Download raw body.
OpenBSD perl 5.38.2 - Call for Testing
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 <yardley@tanet.net>
A. Sinan Unur <nanis@cpan.org>
@@ -56,7 +59,8 @@ Albert Chin-A-Young <china@th
Albert Dvornik <bert@alum.mit.edu>
Alberto Simões <ambs@cpan.org>
Alessandro Forghieri <alf@orion.it>
-Alex Davies <adavies@ptc.com>
+Alex <aleksandrosansan@gmail.com>
+Alex Davies <alex.davies501@gmail.com>
Alex Gough <alex@rcon.org>
Alex Solovey <a.solovey@gmail.com>
Alex Vandiver <alexmv@mit.edu>
@@ -69,6 +73,7 @@ Alexander Gernler <alexande
Alexander Gough <alex-p5p@earth.li>
Alexander Hartmaier <abraxxa@cpan.org>
Alexander Klimov <ask@wisdom.weizmann.ac.il>
+Alexander Nikolov <sasho648@gmail.com>
Alexander Smishlajev <als@turnhere.com>
Alexander Voronov <alexander-voronov@yandex.ru>
Alexandr Ciornii <alexchorny@gmail.com>
@@ -106,6 +111,7 @@ Andrew Hamm <AHamm@ci
Andrew M. Langmead <aml@world.std.com>
Andrew Pimlott <pimlott@idiomtech.com>
Andrew Rodland <arodland@cpan.org>
+Andrew Ruthven <andrew@etc.gen.nz>
Andrew Savige <ajsavige@yahoo.com.au>
Andrew Tam <andrewtam000@gmail.com>
Andrew Vignaux <ajv@nz.sangacorp.com>
@@ -128,6 +134,7 @@ Aristotle Pagaltzis <pagaltzi
Arjen Laarhoven <arjen@nl.demon.net>
Arkturuz <arkturuz@gmail.com>
Arne Ahrend <aahrend@web.de>
+Arne Johannessen <ajnn@cpan.org>
Arnold D. Robbins <arnold@gnu.ai.mit.edu>
Art Green <Art_Green@mercmarine.com>
Art Haas <ahaas@airmail.net>
@@ -148,6 +155,8 @@ Bah <bah@long
Barrie Slaymaker <barries@slaysys.com>
Barry Friedman
Bart Kedryna <bkedryna@home.com>
+Bart Van Assche <bvanassche@acm.org>
+Bartosz Jarzyna <bbrtj.pro@gmail.com>
Bas van Sisseren <bas@quarantainenet.nl>
Beau Cox
Ben Carter <bcarter@gumdrop.flyinganvil.org>
@@ -217,6 +226,7 @@ Brian S. Cashman <bsc@umic
Brian Strand <bstrand@switchmanagement.com>
Brooks D. Boyd
Bruce Barnett <barnett@grymoire.crd.ge.com>
+Bruce Gray <bruce.gray@acm.org>
Bruce J. Keeler <bkeelerx@iwa.dp.intel.com>
Bruce P. Schuck <bruce@aps.org>
Bryan Stenson <bryan@siliconvortex.com>
@@ -283,6 +293,7 @@ Chunhui Teng <cteng@no
Claes Jacobsson <claes@surfar.nu>
Clark Cooper <coopercc@netheaven.com>
Claudio Ramirez <nxadm@cpan.org>
+Clemens Wasser <clemens.wasser@gmail.com>
Clinton A. Pierce <clintp@geeksalad.org>
Clinton Gormley
Colin Kuskie <ckuskie@cadence.com>
@@ -331,6 +342,7 @@ Daniel P. Berrange <dan@berr
Daniel Perrett <perrettdl@googlemail.com>
Daniel S. Lewart <lewart@uiuc.edu>
Daniel Yacob <perl@geez.org>
+danielnachun <daniel.nachun@gmail.com>
Danny R. Faught <faught@mailhost.rsn.hp.com>
Danny Rathjens
Danny Sadinoff <danny-cpan@sadinoff.com>
@@ -425,6 +437,7 @@ Earl Hood
Ed Avis <eda@waniasset.com>
Ed J <etj@cpan.org>
Ed Mooring <mooring@Lynx.COM>
+Ed Sabol <esabol@users.noreply.github.com>
Ed Santiago <esm@pobox.com>
Eddy Tan <eddy.net@gmail.com>
Edgar Bering <trizor@gmail.com>
@@ -443,7 +456,6 @@ Eric Brine <ikegami@
Eric E. Coe <Eric.Coe@oracle.com>
Eric Fifer <egf7@columbia.edu>
Eric Herman <eric@freesa.org>
-Eric Lindblad <lindblad@gmx.com>
Eric Melville
Eric Promislow <ericp@ActiveState.com>
Erich Rickheit
@@ -459,8 +471,10 @@ Fabien Tassin <tassin@e
Father Chrysostomos <sprout@cpan.org>
Felipe Gasper <felipe@felipegasper.com>
Felix Gallo <fgallo@etoys.com>
+Ferenc Erki <ferki@cpan.org>
Fergal Daly <fergal@esatclear.ie>
Fingle Nark <finglenark@gmail.com>
+Firas Khalil Khana <firasuke@gmail.com>
Florent Guillaume
Florian Ragwitz <rafl@debian.org>
Florian Weimer <fweimer@redhat.com>
@@ -499,7 +513,6 @@ Gideon Israel Dsouza <gideon@c
Giles Lean <giles@nemeton.com.au>
Giovanni Tataranni <gtataranni@users.noreply.github.com>
Gisle Aas <gisle@aas.no>
-GitHub <noreply@github.com>
Glenn D. Golden <gdg@zplane.com>
Glenn Linderman <perl@nevcal.com>
Gomar <gomar@md.media-web.de>
@@ -721,6 +734,7 @@ John W. Krahn
John Wright <john@johnwright.org>
Johnny Lam <jlam@jgrind.org>
Jon Eveland <jweveland@yahoo.com>
+Jon Gentle <atrodo@atrodo.org>
Jon Gunnip <jongunnip@hotmail.com>
Jon Orwant <orwant@oreilly.com>
Jonathan Biggar <jon@sems.com>
@@ -780,6 +794,7 @@ Ken Williams <ken@math
Kenichi Ishigaki <ishigaki@cpan.org>
Kenneth Albanowski <kjahds@kjahds.com>
Kenneth Duda <kjd@cisco.com>
+Kenneth Ölwing <knth@cpan.org>
Kent Fredric <kentfredric@gmail.com>
Keong Lim <Keong.Lim@sr.com.au>
Kevin Brintnall <kbrint@rufus.net>
@@ -800,6 +815,7 @@ Kragen Sitaker <kragen@p
Krishna Sethuraman <krishna@sgi.com>
Kriton Kyrimis <kyrimis@princeton.edu>
Kurt D. Starsinic <kstar@wolfetech.com>
+Kurt Fitzner <kurt@va1der.ca>
Kyriakos Georgiou
Lajos Veres <vlajos@gmail.com>
Larry Parmelee <parmelee@CS.Cornell.EDU>
@@ -822,9 +838,11 @@ Leon Brocard <acme@ast
Leon Timmermans <fawaka@gmail.com>
Les Peters <lpeters@aol.net>
Lesley Binks <lesley.binks@gmail.com>
+Li Linjie <lilinjie@uniontech.com>
Lincoln D. Stein <lstein@cshl.org>
Linda Walsh
Lionel Cons <lionel.cons@cern.ch>
+Loren Merritt <pengvado@videolan.org>
Louis Strous <louis.strous@gmail.com>
Lubomir Rintel <lkundrak@v3.sk>
Luc St-Louis <luc.st-louis@ca.transport.bombardier.com>
@@ -850,6 +868,7 @@ Marc Reisner <reisner.
Marc Simpson <marc@0branch.com>
Marc-Philip Werner <marc-philip.werner@sap.com>
Marcel Grünauer <marcel@codewerk.com>
+Marcel Telka <marcel@telka.sk>
Marco Fontani <MFONTANI@cpan.org>
Marco Peereboom <marco@conformal.com>
Marcus Holland-Moritz <mhx-perl@gmx.net>
@@ -864,7 +883,7 @@ Mark Dootson <mdootson
Mark Fowler <mark@twoshortplanks.com>
Mark Hanson
Mark J. Reed <mreed@strange.turner.com>
-Mark Jason Dominus <mjd@plover.com>
+Mark Jason Dominus <mjd@pobox.com>
Mark K Trettin <mkt@lucent.com>
Mark Kaehny <kaehny@execpc.com>
Mark Kettenis <kettenis@wins.uva.nl>
@@ -879,6 +898,7 @@ Mark P. Lutz <mark.p.l
Mark Pease <peasem@primenet.com>
Mark Pizzolato <mark@infocomm.com>
Mark R. Levinson <mrl@isc.upenn.edu>
+Mark Shelor <mshelor@cpan.org>
Mark Stosberg <mark@summersault.com>
Marko Asplund <aspa@merlot.kronodoc.fi>
Markus Jansen <Markus.Jansen@ericsson.com>
@@ -916,13 +936,14 @@ Matt Turner <mattst88
Matthew Black <black@csulb.edu>
Matthew Green <mrg@splode.eterna.com.au>
Matthew Horsfall <wolfsage@gmail.com>
+Matthew O. Persico <matthew.persico@gmail.com>
Matthew Sachs <matthewg@zevils.com>
Matthew T Harden <mthard@mthard1.monsanto.com>
Matthias Bethke <matthias@towiski.de>
Matthias Ulrich Neeracher <neeracher@mac.com>
Matthias Urlichs <smurf@noris.net>
Matthijs van Duin <xmath@cpan.org>
-Mattia Barbon <mbarbon@dsi.unive.it>
+Mattia Barbon <mattia@barbon.org>
Maurizio Loreti <maurizio.loreti@pd.infn.it>
Max Baker <max@warped.org>
Max Maischein <corion@corion.net>
@@ -972,6 +993,7 @@ Mikhail Zabaluev <mhz@alt-
Milosz Tanski <mtanski@gridapp.com>
Milton L. Hankins <mlh@swl.msd.ray.com>
Misty De Meo <mistydemeo@github.com>
+Mohammad S Anwar <Mohammad.Anwar@yahoo.com>
Mohammed El-Afifi <mohammed_elafifi@yahoo.com>
Moritz Lenz <moritz@casella.verplant.org>
Moshe Kaminsky <kaminsky@math.huji.ac.il>
@@ -980,6 +1002,7 @@ Mr. Nobody <mrnobo10
Murray Nesbitt <murray@nesbitt.ca>
Nathan Glenn <garfieldnate@gmail.com>
Nathan Kurz <nate@valleytel.net>
+Nathan Mills <38995150+quipyowert2@users.noreply.github.com>
Nathan Torkington <gnat@frii.com>
Nathan Trapuzzano <nbtrap@nbtrap.com>
Neale Ferguson <neale@VMA.TABNSW.COM.AU>
@@ -998,6 +1021,7 @@ Nick Johnston <nickjohn
Nick Logan <ugexe@cpan.org>
Nick Williams <Nick.Williams@morganstanley.com>
Nicolas Kaiser <nikai@nikai.net>
+Nicolas Mendoza <mendoza@pvv.ntnu.no>
Nicolas R <atoomic@cpan.org>
Niels Thykier <niels@thykier.net>
Nigel Sandever <njsandever@hotmail.com>
@@ -1080,6 +1104,7 @@ Peter J. Farley III <pjfarley
Peter J. Holzer <hjp@hjp.at>
Peter Jaspers-Fayer
Peter John Acklam <pjacklam@online.no>
+Peter Levine <plevine457@gmail.com>
Peter Liscovius
Peter Martini <PeterCMartini@GMail.com>
Peter O'Gorman <peter@pogma.com>
@@ -1246,12 +1271,12 @@ Shirakata Kentaro <argrath@
Shishir Gundavaram <shishir@ruby.ora.com>
Shlomi Fish <shlomif@cpan.org>
Shoichi Kaji <skaji@cpan.org>
+Sidney Markowitz <sidney@sidney.com>
Simon Cozens <simon@netthink.co.uk>
Simon Glover <scog@roe.ac.uk>
Simon Leinen
Simon Parsons <S.Parsons@ftel.co.uk>
Simon Schubert <corecode@fs.ei.tum.de>
-Sinan Unur <sinan@unur.com>
Sisyphus <sisyphus@cpan.org>
Sizhe Zhao <prc.zhao@outlook.com>
Slaven Rezic <slaven@rezic.de>
@@ -1370,6 +1395,7 @@ Torsten Foertsch <torsten.
Torsten Schönfeld <kaffeetisch@gmx.de>
Trevor Blackwell <tlb@viaweb.com>
Tsutomu IKEGAMI <t-ikegami@aist.go.jp>
+Tsuyoshi Watanabe <twata_1@yahoo.co.jp>
Tuomas J. Lukka <tjl@lukka.student.harvard.edu>
Tye McQueen <tye@metronet.com>
Ulrich Habel <rhaen@NetBSD.org>
@@ -1389,12 +1415,12 @@ Vincent Pit <perl@pro
Vishal Bhatia <vishal@deja.com>
Vitali Peil <vitali.peil@uni-bielefeld.de>
vividsnow <vividsnow@gmail.com>
-vividsnow @vividsnow
Vlad Harchev <hvv@hippo.ru>
Vladimir Alexiev <vladimir@cs.ualberta.ca>
Vladimir Marek <vlmarek@volny.cz>
Vladimir Timofeev <vovkasm@gmail.com>
Volker Schatz <perldoc@volkerschatz.com>
+vsfos <vsfos@foxmail.com>
W. Geoffrey Rommel <grommel@sears.com>
W. Phillip Moore <wpm@ms.com>
Wallace Reis <wreis@cpan.org>
@@ -1437,3 +1463,4 @@ Zefram <zefram@f
Zsbán Ambrus <ambrus@math.bme.hu>
Ævar Arnfjörð Bjarmason <avar@cpan.org>
Михаил Козачков <mchlkzch@gmail.com>
+小鸡 <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 <<EOM >&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 <<EOM >&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 <<EOCP
-#include <stdlib.h>
-#include <malloc.h>
-#$i_mallocmalloc I_MALLOCMALLOC
-#ifdef I_MALLOCMALLOC
-# include <malloc/malloc.h>
-#endif
-
-int main () { return 0; }
-EOCP
-set try
-if eval $compile; then
- echo "<malloc.h> found." >&4
- val="$define"
-else
- echo "<malloc.h> 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 <stdio.h>
+__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 <<EOCP
+#include <stdlib.h>
+#include <malloc.h>
+#$i_mallocmalloc I_MALLOCMALLOC
+#ifdef I_MALLOCMALLOC
+# include <malloc/malloc.h>
+#endif
+
+int main () { return 0; }
+EOCP
+set try
+if eval $compile; then
+ echo "<malloc.h> found." >&4
+ val="$define"
+else
+ echo "<malloc.h> 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 <<EOM >&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 <<EOM
+#include <quadmath.h>
+#include <stdio.h>
+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 <<EOM >&4
+
+*** You requested the use of the quadmath library, but
+*** it appears to be nonfunctional.
+*** Cannot continue, aborting.
+
+EOM
+ exit 1
+ ;;
+ esac
+ else
+ $cat <<EOM >&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 <<EOM >&4
@@ -16983,6 +17068,10 @@ $cat <<EOP >try.c
#ifdef I_STDLIB
#include <stdlib.h>
#endif
+#$i_inttypes I_INTTYPES
+#ifdef I_INTTYPES
+#include <inttypes.h>
+#endif
#include <sys/types.h>
#include <signal.h>
#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 <stdlib.h>
#endif
+#$i_inttypes I_INTTYPES
+#ifdef I_INTTYPES
+#include <inttypes.h>
+#endif
#include <sys/types.h>
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<pod/perlpod.pod>) which is specially
designed to be readable as is.
@@ -90,10 +92,10 @@ to F<pod/perldelta.pod> for more detaile
=head3 Compatibility with earlier versions
-B<WARNING:> 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<WARNING:> 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<pod/perldelta.pod> 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<CPAN> 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<pod/perldelta.pod> 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<CPAN> module's
C<autobundle> 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<NO_TAINT_SUPPORT> 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<SILENT_NO_TAINT_SUPPORT> 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<PERL_HASH_USE_SBOX32_ALSO> 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<PERL_HASH_NO_SBOX32> 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<SBOX32_MAX_LEN>
+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<PERL_PERTURB_KEYS_DISABLED> 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<PERL_PERTURB_KEYS_RANDOM> or C<PERL_PERTURB_KEYS_DETERMINISTIC> 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<NO_HASH_SEED> 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<PERL_HASH_SEED_DEBUG> 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<BEGIN> block inside of an C<eval EXPR> or C<require>
+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<putenv()> 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<putenv()> function when the
-perl interpreter is embedded in another application. You can force perl
-to always use C<putenv()> by compiling with
-C<-Accflags="-DPERL_USE_SAFE_PUTENV">, see section L</"Altering Configure
-variables for C compiler switches etc.">. You can force an embedded perl
-to use direct manipulation by setting C<PL_use_safe_putenv = 0;> after
-the C<perl_construct()> 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<first>,
+The directories defined by APPLLIB_EXP get added to @INC B<first>,
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<Configure>, 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<https://www.chiark.greenend.org.uk/~sg
=head1 Coexistence with earlier versions of perl 5
-Perl 5.36.3 is not binary compatible with versions of Perl earlier than.
-5.36.0. In other words, you will have to recompile your XS modules.
+Perl 5.38.2 is not binary compatible with earlier versions of Perl.
+In other words, you will have to recompile your XS modules.
In general, you can usually safely upgrade from one stable version of Perl
(e.g. 5.30.0) to another similar minor version (e.g. 5.30.1) without
@@ -2581,9 +2655,9 @@ won't interfere with another version. (
libraries after 5.6.0, but not for executables. TODO?) One convenient
way to do this is by using a separate prefix for each version, such as
- sh Configure -Dprefix=/opt/perl5.36.3
+ sh Configure -Dprefix=/opt/perl5.38.2
-and adding /opt/perl5.36.3/bin to the shell PATH variable. Such users
+and adding /opt/perl5.38.2/bin to the shell PATH variable. Such users
may also wish to add a symbolic link /usr/local/bin/perl so that
scripts can still start with #!/usr/local/bin/perl.
@@ -2596,13 +2670,13 @@ seriously consider using a separate dire
subversions may not have all the compatibility wrinkles ironed out
yet.
-=head2 Upgrading from 5.35.11 or earlier
+=head2 Upgrading from 5.36.0 or earlier
-B<Perl 5.36.3 may not be binary compatible with Perl 5.35.11 or
+B<Perl 5.38.2 may not be binary compatible with Perl 5.36.0 or
earlier Perl releases.> 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<PERL_INTERNAL_RAND_SEED>
If you configure perl with C<-Accflags=-DNO_PERL_INTERNAL_RAND_SEED>,
perl will ignore the C<PERL_INTERNAL_RAND_SEED> environment variable.
+
+=head2 C<-DNO_PERL_RAND_SEED>
+X<PERL_RAND_SEED>
+
+If you configure perl with C<-Accflags=-DNO_PERL_RAND_SEED>,
+perl will ignore the C<PERL_RAND_SEED> 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 <langinfo.h>
+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 <langinfo.h>
-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 <FH> 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 <FH> 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 <<!GROK!THIS!
Index: gnu/usr.bin/perl/Makefile.bsd-wrapper1
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/Makefile.bsd-wrapper1,v
diff -u -p -a -u -p -r1.45 Makefile.bsd-wrapper1
--- gnu/usr.bin/perl/Makefile.bsd-wrapper1 23 Dec 2023 21:02:20 -0000 1.45
+++ gnu/usr.bin/perl/Makefile.bsd-wrapper1 21 Feb 2024 15:47:00 -0000
@@ -92,6 +92,9 @@ _quick3p=
perl5361delta 1 pod/perl5361delta.pod \
perl5362delta 1 pod/perl5362delta.pod \
perl5363delta 1 pod/perl5363delta.pod \
+ perl5380delta 1 pod/perl5380delta.pod \
+ perl5381delta 1 pod/perl5381delta.pod \
+ perl5382delta 1 pod/perl5382delta.pod \
perl561delta 1 pod/perl561delta.pod \
perl56delta 1 pod/perl56delta.pod \
perl581delta 1 pod/perl581delta.pod \
@@ -112,6 +115,8 @@ _quick3p=
perlbug 1 utils/perlbug \
perlcall 1 pod/perlcall.pod \
perlcheat 1 pod/perlcheat.pod \
+ perlclass 1 pod/perlclass.pod \
+ perlclassguts 1 pod/perlclassguts.pod \
perlclib 1 pod/perlclib.pod \
perlcommunity 1 pod/perlcommunity.pod \
perldata 1 pod/perldata.pod \
@@ -513,8 +518,6 @@ _quick3p=
Memoize 3p lib/Memoize.pm \
Memoize::AnyDBM_File 3p lib/Memoize/AnyDBM_File.pm \
Memoize::Expire 3p lib/Memoize/Expire.pm \
- Memoize::ExpireFile 3p lib/Memoize/ExpireFile.pm \
- Memoize::ExpireTest 3p lib/Memoize/ExpireTest.pm \
Memoize::NDBM_File 3p lib/Memoize/NDBM_File.pm \
Memoize::SDBM_File 3p lib/Memoize/SDBM_File.pm \
Memoize::Storable 3p lib/Memoize/Storable.pm \
@@ -626,6 +629,7 @@ _quick3p=
sigtrap 3p lib/sigtrap.pm \
Socket 3p lib/Socket.pm \
sort 3p lib/sort.pm \
+ stable 3p lib/stable.pm \
Storable 3p lib/Storable.pm \
strict 3p lib/strict.pm \
Sub::Util 3p lib/Sub/Util.pm \
@@ -802,7 +806,7 @@ _quick3p=
vmsish 3p lib/vmsish.pm \
warnings 3p lib/warnings.pm \
warnings::register 3p lib/warnings/register.pm \
- XS::APItest 3p ext/XS-APItest/APItest.pm \
+ XS::APItest 3p lib/XS/APItest.pm \
XS::Typemap 3p ext/XS-Typemap/Typemap.pm \
XSLoader 3p lib/XSLoader.pm
. ifndef NOMAN
Index: gnu/usr.bin/perl/Makefile.micro
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/Makefile.micro,v
diff -u -p -a -u -p -r1.4 Makefile.micro
--- gnu/usr.bin/perl/Makefile.micro 15 Feb 2023 01:36:12 -0000 1.4
+++ gnu/usr.bin/perl/Makefile.micro 21 Feb 2024 15:47:00 -0000
@@ -1,6 +1,6 @@
LD = $(CC)
CCFLAGS = -c
-DEFINES = -DPERL_CORE -DPERL_MICRO -DPERL_USE_SAFE_PUTENV -DNO_MATHOMS
+DEFINES = -DPERL_CORE -DPERL_MICRO -DNO_MATHOMS
OPTIMIZE =
CFLAGS = $(DEFINES) $(OPTIMIZE)
LDFLAGS =
@@ -18,7 +18,8 @@ O = uav$(_O) udeb$(_O) udoio$(_O) udoop$
umg$(_O) uperlmain$(_O) uop$(_O) ureentr$(_O) \
upad$(_O) uperl$(_O) uperlio$(_O) uperly$(_O) upp$(_O) \
upp_ctl$(_O) upp_hot$(_O) upp_sys$(_O) upp_pack$(_O) upp_sort$(_O) \
- uregcomp$(_O) uregexec$(_O) urun$(_O) \
+ uregcomp$(_O) uregcomp_debug$(_O) uregcomp_invlist$(_O) \
+ uregcomp_study$(_O) uregcomp_trie$(_O) uregexec$(_O) urun$(_O) \
uscope$(_O) usv$(_O) utaint$(_O) utime64$(_O) utoke$(_O) \
unumeric$(_O) ulocale$(_O) umathoms$(_O) \
uuniversal$(_O) uutf8$(_O) uutil$(_O) ukeywords$(_O)
@@ -138,7 +139,19 @@ upp_pack$(_O): $(HE) pp_pack.c
upp_sort$(_O): $(HE) pp_sort.c
$(CC) $(CCFLAGS) -o $@ $(CFLAGS) pp_sort.c
-uregcomp$(_O): $(HE) regcomp.c regcomp.h regnodes.h INTERN.h
+uregcomp$(_O): $(HE) regcomp.c regcomp_internal.h regcomp.h regnodes.h INTERN.h
+ $(CC) $(CCFLAGS) -o $@ $(CFLAGS) regcomp.c
+
+uregcomp_debug$(_O): $(HE) regcomp_debug.c regcomp_internal.h regcomp.h regnodes.h INTERN.h
+ $(CC) $(CCFLAGS) -o $@ $(CFLAGS) regcomp.c
+
+uregcomp_invlist$(_O): $(HE) regcomp_invlist.c regcomp_internal.h regcomp.h regnodes.h INTERN.h
+ $(CC) $(CCFLAGS) -o $@ $(CFLAGS) regcomp.c
+
+uregcomp_study$(_O): $(HE) regcomp_study.c regcomp_internal.h regcomp.h regnodes.h INTERN.h
+ $(CC) $(CCFLAGS) -o $@ $(CFLAGS) regcomp.c
+
+uregcomp_trie$(_O): $(HE) regcomp_trie.c regcomp_internal.h regcomp.h regnodes.h INTERN.h
$(CC) $(CCFLAGS) -o $@ $(CFLAGS) regcomp.c
uregexec$(_O): $(HE) regexec.c regcomp.h regnodes.h
Index: gnu/usr.bin/perl/PACKAGING
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/PACKAGING,v
diff -u -p -a -u -p -r1.1.1.1 PACKAGING
--- gnu/usr.bin/perl/PACKAGING 13 Feb 2019 21:10:45 -0000 1.1.1.1
+++ gnu/usr.bin/perl/PACKAGING 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
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/README,v
diff -u -p -a -u -p -r1.23 README
--- gnu/usr.bin/perl/README 8 Jul 2023 14:18:35 -0000 1.23
+++ gnu/usr.bin/perl/README 21 Feb 2024 15:47:00 -0000
@@ -2,10 +2,7 @@ Perl is Copyright (C) 1993 - 2023 by Lar
All rights reserved.
-
-
-ABOUT PERL
-==========
+# ABOUT PERL
Perl is a general-purpose programming language originally developed for
text manipulation and now used for a wide range of tasks including
@@ -28,15 +25,14 @@ There are also many Perl books available
from various publishers. See pod/perlbook.pod for more information.
-INSTALLATION
-============
+# INSTALLATION
If you're using a relatively modern operating system and want to
install this version of Perl locally, run the following commands:
- ./Configure -des -Dprefix=$HOME/localperl
- make test
- make install
+ ./Configure -des -Dprefix=$HOME/localperl
+ make test
+ make install
This will configure and compile perl for your platform, run the regression
tests, and install perl in a subdirectory "localperl" of your home directory.
@@ -50,11 +46,10 @@ variety of platforms, some more common t
Once you have Perl installed, a wealth of documentation is available to you
through the 'perldoc' tool. To get started, run this command:
- perldoc perl
+ perldoc perl
-IF YOU RUN INTO TROUBLE
-=======================
+# IF YOU RUN INTO TROUBLE
Perl is a large and complex system that's used for everything from
knitting to rocket science. If you run into trouble, it's quite
@@ -76,20 +71,19 @@ Just a personal note: I want you to kno
because it pleases the Author of my story. If this bothers you, then your
notion of Authorship needs some revision. But you can use perl anyway. :-)
- The author.
+The author.
-LICENSING
-=========
+# LICENSING
This program is free software; you can redistribute it and/or modify
it under the terms of either:
- a) the GNU General Public License as published by the Free
- Software Foundation; either version 1, or (at your option) any
- later version, or
+a. the GNU General Public License as published by the Free
+ Software Foundation; either version 1, or (at your option) any
+ later version, or
- b) the "Artistic License" which comes with this Kit.
+b. the "Artistic License" which comes with this Kit.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -126,5 +120,3 @@ is, in this case, a form of mere aggrega
of the GPL. If you still have concerns or difficulties understanding
my intent, feel free to contact me. Of course, the Artistic License
spells all this out for your protection, so you may prefer to use that.
-
-
Index: gnu/usr.bin/perl/README.aix
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/README.aix,v
diff -u -p -a -u -p -r1.4 README.aix
--- gnu/usr.bin/perl/README.aix 30 Dec 2019 02:13:39 -0000 1.4
+++ gnu/usr.bin/perl/README.aix 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.amiga
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/README.amiga,v
diff -u -p -a -u -p -r1.8 README.amiga
--- gnu/usr.bin/perl/README.amiga 5 Feb 2017 00:31:52 -0000 1.8
+++ gnu/usr.bin/perl/README.amiga 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.
Index: gnu/usr.bin/perl/README.android
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/README.android,v
diff -u -p -a -u -p -r1.3 README.android
--- gnu/usr.bin/perl/README.android 1 Mar 2021 23:19:42 -0000 1.3
+++ gnu/usr.bin/perl/README.android 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.bs2000
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/README.bs2000,v
diff -u -p -a -u -p -r1.5 README.bs2000
--- gnu/usr.bin/perl/README.bs2000 15 Feb 2023 01:36:12 -0000 1.5
+++ gnu/usr.bin/perl/README.bs2000 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. Do not worry, you've apparently got the
ASCII->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<pod/perlpod.pod>) which is
specially designed to be readable as is.
@@ -31,7 +33,7 @@ L<https://www.cygwin.com/>
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<NOTE:> 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</usr/local>.
However, your host system and Cygwin configuration will affect Perl's
runtime behavior (see L</"TEST">).
@@ -128,11 +130,10 @@ NOTE: The BerkeleyDB library only comple
A port of SysV IPC is available for Cygwin.
NOTE: This has B<not> been extensively tested. In particular,
-C<d_semctl_semun> is undefined because it fails a Configure test
-and on Win9x the I<shm*()> functions seem to hang. It also creates
-a compile time dependency because F<perl.h> includes F<<sys/ipc.h>>
-and F<<sys/sem.h>> (which will be required in the future when compiling
-CPAN modules). CURRENTLY NOT SUPPORTED!
+C<d_semctl_semun> is undefined because it fails a Configure test. It
+also creates a compile time dependency because F<perl.h> includes
+F<<sys/ipc.h>> and F<<sys/sem.h>> (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<d_eofnblk>
-
-Win9x does not correctly report C<EOF> 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:<line#>: 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<make> and wait:
- make 2>&1 | tee log.make
+ make -jn 2>&1 | tee log.make
+
+where I<n> 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<n> 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<//UNC>) are also supported Since cygwin-1.7 non-POSIX
-pathnames are discouraged. Names may contain all printable
+Naming Codes (F<//UNC>) 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<https://cygwin.com/faq/faq-nochunks.html#faq.using.fixing-fork-failures>
+See L<https://cygwin.com/faq/faq.html#faq.using.fixing-fork-failures>
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<setup.exe>
from L<https://cygwin.com/install.html> to install it.
-1. kill all perl processes and run C<perlrebase> or
-
-2. kill all cygwin processes and services, start dash from cmd.exe and run C<rebaseall>.
+1. kill all perl processes and run
+ C<</bin/find <dir> -xdev -name \*.dll | /bin/rebase -OT ->> or
-=item * C<chown()>
-
-On WinNT C<chown()> can change a file's user and group IDs. On Win9x C<chown()>
-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<F_GETLK> command to C<fcntl()> is a stub that
returns C<ENOSYS>.
-Win9x can not C<rename()> an open file (although WinNT can).
-
The Cygwin C<chroot()> 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 <jdhedden@cpan.org>.
=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<readdir_r> 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<http://www.freebsd.org/cgi/query-pr.cgi?pr=misc/30631> )
+(see L<https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=30631>)
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<sysctl> with C<KERN_PROC_PATHNAME> if that is supported, else by reading
the symlink F</proc/curproc/file>. FreeBSD 7 and earlier has a bug where
either approach sometimes returns an incorrect value
-(see L<http://www.freebsd.org/cgi/query-pr.cgi?pr=35703> ).
+(see L<https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=35703>).
In these cases perl will fall back to the old behaviour of using C's
C<argv[0]> 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<pod/perlpod.pod> 문서를
확인하세요)으로 작성되어 있습니다.
+=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<set PERLLIB_PREFIX> in F<Config.sys>,
=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<PERLLIB_PREFIX>), 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<Synology FAQ|https://kb.synology.com/e
Since it is based on Linux, the NAS can run many popular Linux
software packages, including Perl. In fact, Synology provides a
ready-to-install package for Perl, depending on the version of DSM
-the installed perl ranges from 5.8.6 on DSM-4.3 to 5.24.0 on DSM-6.1.
+the installed perl ranges from 5.8.6 on DSM-4.3 to 5.28.1 on DSM-7.1.
There is an active user community that provides many software packages
for the Synology DSM systems; at the time of writing this document
-they provide Perl version 5.24.1.
+they provide Perl version 5.28.1.
This document describes various features of Synology DSM operating
system that will affect how Perl 5 (hereafter just Perl) is
configured, compiled and/or runs. It has been compiled and verified by
Johan Vromans for the Synology DS413 (QorIQ), with feedback from
-H.Merijn Brand (DS213, ARMv5tel and RS815, Intel Atom x64).
+H.Merijn Brand (DS213: ARMv5tel, RS815: Intel Atom x64, and DS218+:
+Celeron J3355).
=head2 Setting up the build environment
+=head3 DSM 7
+
+For a comfortable development environment, Entware is currently the only
+viable solution. Just follow the detailed instructions on
+L<Install Entware on Synology NAS|https://github.com/Entware/Entware/wiki/Install-on-Synology-NAS>.
+supported architectures are armv5, armv7, mipsel, wl500g, x86_32, and x86_64.
+Check L<here|https://pkg.entware.net/binaries/> 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<not> use
+a site_perl folder. The available C<cpan> 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<Install Entware-ng on Synology NAS|https://github.com/Entware-ng/Entware-ng/wiki/Install-on-Synology-NAS>
+
+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<here|https://pkg.entware.net/binaries/> 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<not> use
+a site_perl folder. The available C<cpan> 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<WARNING:> 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<Install Entware-ng on Synology NAS|https://github.com/Entware-ng/Entware-ng/wiki/Install-on-Synology-NAS>
-
-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<here|https://pkg.entware.net/binaries/> 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<not> use
-a site_perl folder. The available C<cpan> 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 <jvromans@squirrel.nl>
-H. Merijn Brand <h.m.brand@xs4all.nl>
+H. Merijn Brand <cpan@tux.freedom.nl>
=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<http://mingw-w64.org>
+=item L<https://mingw-w64.org>
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<http://mingw-w64.org>.
+The MinGW64 compiler is available at L<https://mingw-w64.org>.
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<http://strawberryperl.com/package/kmx/64_gcctoolchain/>
+L<https://strawberryperl.com/package/kmx/64_gcctoolchain/>
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<https://www.microsoft.com/downloads/search.aspx?displaylang=en>. (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<https://visualstudio.microsoft.com/>.
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<C:\Program Files\Microsoft Visual Studio 12.0\Common7\Tools\vsvars32.bat>
(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<win32/Makefile>. You will need to edit that
+file to set C<CCTYPE> to one of C<MSVC120>-C<MSVC143> 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<https://visualstudio.microsoft.com/visual-cpp-build-tools/>.
+
+This is also referred to as I<Build Tools for Visual Studio>.
=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<https://osdn.net/projects/mingw/>
-L<http://www.mingw-w64.org/>
+L<https://www.mingw-w64.org/>
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<win32/Makefile> and pick the correct C<CCTYPE> 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<nmake> 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<win32> subdirectory under the perl toplevel.
+This directory contains a F<Makefile> that will work with
+versions of C<nmake> that come with Visual C++, and
+a GNU make F<GNUmakefile> that will work for all supported compilers.
+The defaults in the C<gmake> 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<GNUmakefile> (or F<Makefile>, if you're using F<nmake>) and change
+the values of I<INST_DRV> and C<INST_TOP>. 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<perl> with
+C<INST_DRV> and C<INST_TOP> 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<lib/ExtUtils/t/Embed.t> test, which attempts to build a test program and
+may end up building against the installed C<perl>'s F<lib/CORE> 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<CCTYPE> is set correctly and that
+C<CCHOME> points to wherever you installed your compiler. For GCC this
should be the directory that contains the F<bin>, F<include> and
F<lib> 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<GCCCROSS> in the F<GNUmakefile>. Do this only if it's the cross-compiler,
+ie. only if the F<bin> folder doesn't contain a F<gcc.exe>. (The cross-compiler
+does not provide a F<gcc.exe>, F<g++.exe>, F<ar.exe>, etc. Instead, all of these
+executables are prefixed with C<x86_64-w64-mingw32->.)
-The default value for CCHOME in the makefiles for Visual C++
+The default value for C<CCHOME> 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<perl>'s DLL,
+specify them in the C<STATIC_EXT> 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<gmake> (or C<nmake> if you are using that version of C<make>).
-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<perl.exe>,
+F<perl538.dll> at the perl toplevel, and various other extension DLL's
+under the F<lib\auto> 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<gmake>'s parallel mode, type C<gmake -j2> 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<make test>. Try to keep your PATH environmental
+up building C<perl>, and the later C<make test>. Try to keep your C<PATH> environment
variable with the least number of folders possible (remember to keep your C
-compiler's folders there). C<C:\WINDOWS\system32> or C<C:\WINNT\system32>
-depending on your OS version should be first folder in PATH, since "cmd.exe"
+compiler's folders there). F<C:\WINDOWS\system32> or F<C:\WINNT\system32>
+depending on your OS version should be first folder in C<PATH>, since C<cmd.exe>
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<L</XS_INTERNAL>> and C<L</XS_EXTERNAL>> 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<ax> variable.
This is usually handled automatically by C<xsubpp> by calling C<dXSARGS>.
-=for apidoc Amns||dAXMARK
+=for apidoc Amn;||dAXMARK
Sets up the C<ax> variable and stack marker variable C<mark>.
This is usually handled automatically by C<xsubpp> by calling C<dXSARGS>.
-=for apidoc Amns||dITEMS
+=for apidoc Amn;||dITEMS
Sets up the C<items> variable.
This is usually handled automatically by C<xsubpp> by calling C<dXSARGS>.
-=for apidoc Amns||dXSARGS
+=for apidoc Amn;||dXSARGS
Sets up stack and mark pointers for an XSUB, calling C<dSP> and C<dMARK>.
Sets up the C<ax> and C<items> variables by calling C<dAX> and C<dITEMS>.
This is usually handled automatically by C<xsubpp>.
-=for apidoc Amns||dXSI32
+=for apidoc Amn;||dXSI32
Sets up the C<ix> variable for an XSUB which has aliases. This is usually
handled automatically by C<xsubpp>.
-=for apidoc Amns||dUNDERBAR
+=for apidoc Amn;||dUNDERBAR
Sets up any variable needed by the C<UNDERBAR> macro. It used to define
C<padoff_du>, 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<XST_mPV>.
-=for apidoc Amns||XSRETURN_NO
+=for apidoc Amn;||XSRETURN_NO
Return C<&PL_sv_no> from an XSUB immediately. Uses C<XST_mNO>.
-=for apidoc Amns||XSRETURN_YES
+=for apidoc Amn;||XSRETURN_YES
Return C<&PL_sv_yes> from an XSUB immediately. Uses C<XST_mYES>.
-=for apidoc Amns||XSRETURN_UNDEF
+=for apidoc Amn;||XSRETURN_UNDEF
Return C<&PL_sv_undef> from an XSUB immediately. Uses C<XST_mUNDEF>.
-=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<ExtUtils::MakeMaker>. See
C<L</XS_VERSION_BOOTCHECK>>.
-=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<XS_VERSION> variable. This is usually handled automatically by
C<xsubpp>. See L<perlxs/"The VERSIONCHECK: Keyword">.
-=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<perlguts/"Exception Handling">.
@@ -306,7 +306,7 @@ Ends a try block. See L<perlguts/"Excep
=for apidoc AmnU||XCPT_CATCH
Introduces a catch block. See L<perlguts/"Exception Handling">.
-=for apidoc Amns||XCPT_RETHROW
+=for apidoc Amn;||XCPT_RETHROW
Rethrows a previously caught exception. See L<perlguts/"Exception Handling">.
=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<perl5-porters@perl.org|mailto:perl5-porters@perl.org>.
- 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<PL_>
|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<config.h>, $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<perl5-porters@perl.org|mailto:perl5-porters@perl.org>.
+|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<internal>
@@ -1910,6 +2026,8 @@ output('perlintern', <<'_EOB_', $docs{gu
|It has the same sections as L<perlapi>, though some may be empty.
|
_EOB_
+
+my $intern_footer = <<"_EOE_";
|
|=head1 AUTHORS
|
@@ -1921,3 +2039,33 @@ _EOB_
|
|F<config.h>, $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<perlapi/C<newAV_alloc_x>>
-and L<perlapi/C<newAV_alloc_xz>>, 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<size> must be at least 1.
-
-The C<zeroflag> 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<size>) 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<my @new_array = @existing_array;>
+
+=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<my @new_array = %existing_hash;>
+
+=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 <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-def!#undef!'
+sed <<!GROK!THIS! >$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 <<!GROK!THIS! >$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 <<!GROK!THIS! >$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 <<!GROK!THIS! >$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 <<!GROK!THIS! >$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 <<!GROK!THIS! >$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 <<!GROK!THIS! >$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 <<!GROK!THIS! >$CONFIG_H -e 's!^#und
*/
#$i_sysstatvfs I_SYS_STATVFS /**/
+/* I_SYS_SYSCALL:
+ * This symbol, if defined, indicates that <sys/syscall.h> exists.
+ */
+#$i_syssyscall I_SYS_SYSCALL /**/
+
/* I_SYSUTSNAME:
* This symbol, if defined, indicates that <sys/utsname.h> exists and
* should be included.
@@ -4015,6 +4031,32 @@ sed <<!GROK!THIS! >$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 <<!GROK!THIS! >$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 <<!GROK!THIS! >$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 <<!GROK!THIS! >$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 <<!GROK!THIS! >$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 <<EOF }
-usage: $0 [ options ]
- --no-glossary don't include Porting/Glossary in lib/Config.pod
- --chdir=dir change directory before writing files
+sub uncomment($) {
+ return $_[0]=~s/^#(?: )?//mgr;
+}
+
+sub usage { die uncomment <<EOF }
+# usage: $0 [ options ]
+# --no-glossary don't include Porting/Glossary in lib/Config.pod
+# --chdir=dir change directory before writing files
EOF
use strict;
@@ -135,74 +140,74 @@ die "Can't automatically determine name
my $config_txt;
my $heavy_txt;
-my $export_funcs = <<'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);
+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($_ = <MYCONFIG>) || /^\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 .= <<ENDOFSET if $dll;
-\$preconfig{dll_name} = '$dll';
+ $config_txt .= uncomment <<ENDOFSET if $dll;
+# \$preconfig{dll_name} = '$dll';
ENDOFSET
} else {
- $config_txt .= <<'ENDOFSET';
-sub TIEHASH {
- bless $_[1], $_[0];
-}
+ $config_txt .= uncomment <<'ENDOFSET';
+# sub TIEHASH {
+# bless $_[1], $_[0];
+# }
ENDOFSET
}
@@ -840,202 +871,194 @@ my $fast_config = join '', map { " $_
# Sanity check needed to stop an infinite loop if Config_heavy.pl fails to
# define &launcher for some reason (eg it got truncated)
-$config_txt .= sprintf <<'ENDOFTIE', $fast_config;
-
-sub DESTROY { }
-
-sub AUTOLOAD {
- require 'Config_heavy.pl';
- goto \&launcher unless $Config::AUTOLOAD =~ /launcher$/;
- die "&Config::AUTOLOAD failed on $Config::AUTOLOAD";
-}
-
-# tie returns the object, so the value returned to require will be true.
-tie %%Config, 'Config', {
-%s};
+$config_txt .= sprintf uncomment <<'ENDOFTIE', $fast_config;
+#
+# sub DESTROY { }
+#
+# sub AUTOLOAD {
+# require 'Config_heavy.pl';
+# goto \&launcher unless $Config::AUTOLOAD =~ /launcher$/;
+# die "&Config::AUTOLOAD failed on $Config::AUTOLOAD";
+# }
+#
+# # tie returns the object, so the value returned to require will be true.
+# tie %%Config, 'Config', {
+# %s};
ENDOFTIE
open(CONFIG_POD, '>: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<Configure> program at Perl build time (over 900 values).
-
-Shell variables from the F<config.sh> 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<exists> 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<perlrun/Command Switches>.
-
-=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<name='UNKNOWN';>.
-See also C<-V:name> in L<perlrun/Command Switches>.
-
-=item bincompat_options()
-
-Returns a list of C pre-processor options used when compiling this F<perl>
-binary, which affect its binary compatibility with extensions.
-C<bincompat_options()> and C<non_bincompat_options()> are shown together in
-the output of C<perl -V> as I<Compile-time options>.
-
-=item non_bincompat_options()
-
-Returns a list of C pre-processor options used when compiling this F<perl>
-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<perl -V>
-
-=item local_patches()
-
-Returns a list of the names of locally applied patches, equivalent to what
-is shown by C<perl -V>.
-
-=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<Config> variables are determined by the C<Configure> script
-on platforms supported by it (which is most UNIX platforms). Some
-platforms have custom-made C<Config> 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<Configure> program at Perl build time (over 900 values).
+#
+# Shell variables from the F<config.sh> 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<exists> 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<perlrun/Command Switches>.
+#
+# =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<name='UNKNOWN';>.
+# See also C<-V:name> in L<perlrun/Command Switches>.
+#
+# =item bincompat_options()
+#
+# Returns a list of C pre-processor options used when compiling this F<perl>
+# binary, which affect its binary compatibility with extensions.
+# C<bincompat_options()> and C<non_bincompat_options()> are shown together in
+# the output of C<perl -V> as I<Compile-time options>.
+#
+# =item non_bincompat_options()
+#
+# Returns a list of C pre-processor options used when compiling this F<perl>
+# 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<perl -V>
+#
+# =item local_patches()
+#
+# Returns a list of the names of locally applied patches, equivalent to what
+# is shown by C<perl -V>.
+#
+# =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<Config> variables are determined by the C<Configure> script
+# on platforms supported by it (which is most UNIX platforms). Some
+# platforms have custom-made C<Config> 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 <<EOF if $text;
-=back
+my %glossary;
-EOF
- print CONFIG_POD <<EOF;
-=head2 $c
+my $fc;
+my $item;
-=over 4
-
-EOF
- $text = 1;
- }
+sub process {
+ if (s/\A(\w*)\s+\(([\w.]+)\):\s*\n(\t?)/=item C<$1>\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/(?<![.<\'\"])\b([A-Z_]{2,})\b(?![\'\"])/C<$1>/g; # UNISTD
s/(?<![.<\'\"])\b(?!the\b)(\w+)\s+macro\b/C<$1> 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}) {
<GLOS>; # Skip the preamble
while (<GLOS>) {
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 <<EOF_TEXT;
+# =item C<taint_support>
+#
+# From define: C<SILENT_NO_TAINT_SUPPORT> or C<NO_TAINT_SUPPORT>
+#
+# 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</taint_disabled>.
+#
+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 <<EOF_TEXT;
+# =item C<taint_disabled>
+#
+# From define: C<SILENT_NO_TAINT_SUPPORT> or C<NO_TAINT_SUPPORT>
+#
+# 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<SILENT_NO_TAINT_SUPPORT> defined then it will be set to be "silent",
+# and if it was compiled with C<NO_TAINT_SUPPORT> 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</taint_support>.
+#
+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 <stdio.h>"
$ 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 <stdio.h>"
-$ 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 <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ 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<COP> 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<COP> C<c>
+
+=for apidoc Am|line_t|CopLINE|const COP * c
Returns the line number in the source code associated with the C<COP> C<c>
=for apidoc Am|AV *|CopFILEAV|const COP * c
@@ -455,6 +487,17 @@ Returns the SV associated with the C<COP
=for apidoc Am|void|CopFILE_set|COP * c|const char * pv
Makes C<pv> the name of the file associated with the C<COP> C<c>
+=for apidoc Am|void|CopFILE_setn|COP * c|const char * pv|STRLEN len
+Makes C<pv> the name of the file associated with the C<COP> 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<COP> C<c>
@@ -482,14 +525,113 @@ string C<p>, 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<rcpv_new()>.
+No checks are performed to ensure that C<pv> was actually allocated
+with C<rcpv_new()>, 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<rcpv_new()>.
+No checks are performed to ensure that C<pv> was actually allocated
+with C<rcpv_new()>, 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<char *> pointer which was created
+with a call to C<rcpv_new()>. Same as calling rcpv_copy().
+No checks are performed to ensure that C<pv> was actually allocated
+with C<rcpv_new()>, 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<char *> pointer which was created
+with a call to C<rcpv_new()>. Same as calling rcpv_free().
+No checks are performed to ensure that C<pv> was actually allocated
+with C<rcpv_new()>, 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<rcpv_new()>.
+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<pv> was actually allocated
+with C<rcpv_new()>, 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<p>, 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<p>, 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<p>, 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<cop> 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<for ('a'..'z')> */
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<perlcall/LIGHTWEIGHT CALLBACKS>.
-=for apidoc Ams||PUSH_MULTICALL|CV* the_cv
+=for apidoc Am;||PUSH_MULTICALL|CV* the_cv
Opening bracket for a lightweight callback.
See L<perlcall/LIGHTWEIGHT CALLBACKS>.
-=for apidoc Amns||MULTICALL
+=for apidoc Amn;||MULTICALL
Make a lightweight callback. See L<perlcall/LIGHTWEIGHT CALLBACKS>.
-=for apidoc Amns||POP_MULTICALL
+=for apidoc Amn;||POP_MULTICALL
Closing bracket for a lightweight callback.
See L<perlcall/LIGHTWEIGHT CALLBACKS>.
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<perlguts/Autoloading with XSUBs>.
# 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<perlguts/Autoloading with XSUBs>.
: 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<perlguts/Autoloading with XSUBs>.
#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<perlguts/Autoloading with XSUBs>.
#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<perlguts/Autoloading with XSUBs>.
#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<perlguts/Autoloading with XSUBs>.
#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<CvXSUBANY(cv).any_sv> member contains an SV
+pointer whose reference count should be decremented when the CV itself is
+freed. In addition, C<cv_clone()> will increment the reference count, and
+C<sv_dup()> will duplicate the entire pointed-to SV if this flag is set.
+
+Any CV that wraps an XSUB has an C<ANY> 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<any_sv> 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<CvREFCOUNTED_ANYSV> flag.
+
+=for apidoc m|void|CvREFCOUNTED_ANYSV_off|CV *cv
+
+Helper macro to turn off the C<CvREFCOUNTED_ANYSV> 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) : "<null>";
const char* const display_file = file ? file : "<free>";
- 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<perlfunc/C<close>>.
+
+C<gv> is the glob associated with the stream.
+
+C<is_explict> is C<true> if this is an explicit close of the stream; C<false>
+if it is part of another operation, such as closing a pipe (which involves
+implicitly closing both ends).
+
+Returns C<true> if successful; otherwise returns C<false> and sets C<errno> 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<PERL_PV_ESCAPE_NOCLEAR> is set this will not occur.
-If C<PERL_PV_ESCAPE_UNI> is set then the input string is treated as UTF-8
-if C<PERL_PV_ESCAPE_UNI_DETECT> is set then the input string is scanned
+If C<PERL_PV_ESCAPE_UNI> is set then the input string is treated as UTF-8.
+If C<PERL_PV_ESCAPE_UNI_DETECT> is set then the input string is scanned
using C<is_utf8_string()> to determine if it is UTF-8.
If C<PERL_PV_ESCAPE_ALL> is set then all input chars will be output
-using C<\x01F1> style escapes, otherwise if C<PERL_PV_ESCAPE_NONASCII> 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<PERL_PV_ESCAPE_NOBACKSLASH>
-then all chars below 255 will be treated as printable and
-will be output as literals.
+using C<\x01F1> style escapes, otherwise if C<PERL_PV_ESCAPE_NONASCII>
+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<PERL_PV_ESCAPE_NOBACKSLASH> then all chars below 255 will be
+treated as printable and will be output as literals. The
+C<PERL_PV_ESCAPE_NON_WC> 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<PERL_PV_ESCAPE_FIRSTCHAR> 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<PERL_PV_ESCAPE_RE> 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<PERL_PV_ESCAPE_RE> 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<dsv>.
@@ -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<STDERR> filehandle.
-For an example of its output, see L<Devel::Peek>.
+For an example of its output, see L<Devel::Peek>. 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<av_dump()> or C<hv_dump()>.
+
+=for apidoc sv_dump_depth
+
+Dumps the contents of an SV to the C<STDERR> 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<STDERR> 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<STDERR> 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</gv_fetchmeth_pvn>, 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<name>, containing a defined subroutine,
+returning the GV of that glob if found, or C<NULL> if not.
+
+C<stash> is always searched (first), unless it is C<NULL>.
+
+If C<stash> is NULL, or was searched but nothing was found in it, and the
+C<GV_SUPER> bit is set in C<flags>, stashes accessible via C<@ISA> are searched
+next. Searching is conducted according to L<C<MRO> order|perlmroapi>.
+
+Finally, if no matches were found so far, and the C<GV_NOUNIVERSAL> flag in
+C<flags> is not set, C<UNIVERSAL::> is searched.
+
+The argument C<level> 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<name> in C<stash>, creating one if necessary.
+The subroutine slot in the glob will be set to any subroutine found in the
+C<stash> and C<SUPER::> search, hence caching any C<SUPER::> result. Note that
+subroutines found in C<UNIVERSAL::> 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<call_sv>, 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<GvCV> macro.
+
+The only other significant value for C<flags> is C<SVf_UTF8>, indicating that
+C<name> is to be treated as being encoded in UTF-8.
+
+Plain C<gv_fetchmeth> lacks a C<flags> parameter, hence always searches in
+C<stash>, then C<UNIVERSAL::>, and C<name> is never UTF-8. Otherwise it is
+exactly like C<gv_fetchmeth_pvn>.
+
+The other forms do have a C<flags> parameter, and differ only in how the glob
+name is specified.
+
+In C<gv_fetchmeth_pv>, C<name> is a C language NUL-terminated string.
+
+In C<gv_fetchmeth_pvn>, C<name> points to the first byte of the name, and an
+additional parameter, C<len>, specifies its length in bytes. Hence, the name
+may contain embedded-NUL characters.
+
+In C<gv_fetchmeth_sv>, C<*name> is an SV, and the name is the PV extracted from
+that, using L</C<SvPV>>. If the SV is marked as being in UTF-8, the extracted
+PV will also be.
-=for apidoc gv_fetchmeth_sv
-
-Exactly like L</gv_fetchmeth_pvn>, 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</gv_fetchmeth_pvn>, 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<name> and a defined subroutine or
-C<NULL>. The glob lives in the given C<stash>, or in the stashes
-accessible via C<@ISA> and C<UNIVERSAL::>.
-
-The argument C<level> should be either 0 or -1. If C<level==0>, as a
-side-effect creates a glob with the given C<name> in the given C<stash>
-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<flags> are C<GV_SUPER>, C<GV_NOUNIVERSAL>, and
-C<SVf_UTF8>.
-
-C<GV_SUPER> indicates that we want to look up the method in the superclasses
-of the C<stash>.
-
-C<GV_NOUNIVERSAL> indicates that we do not want to look up the method in
-the stash accessible by C<UNIVERSAL::>.
-
-The
-GV returned from C<gv_fetchmeth> may be a method cache entry, which is not
-visible to Perl code. So when calling C<call_sv>, 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<GvCV> 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<AUTOLOAD> method, returning NULL if not found, or
+else returning a pointer to its GV, while setting the package
+L<C<$AUTOLOAD>|perlobj/AUTOLOAD> variable to C<name> (fully qualified). Also,
+if found and the GV's CV is an XSUB, the CV's PV will be set to C<name>, and
+its stash will be set to the stash of the GV.
+
+Searching is done in L<C<MRO> order|perlmroapi>, as specified in
+L</C<gv_fetchmeth>>, beginning with C<stash> if it isn't NULL.
+
+The forms differ only in how C<name> is specified.
+
+In C<gv_autoload_pv>, C<namepv> is a C language NUL-terminated string.
+
+In C<gv_autoload_pvn>, C<name> points to the first byte of the name, and an
+additional parameter, C<len>, specifies its length in bytes. Hence, C<*name>
+may contain embedded-NUL characters.
+
+In C<gv_autoload_sv>, C<*namesv> is an SV, and the name is the PV extracted
+from that using L</C<SvPV>>. 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<gv_fetchsv> 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<gv> into C<sv>. The C<gv_e*> forms return
instead the effective package name (see L</HvENAME>).
@@ -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<sv> to see if the overloaded (active magic) operation C<method>
+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<method> is an integer enum, one of the values found in F<overload.h>,
+for instance C<string_amg>.
+
+C<flags> 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<gv> to C<name> which is C<len> bytes long. Thus it may
+contain embedded NUL characters.
+
+If C<flags> contains C<SVf_UTF8>, 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<L</gv_autoload_pvn>>.
=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<MUTABLE_I<*>>() 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<MUTABLE_PTR> 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 C<I<*>V_FROM_REF> macros extract the C<SvRV()> 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<ref> 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 <stdbool.h>
#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<hv_fetch>, but takes a literal string instead of a
string/length pair.
-
-=for apidoc Am|SV**|hv_stores|HV* tb|"key"|SV* val
-Like C<hv_store>, 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<l1> gives the number of bytes in C<s1>
Returns true or false.
=for apidoc Am|bool|memCHRs|"list"|char c
-Returns the position of the first occurence of the byte C<c> in the literal
+Returns the position of the first occurrence of the byte C<c> in the literal
string C<"list">, or NULL if C<c> doesn't appear in C<"list">. All bytes are
treated as unsigned char. Thus this macro can be used to determine if C<c> is
in a set of particular characters. Unlike L<strchr(3)>, it works even if C<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<m/[[:alpha:]]/>.
See the L<top of this section|/Character classification> 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<m/[[:alnum:]]/>.
See the L<top of this section|/Character classification> for an explanation of
the variants.
-A (discouraged from use) synonym is C<isALNUMC> (where the C<C> suffix means
-this corresponds to the C language alphanumeric definition). Also
-there are the variants
-C<isALNUMC_A>, C<isALNUMC_L1>
-C<isALNUMC_LC>, and C<isALNUMC_LC_uvchr>.
+=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</C<isALPHANUMERIC>>.
+That is, each returns a boolean indicating whether the specified character is
+one of C<[A-Za-z0-9]>, analogous to C<m/[[:alnum:]]/>.
+
+The C<C> suffix in the names was meant to indicate that they correspond to the
+C language L<C<isalnum(3)>>.
=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<m/[[:ascii:]]/>.
On non-ASCII platforms, it returns TRUE iff this
@@ -884,13 +910,13 @@ C<isASCII_utf8_safe> 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<m/[[:blank:]]/>.
See the L<top of this section|/Character classification> 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<m/[[:cntrl:]]/>.
@@ -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<m/[[:digit:]]/>.
@@ -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<m/[[:graph:]]/>.
See the L<top of this section|/Character classification> 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<m/[[:lower:]]/>.
See the L<top of this section|/Character classification> for an explanation of
@@ -970,13 +996,13 @@ C<isOCTAL>.
=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<m/[[:punct:]]/>.
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<m/\s/> 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<isSPACE()> 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<m/[[:upper:]]/>.
See the L<top of this section|/Character classification> 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<m/[[:print:]]/>.
See the L<top of this section|/Character classification> 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<m/\w/> and C<m/[[:word:]]/> 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<isALNUM()> 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<top of this section|/Character classification> for an explanation of
the variants.
+
C<isWORDCHAR_A>, C<isWORDCHAR_L1>, C<isWORDCHAR_uvchr>,
C<isWORDCHAR_LC>, C<isWORDCHAR_LC_uvchr>, C<isWORDCHAR_LC_utf8>, and
C<isWORDCHAR_LC_utf8_safe> 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</C<isWORDCHAR>>
+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</C<isALPHANUMERIC>>
+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<isXDIGIT_A()>
and C<isXDIGIT_L1()> are identical to C<isXDIGIT()>.
@@ -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<XID_Start>. 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<XID_Continue>. 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</i> 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 <HIGHEST_REGCOMP_DOT_H_SYNC_> 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<CopyD> is like C<Copy> but returns C<d
for encouraging compilers to tail-call
optimise.
+=for apidoc Am|void |NewCopy |void* src|void* dest|int nitems|type
+Combines Newx() and Copy() into a single macro. Dest will be allocated
+using Newx() and then src will be copied into it.
+
=for apidoc Am|void |Zero |void* dest|int nitems|type
=for apidoc_item |void *|ZeroD|void* dest|int nitems|type
@@ -2639,6 +2730,7 @@ PoisonWith(0xEF) for catching access to
* max(n) * sizeof(t) > 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<message> argument must
+be a C string. The string " is deprecated" will automatically be added
+to the end of the C<message>.
+
+=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<when> and
+C<message> arguments must be a C string. The C<when> 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<message
+" is deprecated, and will disappear in Perl " when> which is why C<message>
+and C<when> 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<when>
+and C<message> arguments must be a C string. The C<when> 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<message " is
+deprecated, and will become fatal in Perl " when> which is why C<message>
+and C<when> 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<key> and the
-absolute value of C<klen> is the length of the key. If C<klen> is
-negative the key is assumed to be in UTF-8-encoded Unicode. The
-C<hash> parameter is the precomputed hash value; if it is zero then
-Perl will compute it.
+These each store SV C<val> with the specified key in hash C<hv>, 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<SV*>.
-The return value will be
-C<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<SV*>. Note that the caller is
+They differ only in how the hash key is specified.
+
+In C<hv_stores>, the key is a C language string literal, enclosed in double
+quotes. It is never treated as being in UTF-8.
+
+In C<hv_store>, C<key> 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<klen>. A NULL key indicates the key is to be
+treated as C<undef>, and C<klen> is ignored; otherwise the key string may
+contain embedded-NUL bytes. If C<klen> is negative, the string is treated as
+being encoded in UTF-8; otherwise not.
+
+C<hv_store> has another extra parameter, C<hash>, a precomputed hash of the key
+string, or zero if it has not been precomputed. This parameter is omitted from
+C<hv_stores>, as it is computed automatically at compile time.
+
+If <hv> is NULL, NULL is returned and no action is taken.
+
+If C<val> is NULL, it is treated as being C<undef>; otherwise the caller is
responsible for suitably incrementing the reference count of C<val> before
the call, and decrementing it if the function returned C<NULL>. Effectively
a successful C<hv_store> takes ownership of one reference to C<val>. 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<hv_store>
will own the only reference to the new SV, and your code doesn't need to do
-anything further to tidy up. C<hv_store> is not implemented as a call to
-C<hv_store_ent>, and does not create a temporary SV for the key, so if your
-key data is not already in SV form then use C<hv_store> in preference to
-C<hv_store_ent>.
+anything further to tidy up.
+
+C<hv_store> is not implemented as a call to L</C<hv_store_ent>>, and does not
+create a temporary SV for the key, so if your key data is not already in SV
+form then use C<hv_store> in preference to C<hv_store_ent>.
See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> 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<hv> so it has at least C<newmax> 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<hv> to the specified name.
+
+They differ only in how the name is specified.
+
+In C<hv_name_sets>, the name is a literal C string, enclosed in double quotes.
+
+In C<hv_name_set>, C<name> points to the first byte of the name, and an
+additional parameter, C<len>, specifies its length in bytes. Hence, the name
+may contain embedded-NUL characters.
+
+If C<SVf_UTF8> is set in C<flags>, the name is treated as being in UTF-8;
+otherwise not.
+
+If C<HV_NAME_SETALL> is set in C<flags>, 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<L</CopLABEL_len_flags>>;
or if you don't need to know if the label is UTF-8 or not, the macro
C<L</CopLABEL_len>>;
-or if you additionally dont need to know the length, C<L</CopLABEL>>.
+or if you additionally don't need to know the length, C<L</CopLABEL>>.
=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<struct xpvhv_aux> extension. Use this to check
+whether it is valid to call C<HvAUX()>.
+
+=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<key> 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<push @myarray, $val;>.
+
+=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<perlapi/C<newAV_alloc_x>>
+and L<perlapi/C<newAV_alloc_xz>>, 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<size> must be at least 1.
+
+The C<zeroflag> 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<sv> 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<sv> 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<L</is_strict_utf8_string_loclen>> 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<L</is_c9strict_utf8_string_loclen>> 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<s> displaced by C<off> characters, either
-forward or backward.
-
-WARNING: do not use the following unless you *know* C<off> is within
-the UTF-8 data pointed to by C<s> *and* that on entry C<s> is aligned
-on the first byte of character or just after the last byte of a character.
+forward (if C<off> is positive) or backward (if negative). C<s> does not need
+to be pointing to the starting byte of a character. If it isn't, one count of
+C<off> 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</utf8_hop_safe> to this one.
+
+Do NOT use this function unless you B<know> C<off> is within
+the UTF-8 data pointed to by C<s> B<and> that on entry C<s> 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<s> displaced by up to C<off> characters,
-forward.
+forward. C<s> does not need to be pointing to the starting byte of a
+character. If it isn't, one count of C<off> will be used up to get to the
+start of the next character.
C<off> 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<s> displaced by up to C<off> characters,
-backward.
+backward. C<s> does not need to be pointing to the starting byte of a
+character. If it isn't, one count of C<off> will be used up to get to that
+start.
C<off> 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<s> displaced by up to C<off> characters,
-either forward or backward.
+either forward or backward. C<s> does not need to be pointing to the starting
+byte of a character. If it isn't, one count of C<off> 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<start>.
@@ -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<type> is
+the opcode, which should be one of C<OP_PADSV>, C<OP_PADAV>, C<OP_PADHV>
+or C<OP_PADCV>. The returned op will have the C<op_targ> field set by
+the C<padix> 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<op_targ> 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<strdup()>. Returns a pointer to a newly allocated
+string which is a duplicate of C<pv>. The size of the string is
+determined by C<strlen()>, which means it may not contain embedded C<NUL>
+characters and must have a trailing C<NUL>. 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<L</Safefree>> function, or
+L<C<SAVEFREEPV>|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<L</savesharedpv>>.
+
+=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<strndup()> would be if it existed. Returns a
+pointer to a newly allocated string which is a duplicate of the first
+C<len> bytes from C<pv>, plus a trailing
+C<NUL> byte. The memory allocated for
+the new string can be freed with the C<Safefree()> 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<L</savesharedpvn>>.
+
+=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<savepv()>/C<savepvn()> which gets the string to duplicate from
+the passed in SV using C<SvPV()>
+
+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<L</savesharedsvpv>>.
+
+=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<savesharedpv()> 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<perlapi/C<PERL_GET_CONTEXT>>, 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<strlcat> if available, or a Perl implementation of it.
+This operates on C C<NUL>-terminated strings.
+
+C<my_strlcat()> appends string C<src> to the end of C<dst>. It will append at
+most S<C<size - strlen(dst) - 1>> characters. It will then C<NUL>-terminate,
+unless C<size> is 0 or the original C<dst> string was longer than C<size> (in
+practice this should not happen as it means that either C<size> is incorrect or
+that C<dst> is not a proper C<NUL>-terminated string).
+
+Note that C<size> is the full size of the destination buffer and
+the result is guaranteed to be C<NUL>-terminated if there is room. Note that
+room for the C<NUL> should be included in C<size>.
+
+The return value is the total length that C<dst> would have if C<size> is
+sufficiently large. Thus it is the initial length of C<dst> plus the length of
+C<src>. If C<size> 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<strlcpy> if available, or a Perl implementation of it.
+This operates on C C<NUL>-terminated strings.
+
+C<my_strlcpy()> copies up to S<C<size - 1>> characters from the string C<src>
+to C<dst>, C<NUL>-terminating the result if C<size> is not 0.
+
+The return value is the total length C<src> would be if the copy completely
+succeeded. If it is larger than C<size>, 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<BUT BEWARE>, 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<SvPV> whe
the returned length, (hence the length is "Not Applicable", which is how this
variable got its name).
+B<BUT BEWARE>, 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<SvPV_nolen> 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<<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_)
#endif /* ASCII/Latin1 */
@@ -271,262 +271,262 @@
&& '\\' == 224 && '[' == 173 && ']' == 189 && '{' == 192 && '}' == 208 \
&& '^' == 95 && '~' == 161 && '!' == 90 && '#' == 123 && '|' == 79 \
&& '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21
-/* 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),
-/* 0x04 U+9C ST */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x05 U+09 HT */ (1U<<_CC_ASCII)|(1U<<_CC_BLANK)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE),
-/* 0x06 U+86 SSA */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x07 U+7F DEL */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x08 U+97 EPA */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x09 U+8D RI */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x0A U+8E SS2 */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 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),
-/* 0x14 U+9D OSC */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x15 U+0A LF */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE)|(1U<<_CC_VERTSPACE),
-/* 0x16 U+08 BS */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x17 U+87 ESA */ (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),
-/* 0x1A U+92 PU2 */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x1B U+8F SS3 */ (1U<<_CC_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),
-/* 0x20 U+80 PAD */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x21 U+81 HOP */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x22 U+82 BPH */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x23 U+83 NBH */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x24 U+84 IND */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x25 U+85 NEL */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE)|(1U<<_CC_VERTSPACE),
-/* 0x26 U+17 ETB */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x27 U+1B ESC */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x28 U+88 HTS */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x29 U+89 HTJ */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x2A U+8A VTS */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x2B U+8B PLD */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x2C U+8C PLU */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x2D U+05 ENQ */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x2E U+06 ACK */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x2F U+07 BEL */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x30 U+90 DCS */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x31 U+91 PU1 */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x32 U+16 SYN */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x33 U+93 STS */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x34 U+94 CCH */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x35 U+95 MW */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x36 U+96 SPA */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x37 U+04 EOT */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x38 U+98 SOS */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x39 U+99 SGC */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x3A U+9A SCI */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x3B U+9B CSI */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x3C U+14 DC4 */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x3D U+15 NAK */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x3E U+9E PM */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x3F U+1A SUB */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x40 U+20 SP */ (1U<<_CC_ASCII)|(1U<<_CC_BLANK)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE),
-/* 0x41 U+A0 NBSP */ (1U<<_CC_BLANK)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE),
-/* 0x42 U+E2 I8=A1 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),
-/* 0x43 U+E4 I8=A2 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),
-/* 0x44 U+E0 I8=A3 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),
-/* 0x45 U+E1 I8=A4 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),
-/* 0x46 U+E3 I8=A5 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),
-/* 0x47 U+E5 I8=A6 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),
-/* 0x48 U+E7 I8=A7 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),
-/* 0x49 U+F1 I8=A8 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),
-/* 0x4A U+A2 I8=A9 CENT */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* 0x4B U+2E '.' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x4C U+3C '<' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x4D U+28 '(' */ (1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x4E U+2B '+' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x4F U+7C '|' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x50 U+26 '&' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x51 U+E9 I8=AA 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),
-/* 0x52 U+EA I8=AB 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),
-/* 0x53 U+EB I8=AC 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),
-/* 0x54 U+E8 I8=AD 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),
-/* 0x55 U+ED I8=AE 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),
-/* 0x56 U+EE I8=AF 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),
-/* 0x57 U+EF I8=B0 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),
-/* 0x58 U+EC I8=B1 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),
-/* 0x59 U+DF I8=B2 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),
-/* 0x5A U+21 '!' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x5B U+24 '$' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x5C U+2A '*' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x5D U+29 ')' */ (1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x5E U+3B ';' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x5F U+5E '^' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x60 U+2D '-' */ (1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x61 U+2F '/' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x62 U+C2 I8=B3 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),
-/* 0x63 U+C4 I8=B4 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),
-/* 0x64 U+C0 I8=B5 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),
-/* 0x65 U+C1 I8=B6 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),
-/* 0x66 U+C3 I8=B7 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),
-/* 0x67 U+C5 I8=B8 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),
-/* 0x68 U+C7 I8=B9 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),
-/* 0x69 U+D1 I8=BA 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),
-/* 0x6A U+A6 I8=BB BROKEN BAR */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* 0x6B U+2C ',' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x6C U+25 '%' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x6D U+5F '_' */ (1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_WORDCHAR),
-/* 0x6E U+3E '>' */ (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<<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_),
+/* 0x04 U+9C ST */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x05 U+09 HT */ (1U<<CC_ASCII_)|(1U<<CC_BLANK_)|(1U<<CC_CNTRL_)|(1U<<CC_MNEMONIC_CNTRL_)|(1U<<CC_QUOTEMETA_)|(1U<<CC_SPACE_),
+/* 0x06 U+86 SSA */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x07 U+7F DEL */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x08 U+97 EPA */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x09 U+8D RI */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x0A U+8E SS2 */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 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_),
+/* 0x14 U+9D OSC */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x15 U+0A LF */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_MNEMONIC_CNTRL_)|(1U<<CC_QUOTEMETA_)|(1U<<CC_SPACE_)|(1U<<CC_VERTSPACE_),
+/* 0x16 U+08 BS */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_MNEMONIC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x17 U+87 ESA */ (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_),
+/* 0x1A U+92 PU2 */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x1B U+8F SS3 */ (1U<<CC_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_),
+/* 0x20 U+80 PAD */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x21 U+81 HOP */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x22 U+82 BPH */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x23 U+83 NBH */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x24 U+84 IND */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x25 U+85 NEL */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_)|(1U<<CC_SPACE_)|(1U<<CC_VERTSPACE_),
+/* 0x26 U+17 ETB */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x27 U+1B ESC */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_MNEMONIC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x28 U+88 HTS */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x29 U+89 HTJ */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x2A U+8A VTS */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x2B U+8B PLD */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x2C U+8C PLU */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x2D U+05 ENQ */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x2E U+06 ACK */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x2F U+07 BEL */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_MNEMONIC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x30 U+90 DCS */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x31 U+91 PU1 */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x32 U+16 SYN */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x33 U+93 STS */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x34 U+94 CCH */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x35 U+95 MW */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x36 U+96 SPA */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x37 U+04 EOT */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x38 U+98 SOS */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x39 U+99 SGC */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x3A U+9A SCI */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x3B U+9B CSI */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x3C U+14 DC4 */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x3D U+15 NAK */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x3E U+9E PM */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x3F U+1A SUB */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x40 U+20 SP */ (1U<<CC_ASCII_)|(1U<<CC_BLANK_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_)|(1U<<CC_SPACE_),
+/* 0x41 U+A0 NBSP */ (1U<<CC_BLANK_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_)|(1U<<CC_SPACE_),
+/* 0x42 U+E2 I8=A1 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_),
+/* 0x43 U+E4 I8=A2 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_),
+/* 0x44 U+E0 I8=A3 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_),
+/* 0x45 U+E1 I8=A4 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_),
+/* 0x46 U+E3 I8=A5 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_),
+/* 0x47 U+E5 I8=A6 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_),
+/* 0x48 U+E7 I8=A7 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_),
+/* 0x49 U+F1 I8=A8 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_),
+/* 0x4A U+A2 I8=A9 CENT */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* 0x4B U+2E '.' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x4C U+3C '<' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x4D U+28 '(' */ (1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x4E U+2B '+' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x4F U+7C '|' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x50 U+26 '&' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x51 U+E9 I8=AA 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_),
+/* 0x52 U+EA I8=AB 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_),
+/* 0x53 U+EB I8=AC 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_),
+/* 0x54 U+E8 I8=AD 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_),
+/* 0x55 U+ED I8=AE 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_),
+/* 0x56 U+EE I8=AF 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_),
+/* 0x57 U+EF I8=B0 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_),
+/* 0x58 U+EC I8=B1 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_),
+/* 0x59 U+DF I8=B2 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_),
+/* 0x5A U+21 '!' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x5B U+24 '$' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x5C U+2A '*' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x5D U+29 ')' */ (1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x5E U+3B ';' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x5F U+5E '^' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x60 U+2D '-' */ (1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x61 U+2F '/' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x62 U+C2 I8=B3 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_),
+/* 0x63 U+C4 I8=B4 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_),
+/* 0x64 U+C0 I8=B5 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_),
+/* 0x65 U+C1 I8=B6 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_),
+/* 0x66 U+C3 I8=B7 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_),
+/* 0x67 U+C5 I8=B8 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_),
+/* 0x68 U+C7 I8=B9 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_),
+/* 0x69 U+D1 I8=BA 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_),
+/* 0x6A U+A6 I8=BB BROKEN BAR */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* 0x6B U+2C ',' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x6C U+25 '%' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x6D U+5F '_' */ (1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_WORDCHAR_),
+/* 0x6E U+3E '>' */ (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_)
#endif /* EBCDIC 1047 */
@@ -534,263 +534,263 @@
&& '\\' == 224 && '[' == 186 && ']' == 187 && '{' == 192 && '}' == 208 \
&& '^' == 176 && '~' == 161 && '!' == 90 && '#' == 123 && '|' == 79 \
&& '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37
-/* 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),
-/* 0x04 U+9C ST */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x05 U+09 HT */ (1U<<_CC_ASCII)|(1U<<_CC_BLANK)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE),
-/* 0x06 U+86 SSA */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x07 U+7F DEL */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x08 U+97 EPA */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x09 U+8D RI */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x0A U+8E SS2 */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 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),
-/* 0x14 U+9D OSC */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x15 U+85 NEL */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE)|(1U<<_CC_VERTSPACE),
-/* 0x16 U+08 BS */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x17 U+87 ESA */ (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),
-/* 0x1A U+92 PU2 */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x1B U+8F SS3 */ (1U<<_CC_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),
-/* 0x20 U+80 PAD */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x21 U+81 HOP */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x22 U+82 BPH */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x23 U+83 NBH */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x24 U+84 IND */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x25 U+0A LF */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE)|(1U<<_CC_VERTSPACE),
-/* 0x26 U+17 ETB */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x27 U+1B ESC */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x28 U+88 HTS */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x29 U+89 HTJ */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x2A U+8A VTS */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x2B U+8B PLD */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x2C U+8C PLU */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x2D U+05 ENQ */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x2E U+06 ACK */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x2F U+07 BEL */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x30 U+90 DCS */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x31 U+91 PU1 */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x32 U+16 SYN */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x33 U+93 STS */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x34 U+94 CCH */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x35 U+95 MW */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x36 U+96 SPA */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x37 U+04 EOT */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x38 U+98 SOS */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x39 U+99 SGC */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x3A U+9A SCI */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x3B U+9B CSI */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x3C U+14 DC4 */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x3D U+15 NAK */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x3E U+9E PM */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x3F U+1A SUB */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA),
-/* 0x40 U+20 SP */ (1U<<_CC_ASCII)|(1U<<_CC_BLANK)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE),
-/* 0x41 U+A0 NBSP */ (1U<<_CC_BLANK)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE),
-/* 0x42 U+E2 I8=A1 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),
-/* 0x43 U+E4 I8=A2 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),
-/* 0x44 U+E0 I8=A3 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),
-/* 0x45 U+E1 I8=A4 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),
-/* 0x46 U+E3 I8=A5 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),
-/* 0x47 U+E5 I8=A6 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),
-/* 0x48 U+E7 I8=A7 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),
-/* 0x49 U+F1 I8=A8 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),
-/* 0x4A U+A2 I8=A9 CENT */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* 0x4B U+2E '.' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x4C U+3C '<' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x4D U+28 '(' */ (1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x4E U+2B '+' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x4F U+7C '|' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x50 U+26 '&' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x51 U+E9 I8=AA 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),
-/* 0x52 U+EA I8=AB 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),
-/* 0x53 U+EB I8=AC 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),
-/* 0x54 U+E8 I8=AD 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),
-/* 0x55 U+ED I8=AE 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),
-/* 0x56 U+EE I8=AF 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),
-/* 0x57 U+EF I8=B0 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),
-/* 0x58 U+EC I8=B1 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),
-/* 0x59 U+DF I8=B2 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),
-/* 0x5A U+21 '!' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x5B U+24 '$' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x5C U+2A '*' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x5D U+29 ')' */ (1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x5E U+3B ';' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x5F U+AC I8=B3 NOT */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* 0x60 U+2D '-' */ (1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x61 U+2F '/' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x62 U+C2 I8=B4 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),
-/* 0x63 U+C4 I8=B5 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),
-/* 0x64 U+C0 I8=B6 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),
-/* 0x65 U+C1 I8=B7 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),
-/* 0x66 U+C3 I8=B8 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),
-/* 0x67 U+C5 I8=B9 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),
-/* 0x68 U+C7 I8=BA 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),
-/* 0x69 U+D1 I8=BB 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),
-/* 0x6A U+A6 I8=BC BROKEN BAR */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA),
-/* 0x6B U+2C ',' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x6C U+25 '%' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA),
-/* 0x6D U+5F '_' */ (1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_WORDCHAR),
-/* 0x6E U+3E '>' */ (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<<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_),
+/* 0x04 U+9C ST */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x05 U+09 HT */ (1U<<CC_ASCII_)|(1U<<CC_BLANK_)|(1U<<CC_CNTRL_)|(1U<<CC_MNEMONIC_CNTRL_)|(1U<<CC_QUOTEMETA_)|(1U<<CC_SPACE_),
+/* 0x06 U+86 SSA */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x07 U+7F DEL */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x08 U+97 EPA */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x09 U+8D RI */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x0A U+8E SS2 */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 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_),
+/* 0x14 U+9D OSC */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x15 U+85 NEL */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_)|(1U<<CC_SPACE_)|(1U<<CC_VERTSPACE_),
+/* 0x16 U+08 BS */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_MNEMONIC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x17 U+87 ESA */ (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_),
+/* 0x1A U+92 PU2 */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x1B U+8F SS3 */ (1U<<CC_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_),
+/* 0x20 U+80 PAD */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x21 U+81 HOP */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x22 U+82 BPH */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x23 U+83 NBH */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x24 U+84 IND */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x25 U+0A LF */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_MNEMONIC_CNTRL_)|(1U<<CC_QUOTEMETA_)|(1U<<CC_SPACE_)|(1U<<CC_VERTSPACE_),
+/* 0x26 U+17 ETB */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x27 U+1B ESC */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_MNEMONIC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x28 U+88 HTS */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x29 U+89 HTJ */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x2A U+8A VTS */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x2B U+8B PLD */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x2C U+8C PLU */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x2D U+05 ENQ */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x2E U+06 ACK */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x2F U+07 BEL */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_MNEMONIC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x30 U+90 DCS */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x31 U+91 PU1 */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x32 U+16 SYN */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x33 U+93 STS */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x34 U+94 CCH */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x35 U+95 MW */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x36 U+96 SPA */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x37 U+04 EOT */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x38 U+98 SOS */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x39 U+99 SGC */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x3A U+9A SCI */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x3B U+9B CSI */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x3C U+14 DC4 */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x3D U+15 NAK */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x3E U+9E PM */ (1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x3F U+1A SUB */ (1U<<CC_ASCII_)|(1U<<CC_CNTRL_)|(1U<<CC_QUOTEMETA_),
+/* 0x40 U+20 SP */ (1U<<CC_ASCII_)|(1U<<CC_BLANK_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_)|(1U<<CC_SPACE_),
+/* 0x41 U+A0 NBSP */ (1U<<CC_BLANK_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_)|(1U<<CC_SPACE_),
+/* 0x42 U+E2 I8=A1 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_),
+/* 0x43 U+E4 I8=A2 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_),
+/* 0x44 U+E0 I8=A3 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_),
+/* 0x45 U+E1 I8=A4 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_),
+/* 0x46 U+E3 I8=A5 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_),
+/* 0x47 U+E5 I8=A6 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_),
+/* 0x48 U+E7 I8=A7 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_),
+/* 0x49 U+F1 I8=A8 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_),
+/* 0x4A U+A2 I8=A9 CENT */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* 0x4B U+2E '.' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x4C U+3C '<' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x4D U+28 '(' */ (1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x4E U+2B '+' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x4F U+7C '|' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x50 U+26 '&' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x51 U+E9 I8=AA 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_),
+/* 0x52 U+EA I8=AB 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_),
+/* 0x53 U+EB I8=AC 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_),
+/* 0x54 U+E8 I8=AD 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_),
+/* 0x55 U+ED I8=AE 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_),
+/* 0x56 U+EE I8=AF 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_),
+/* 0x57 U+EF I8=B0 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_),
+/* 0x58 U+EC I8=B1 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_),
+/* 0x59 U+DF I8=B2 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_),
+/* 0x5A U+21 '!' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x5B U+24 '$' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x5C U+2A '*' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x5D U+29 ')' */ (1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x5E U+3B ';' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x5F U+AC I8=B3 NOT */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* 0x60 U+2D '-' */ (1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x61 U+2F '/' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x62 U+C2 I8=B4 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_),
+/* 0x63 U+C4 I8=B5 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_),
+/* 0x64 U+C0 I8=B6 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_),
+/* 0x65 U+C1 I8=B7 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_),
+/* 0x66 U+C3 I8=B8 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_),
+/* 0x67 U+C5 I8=B9 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_),
+/* 0x68 U+C7 I8=BA 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_),
+/* 0x69 U+D1 I8=BB 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_),
+/* 0x6A U+A6 I8=BC BROKEN BAR */ (1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_QUOTEMETA_),
+/* 0x6B U+2C ',' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x6C U+25 '%' */ (1U<<CC_ASCII_)|(1U<<CC_GRAPH_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_QUOTEMETA_),
+/* 0x6D U+5F '_' */ (1U<<CC_ASCII_)|(1U<<CC_CHARNAME_CONT_)|(1U<<CC_GRAPH_)|(1U<<CC_IDFIRST_)|(1U<<CC_PRINT_)|(1U<<CC_PUNCT_)|(1U<<CC_WORDCHAR_),
+/* 0x6E U+3E '>' */ (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_)
#endif /* EBCDIC 037 */
-/* ex: set ro: */
+/* ex: set ro ft=c: */
Index: gnu/usr.bin/perl/locale.c
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/locale.c,v
diff -u -p -a -u -p -r1.9 locale.c
--- gnu/usr.bin/perl/locale.c 15 Feb 2023 01:36:13 -0000 1.9
+++ gnu/usr.bin/perl/locale.c 21 Feb 2024 15:47:02 -0000
@@ -38,14 +38,113 @@
* it would be possible to emulate thread-safe locales, but this likely would
* involve a lot of locale switching, and would require XS code changes.
* Macros could be written so that the code wouldn't have to know which type of
- * system is being used. It's unlikely that we would ever do that, since most
- * modern systems support thread-safe locales, but there was code written to
- * this end, and is retained, #ifdef'd out.
+ * system is being used.
+ *
+ * Table-driven code is used for simplicity and clarity, as many operations
+ * differ only in which category is being worked on. However the system
+ * categories need not be small contiguous integers, so do not lend themselves
+ * to table lookup. Instead we have created our own equivalent values which
+ * are all small contiguous non-negative integers, and translation functions
+ * between the two sets. For category 'LC_foo', the name of our index is
+ * LC_foo_INDEX_. Various parallel tables, indexed by these, are used.
+ *
+ * Many of the macros and functions in this file have one of the suffixes '_c',
+ * '_r', or '_i'. khw found these useful in remembering what type of locale
+ * category to use as their parameter. '_r' takes an int category number as
+ * passed to setlocale(), like LC_ALL, LC_CTYPE, etc. The 'r' indicates that
+ * the value isn't known until runtime. '_c' also indicates such a category
+ * number, but its value is known at compile time. These are both converted
+ * into unsigned indexes into various tables of category information, where the
+ * real work is generally done. The tables are generated at compile-time based
+ * on platform characteristics and Configure options. They hide from the code
+ * many of the vagaries of the different locale implementations out there. You
+ * may have already guessed that '_i' indicates the parameter is such an
+ * unsigned index. Converting from '_r' to '_i' requires run-time lookup.
+ * '_c' is used to get cpp to do this at compile time. To avoid the runtime
+ * expense, the code is structured to use '_r' at the API level, and once
+ * converted, everything possible is done using the table indexes.
+ *
+ * On unthreaded perls, most operations expand out to just the basic
+ * setlocale() calls. The same is true on threaded perls on modern Windows
+ * systems where the same API, after set up, is used for thread-safe locale
+ * handling. On other systems, there is a completely different API, specified
+ * in POSIX 2008, to do thread-safe locales. On these systems, our
+ * emulate_setlocale_i() function is used to hide the different API from the
+ * outside. This makes it completely transparent to most XS code.
+ *
+ * A huge complicating factor is that the LC_NUMERIC category is normally held
+ * in the C locale, except during those relatively rare times when it needs to
+ * be in the underlying locale. There is a bunch of code to accomplish this,
+ * and to allow easy switches from one state to the other.
+ *
+ * In addition, the setlocale equivalents have versions for the return context,
+ * 'void' and 'bool', besides the full return value. This can present
+ * opportunities for avoiding work. We don't have to necessarily create a safe
+ * copy to return if no return is desired.
+ *
+ * There are 3.5 major implementations here; which one chosen depends on what
+ * the platform has available, and Configuration options.
+ *
+ * 1) Raw my_setlocale(). Here the layer adds nothing. This is used for
+ * unthreaded perls, and when the API for safe locale threading is identical
+ * to the unsafe API (Windows, currently).
+ *
+ * 2) A minimal layer that makes my_setlocale() uninterruptible and returns a
+ * per-thread/per-category value.
+ *
+ * 3a and 3b) A layer that implements POSIX 2008 thread-safe locale handling,
+ * mapping the setlocale() API to them. This automatically makes almost all
+ * code thread-safe without need for changes. This layer is chosen on
+ * threaded perls when the platform supports the POSIX 2008 functions, and
+ * when there is no manual override in Configure.
+ *
+ * 3a) is when the platform has a reliable querylocale() function or
+ * equivalent that is selected to be used.
+ * 3b) is when we have to emulate that functionality.
+ *
+ * z/OS (os390) is an outlier. Locales really don't work under threads when
+ * either the radix character isn't a dot, or attempts are made to change
+ * locales after the first thread is created. The reason is that IBM has made
+ * it thread-safe by refusing to change locales (returning failure if
+ * attempted) any time after an application has called pthread_create() to
+ * create another thread. The expectation is that an application will set up
+ * its locale information before the first fork, and be stable thereafter. But
+ * perl toggles LC_NUMERIC if the locale's radix character isn't a dot, as do
+ * the other toggles, which are less common.
*/
+/* 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. (Must come before #including
+ * perl.h) */
+#ifdef DEBUGGING
+static int debug_initialization = 0;
+# define DEBUG_INITIALIZATION_set(v) (debug_initialization = v)
+# define DEBUG_LOCALE_INITIALIZATION_ debug_initialization
+/* C standards seem to say that __LINE__ is merely "an integer constant",
+ * which means it might be either int, long (with L suffix), or long long
+ * (or their corresponding unsigned type). So, we have to explicitly cast
+ * __LINE__ to a particular integer type to pass it reliably to variadic
+ * functions like (PerlIO_)printf, as below: */
+# ifdef USE_LOCALE_THREADS
+# define DEBUG_PRE_STMTS \
+ dSAVE_ERRNO; dTHX; PerlIO_printf(Perl_debug_log,"\n%s: %" LINE_Tf ": %p: ",\
+ __FILE__, (line_t)__LINE__, aTHX);
+# else
+# define DEBUG_PRE_STMTS \
+ dSAVE_ERRNO; dTHX; PerlIO_printf(Perl_debug_log, "\n%s: %" LINE_Tf ": ", \
+ __FILE__, (line_t)__LINE__);
+# endif
+# define DEBUG_POST_STMTS RESTORE_ERRNO;
+#else
+# define debug_initialization 0
+# define DEBUG_INITIALIZATION_set(v)
+# define DEBUG_PRE_STMTS
+# define DEBUG_POST_STMTS
+#endif
+
#include "EXTERN.h"
#define PERL_IN_LOCALE_C
-#include "perl_langinfo.h"
#include "perl.h"
#include "reentr.h"
@@ -57,27 +156,53 @@
# include <wctype.h>
#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 <libintl.h>
+# 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 <libintl.h>
-# 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<const> (presumably because its API was
updated; it is illegal to change the information C<setlocale> returns; doing
so leads to segfaults.)
-Finally, C<Perl_setlocale> works under all circumstances, whereas plain
-C<setlocale> can be completely ineffective on some platforms under some
-configurations.
+Finally, C<Perl_setlocale> works under all circumstances, whereas plain
+C<setlocale> 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<setlocale()> 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<Perl_setlocale>, 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<Perl_setlocale> 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<localeconv(3)>. It is the same as
+L<POSIX::localeconv|POSIX/localeconv> (returning a hash of the C<localeconv()>
+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<Perl_setlocale> 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<setlocale()> is ineffective, returning the wrong information, and
-failing to actually change the locale. C<Perl_setlocale>, however works
-properly in all circumstances.
+# endif
-The return points to a per-thread static buffer, which is overwritten the next
-time C<Perl_setlocale> 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<L<nl_langinfo(3)>>,
-taking the same C<item> parameter values, and returning the same information.
-But it is more thread-safe than regular C<nl_langinfo()>, and hides the quirks
-of Perl's locale handling from your code, and can be used on systems that lack
-a native C<nl_langinfo>.
+C<Perl_langinfo> is an (almost) drop-in replacement for the system
+C<L<nl_langinfo(3)>>, taking the same C<item> parameter values, and returning
+the same information. But it is more thread-safe than regular
+C<nl_langinfo()>, and hides the quirks of Perl's locale handling from your
+code, and can be used on systems that lack a native C<nl_langinfo>.
+
+However, you should instead use the improved version of this:
+L</Perl_langinfo8>, which behaves identically except for an additional
+parameter, a pointer to a variable declared as L</C<utf8ness_t>>, 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<nl_langinfo()>:
=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<C<const char *>>, whereas plain
-C<nl_langinfo()> returns S<C<char *>>, but you are (only by documentation)
-forbidden to write into the buffer. By declaring this C<const>, the compiler
-enforces this restriction, so if it is violated, you know at compilation time,
-rather than getting segfaults at runtime.
+C<Perl_langinfo8> has an extra parameter, described above. Besides this, the
+other reason they aren't quite a drop-in replacement is actually an advantage.
+The C<const>ness 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<RADIXCHAR> and C<THOUSEP> items,
+They deliver the correct results for the C<RADIXCHAR> and C<THOUSEP> items,
without you having to write extra code. The reason for the extra code would be
because these are from the C<LC_NUMERIC> 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<Perl_langinfo(
(or equivalent) locale would break a lot of CPAN, which is expecting the radix
(decimal point) character to be a dot.)
-=item *
+=item c.
-The system function it replaces can have its static return buffer trashed,
+The system function they replace can have its static return buffer trashed,
not only by a subsequent call to that function, but by a C<freelocale>,
-C<setlocale>, 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<setlocale>, 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<nl_langinfo>, 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<nl_langinfo>, such
+as Windows, hence making your code more portable. Of the fifty-some possible
items specified by the POSIX 2008 standard,
L<http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/langinfo.h.html>,
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<L<localeconv(3)>>, and
C<L<strftime(3)>>, both of which are specified in C89, so should be always be
-available. Later C<strftime()> versions have additional capabilities; C<""> is
-returned for those not available on your system.
+available. Later C<strftime()> 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<localeconv>, the buffer from any previous explicit call to
-C<localeconv> 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<localeconv()> directly anyway, because of
-issues like the ones listed in the second item of this list (above) for
-C<RADIXCHAR> and C<THOUSEP>. You can use the methods given in L<perlcall> to
-call L<POSIX/localeconv> and avoid all the issues, but then you have a hash to
-unpack).
+C<L<localeconv(3)>> will be overwritten. But you shouldn't be using
+C<localeconv> 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</Perl_localeconv>, which is thread-safe; or by using the
+methods given in L<perlcall> to call
+L<C<POSIX::localeconv()>|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<nl_langinfo()> would return are specified in
L<I18N::Langinfo>.
-=back
-
-When using C<Perl_langinfo> on systems that don't have a native
-C<nl_langinfo()>, you must
+When using C<Perl_langinfo8> (or plain C<Perl_langinfo>) on systems that don't
+have a native C<nl_langinfo()>, you must
#include "perl_langinfo.h"
-before the C<perl.h> C<#include>. You can replace your C<langinfo.h>
+before the C<perl.h> C<#include>. You can replace your F<langinfo.h>
C<#include> with this one. (Doing it this way keeps out the symbols that plain
-C<langinfo.h> would try to import into the namespace for code that doesn't need
+F<langinfo.h> would try to import into the namespace for code that doesn't need
it.)
-The original impetus for C<Perl_langinfo()> 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<nl_langinfo> API instead of C<L<localeconv(3)>> which is a
-pain to make thread-friendly. For other fields returned by C<localeconv>, it
-is better to use the methods given in L<perlcall> to call
-L<C<POSIX::localeconv()>|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<LC_TIME> 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<L<setlocale(3)>> 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<L</sync_locale>>. 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<GetNumberFormat> and C<GetCurrencyFormat>; 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<GetNumberFormat> and C<GetCurrencyFormat>); patches
welcome.
-Without this function call, threads that use the L<C<setlocale(3)>> system
-function will not work properly, as all the locale-sensitive functions will
-look at the per-thread locale, and C<setlocale> will have no effect on this
-thread.
-
-Perl code should convert to either call
-L<C<Perl_setlocale>|perlapi/Perl_setlocale> (which is a drop-in for the system
-C<setlocale>) or use the methods given in L<perlcall> to call
+XS code should never call plain C<setlocale>, but should instead be converted
+to either call L<C<Perl_setlocale>|perlapi/Perl_setlocale> (which is a drop-in
+for the system C<setlocale>) or use the methods given in L<perlcall> to call
L<C<POSIX::setlocale>|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<gtk>, that call the system C<setlocale> 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<C<sync_locale()>|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<C<use locale>>.
+
+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<C<Perl_setlocale>|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<perllocale/Multi-threaded operation>). Using the system
-L<C<setlocale(3)>> should be avoided. Nevertheless, certain non-Perl libraries
-called from XS, such as C<Gtk> do so, and this can't be changed. When the
-locale is changed by XS code that didn't use
-L<C<Perl_setlocale>|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<perllocale/Multi-threaded operation>).
+
+Using the libc L<C<setlocale(3)>> 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<L</switch_to_global_locale>>, 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<Gtk> 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<C<Perl_switch_to_global_locale>|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 (<CFG>) {
}
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 <MAP>;
@@ -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 <<EOP;
dll_perlmain=main
fill_extLibpath
Index: gnu/usr.bin/perl/malloc.c
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/malloc.c,v
diff -u -p -a -u -p -r1.20 malloc.c
--- gnu/usr.bin/perl/malloc.c 15 Feb 2023 01:36:13 -0000 1.20
+++ gnu/usr.bin/perl/malloc.c 21 Feb 2024 15:47:02 -0000
@@ -410,25 +410,25 @@ union overhead {
u_int ovu_rmagic; /* range magic number */
#endif
} ovu;
-#define ov_magic ovu.ovu_magic
-#define ov_index ovu.ovu_index
-#define ov_size ovu.ovu_size
-#define ov_rmagic ovu.ovu_rmagic
+#define ov_magic ovu.ovu_magic
+#define ov_index ovu.ovu_index
+#define ov_size ovu.ovu_size
+#define ov_rmagic ovu.ovu_rmagic
};
-#define MAGIC 0xff /* magic # on accounting info */
+#define MAGIC 0xff /* magic # on accounting info */
#define RMAGIC 0x55555555 /* magic # on range info */
#define RMAGIC_C 0x55 /* magic # on range info */
#ifdef RCHECK
-# define RMAGIC_SZ sizeof (u_int) /* Overhead at end of bucket */
+# define RMAGIC_SZ sizeof (u_int) /* Overhead at end of bucket */
# ifdef TWO_POT_OPTIMIZE
# define MAX_SHORT_BUCKET (12 * BUCKETS_PER_POW2) /* size-1 fits in short */
# else
# define MAX_SHORT_BUCKET (13 * BUCKETS_PER_POW2)
# endif
#else
-# define RMAGIC_SZ 0
+# define RMAGIC_SZ 0
#endif
#if !defined(PACK_MALLOC) && defined(BUCKETS_ROOT2)
@@ -583,7 +583,7 @@ static const u_short buck_size[MAX_BUCKE
*
* This allows for an additional optimization: the above scheme leads
* to giant overheads for sizes 128 or more (one whole chunk needs to
- * be sacrifised to keep INDEX). Instead we use chunks not of size
+ * be sacrificed to keep INDEX). Instead we use chunks not of size
* 2^k, but of size 2^k-ALIGN. If we pack these chunks at the end of
* the arena, then the beginnings are still in different 2^k-long
* sections of the arena if k>=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<SvIVx> 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<SvUVx> 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<SvNVx> 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<SvPV_nolen> macro instead
-=for apidoc_section $SV
-=for apidoc sv_pvn
-
-A private implementation of the C<SvPV> 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<SvPVbyte_nolen> instead.
-=for apidoc sv_pvbyten
-
-A private implementation of the C<SvPVbyte> 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<SvPVutf8_nolen> macro instead
-=for apidoc sv_pvutf8n
-
-A private implementation of the C<SvPVutf8> 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<unpack()> Perl function. Note: parameters C<strbeg>,
-C<new_s> and C<ocnt> are not used. This call should not be used, use
-C<unpackstring> 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<pack()> Perl function. Note: parameters
-C<next_in_list> and C<flags> are not used. This call should not be used; use
-C<L</packlist>> 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<OP_NAME>
-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<OP_DESC> 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</isUTF8_CHAR>
-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</utf8_to_uvuni_buf>(), but should only be called when it is known that
- * there are no malformations in the input UTF-8 string C<s>. 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</utf8_to_uvuni_buf> for alternatives.
+of any interest to you.
If C<s> points to one of the detected malformations, and UTF8 warnings are
enabled, zero is returned and C<*retlen> is set (if C<retlen> 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<po> 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<NULL> is returned.
-
-Use L<perlintern/C<PAD_COMPNAME_TYPE>> 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<perlapi/uvchr_to_utf8> or
-L<perlapi/uvchr_to_utf8_flags>.
-
-This function is a deprecated synonym for L</uvoffuni_to_utf8_flags>,
-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<SVt_PVMG>. See C<L</sv_magic>>.
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<sv>. 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<sv> is a C<PVMG> or
-higher. Use C<sv_len()> 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<perlmroapi>.
#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<level> 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<mro_get_linear_isa_dfs> 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<SvREFCNT_inc()> 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, C<mro::method_changed_in(classname)
void
Perl_mro_method_changed_in(pTHX_ HV *stash)
{
- const char * const stashname = HvENAME_get(stash);
- const STRLEN stashname_len = HvENAMELEN_get(stash);
-
- SV ** const svp = hv_fetchhek(PL_isarev, HvENAME_HEK(stash), 0);
- HV * const isarev = svp ? MUTABLE_HV(*svp) : NULL;
-
PERL_ARGS_ASSERT_MRO_METHOD_CHANGED_IN;
+ const char * const stashname = HvENAME_get(stash);
+
if(!stashname)
Perl_croak(aTHX_ "Can't call mro_method_changed_in() on anonymous symbol table");
+
+ const STRLEN stashname_len = HvENAMELEN_get(stash);
+
+ SV ** const svp = hv_fetchhek(PL_isarev, HvENAME_HEK_NN(stash), 0);
+ HV * const isarev = svp ? MUTABLE_HV(*svp) : NULL;
/* Inc the package generation, since a local method changed */
HvMROMETA(stash)->pkg_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<pv> that is looked at by this function (by
-passing a non-NULL C<endptr>), and if the intial bytes of that portion form a
+passing a non-NULL C<endptr>), 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<pv> must be valid in order for TRUE to be returned. C<*endptr> is
@@ -1492,7 +1492,7 @@ N.B. C<s> 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<OPf_KIDS> set is expected to have a valid
+C<op_first> pointer. If you are attempting to free an op but preserve its
+child op, make sure to clear that flag before calling C<op_free()>. 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<name>, and the key to access
+it is given by the C<SVOP_sv> of the C<OP_CONST> op given by C<o>.
+C<is_hash> selects whether it prints using {KEY} or [KEY] brackets.
+
+C<is_slice> 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 .= <FOO> 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<type> represents the context type, roughly based on the type of op that
+would do the modifying, although C<local()> is represented by C<OP_NULL>,
+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<OP_ADD> and a C<type> argument of C<OP_SASSIGN>.
- /* 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 C<ck_>xxx 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<use attributes $pkg,$rv,@attrs> */
+
+#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<use> 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<attrstr> and
+C<len> arguments to the subroutine identified by the C<cv> argument which
+is expected to be associated with the package identified by the C<stashpv>
+argument (see L<attributes>). It gets this wrong, though, in that it
+does not correctly identify the boundaries of the individual attribute
+specifications within C<attrstr>. 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<ATTRS:> keyword from F<xsubpp>.) 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<type> represents the context type, roughly based on the type of op that
-would do the modifying, although C<local()> is represented by C<OP_NULL>,
-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<OP_ADD> and a C<type> argument of C<OP_SASSIGN>.
+ 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<my Dog $spot> 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<enter>/C<leave> pair, but a C<scope> 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<block_end>.
- 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<floor>
+is the savestack index returned by
+C<block_start>, and C<seq> 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<perlguts/"Compile-time scope hooks">.
- 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<use attributes $pkg,$rv,@attrs> */
+ 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<use> 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<attrstr> and
-C<len> arguments to the subroutine identified by the C<cv> argument which
-is expected to be associated with the package identified by the C<stashpv>
-argument (see L<attributes>). It gets this wrong, though, in that it
-does not correctly identify the boundaries of the individual attribute
-specifications within C<attrstr>. 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<ATTRS:> keyword from F<xsubpp>.) 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<my Dog $spot> 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<enter>/C<leave> pair, but a C<scope> 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<block_end>.
+Checks an optree that implements a block, to ensure there are no control-flow
+ops that attempt to leave the block. Any C<OP_RETURN> is forbidden, as is any
+C<OP_GOTO>. Loops are analysed, so any LOOPEX op (C<OP_NEXT>, C<OP_LAST> or
+C<OP_REDO>) 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<goto>, 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<all> C<OP_GOTO> 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<floor>
-is the savestack index returned by
-C<block_start>, and C<seq> 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<first> is the list-type op,
+and C<last> is the op to append to the list. C<optype> specifies the
+intended opcode for the list. If C<first> is not already a list of the
+right type, it will be upgraded into one. If either C<first> or C<last>
+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<perlguts/"Compile-time scope hooks">.
+Concatenate the lists of ops contained directly within two list-type ops,
+returning the combined list. C<first> and C<last> are the list-type ops
+to concatenate. C<optype> specifies the intended opcode for the list.
+If either C<first> or C<last> is not already a list of the right type,
+it will be upgraded into one. If either C<first> or C<last> 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<first> is the op to prepend to the
+list, and C<last> is the list-type op. C<optype> specifies the intended
+opcode for the list. If C<last> is not already a list of the right type,
+it will be upgraded into one. If either C<first> or C<last> 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<o> into a list op if it is not one already, and then converts it
+into the specified C<type>, 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<newLISTOP>,
+C<op_prepend_elem> and C<op_append_elem>. Then finally it is passed to
+C<op_convert_list> 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<stub> 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<OP_LIST> if it is not already. If
+a new C<OP_LIST> op was created, its first child will be C<OP_PUSHMARK>.
+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<type> is
+the opcode. C<flags> gives the eight bits of C<op_flags>, except that
+C<OPf_KIDS> will be set automatically if required. C<first> and C<last>
+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<newLISTOP(OP_JOIN, ...)> (e.g.) is not
+appropriate. What you want to do in that case is create an op of type
+C<OP_LIST>, append more children to it, and then call L</op_convert_list>.
+See L</op_convert_list> 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<type> is the opcode. C<flags> gives the
+eight bits of C<op_flags>, and, shifted up eight bits, the eight bits
+of C<op_private>.
+
+=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<type> is
+the opcode. C<flags> gives the eight bits of C<op_flags>, except that
+C<OPf_KIDS> will be set automatically if required, and, shifted up eight
+bits, the eight bits of C<op_private>, except that the bit with value 1
+is automatically set. C<first> 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<first> is the list-type op,
-and C<last> is the op to append to the list. C<optype> specifies the
-intended opcode for the list. If C<first> is not already a list of the
-right type, it will be upgraded into one. If either C<first> or C<last>
-is null, the other is returned unchanged.
+Similar to C<newUNOP>, but creates an C<UNOP_AUX> struct instead, with C<op_aux>
+initialised to C<aux>
=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<first> and C<last> are the list-type ops
-to concatenate. C<optype> specifies the intended opcode for the list.
-If either C<first> or C<last> is not already a list of the right type,
-it will be upgraded into one. If either C<first> or C<last> is null,
-the other is returned unchanged.
+Constructs, checks, and returns an op of method type with a method name
+evaluated at runtime. C<type> is the opcode. C<flags> gives the eight
+bits of C<op_flags>, except that C<OPf_KIDS> will be set automatically,
+and, shifted up eight bits, the eight bits of C<op_private>, except that
+the bit with value 1 is automatically set. C<dynamic_meth> supplies an
+op which evaluates method name; it is consumed by this function and
+become part of the constructed op tree.
+Supported optypes: C<OP_METHOD>.
=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<first> is the op to prepend to the
-list, and C<last> is the list-type op. C<optype> specifies the intended
-opcode for the list. If C<last> is not already a list of the right type,
-it will be upgraded into one. If either C<first> or C<last> is null,
-the other is returned unchanged.
+Constructs, checks, and returns an op of method type with a constant
+method name. C<type> is the opcode. C<flags> gives the eight bits of
+C<op_flags>, and, shifted up eight bits, the eight bits of
+C<op_private>. C<const_meth> supplies a constant method name;
+it must be a shared COW string.
+Supported optypes: C<OP_METHOD_NAMED>.
=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<o> into a list op if it is not one already, and then converts it
-into the specified C<type>, 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<newLISTOP>,
-C<op_prepend_elem> and C<op_append_elem>. Then finally it is passed to
-C<op_convert_list> to make it the right type.
+Constructs, checks, and returns an op of any binary type. C<type>
+is the opcode. C<flags> gives the eight bits of C<op_flags>, except
+that C<OPf_KIDS> will be set automatically, and, shifted up eight bits,
+the eight bits of C<op_private>, except that the bit with value 1 or
+2 is automatically set as required. C<first> and C<last> 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<stub> 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<type> is
-the opcode. C<flags> gives the eight bits of C<op_flags>, except that
-C<OPf_KIDS> will be set automatically if required. C<first> and C<last>
-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<newLISTOP(OP_JOIN, ...)> (e.g.) is not
-appropriate. What you want to do in that case is create an op of type
-C<OP_LIST>, append more children to it, and then call L</op_convert_list>.
-See L</op_convert_list> 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<type> is the opcode. C<flags> gives the
-eight bits of C<op_flags>, and, shifted up eight bits, the eight bits
-of C<op_private>.
+ 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<type> is
-the opcode. C<flags> gives the eight bits of C<op_flags>, except that
-C<OPf_KIDS> will be set automatically if required, and, shifted up eight
-bits, the eight bits of C<op_private>, except that the bit with value 1
-is automatically set. C<first> 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<newUNOP>, but creates an C<UNOP_AUX> struct instead, with C<op_aux>
-initialised to C<aux>
+ 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<type> is the opcode. C<flags> gives the eight
-bits of C<op_flags>, except that C<OPf_KIDS> will be set automatically,
-and, shifted up eight bits, the eight bits of C<op_private>, except that
-the bit with value 1 is automatically set. C<dynamic_meth> supplies an
-op which evaluates method name; it is consumed by this function and
-become part of the constructed op tree.
-Supported optypes: C<OP_METHOD>.
+ 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<type> is the opcode. C<flags> gives the eight bits of
-C<op_flags>, and, shifted up eight bits, the eight bits of
-C<op_private>. C<const_meth> supplies a constant method name;
-it must be a shared COW string.
-Supported optypes: C<OP_METHOD_NAMED>.
+ /* 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<type>
-is the opcode. C<flags> gives the eight bits of C<op_flags>, except
-that C<OPf_KIDS> will be set automatically, and, shifted up eight bits,
-the eight bits of C<op_private>, except that the bit with value 1 or
-2 is automatically set as required. C<first> and C<last> 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 <cp>. 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 <cp>, 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 <cp>. 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 <cp>, 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<type> is the opcode. C<flags> gives the eight bits of C<op_flags>
+and, shifted up eight bits, the eight bits of C<op_private>.
- 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<type> is the opcode. C<flags> gives the eight bits of C<op_flags>
-and, shifted up eight bits, the eight bits of C<op_private>.
+Constructs, checks, and returns an op of any type that involves an
+embedded SV. C<type> is the opcode. C<flags> gives the eight bits
+of C<op_flags>. C<sv> 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<type> is the opcode. C<flags> gives the
+eight bits of C<op_flags>. A pad slot is automatically allocated, and
+is populated with C<sv>; 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<type> is the opcode. C<flags> gives the
+eight bits of C<op_flags>. C<gv> 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<type> is the opcode. C<flags> gives
+the eight bits of C<op_flags>. C<pv> supplies the C-level pointer.
+Depending on the op type, the memory referenced by C<pv> may be freed
+when the op is destroyed. If the op is of a freeing type, C<pv> must
+have been allocated using C<PerlMemShared_malloc>.
- /* 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<type> is the opcode. C<flags> gives the eight bits
-of C<op_flags>. C<sv> 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<type> is the opcode. C<flags> gives the
-eight bits of C<op_flags>. A pad slot is automatically allocated, and
-is populated with C<sv>; 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<type> is the opcode. C<flags> gives the
-eight bits of C<op_flags>. C<gv> 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<name>.
+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<use Foo::Bar VERSION>. The optional
+trailing arguments can be used to specify arguments to the module's C<import()>
+method, similar to C<use Foo::Bar VERSION LIST>; their precise handling depends
+on the flags. The flags argument is a bitwise-ORed collection of any of
+C<PERL_LOADMOD_DENY>, C<PERL_LOADMOD_NOIMPORT>, or C<PERL_LOADMOD_IMPORT_OPS>
+(or 0 for no flags).
-OP *
-Perl_newGVOP(pTHX_ I32 type, I32 flags, GV *gv)
-{
- PERL_ARGS_ASSERT_NEWGVOP;
+If C<PERL_LOADMOD_NOIMPORT> is set, the module is loaded as if with an empty
+import list, as in C<use Foo::Bar ()>; this is the only circumstance in which
+the trailing optional arguments may be omitted entirely. Otherwise, if
+C<PERL_LOADMOD_IMPORT_OPS> is set, the trailing arguments must consist of
+exactly one C<OP*>, containing the op tree that produces the relevant import
+arguments. Otherwise, the trailing arguments must all be C<SV*> values that
+will be used as import arguments; and the list must be terminated with C<(SV*)
+NULL>. If neither C<PERL_LOADMOD_NOIMPORT> nor C<PERL_LOADMOD_IMPORT_OPS> is
+set, the trailing C<NULL> pointer is needed even if no import arguments are
+desired. The reference count for each specified C<SV*> argument is
+decremented. In addition, the C<name> 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<PERL_LOADMOD_DENY> is set, the module is loaded as if with C<no> rather
+than C<use>.
-/*
-=for apidoc newPVOP
+C<load_module> and C<load_module_nocontext> 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<pTHX>.
-Constructs, checks, and returns an op of any type that involves an
-embedded C-level pointer (PV). C<type> is the opcode. C<flags> gives
-the eight bits of C<op_flags>. C<pv> supplies the C-level pointer.
-Depending on the op type, the memory referenced by C<pv> may be freed
-when the op is destroyed. If the op is of a freeing type, C<pv> must
-have been allocated using C<PerlMemShared_malloc>.
+=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<L</load_module>> 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<name>.
-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<use Foo::Bar VERSION>. The optional
-trailing arguments can be used to specify arguments to the module's C<import()>
-method, similar to C<use Foo::Bar VERSION LIST>; their precise handling depends
-on the flags. The flags argument is a bitwise-ORed collection of any of
-C<PERL_LOADMOD_DENY>, C<PERL_LOADMOD_NOIMPORT>, or C<PERL_LOADMOD_IMPORT_OPS>
-(or 0 for no flags).
-
-If C<PERL_LOADMOD_NOIMPORT> is set, the module is loaded as if with an empty
-import list, as in C<use Foo::Bar ()>; this is the only circumstance in which
-the trailing optional arguments may be omitted entirely. Otherwise, if
-C<PERL_LOADMOD_IMPORT_OPS> is set, the trailing arguments must consist of
-exactly one C<OP*>, containing the op tree that produces the relevant import
-arguments. Otherwise, the trailing arguments must all be C<SV*> values that
-will be used as import arguments; and the list must be terminated with C<(SV*)
-NULL>. If neither C<PERL_LOADMOD_NOIMPORT> nor C<PERL_LOADMOD_IMPORT_OPS> is
-set, the trailing C<NULL> pointer is needed even if no import arguments are
-desired. The reference count for each specified C<SV*> argument is
-decremented. In addition, the C<name> argument is modified.
-
-If C<PERL_LOADMOD_DENY> is set, the module is loaded as if with C<no> rather
-than C<use>.
-
-C<load_module> and C<load_module_nocontext> 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<pTHX>.
-
-=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<L</load_module>> 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_ARGDEFELEM> op which provides a defaulting
+expression given by C<expr> for the signature parameter at the index given
+by C<argindex>. 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<left> and C<right>
@@ -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 <FH> 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(<FH>), close(<FH>) 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<cvop> is the op
-being considered, normally an C<rv2cv> 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<rv2cv> is to operate on is provided by a suitable C<gv> or C<const> op.
-A C<gv> op is suitable if the GV's CV slot is populated. A C<const> 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<rv2cv> op
-has the C<OPpENTERSUB_AMPER> 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<flags> has the bit C<RV2CVOPCV_MARK_EARLY> 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<gv> op has the C<OPpEARLY_CV> 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<flags> has the bit C<RV2CVOPCV_RETURN_NAME_GV> 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<CvGV> of the subroutine, but for an anonymous
-(C<CvANON>) subroutine that is referenced through a GV it will be the
-referencing GV. The resulting C<GV*> is cast to C<CV*> 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<entersub>
-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<entersub> op tree
-based on a subroutine prototype. This makes various modifications to
-the argument ops, from applying context up to inserting C<refgen> 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<protosv> 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<CV*>
-that has been cast to C<SV*>) 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<namegv> 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<entersub> 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<protosv> 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<CV*>
-that has been cast to C<SV*>), 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<namegv> 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<cv>.
-Specifically, the function is applied to an C<entersub> op tree for a
-subroutine call, not marked with C<&>, where the callee can be identified
-at compile time as C<cv>.
-
-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<entersubop> is a pointer to the C<entersub> op,
-which may be replaced by the check function, and C<namegv> supplies
-the name that should be used by the check function to refer
-to the callee of the C<entersub> 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<namegv> may not actually be a GV. If the C<CALL_CHECKER_REQUIRE_GV>
-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</cv_name>.
-If the C<CALL_CHECKER_REQUIRE_GV> bit is set in C<*ckflags_p> then the
-check function requires C<namegv> to be a genuine GV.
+OP *
+Perl_ck_eval(pTHX_ OP *o)
+{
-By default, the check function is
-L<Perl_ck_entersub_args_proto_or_list|/ck_entersub_args_proto_or_list>,
-the SV parameter is C<cv> itself, and the C<CALL_CHECKER_REQUIRE_GV>
-flag is clear. This implements standard prototype processing. It can
-be changed, for a particular subroutine, by L</cv_set_call_checker_flags>.
+ PERL_ARGS_ASSERT_CK_EVAL;
-If the C<CALL_CHECKER_REQUIRE_GV> bit is set in C<gflags> then it
-indicates that the caller only knows about the genuine GV version of
-C<namegv>, and accordingly the corresponding bit will always be set in
-C<*ckflags_p>, regardless of the check function's recorded requirements.
-If the C<CALL_CHECKER_REQUIRE_GV> bit is clear in C<gflags> then it
-indicates the caller knows about the possibility of passing something
-other than a GV as C<namegv>, 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<gflags> is a bitset passed into C<cv_get_call_checker_flags>, in which
-only the C<CALL_CHECKER_REQUIRE_GV> 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</cv_get_call_checker_flags>, 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<namegv> 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<cv>.
-Specifically, the function is applied to an C<entersub> op tree for a
-subroutine call, not marked with C<&>, where the callee can be identified
-at compile time as C<cv>.
+ 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<ckfun>, an SV argument for
-it is supplied in C<ckobj>, and control flags are supplied in C<ckflags>.
-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<entersubop> is a pointer to the C<entersub> op,
-which may be replaced by the check function, and C<namegv> supplies
-the name that should be used by the check function to refer
-to the callee of the C<entersub> 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<namegv> 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</cv_name>. You can force perl to pass a GV by including
-C<CALL_CHECKER_REQUIRE_GV> in the C<ckflags>.
+ /* 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<ckflags> is a bitset, in which only the C<CALL_CHECKER_REQUIRE_GV>
-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</cv_get_call_checker_flags>.
+ /* 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</cv_set_call_checker_flags>, which passes it the
-C<CALL_CHECKER_REQUIRE_GV> 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<namegv> 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(<FH>), close(<FH>) 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<cvop> is the op
+being considered, normally an C<rv2cv> 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<rv2cv> is to operate on is provided by a suitable C<gv> or C<const> op.
+A C<gv> op is suitable if the GV's CV slot is populated. A C<const> 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<rv2cv> op
+has the C<OPpENTERSUB_AMPER> 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<flags> has the bit C<RV2CVOPCV_MARK_EARLY> 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<gv> op has the C<OPpEARLY_CV> 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<flags> has the bit C<RV2CVOPCV_RETURN_NAME_GV> 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<CvGV> of the subroutine, but for an anonymous
+(C<CvANON>) subroutine that is referenced through a GV it will be the
+referencing GV. The resulting C<GV*> is cast to C<CV*> 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<entersub>
+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<entersub> op tree
+based on a subroutine prototype. This makes various modifications to
+the argument ops, from applying context up to inserting C<refgen> 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<protosv> 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<CV*>
+that has been cast to C<SV*>) 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<namegv> 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<entersub> 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<protosv> 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<CV*>
+that has been cast to C<SV*>), 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<namegv> 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<cv>.
+Specifically, the function is applied to an C<entersub> op tree for a
+subroutine call, not marked with C<&>, where the callee can be identified
+at compile time as C<cv>.
- /* 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<entersubop> is a pointer to the C<entersub> op,
+which may be replaced by the check function, and C<namegv> supplies
+the name that should be used by the check function to refer
+to the callee of the C<entersub> 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<namegv> may not actually be a GV. If the C<CALL_CHECKER_REQUIRE_GV>
+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</cv_name>.
+If the C<CALL_CHECKER_REQUIRE_GV> bit is set in C<*ckflags_p> then the
+check function requires C<namegv> to be a genuine GV.
+By default, the check function is
+L<Perl_ck_entersub_args_proto_or_list|/ck_entersub_args_proto_or_list>,
+the SV parameter is C<cv> itself, and the C<CALL_CHECKER_REQUIRE_GV>
+flag is clear. This implements standard prototype processing. It can
+be changed, for a particular subroutine, by L</cv_set_call_checker_flags>.
- 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<CALL_CHECKER_REQUIRE_GV> bit is set in C<gflags> then it
+indicates that the caller only knows about the genuine GV version of
+C<namegv>, and accordingly the corresponding bit will always be set in
+C<*ckflags_p>, regardless of the check function's recorded requirements.
+If the C<CALL_CHECKER_REQUIRE_GV> bit is clear in C<gflags> then it
+indicates the caller knows about the possibility of passing something
+other than a GV as C<namegv>, 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<gflags> is a bitset passed into C<cv_get_call_checker_flags>, in which
+only the C<CALL_CHECKER_REQUIRE_GV> 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</cv_get_call_checker_flags>, 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<namegv> 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<cv>.
+Specifically, the function is applied to an C<entersub> op tree for a
+subroutine call, not marked with C<&>, where the callee can be identified
+at compile time as C<cv>.
- /* 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<ckfun>, an SV argument for
+it is supplied in C<ckobj>, and control flags are supplied in C<ckflags>.
+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<entersubop> is a pointer to the C<entersub> op,
+which may be replaced by the check function, and C<namegv> supplies
+the name that should be used by the check function to refer
+to the callee of the C<entersub> 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<namegv> 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</cv_name>. You can force perl to pass a GV by including
+C<CALL_CHECKER_REQUIRE_GV> in the C<ckflags>.
- /* 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<ckflags> is a bitset, in which only the C<CALL_CHECKER_REQUIRE_GV>
+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</cv_get_call_checker_flags>.
- /* 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</cv_set_call_checker_flags>, which passes it the
+C<CALL_CHECKER_REQUIRE_GV> 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<namegv> 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 .= <FH>" 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<strlen(pv)>. 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<GIMME_V> 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<which> is a preprocessor token
indicating which entry to return. If the appropriate flag is not set
this will return C<NULL>. 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<which> is a preprocessing token indicating which entry to set.
The type of C<ptr> 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<which> 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<which> 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<which>. C<which> is a
preprocessing token; the type of C<arg> depends on C<which>.
@@ -866,7 +887,7 @@ preprocessing token; the type of C<arg>
=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<which> 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<which>. This macro evaluates its a
once. If you are using C<Perl_custom_op_xop> to retrieve a
C<XOP *> from a C<OP *>, use the more efficient L</XopENTRYCUSTOM> instead.
-=for apidoc Am||XopENTRYCUSTOM|const OP *o|which
+=for apidoc Amu||XopENTRYCUSTOM|const OP *o|token which
Exactly like C<XopENTRY(XopENTRY(Perl_custom_op_xop(aTHX_ o), which)> but more
efficient. The C<which> parameter is identical to L</XopENTRY>.
-=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<which> is a cpp token
indicating which entry to set. See L<perlguts/"Custom Operators">
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<NOT_IN_PAD>.
-
-Now it always returns C<NOT_IN_PAD>.
-
-=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</newPADNAMEpvn>.) C<outer> is
the outer pad name that this one mirrors. The returned pad name has the
-C<PADNAMEt_OUTER> flag already set.
+C<PADNAMEf_OUTER> 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<PL_compcv>) into the supplied buffer. This should be used initially to
+create the state in the buffer, as the final thing before a C<LEAVE> within a
+block.
+
+ ENTER;
+ start_subparse(0);
+ ...
+
+ suspend_compcv(&buffer);
+ LEAVE;
+
+Once suspended, the C<resume_compcv> or C<resume_compcv_and_save> 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<suspend_compcv> function
+for a final time before being compiled into a full CV. This should be used
+within an C<ENTER>/C<LEAVE> scoped pair.
+
+=for apidoc resume_compcv_and_save
+
+Resumes a buffer previously suspended by the C<suspend_compcv> 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<ENTER>/C<LEAVE> 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<PadnameFIELDINFO>.
+
=for apidoc m|HV *|PadnameTYPE|PADNAME * pn
The stash associated with a typed lexical. This returns the C<%Foo::> hash
for C<my Foo $bar>.
@@ -249,6 +273,9 @@ for C<my Foo $bar>.
=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<gen>.
#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 (<PLIN>) {
- 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 .= <FOO> 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 C<ck_>xxx 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 .= <FH>" 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<rand()>, 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<exit> (or to
return from C<main>), 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<exit> 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<perl_run> being called (and therefore C<INIT> blocks and the
-main program running) despite a call to C<exit>. 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</perl_destruct>.
=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<flags> are passed
to C<gv_fetchpv>. If C<GV_ADD> is set and the
Perl variable does not exist then it will be created. If C<flags> is zero
-and the variable does not exist then NULL is returned.
+(ignoring C<SVf_UTF8>) and the variable does not exist then C<NULL> 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<flags> are passed to
C<gv_fetchpv>. If C<GV_ADD> is set and the
Perl variable does not exist then it will be created. If C<flags> is zero
-and the variable does not exist then C<NULL> is returned.
+(ignoring C<SVf_UTF8>) and the variable does not exist then C<NULL> 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<flags> are passed to
C<gv_fetchpvn_flags>. If C<GV_ADD> 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</C<my_exit>>, using
+C<errno>, but forces an en error code of 255 if C<errno> 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<depth>, indicating the C stack depth. This argument is omitted otherwise.
This macro expands to either S<C<, depth>> 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<depth>.
-=for apidoc CyW ||_pDEPTH
-This is used in the prototype declarations for functions that take a L</C<_aDEPTH>>
+=for apidoc CyW ||comma_pDEPTH
+This is used in the prototype declarations for functions that take a L</C<comma_aDEPTH>>
final parameter, much like L<C<pTHX_>|perlguts/Background and MULTIPLICITY>
is used in functions that take a thread context initial parameter.
+=for apidoc CmnW ||debug_aDEPTH
+Same as L</C<comma_aDEPTH>> but with no leading argument. Intended for functions with
+no normal arguments, and used by L</C<comma_aDEPTH>> itself.
+
+=for apidoc CmnW ||debug_pDEPTH
+Same as L</C<comma_pDEPTH>> but with no leading argument. Intended for functions with
+no normal arguments, and used by L</C<comma_pDEPTH>> 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<x> 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<L</PERL_UNUSED_VAR>> 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<L</PERL_USE_GCC_BRACE_GROUPS>>.
+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<static inline>
+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<perlhacktips/Writing
+safer macros> 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<static inline> function instead.
+
+The extension, of the form
({ statement ... })
-turns the block consisting of I<statements ...> into an expression with a
+turns the block consisting of I<statement ...> into an expression with a
value, unlike plain C language blocks. This can present optimization
-possibilities, B<BUT> you generally need to specify an alternative in case this
-ability doesn't exist or has otherwise been forbidden.
+possibilities, B<BUT>, 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<static inline>
+function instead.
+
+Perl can be configured to not use this feature by passing the parameter
+C<-Accflags=-DPERL_GCC_BRACE_GROUPS_FORBIDDEN> to F<Configure>.
+
+=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<L</EBCDIC>> 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 <xlocale.h>
#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 <setjmp.h>
@@ -1158,7 +1431,9 @@ EXTERN_C int usleep(unsigned int);
/* Macros for correct constant construction. These are in C99 <stdint.h>
* (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</UV> 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</UV> 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<use
+ * locale> 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</C<my_atof>>.
+
+=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<strtoul>.
#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<strtoul>.
* "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 <rms.h>
#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 <stdio.h> 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</wrap_keywor
*/
#if defined(USE_ITHREADS)
-PERLVAR(G, keyword_plugin_mutex, perl_mutex) /* Mutex for PL_keyword_plugin */
+PERLVAR(G, keyword_plugin_mutex, perl_mutex) /* Mutex for PL_keyword_plugin and PL_infix_plugin */
#endif
PERLVARI(G, keyword_plugin, Perl_keyword_plugin_t, Perl_keyword_plugin_standard)
+/*
+=for apidoc AmnUx|Perl_infix_plugin_t|PL_infix_plugin
+
+B<NOTE:> This API exists entirely for the purpose of making the CPAN module
+C<XS::Parse::Infix> work. It is not expected that additional modules will make
+use of it; rather, that they should use C<XS::Parse::Infix> 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<opname> points to the operator name in the parser's input buffer,
+and C<oplen> gives the I<maximum> 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<PL_keyword_plugin>, 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<infix_ptr> 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<oplen>. In the case
+of an operator named by non-identifier characters, this is permitted to be
+shorter than C<oplen>, 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<parse> 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<not> 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<opdata> to provide an SV containing additional data to be
+passed into the C<build_op> function later on.
+
+The information structure gives the operator precedence level in the C<prec>
+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<build_op> 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<build_op> function has returned, if the variable pointed to by
+C<opdata> was set to a non-C<NULL> value, it will then be destroyed by calling
+C<SvREFCNT_dec()>.
+
+For thread safety, modules should not set this variable directly.
+Instead, use the function L</wrap_infix_plugin>.
+
+However, that all said, the introductory note above still applies. This
+variable is provided in core perl only for the benefit of the
+C<XS::Parse::Infix> 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<XS::Parse::Infix>, 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 <ival> GRAMPROG GRAMEXPR GRAMBLOCK GRAMBARESTMT GRAMFULLSTMT GRAMSTMTSEQ GRAMSUBSIGNATURE
+/* Tokens emitted by toke.c for simple punctiation characters - &, {, }, etc... */
%token <ival> PERLY_AMPERSAND
%token <ival> PERLY_BRACE_OPEN
%token <ival> PERLY_BRACE_CLOSE
@@ -62,38 +63,55 @@
%token <ival> PERLY_SNAIL
%token <ival> PERLY_STAR
-%token <opval> BAREWORD METHOD FUNCMETH THING PMFUNC PRIVATEREF QWLIST
+/* Tokens emitted by toke.c on simple keywords */
+%token <ival> KW_FORMAT KW_PACKAGE KW_CLASS
+%token <ival> KW_LOCAL KW_MY KW_FIELD
+%token <ival> KW_IF KW_ELSE KW_ELSIF KW_UNLESS
+%token <ival> KW_FOR KW_UNTIL KW_WHILE KW_CONTINUE
+%token <ival> KW_GIVEN KW_WHEN KW_DEFAULT
+%token <ival> KW_TRY KW_CATCH KW_FINALLY KW_DEFER
+%token <ival> KW_REQUIRE KW_DO
+
+/* The 'use' and 'no' keywords both emit this */
+%token <ival> 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 <ival> KW_SUB_named KW_SUB_named_sig KW_SUB_anon KW_SUB_anon_sig
+%token <ival> KW_METHOD_named KW_METHOD_anon
+
+/* Tokens emitted in other situations */
+%token <opval> BAREWORD METHCALL0 METHCALL THING PMFUNC PRIVATEREF QWLIST
%token <opval> FUNC0OP FUNC0SUB UNIOPSUB LSTOPSUB
%token <opval> PLUGEXPR PLUGSTMT
%token <opval> LABEL
-%token <ival> FORMAT SUB SIGSUB ANONSUB ANON_SIGSUB PACKAGE USE
-%token <ival> WHILE UNTIL IF UNLESS ELSE ELSIF CONTINUE FOR
-%token <ival> GIVEN WHEN DEFAULT
-%token <ival> TRY CATCH FINALLY
%token <ival> LOOPEX DOTDOT YADAYADA
%token <ival> FUNC0 FUNC1 FUNC UNIOP LSTOP
-%token <ival> MULOP ADDOP
-%token <ival> DOLSHARP DO HASHBRACK NOAMP
-%token <ival> LOCAL MY REQUIRE
+%token <ival> POWOP MULOP ADDOP
+%token <ival> DOLSHARP HASHBRACK NOAMP
%token <ival> COLONATTR FORMLBRACK FORMRBRACK
%token <ival> SUBLEXSTART SUBLEXEND
-%token <ival> DEFER
+%token <ival> PHASER
%type <ival> grammar remember mremember
-%type <ival> startsub startanonsub startformsub
+%type <ival> startsub startanonsub startanonmethod startformsub
%type <ival> mintro
+%type <ival> sigsub_or_method_named
%type <opval> stmtseq fullstmt labfullstmt barestmt block mblock else finally
%type <opval> expr term subscripted scalar ary hsh arylen star amper sideff
%type <opval> condition
+%type <opval> catch_paren
%type <opval> empty
%type <opval> sliceme kvslice gelem
%type <opval> listexpr nexpr texpr iexpr mexpr mnexpr
-%type <opval> optlistexpr optexpr optrepl indirob listop method
+%type <opval> optlistexpr optexpr optrepl indirob listop methodname
%type <opval> formname subname proto cont my_scalar my_var
%type <opval> list_of_scalars my_list_of_scalars refgen_topic formblock
%type <opval> subattrlist myattrlist myattrterm myterm
+%type <pval> fieldvar /* pval is PADNAME */
+%type <opval> optfieldattrlist fielddecl
%type <opval> termbinop termunop anonymous termdo
%type <opval> termrelop relopchain termeqop eqopchain
%type <ival> sigslurpsigil
@@ -105,29 +123,32 @@
%nonassoc <ival> PREC_LOW
%nonassoc LOOPEX
-%left <ival> OROP
-%left <ival> ANDOP
+%nonassoc <pval> PLUGIN_LOW_OP
+%left <ival> OROP <pval> PLUGIN_LOGICAL_OR_LOW_OP
+%left <ival> ANDOP <pval> PLUGIN_LOGICAL_AND_LOW_OP
%right <ival> NOTOP
%nonassoc LSTOP LSTOPSUB
%left PERLY_COMMA
-%right <ival> ASSIGNOP
+%right <ival> ASSIGNOP <pval> PLUGIN_ASSIGN_OP
%right <ival> PERLY_QUESTION_MARK PERLY_COLON
%nonassoc DOTDOT
-%left <ival> OROR DORDOR
-%left <ival> ANDAND
+%left <ival> OROR DORDOR <pval> PLUGIN_LOGICAL_OR_OP
+%left <ival> ANDAND <pval> PLUGIN_LOGICAL_AND_OP
%left <ival> BITOROP
%left <ival> BITANDOP
%left <ival> CHEQOP NCEQOP
%left <ival> CHRELOP NCRELOP
+%nonassoc <pval> PLUGIN_REL_OP
%nonassoc UNIOP UNIOPSUB
-%nonassoc REQUIRE
+%nonassoc KW_REQUIRE
%left <ival> SHIFTOP
-%left ADDOP
-%left MULOP
+%left ADDOP <pval> PLUGIN_ADD_OP
+%left MULOP <pval> PLUGIN_MUL_OP
%left <ival> MATCHOP
%right <ival> PERLY_EXCLAMATION_MARK PERLY_TILDE UMINUS REFGEN
-%right <ival> POWOP
+%right POWOP <pval> PLUGIN_POW_OP
%nonassoc <ival> PREINC PREDEC POSTINC POSTDEC POSTJOIN
+%nonassoc <pval> PLUGIN_HIGH_OP
%left <ival> ARROW
%nonassoc <ival> PERLY_PAREN_CLOSE
%left <ival> 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; $<opval>$ = 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<L</PUTBACK>> and
L<perlcall>.
-=for apidoc Amns||dSP
+=for apidoc Amn;||dSP
Declares a local copy of perl's stack pointer for the XSUB, available via
the C<SP> macro. See C<L</SP>>.
-=for apidoc ms||djSP
+=for apidoc m;||djSP
Declare Just C<SP>. This is actually identical to C<dSP>, and declares
a local copy of perl's stack pointer, available via the C<SP> macro.
See C<L<perlapi/SP>>. (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<mark>, for the XSUB. See C<L</MARK>> and
C<L</dORIGMARK>>.
-=for apidoc Amns||dORIGMARK
+=for apidoc Amn;||dORIGMARK
Saves the original stack mark for the XSUB. See C<L</ORIGMARK>>.
=for apidoc AmnU||ORIGMARK
The original stack mark for the XSUB. See C<L</dORIGMARK>>.
-=for apidoc Amns||SPAGAIN
+=for apidoc Amn;||SPAGAIN
Refetch the stack pointer. Used after a callback. See L<perlcall>.
=cut */
@@ -55,7 +55,7 @@ Refetch the stack pointer. Used after a
#define MARK mark
/*
-=for apidoc Amns||TARG
+=for apidoc Amn;||TARG
C<TARG> is short for "target". It is an entry in the pad that an OPs
C<op_targ> 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<TARG>
+=for apidoc Amn;||dTARGET
+Declare that this function uses C<TARG>, and initializes it
=cut
*/
@@ -119,7 +119,7 @@ Declare that this function uses C<TARG>
#define DIE return Perl_die
/*
-=for apidoc Amns||PUTBACK
+=for apidoc Amn;||PUTBACK
Closing bracket for XSUB arguments. This is usually handled by C<xsubpp>.
See C<L</PUSHMARK>> and L<perlcall> for other uses.
@@ -201,6 +201,10 @@ C<TARG>, so C<dTARGET> or C<dXSTARG> sho
call multiple C<TARG>-oriented macros to return lists from XSUB's - see
C<L</mPUSHp>> instead. See also C<L</XPUSHp>> and C<L</mXPUSHp>>.
+=for apidoc Am|void|PUSHpvs|"literal string"
+A variation on C<PUSHp> 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<TARG>, so C<dTARGET> or C<dXSTARG> should be
@@ -234,6 +238,10 @@ C<dTARGET> or C<dXSTARG> should be calle
multiple C<TARG>-oriented macros to return lists from XSUB's - see
C<L</mXPUSHp>> instead. See also C<L</PUSHp>> and C<L</mPUSHp>>.
+=for apidoc Am|void|XPUSHpvs|"literal string"
+A variation on C<XPUSHp> 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<TARG>, so C<dTARGET> or C<dXSTARG> should be called to
@@ -270,6 +278,10 @@ Push a string onto the stack. The stack
The C<len> indicates the length of the string. Does not use C<TARG>.
See also C<L</PUSHp>>, C<L</mXPUSHp>> and C<L</XPUSHp>>.
+=for apidoc Am|void|mPUSHpvs|"literal string"
+A variation on C<mPUSHp> 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<TARG>. See also C<L</PUSHn>>, C<L</mXPUSHn>> and C<L</XPUSHn>>.
@@ -297,6 +309,10 @@ Push a string onto the stack, extending
indicates the length of the string. Does not use C<TARG>. See also
C<L</XPUSHp>>, C<mPUSHp> and C<PUSHp>.
+=for apidoc Am|void|mXPUSHpvs|"literal string"
+A variation on C<mXPUSHp> 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<TARG>. See also C<L</XPUSHn>>, C<L</mPUSHn>> and C<L</PUSHn>>.
@@ -316,11 +332,11 @@ Does not use C<TARG>. See also C<L</XPU
* requested to be extended (which is likely to be less than PL_stack_max)
*/
#if defined DEBUGGING && !defined DEBUGGING_RE_ONLY
-# define EXTEND_HWM_SET(p, n) \
- STMT_START { \
- SSize_t ix = (p) - PL_stack_base + (n); \
- if (ix > 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<TARG>. See also C<L</XPU
# define EXTEND_SKIP(p, n) STMT_START { \
EXTEND_HWM_SET(p, n); \
assert(!_EXTEND_NEEDS_GROW(p,n)); \
- } STMT_END
+ } STMT_END
# define EXTEND(p,n) STMT_START { \
@@ -390,7 +406,8 @@ Does not use C<TARG>. See also C<L</XPU
if (UNLIKELY(_EXTEND_NEEDS_GROW(p,n))) { \
sp = stack_grow(sp,p,_EXTEND_SAFE_N(n)); \
PERL_UNUSED_VAR(sp); \
- } } STMT_END
+ } \
+ } STMT_END
/* Same thing, but update mark register too. */
# define MEXTEND(p,n) STMT_START { \
EXTEND_HWM_SET(p, n); \
@@ -399,7 +416,8 @@ Does not use C<TARG>. See also C<L</XPU
sp = stack_grow(sp,p,_EXTEND_SAFE_N(n)); \
mark = PL_stack_base + markoff; \
PERL_UNUSED_VAR(sp); \
- } } STMT_END
+ } \
+ } STMT_END
#endif
@@ -472,6 +490,7 @@ Does not use C<TARG>. See also C<L</XPU
#define PUSHs(s) (*++sp = (s))
#define PUSHTARG STMT_START { SvSETMAGIC(TARG); PUSHs(TARG); } STMT_END
#define PUSHp(p,l) STMT_START { sv_setpvn(TARG, (p), (l)); PUSHTARG; } STMT_END
+#define PUSHpvs(s) PUSHp("" s "", sizeof(s)-1)
#define PUSHn(n) STMT_START { TARGn(n,1); PUSHs(TARG); } STMT_END
#define PUSHi(i) STMT_START { TARGi(i,1); PUSHs(TARG); } STMT_END
#define PUSHu(u) STMT_START { TARGu(u,1); PUSHs(TARG); } STMT_END
@@ -479,6 +498,7 @@ Does not use C<TARG>. See also C<L</XPU
#define XPUSHs(s) STMT_START { EXTEND(sp,1); *++sp = (s); } STMT_END
#define XPUSHTARG STMT_START { SvSETMAGIC(TARG); XPUSHs(TARG); } STMT_END
#define XPUSHp(p,l) STMT_START { sv_setpvn(TARG, (p), (l)); XPUSHTARG; } STMT_END
+#define XPUSHpvs(s) XPUSHp("" s "", sizeof(s)-1)
#define XPUSHn(n) STMT_START { TARGn(n,1); XPUSHs(TARG); } STMT_END
#define XPUSHi(i) STMT_START { TARGi(i,1); XPUSHs(TARG); } STMT_END
#define XPUSHu(u) STMT_START { TARGu(u,1); XPUSHs(TARG); } STMT_END
@@ -487,6 +507,7 @@ Does not use C<TARG>. See also C<L</XPU
#define mPUSHs(s) PUSHs(sv_2mortal(s))
#define PUSHmortal PUSHs(sv_newmortal())
#define mPUSHp(p,l) PUSHs(newSVpvn_flags((p), (l), SVs_TEMP))
+#define mPUSHpvs(s) mPUSHp("" s "", sizeof(s)-1)
#define mPUSHn(n) sv_setnv(PUSHmortal, (NV)(n))
#define mPUSHi(i) sv_setiv(PUSHmortal, (IV)(i))
#define mPUSHu(u) sv_setuv(PUSHmortal, (UV)(u))
@@ -494,6 +515,7 @@ Does not use C<TARG>. See also C<L</XPU
#define mXPUSHs(s) XPUSHs(sv_2mortal(s))
#define XPUSHmortal XPUSHs(sv_newmortal())
#define mXPUSHp(p,l) STMT_START { EXTEND(sp,1); mPUSHp((p), (l)); } STMT_END
+#define mXPUSHpvs(s) mXPUSHp("" s "", sizeof(s)-1)
#define mXPUSHn(n) STMT_START { EXTEND(sp,1); mPUSHn(n); } STMT_END
#define mXPUSHi(i) STMT_START { EXTEND(sp,1); mPUSHi(i); } STMT_END
#define mXPUSHu(u) STMT_START { EXTEND(sp,1); mPUSHu(u); } STMT_END
@@ -682,7 +704,7 @@ True if this op will be the return value
/* Used in various places that need to dereference a glob or globref */
# define MAYBE_DEREF_GV_flags(sv,phlags) \
( \
- (void)(phlags & SV_GMAGIC && (SvGETMAGIC(sv),0)), \
+ (void)(((phlags) & SV_GMAGIC) && (SvGETMAGIC(sv),0)), \
isGV_with_GP(sv) \
? (GV *)(sv) \
: SvROK(sv) && SvTYPE(SvRV(sv)) <= SVt_PVLV && \
Index: gnu/usr.bin/perl/pp_ctl.c
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/pp_ctl.c,v
diff -u -p -a -u -p -r1.25 pp_ctl.c
--- gnu/usr.bin/perl/pp_ctl.c 8 Jul 2023 14:18:35 -0000 1.25
+++ gnu/usr.bin/perl/pp_ctl.c 21 Feb 2024 15:47:03 -0000
@@ -35,9 +35,6 @@
#include "perl.h"
#include "feature.h"
-#define RUN_PP_CATCHABLY(thispp) \
- STMT_START { if (CATCH_GET) return docatch(thispp); } STMT_END
-
#define dopopto_cursub() \
(PL_curstackinfo->si_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 <arg> 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<cop.h>: je_mustcatch, when set at any runlevel to TRUE, means eval ops must
-establish a local jmpenv to handle exception traps.
+See L<perlinterp/"Exception handing"> 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<BEGIN{die}>,
- * 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 <function_name> args
+ *
+ * (OPf_STACKED
+ * |OPf_SPECIAL) sort { <block> } 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 <sys/syscall.h>
+#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<PL_defoutgv> "owns" a re
count of the passed in typeglob is increased by one, and the reference count
of the typeglob that C<PL_defoutgv> points to is decreased by one.
+=for apidoc AmnU||PL_defoutgv
+
+See C<L</setdefout>>.
+
=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<pattern>, 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</C<pregcomp>>
+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<pattern> is already a C<REGEXP>, 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<perlre>.
- if (! invlist) {
- invlist = sv_2mortal(_new_invlist(0));
- }
+The possible flags for C<rx_flags> are documented in L<perlreapi>. Their names
+all begin with C<RXf_>.
- /* 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:
- * (<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) & (<everything>) = 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 <ac>(16)
- 8: BRANCH(11)
- 9: EXACT <ad>(16)
- 11: BRANCH(14)
- 12: EXACT <ab>(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]
- <ac>
- <ad>
- <ab>
- 16: SUCCEED(0)
- 17: NOTHING(18)
- 18: END(0)
-
-Cases where tail != last would be like /(?foo|bar)baz/:
-
- 1: BRANCH(4)
- 2: EXACT <foo>(8)
- 4: BRANCH(7)
- 5: EXACT <bar>(8)
- 7: TAIL(8)
- 8: EXACT <baz>(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]
- <foo>
- <bar>
- 7: TAIL(8)
- 8: EXACT <baz>(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<numstates; q_read++ ) {
- Perl_re_printf( aTHX_ ", %" UVuf, (UV)fail[q_read]);
- }
- Perl_re_printf( aTHX_ "\n");
- });
- Safefree(q);
- /*RExC_seen |= REG_TRIEDFA_SEEN;*/
- return stclass;
-}
-
-
-/* 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 */
-
-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)
-{
- /* Merge several consecutive EXACTish nodes into one. */
-
- regnode *n = regnext(scan);
- U32 stringok = 1;
- regnode *next = scan + NODE_SZ_STR(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(PL_regkind[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
- && ( PL_regkind[OP(n)] == NOTHING
- || (stringok && PL_regkind[OP(n)] == EXACT))
- && NEXT_OFF(n)
- && NEXT_OFF(scan) + NEXT_OFF(n) < I16_MAX)
+ 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))
{
-
- if (OP(n) == TAIL || n > 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) <SCAN FINISHED> ",
- 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) <NOTHING BRANCH SEQUENCE>\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>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<pattern>, 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</C<pregcomp>>
-to compile using the currently active regexp engine.
-
-If C<pattern> is already a C<REGEXP>, 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<perlre>.
-
-The possible flags for C<rx_flags> are documented in L<perlreapi>. Their names
-all begin with C<RXf_>.
-
-=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; i<SvIVX(sv_dat); i++ ) {
- if ((I32)(rx->nparens) >= 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<Perl_magic_len> in F<mg.c> */
- 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<invlist_inline.h> */
-#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 <index> 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 <list>, 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 <cp>. If <cp> 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 <cp>, 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;
- }
-
- /* <mid> 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 <mid> 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 <i> 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 <a> 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, <cp_list> contains all the code points we can determine at
@@ -19666,7 +11128,7 @@ S_regclass(pTHX_ RExC_state_t *pRExC_sta
* <cp_list>. 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 <doinit> 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 <listsvp> 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; bit<REG_INTFLAGS_NAME_SIZE; bit++) {
- if (flags & (1<<bit)) {
- if (!set++ && lead)
- Perl_re_printf( aTHX_ "%s", lead);
- Perl_re_printf( aTHX_ "%s ", PL_reg_intflags_name[bit]);
- }
- }
- if (lead) {
- if (set)
- Perl_re_printf( aTHX_ "\n");
- else
- Perl_re_printf( aTHX_ "%s[none-set]\n", lead);
- }
-}
-
-static void
-S_regdump_extflags(pTHX_ const char *lead, const U32 flags)
-{
- int bit;
- int set=0;
- regex_charset cs;
-
- ASSUME(REG_EXTFLAGS_NAME_SIZE <= sizeof(flags)*8);
-
- for (bit=0; bit<REG_EXTFLAGS_NAME_SIZE; bit++) {
- if (flags & (1U<<bit)) {
- if ((1U<<bit) & RXf_PMf_CHARSET) { /* Output separately, below */
- continue;
- }
- if (!set++ && lead)
- Perl_re_printf( aTHX_ "%s", lead);
- Perl_re_printf( aTHX_ "%s ", PL_reg_extflags_name[bit]);
- }
- }
- if ((cs = get_regex_charset(flags)) != REGEX_DEPENDS_CHARSET) {
- if (!set++ && lead) {
- Perl_re_printf( aTHX_ "%s", lead);
- }
- switch (cs) {
- case REGEX_UNICODE_CHARSET:
- Perl_re_printf( aTHX_ "UNICODE");
- break;
- case REGEX_LOCALE_CHARSET:
- Perl_re_printf( aTHX_ "LOCALE");
- break;
- case REGEX_ASCII_RESTRICTED_CHARSET:
- Perl_re_printf( aTHX_ "ASCII-RESTRICTED");
- break;
- case REGEX_ASCII_MORE_RESTRICTED_CHARSET:
- Perl_re_printf( aTHX_ "ASCII-MORE_RESTRICTED");
- break;
- default:
- Perl_re_printf( aTHX_ "UNKNOWN CHARACTER SET");
- break;
- }
- }
- if (lead) {
- if (set)
- Perl_re_printf( aTHX_ "\n");
- else
- Perl_re_printf( aTHX_ "%s[none-set]\n", lead);
- }
-}
-#endif
-
-void
-Perl_regdump(pTHX_ const regexp *r)
-{
-#ifdef DEBUGGING
- int i;
- SV * const sv = sv_newmortal();
- SV *dsv= sv_newmortal();
- RXi_GET_DECL(r, ri);
- DECLARE_AND_GET_RE_DEBUG_FLAGS;
-
- PERL_ARGS_ASSERT_REGDUMP;
-
- (void)dumpuntil(r, ri->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
- 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,
- "<S:%" UVuf "/%" IVdf " W:%" UVuf " L:%" UVuf "/%" UVuf " C:%" UVuf "/%" UVuf ">",
- (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; n<SvIVX(sv_dat); n++ ) {
- Perl_sv_catpvf(aTHX_ sv, "%s%" IVdf,
- (n ? "," : ""), (IV)nums[n]);
- }
- Perl_sv_catpvf(aTHX_ sv, " '%" SVf "'", SVfARG(*name));
- }
- }
- }
- if ( k == REF && reginfo) {
- U32 n = ARG(o); /* which paren pair */
- I32 ln = prog->offs[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[op<AHOCORASICK ? n : ac->trie];
-#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<next_off> 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</head(?:[ab]foo|[cd]bar)tail/>
+ *
+ * 1: EXACT <head> (3)
+ * 3: BRANCH (8)
+ * 4: ANYOFR[ab] (6)
+ * 6: EXACT <foo> (14)
+ * 8: BRANCH (FAIL)
+ * 9: ANYOFR[cd] (11)
+ * 11: EXACT <bar> (14)
+ * 13: TAIL (14)
+ * 14: EXACT <tail> (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<next_off> 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<Perl_regnext()> and follow the C<next_off> pointer, and to find
+ * the "BRANCHes contents" we would use C<REGNODE_AFTER()>.
+ *
+ * Be aware that C<REGNODE_AFTER()> 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<next_off> 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<next_off> 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<Perl_regnext()> may not work properly
+ * as the C<next_off> 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<Perl_regnode_after()>. 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<<bit)) {
+ if (!set++ && lead)
+ Perl_re_printf( aTHX_ "%s", lead);
+ Perl_re_printf( aTHX_ "%s ", PL_reg_intflags_name[bit]);
+ }
+ }
+ if (lead) {
+ if (set)
+ Perl_re_printf( aTHX_ "\n");
+ else
+ Perl_re_printf( aTHX_ "%s[none-set]\n", lead);
+ }
+}
+
+static void
+S_regdump_extflags(pTHX_ const char *lead, const U32 flags)
+{
+ int bit;
+ int set=0;
+ regex_charset cs;
+
+ ASSUME(REG_EXTFLAGS_NAME_SIZE <= sizeof(flags)*8);
+
+ for (bit=0; bit<REG_EXTFLAGS_NAME_SIZE; bit++) {
+ if (flags & (1U<<bit)) {
+ if ((1U<<bit) & RXf_PMf_CHARSET) { /* Output separately, below */
+ continue;
+ }
+ if (!set++ && lead)
+ Perl_re_printf( aTHX_ "%s", lead);
+ Perl_re_printf( aTHX_ "%s ", PL_reg_extflags_name[bit]);
+ }
+ }
+ if ((cs = get_regex_charset(flags)) != REGEX_DEPENDS_CHARSET) {
+ if (!set++ && lead) {
+ Perl_re_printf( aTHX_ "%s", lead);
+ }
+ switch (cs) {
+ case REGEX_UNICODE_CHARSET:
+ Perl_re_printf( aTHX_ "UNICODE");
+ break;
+ case REGEX_LOCALE_CHARSET:
+ Perl_re_printf( aTHX_ "LOCALE");
+ break;
+ case REGEX_ASCII_RESTRICTED_CHARSET:
+ Perl_re_printf( aTHX_ "ASCII-RESTRICTED");
+ break;
+ case REGEX_ASCII_MORE_RESTRICTED_CHARSET:
+ Perl_re_printf( aTHX_ "ASCII-MORE_RESTRICTED");
+ break;
+ default:
+ Perl_re_printf( aTHX_ "UNKNOWN CHARACTER SET");
+ break;
+ }
+ }
+ if (lead) {
+ if (set)
+ Perl_re_printf( aTHX_ "\n");
+ else
+ Perl_re_printf( aTHX_ "%s[none-set]\n", lead);
+ }
+}
+#endif
+
+void
+Perl_regdump(pTHX_ const regexp *r)
+{
+#ifdef DEBUGGING
+ int i;
+ SV * const sv = sv_newmortal();
+ SV *dsv= sv_newmortal();
+ RXi_GET_DECL(r, ri);
+ DECLARE_AND_GET_RE_DEBUG_FLAGS;
+
+ PERL_ARGS_ASSERT_REGDUMP;
+
+ (void)dumpuntil(r, ri->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,
+ "<S:%" UVuf "/%" IVdf " W:%" UVuf " L:%" UVuf "/%" UVuf " C:%" UVuf "/%" UVuf ">",
+ (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; n<SvIVX(sv_dat); n++ ) {
+ Perl_sv_catpvf(aTHX_ sv, "%s%" IVdf,
+ (n ? "," : ""), (IV)nums[n]);
+ }
+ Perl_sv_catpvf(aTHX_ sv, " '%" SVf "'", SVfARG(*name));
+ }
+ }
+ } else if (parno>0) {
+ 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[op<AHOCORASICK ? n : ac->trie];
+#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<invlist_inline.h> */
+
+#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 <index> 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 <list>, 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 <cp>. If <cp> 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 <cp>, 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;
+ }
+
+ /* <mid> 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 <mid> 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 <i> 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 <a> 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:
+ * (<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) & (<everything>) = 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) <SCAN FINISHED> ",
+ 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) <NOTHING BRANCH SEQUENCE>\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>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 <ac>(16)
+ 8: BRANCH(11)
+ 9: EXACT <ad>(16)
+ 11: BRANCH(14)
+ 12: EXACT <ab>(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]
+ <ac>
+ <ad>
+ <ab>
+ 16: SUCCEED(0)
+ 17: NOTHING(18)
+ 18: END(0)
+
+Cases where tail != last would be like /(?foo|bar)baz/:
+
+ 1: BRANCH(4)
+ 2: EXACT <foo>(8)
+ 4: BRANCH(7)
+ 5: EXACT <bar>(8)
+ 7: TAIL(8)
+ 8: EXACT <baz>(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]
+ <foo>
+ <bar>
+ 7: TAIL(8)
+ 8: EXACT <baz>(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<numstates; q_read++ ) {
+ Perl_re_printf( aTHX_ ", %" UVuf, (UV)fail[q_read]);
+ }
+ Perl_re_printf( aTHX_ "\n");
+ });
+ Safefree(q);
+ /*RExC_seen |= REG_TRIEDFA_SEEN;*/
+ return stclass;
+}
Index: gnu/usr.bin/perl/regen.pl
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/regen.pl,v
diff -u -p -a -u -p -r1.1.1.8 regen.pl
--- gnu/usr.bin/perl/regen.pl 13 Feb 2019 21:10:47 -0000 1.1.1.8
+++ gnu/usr.bin/perl/regen.pl 21 Feb 2024 15:47:03 -0000
@@ -22,11 +22,14 @@ foreach my $pl (map {chomp; "regen/$_"}
}
__END__
+embed.pl
+feature.pl
mg_vtable.pl
+miniperlmain.pl
opcode.pl
overload.pl
reentr.pl
regcomp.pl
+scope_types.pl
+tidy_embed.pl
warnings.pl
-embed.pl
-feature.pl
Index: gnu/usr.bin/perl/regexec.c
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/regexec.c,v
diff -u -p -a -u -p -r1.29 regexec.c
--- gnu/usr.bin/perl/regexec.c 15 Feb 2023 01:36:13 -0000 1.29
+++ gnu/usr.bin/perl/regexec.c 21 Feb 2024 15:47:03 -0000
@@ -71,6 +71,7 @@
* regular-expression syntax might require a total rethink.
*/
#include "EXTERN.h"
+#define PERL_IN_REGEX_ENGINE
#define PERL_IN_REGEXEC_C
#include "perl.h"
@@ -100,7 +101,7 @@ static const char sets_utf8_locale_requi
#define CHECK_AND_WARN_NON_UTF8_CTYPE_LOCALE_IN_SETS(n) \
STMT_START { \
- if (! IN_UTF8_CTYPE_LOCALE && ANYOFL_UTF8_LOCALE_REQD(FLAGS(n))) { \
+ if (! IN_UTF8_CTYPE_LOCALE && (FLAGS(n) & ANYOFL_UTF8_LOCALE_REQD)){\
Perl_ck_warner(aTHX_ packWARN(WARN_LOCALE), \
sets_utf8_locale_required); \
} \
@@ -119,7 +120,7 @@ static const char non_utf8_target_but_ut
} STMT_END
#ifndef STATIC
-#define STATIC static
+#define STATIC static
#endif
/*
@@ -177,36 +178,36 @@ static const char non_utf8_target_but_ut
* VERBS must NOT be included. JUMPABLE is used to determine if we can ignore a
* node that is in between two EXACT like nodes when ascertaining what the required
* "follow" character is. This should probably be moved to regex compile time
- * although it may be done at run time beause of the REF possibility - more
+ * although it may be done at run time because of the REF possibility - more
* investigation required. -- demerphq
*/
#define JUMPABLE(rn) ( \
OP(rn) == OPEN || \
(OP(rn) == CLOSE && \
- !EVAL_CLOSE_PAREN_IS(cur_eval,ARG(rn)) ) || \
+ !EVAL_CLOSE_PAREN_IS(cur_eval,PARNO(rn)) ) || \
OP(rn) == EVAL || \
OP(rn) == SUSPEND || OP(rn) == IFMATCH || \
OP(rn) == PLUS || OP(rn) == MINMOD || \
OP(rn) == KEEPS || \
- (PL_regkind[OP(rn)] == CURLY && ARG1(rn) > 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; n<SvIVX(sv_dat); n++ ) {
- if ((I32)rex->lastparen >= 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: /* (?(<name>)) */
@@ -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 $<digit>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 $<digit>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; i<SvIVX(sv_dat); i++ ) {
+ if ((I32)(rx->nparens) >= 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<Perl_magic_len> in F<mg.c> */
+ 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<SAVEf_KEEPOLDELEM> is set in in C<flags>, the function returns the input
+scalar untouched.
+
+Otherwise it replaces C<*sptr> with a new C<undef> 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<SAVEf_SETMAGIC> is set in in C<flags>, '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<e.g.>,
+S<C<'local $x = $y'>>), 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<SAVERCPV>.
+
+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<SAVEFREERCPV>.
+
+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<ptr> will be decremented at the end of the current
+I<pseudo-block>. C<type> gives the type of C<ptr>, expressed as one of the
+constants in F<scope.h> whose name begins with C<SAVEt_>.
+
+This is the underlying implementation of several macros, like
+C<SAVEFREESV>.
+
+=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<av[idx]> to be restored
+at the end of the enclosing I<pseudo-block>.
+
+In C<save_aelem>, the SV at C**sptr> will be replaced by a new C<undef>
+scalar. That scalar will inherit any magic from the original C<**sptr>,
+and any 'set' magic will be processed.
+
+In C<save_aelem_flags>, C<SAVEf_KEEPOLDELEM> being set in C<flags> causes
+the function to forgo all that: the scalar at C<**sptr> is untouched.
+If C<SAVEf_KEEPOLDELEM> is not set, the SV at C**sptr> will be replaced by a
+new C<undef> scalar. That scalar will inherit any magic from the original
+C<**sptr>. Any 'set' magic will be processed if and only if C<SAVEf_SETMAGIC>
+is set in in C<flags>.
+
+=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<pseudo-block>.
+
+In C<save_helem>, the SV at C**sptr> will be replaced by a new C<undef>
+scalar. That scalar will inherit any magic from the original C<**sptr>,
+and any 'set' magic will be processed.
+
+In C<save_helem_flags>, C<SAVEf_KEEPOLDELEM> being set in C<flags> causes
+the function to forgo all that: the scalar at C<**sptr> is untouched.
+If C<SAVEf_KEEPOLDELEM> is not set, the SV at C**sptr> will be replaced by a
+new C<undef> scalar. That scalar will inherit any magic from the original
+C<**sptr>. Any 'set' magic will be processed if and only if C<SAVEf_SETMAGIC>
+is set in in C<flags>.
+
+=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<end of the current statement>.
+
+The C<coderef> argument determines the type of function that will be
+called. If it is C<SvROK()> 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<SvIV()> which is C<SvIOK()> whose value is a pointer
+to a C function of type C<DESTRUCTORFUNC_t> created using C<PTR2INT()>.
+Either way the C<args> 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<mortal_destructor_x()> is used for the C function case.
+
+When operating in Perl callback mode the C<args> 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<args> SV will be provided as a single argument to
+the code reference.
+
+When operating in a C callback mode the C<args> parameter will be passed
+directly to the C function as a C<void *> pointer. No additional
+processing of the argument will be peformed, and it is the callers
+responsibility to free the C<args> parameter if necessary.
+
+Be aware that there is a signficant difference in timing between the
+I<end of the current statement> and the I<end of the current pseudo
+block>. If you are looking for a mechanism to trigger a function at the
+end of the B<current pseudo block> you should look at
+C<SAVEDESTRUCTORX()> instead of this function.
+
+=for apidoc mortal_svfunc_x
+
+This function arranges for a C function reference to be called at the
+B<end of the current statement> with the arguments provided. It is a
+wrapper around C<mortal_destructor_sv()> which ensures that the latter
+function is called appropriately.
+
+Be aware that there is a signficant difference in timing between the
+I<end of the current statement> and the I<end of the current pseudo
+block>. If you are looking for a mechanism to trigger a function at the
+end of the B<current pseudo block> you should look at
+C<SAVEDESTRUCTORX()> instead of this function.
+
+=for apidoc magic_freedestruct
+
+This function is called via magic to implement the
+C<mortal_destructor_sv()> and C<mortal_destructor_x()> 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<L</FREETMPS>> and
L<perlcall>.
-=for apidoc Amns||FREETMPS
+=for apidoc Amn;||FREETMPS
Closing bracket for temporaries on a callback. See C<L</SAVETMPS>> and
L<perlcall>.
-=for apidoc Amns||ENTER
+=for apidoc Amn;||ENTER
Opening bracket on a callback. See C<L</LEAVE>> and L<perlcall>.
-=for apidoc Amns||LEAVE
+=for apidoc Amn;||LEAVE
Closing bracket on a callback. See C<L</ENTER>> and L<perlcall>.
-=for apidoc Ams||ENTER_with_name|"name"
+=for apidoc Am;||ENTER_with_name|"name"
Same as C<L</ENTER>>, 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<L</LEAVE>>, but when debugging is enabled it first checks that the
scope has the given name. C<name> must be a literal string.
@@ -246,6 +177,8 @@ scope has the given name. C<name> 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<name> 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<name> 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<name> 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</C<SSPTR>> to convert the returned index into a pointer.
@@ -325,8 +273,8 @@ L</C<MEM_ALIGNBYTES>>. The alignment wi
reallocation B<only> 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<index> returned by L/<C<SSNEW>> and kin into actual pointers.
@@ -342,8 +290,8 @@ casts it to a pointer of that C<type>.
(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<sv_setsv(sv, &PL_sv_yes)>, 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<sv_setsv(sv, &PL_sv_no)>, 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<sv_setsv(sv, bool_val ? &Pl_sv_yes : &PL_sv_no)>, 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<NUL> characters.
In the plain C<pv> forms, C<ptr> 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<NUL> byte.
+first encountered C<NUL> byte.
In the forms that take a C<ptr> 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<ptr> 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<type> 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<REFCNT> is zero. Most of the time
-you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
-instead.
+you'll want to call C<SvREFCNT_dec> 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<hek> 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<not> 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<sv_setsv>.)
@@ -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<sv_setpviv_mg> performs 'set' magic; C<sv_setpviv>
-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<L</sv_catpvf>> 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<sprintf>, and append the formatted
output to an SV. As with C<sv_vcatpvfn>, 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<SVfARG()>
+ * to set up the argument properly.
* (This was previously %_).
*
- * %-<num>p Ditto but like %.<num>s (i.e. num is max width)
+ * %-<num>p Ditto but like %.<num>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
*
- * %<num>p where num is 1 or > 4: reserved for future
+ * %<num>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<t/porting/diag.t> to be aware of it
+ * on top of adding the various defines and etc. Do not
+ * forget to add it to F<pod/perlguts.pod> 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 %%<num>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<SVt_PVOBJ> is for object instances of the new `use feature 'class'` kind.
C<SVt_PVIO> is for I/O objects, C<SVt_PVFM> for formats, C<SVt_PVCV> for
subroutines, C<SVt_PVHV> for hashes and C<SVt_PVAV> for arrays.
@@ -67,10 +69,13 @@ PVMG, we save memory by allocating small
other types are just simpler forms of C<SVt_PVMG>, with fewer internal fields.
C<SVt_NULL> can only hold undef. C<SVt_IV> can hold undef, an integer, or a
reference. (C<SVt_RV> is an alias for C<SVt_IV>, which exists for backward
-compatibility.) C<SVt_NV> can hold any of those or a double. C<SVt_PV> can only
-hold C<undef> or a string. C<SVt_PVIV> is a superset of C<SVt_PV> and C<SVt_IV>.
-C<SVt_PVNV> is similar. C<SVt_PVMG> can hold anything C<SVt_PVNV> can hold, but it
-can, but does not have to, be blessed or magical.
+compatibility.) C<SVt_NV> 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<SVt_PV> can hold C<undef>, a string, or a reference.
+C<SVt_PVIV> is a superset of C<SVt_PV> and C<SVt_IV>. C<SVt_PVNV> is a
+superset of C<SVt_PV> and C<SVt_NV>. C<SVt_PVMG> can hold anything C<SVt_PVNV>
+can hold, but it may also be blessed or magical.
=for apidoc AmnU||SVt_NULL
Type flag for scalars. See L</svtype>.
@@ -120,6 +125,9 @@ Type flag for formats. See L</svtype>.
=for apidoc AmnU||SVt_PVIO
Type flag for I/O objects. See L</svtype>.
+=for apidoc AmnUx||SVt_PVOBJ
+Type flag for object instances. See L</svtype>.
+
=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<void> in their names return the SV.
@@ -322,13 +336,30 @@ effects and you don't need the return va
C<SvREFCNT_inc_simple_void_NN> can only be used with expressions without side
effects, you don't need the return value, and you know C<sv> is not C<NULL>.
-=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<SvREFCNT_dec_NN> may only be used when C<sv> is known to not be C<NULL>.
+The function C<SvREFCNT_dec_ret_NULL()> is identical to the
+C<SvREFCNT_dec()> except it returns a NULL C<SV *>. It is used by
+C<SvREFCNT_dec_set_NULL()> 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<L</svtype>>.
@@ -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<OK> 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<BOOL_INTERNALS_sv_isbool()> or
+C<BOOL_INTERNALS_sv_isbool_true()> or
+C<BOOL_INTERNALS_sv_isbool_false()>. Currently equivalent to
+C<SvIandPOK(sv)> or C<SvIOK(sv) && SvPOK(sv)>. Serialization may want to
+unroll this check. If so you are strongly recommended to add code like
+C<assert(SvBoolFlagsOK(sv));> B<before> 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<SvPOK()> and
+C<SvIOK()> at the same time. Equivalent to C<SvIOK(sv) && SvPOK(sv)> 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<SvIOK_on(sv); SvPOK_on(sv);> 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<SvIOK_off(sv); SvPK_off(v);> but more efficient.
+
+=for apidoc Am|bool|BOOL_INTERNALS_sv_isbool|SV* sv
+Checks if a C<SvBoolFlagsOK()> sv is a bool. B<Note> that it is the
+caller's responsibility to ensure that the sv is C<SvBoolFlagsOK()> 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<sv_isbool(sv)> instead.
+
+=for apidoc Am|bool|BOOL_INTERNALS_sv_isbool_true|SV* sv
+Checks if a C<SvBoolFlagsOK()> sv is a true bool. B<Note> that it is
+the caller's responsibility to ensure that the sv is C<SvBoolFlagsOK()>
+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<NOT> what you should use
+to check if an SV is "true", for that you should be using
+C<SvTRUE(sv)> instead.
+
+=for apidoc Am|bool|BOOL_INTERNALS_sv_isbool_false|SV* sv
+Checks if a C<SvBoolFlagsOK()> sv is a false bool. B<Note> that it is
+the caller's responsibility to ensure that the sv is C<SvBoolFlagsOK()>
+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<NOT> what you should use
+to check if an SV is "false", for that you should be using
+C<!SvTRUE(sv)> 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</Sv
Returns the raw value in the SV's NV slot, without checks or conversions.
Only use when you are sure C<SvNOK> is true. See also C<L</SvNV>>.
-=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<sv_force_normal> 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<L</SvGROW>>. It is generally better to use
C<SvGROW> instead. This is because C<SvPV_renew> ignores potential issues that
-C<SvGROW> handles. C<sv> needs to have a real C<PV> that is unencombered by
+C<SvGROW> handles. C<sv> needs to have a real C<PV> that is unencumbered by
things like COW. Using C<SV_CHECK_THINKFIRST> or
C<SV_CHECK_THINKFIRST_COW_DROP> before calling this should clean it up, but
why not just use C<SvGROW> if you're not sure about the provenance?
@@ -1427,6 +1560,19 @@ why not just use C<SvGROW> 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<sv>, which needs to have a real
+C<PV> 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<sv> stay the same?
+
+If the answers are both yes, then use L</C<SV_CHECK_THINKFIRST>> or
+L</C<SV_CHECK_THINKFIRST_COW_DROP>> 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<L</SvPV>>, returning the string in the SV, but will force the
SV into containing a string (C<L</SvPOK>>), and only a string
@@ -1638,37 +1784,37 @@ downgraded from UTF-8, this croaks.
C<SvPVbytex_force> is like C<SvPVbyte_force>, but guarantees to evaluate C<sv>
only once; use the more efficient C<SvPVbyte_force> 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<sv>, or a stringified form of
+These each return a pointer to the string in C<sv>, or a stringified form of
C<sv> if it does not contain a string. The SV may cache the stringified
version becoming C<SvPOK>.
@@ -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<mutable> in their names.
-The forms whose name ends in C<x> are the same as the corresponding form
-without the C<x>, but the C<x> form is guaranteed to evaluate C<sv> exactly
-once, with a slight loss of efficiency. Use this if C<sv> is an expression
-with side effects.
+As of 5.38, all forms are guaranteed to evaluate C<sv> exactly once. For
+earlier Perls, use a form whose name ends with C<x> for single evaluation.
C<SvPVutf8> is like C<SvPV>, but converts C<sv> to UTF-8 first if not already
-UTF-8. Similiarly, the other forms with C<utf8> in their names correspond to
+UTF-8. Similarly, the other forms with C<utf8> in their names correspond to
their respective forms without.
C<SvPVutf8_or_null> and C<SvPVutf8_or_null_nomg> don't have corresponding
@@ -1729,62 +1873,17 @@ undef, they return C<NULL>.
C<SvPVbyte> is like C<SvPV>, but converts C<sv> to byte representation first if
currently encoded as UTF-8. If C<sv> cannot be downgraded from UTF-8, it
-croaks. Similiarly, the other forms with C<byte> in their names correspond to
+croaks. Similarly, the other forms with C<byte> in their names correspond to
their respective forms without.
C<SvPVbyte_or_null> doesn't have a corresponding non-C<byte> form. Instead it
is like C<SvPVbyte>, but when C<sv> is undef, it returns C<NULL>.
-=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<sv>'s IV slot, but not in all cases. (Use
-C<L</sv_setiv>> to make sure it does).
-
-C<SvIVx> is different from the others in that it is guaranteed to evaluate
-C<sv> exactly once; the others may evaluate it multiple times. Only use this
-form if C<sv> is an expression with side effects, otherwise use the more
-efficient C<SvIV>.
-
-C<SvIV_nomg> is the same as C<SvIV>, 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<sv>'s NV slot, but not in all cases. (Use
-C<L</sv_setnv>> to make sure it does).
-
-C<SvNVx> is different from the others in that it is guaranteed to evaluate
-C<sv> exactly once; the others may evaluate it multiple times. Only use this
-form if C<sv> is an expression with side effects, otherwise use the more
-efficient C<SvNV>.
-
-C<SvNV_nomg> is the same as C<SvNV>, 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<sv>'s UV slot, but not in all cases. (Use
-C<L</sv_setuv>> to make sure it does).
-
-C<SvUVx> is different from the others in that it is guaranteed to evaluate
-C<sv> exactly once; the others may evaluate it multiple times. Only use this
-form if C<sv> is an expression with side effects, otherwise use the more
-efficient C<SvUV>.
-
-C<SvUV_nomg> is the same as C<SvUV>, 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<L</SvOK>> 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<sv> more than once.
-
-Returns a boolean as to whether or not C<sv> contains a PV that is considered
-TRUE. FALSE is returned if C<sv> 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<sv> 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<sv> 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<sv>, 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<sv>.
+
+=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<sv> 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<sv>, 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<sv>, instead use
+L</C<SV_CHECK_THINKFIRST_COW_DROP>> 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<sv> 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<L</mg_get>> on an SV if it has 'get' magic. For example, this
-will call C<FETCH> on a tied variable. This macro evaluates its
-argument more than once.
-
=for apidoc Am|void|SvSETMAGIC|SV* sv
Invokes C<L</mg_set>> 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<STORE>). 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<dsv> is the same as C<ssv>, these do nothing. Otherwise they all call
some form of C<L</sv_setsv>>. 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<sv> contains a PV that is considered
+TRUE. FALSE is returned if C<sv> 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<sv> 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<L</mg_get>> on an SV if it has 'get' magic. For example, this
+will call C<FETCH> 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<sv> 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<sv> 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<sv>'s IV slot, but not in all cases. (Use
+C<L</sv_setiv>> to make sure it does).
+
+As of 5.37.1, all are guaranteed to evaluate C<sv> only once.
+
+C<SvIVx> is now identical to C<SvIV>, but prior to 5.37.1, it was the only form
+guaranteed to evaluate C<sv> only once.
+
+C<SvIV_nomg> is the same as C<SvIV>, 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<sv>'s NV slot, but not in all cases. (Use
+C<L</sv_setnv>> to make sure it does).
+
+As of 5.37.1, all are guaranteed to evaluate C<sv> only once.
+
+C<SvNVx> is now identical to C<SvNV>, but prior to 5.37.1, it was the only form
+guaranteed to evaluate C<sv> only once.
+
+C<SvNV_nomg> is the same as C<SvNV>, 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<sv>'s UV slot, but not in all cases. (Use
+C<L</sv_setuv>> to make sure it does).
+
+As of 5.37.1, all are guaranteed to evaluate C<sv> only once.
+
+C<SvUVx> is now identical to C<SvUV>, but prior to 5.37.1, it was the only form
+guaranteed to evaluate C<sv> 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<not> 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 <sys/syscall.h>
+#include <stdarg.h>
+#include <errno.h>
+#include <sys/socket.h>
+#include <sys/event.h>
+#include <sys/futex.h>
+#include <sys/ioctl.h>
+#include <sys/ktrace.h>
+#include <sys/mman.h>
+#include <sys/mount.h>
+#include <sys/msg.h>
+#include <sys/poll.h>
+#include <sys/ptrace.h>
+#include <sys/resource.h>
+#include <sys/select.h>
+#include <sys/sem.h>
+#include <sys/shm.h>
+#include <sys/stat.h>
+#include <sys/sysctl.h>
+#include <sys/time.h>
+#include <sys/uio.h>
+#include <sys/wait.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <sched.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <syslog.h>
+#include <tib.h>
+#include <time.h>
+#include <unistd.h>
+#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 *); <signal.h>
+ * int sigprocmask(int, sigset_t); <sys/syscall.h>
+ *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 *); <signal.h>
+ * int sigpending(void); <sys/syscall.h>
+ *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 *); <signal.h>
+ * int sigsuspend(int); <sys/syscall.h>
+ *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); <unistd.h>
+ * int getlogin_r(char *, u_int); <sys/syscall.h>
+ *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</TAINT_PROPER> 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</TAINT_ENV> 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)
(<Foo::BAR> or <FOO>) 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_format> is non-zero, the input is to be considered a format sub
+(a specialised sub used to implement perl's C<format> feature); else a
+normal C<sub>.
+
+C<flags> are added to the flags for C<PL_compcv>. C<flags> may include the
+C<CVf_IsMETHOD> bit, which causes the new subroutine to be a method.
+
+This returns the value of C<PL_savestack_ix> 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<NOTE:> This API exists entirely for the purpose of making the CPAN module
+C<XS::Parse::Infix> work. It is not expected that additional modules will make
+use of it; rather, that they should use C<XS::Parse::Infix> 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</PL_infix_plugin> variable. C<new_plugin> is a
+pointer to the C function that is to be added to the infix plugin chain, and
+C<old_plugin_p> points to a storage location where a pointer to the next
+function in the chain will be stored. The value of C<new_plugin> is written
+into the L</PL_infix_plugin> variable, while the value previously stored there
+is written to C<*old_plugin_p>.
+
+Direct access to L</PL_infix_plugin> 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 <arpa/inet.h> to get inet_addr and friends declarations.
*/
-/*#define I_ARPA_INET / **/
+/*#define I_ARPA_INET / **/
/* I_DBM:
* This symbol, if defined, indicates that <dbm.h> exists and should
@@ -630,7 +630,7 @@
* This symbol, if defined, indicates to the C program that it should
* include <locale.h>.
*/
-/*#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 <sys/sockio.h> 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 <sys/stat.h>.
*/
-#define I_SYS_STAT /**/
+#define I_SYS_STAT /**/
/* I_SYS_TIMES:
* This symbol, if defined, indicates to the C program that it should
* include <sys/times.h>.
*/
-/*#define I_SYS_TIMES / **/
+/*#define I_SYS_TIMES / **/
/* I_SYS_TYPES:
* This symbol, if defined, indicates to the C program that it should
* include <sys/types.h>.
*/
-/*#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 <sys/uio.h> 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 <xlocale.h> 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 <bfd.h> exists and
* can be included.
*/
-/*#define I_BFD / **/
+/*#define I_BFD / **/
/* I_CRYPT:
* This symbol, if defined, indicates that <crypt.h> 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 <fp.h> exists and
* should be included.
*/
-/*#define I_FP / **/
+/*#define I_FP / **/
/* I_FP_CLASS:
* This symbol, if defined, indicates that <fp_class.h> exists and
* should be included.
*/
-/*#define I_FP_CLASS / **/
+/*#define I_FP_CLASS / **/
/* I_IEEEFP:
* This symbol, if defined, indicates that <ieeefp.h> 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 <langinfo.h> exists and
* should be included.
*/
-/*#define I_LANGINFO / **/
+/*#define I_LANGINFO / **/
/* I_LIBUTIL:
* This symbol, if defined, indicates that <libutil.h> 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 <mntent.h> 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 <poll.h> exists and
* should be included. (see also HAS_POLL)
*/
-/*#define I_POLL / **/
+/*#define I_POLL / **/
/* I_PROT:
* This symbol, if defined, indicates that <prot.h> exists and
* should be included.
*/
-/*#define I_PROT / **/
+/*#define I_PROT / **/
/* I_QUADMATH:
* This symbol, if defined, indicates that <quadmath.h> exists and
* should be included.
*/
-/*#define I_QUADMATH / **/
+/*#define I_QUADMATH / **/
/* I_SHADOW:
* This symbol, if defined, indicates that <shadow.h> exists and
* should be included.
*/
-/*#define I_SHADOW / **/
+/*#define I_SHADOW / **/
/* I_SOCKS:
* This symbol, if defined, indicates that <socks.h> exists and
* should be included.
*/
-/*#define I_SOCKS / **/
+/*#define I_SOCKS / **/
/* I_STDBOOL:
* This symbol, if defined, indicates that <stdbool.h> exists and
* can be included.
*/
-/*#define I_STDBOOL / **/
+/*#define I_STDBOOL / **/
/* I_STDINT:
* This symbol, if defined, indicates that <stdint.h> exists and
@@ -3769,54 +3780,59 @@
* This symbol, if defined, indicates that <sunmath.h> exists and
* should be included.
*/
-/*#define I_SUNMATH / **/
+/*#define I_SUNMATH / **/
/* I_SYSLOG:
* This symbol, if defined, indicates that <syslog.h> exists and
* should be included.
*/
-/*#define I_SYSLOG / **/
+/*#define I_SYSLOG / **/
/* I_SYSMODE:
* This symbol, if defined, indicates that <sys/mode.h> exists and
* should be included.
*/
-/*#define I_SYSMODE / **/
+/*#define I_SYSMODE / **/
/* I_SYS_MOUNT:
* This symbol, if defined, indicates that <sys/mount.h> exists and
* should be included.
*/
-/*#define I_SYS_MOUNT / **/
+/*#define I_SYS_MOUNT / **/
/* I_SYS_STATFS:
* This symbol, if defined, indicates that <sys/statfs.h> exists.
*/
-/*#define I_SYS_STATFS / **/
+/*#define I_SYS_STATFS / **/
/* I_SYS_STATVFS:
* This symbol, if defined, indicates that <sys/statvfs.h> exists and
* should be included.
*/
-/*#define I_SYS_STATVFS / **/
+/*#define I_SYS_STATVFS / **/
+
+/* I_SYS_SYSCALL:
+ * This symbol, if defined, indicates that <sys/syscall.h> exists.
+ */
+/*#define I_SYS_SYSCALL / **/
/* I_SYSUTSNAME:
* This symbol, if defined, indicates that <sys/utsname.h> exists and
* should be included.
*/
-/*#define I_SYSUTSNAME / **/
+/*#define I_SYSUTSNAME / **/
/* I_SYS_VFS:
* This symbol, if defined, indicates that <sys/vfs.h> exists and
* should be included.
*/
-/*#define I_SYS_VFS / **/
+/*#define I_SYS_VFS / **/
/* I_USTAT:
* This symbol, if defined, indicates that <ustat.h> exists and
* should be included.
*/
-/*#define I_USTAT / **/
+/*#define I_USTAT / **/
/* I_WCHAR:
* This symbol, if defined, indicates to the C program that <wchar.h>
@@ -3827,7 +3843,7 @@
/* I_WCTYPE:
* This symbol, if defined, indicates that <wctype.h> 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 <netdb.h> 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 <netdb.h> 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 <netdb.h> 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 <netdb.h> 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</sv_derived_from_pvn>, but takes the name string as the
+C<HvNAME> 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<L<NATIVE_TO_UNI(utf8_to_uvchr_buf(...))|perlapi/utf8_to_uvchr_buf>> instead.
-If you are not absolutely sure this is one of those cases, then assume it isn't
-and use plain C<utf8_to_uvchr_buf> instead.
-
-Returns the Unicode (not-native) code point of the first character in the
-string C<s> which
-is assumed to be in UTF-8 encoding; C<send> points to 1 beyond the end of C<s>.
-C<retlen> will be set to the length, in bytes, of that character.
-
-If C<s> 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<retlen> 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<retlen> isn't NULL) so that (S<C<s> + C<*retlen>>) is the
-next possible position in C<s> that could begin a non-malformed character.
-See L<perlapi/utf8n_to_uvchr> 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<e E<lt> 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<UTF8NESS_YES>
+
+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<UTF8NESS_NO>
+
+This means the string definitely should be treated as a sequence of bytes, not
+encoded as UTF-8.
+
+=item C<UTF8NESS_IMMATERIAL>
+
+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<UTF8NESS_UNKNOWN>
+
+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<C<0 E<lt>= I<enum value> E<lt>= UTF8NESS_IMMATERIAL>>
+
+the string may be treated in code as non-UTF8
+
+=item S<C<UTF8NESS_IMMATERIAL E<lt>= <I<enum value>>>
+
+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<strdup()>. Returns a pointer to a newly allocated
-string which is a duplicate of C<pv>. The size of the string is
-determined by C<strlen()>, which means it may not contain embedded C<NUL>
-characters and must have a trailing C<NUL>. 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<L</Safefree>> function, or
-L<C<SAVEFREEPV>|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<L</savesharedpv>>.
-
-=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<strndup()> would be if it existed. Returns a
-pointer to a newly allocated string which is a duplicate of the first
-C<len> bytes from C<pv>, plus a trailing
-C<NUL> byte. The memory allocated for
-the new string can be freed with the C<Safefree()> 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<L</savesharedpvn>>.
-
-=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<savepv()>/C<savepvn()> which gets the string to duplicate from
-the passed in SV using C<SvPV()>
-
-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<L</savesharedsvpv>>.
-
-=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<savesharedpv()> 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<max; j++) { /* copy environment */
- const Size_t len = strlen(environ[j]);
- tmpenv[j] = S_env_alloc(NULL, len, 1, 0, 1);
- Copy(environ[j], tmpenv[j], len+1, char);
- }
-
- tmpenv[max] = NULL;
- environ = tmpenv; /* tell exec where it is now */
- }
-
- if (!val) {
- safesysfree(environ[i]);
- while (environ[i]) {
- environ[i] = environ[i+1];
- i++;
- }
-# ifdef __amigaos4__
- goto my_setenv_out;
-# else
- return;
-# endif
- }
-
- if (!environ[i]) { /* does not exist yet */
- environ = (char**)S_env_alloc(environ, i, 2, 0, sizeof(char*));
- environ[i+1] = NULL; /* make sure it's null terminated */
- }
- else
- safesysfree(environ[i]);
-
- vlen = strlen(val);
-
- environ[i] = S_env_alloc(NULL, nlen, vlen, 2, 1);
- /* all that work just for this */
- my_setenv_format(environ[i], nam, nlen, val, vlen);
- }
- else {
-
-# endif /* !PERL_USE_SAFE_PUTENV */
+# if defined(USE_ITHREADS) && !defined(WIN32)
+ /* only parent thread can modify process environment, so no need to use a
+ * mutex */
+ if (PL_curinterp != aTHX)
+ return;
+# endif
-# ifdef MY_HAS_SETENV
-# if defined(HAS_UNSETENV)
+# if defined(HAS_SETENV) && defined(HAS_UNSETENV)
if (val == NULL) {
- (void)unsetenv(nam);
+ unsetenv(nam);
} else {
- (void)setenv(nam, val, 1);
+ setenv(nam, val, 1);
}
-# else /* ! HAS_UNSETENV */
- (void)setenv(nam, val, 1);
-# endif /* HAS_UNSETENV */
-# elif defined(HAS_UNSETENV)
+# elif defined(HAS_UNSETENV)
if (val == NULL) {
if (environ) /* old glibc can crash with null environ */
- (void)unsetenv(nam);
+ unsetenv(nam);
} else {
const Size_t nlen = strlen(nam);
const Size_t vlen = strlen(val);
char * const new_env = S_env_alloc(NULL, nlen, vlen, 2, 1);
my_setenv_format(new_env, nam, nlen, val, vlen);
- (void)putenv(new_env);
+ putenv(new_env);
}
-# else /* ! HAS_UNSETENV */
+# else /* ! HAS_UNSETENV */
- char *new_env;
const Size_t nlen = strlen(nam);
- Size_t vlen;
if (!val) {
val = "";
}
- vlen = strlen(val);
- new_env = S_env_alloc(NULL, nlen, vlen, 2, 1);
+ Size_t vlen = strlen(val);
+ char *new_env = S_env_alloc(NULL, nlen, vlen, 2, 1);
/* all that work just for this */
my_setenv_format(new_env, nam, nlen, val, vlen);
- (void)putenv(new_env);
-
-# endif /* MY_HAS_SETENV */
-
-# ifndef PERL_USE_SAFE_PUTENV
- }
+# ifndef WIN32
+ putenv(new_env);
+# else
+ PerlEnv_putenv(new_env);
+ safesysfree(new_env);
# endif
- }
-
-# ifdef __amigaos4__
-my_setenv_out:
- amigaos4_release_environ(__FUNCTION__);
-# endif
-}
-
-# else /* WIN32 */
-
-void
-Perl_my_setenv(pTHX_ const char *nam, const char *val)
-{
- char *envstr;
- const Size_t nlen = strlen(nam);
- Size_t vlen;
- if (!val) {
- val = "";
- }
- vlen = strlen(val);
- envstr = S_env_alloc(NULL, nlen, vlen, 2, 1);
- my_setenv_format(envstr, nam, nlen, val, vlen);
- (void)PerlEnv_putenv(envstr);
- safesysfree(envstr);
+# endif /* HAS_SETENV */
}
-# endif /* WIN32 */
-
-#endif /* USE_ENVIRON_ARRAY */
-
-
-
+#endif /* USE_ENVIRON_ARRAY || WIN32 */
#ifdef UNLINK_ALL_VERSIONS
I32
@@ -3805,35 +3562,6 @@ Perl_find_script(pTHX_ const char *scrip
/*
=for apidoc_section $embedding
-=for apidoc get_context
-
-Implements L<perlapi/C<PERL_GET_CONTEXT>>, 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<perlapi/C<PERL_SET_CONTEXT>>, 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<opcodes.h>, C<PL_op_name[opcode]> 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<opcodes.h>, C<PL_op_desc[opcode]> 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 <starlet.h>
#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) : "<unknown>",
+ 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<vsnprintf>.
=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<sv_vcatpvf> instead, or getting C<vsnp
=cut
*/
+
int
Perl_my_vsnprintf(char *buffer, const Size_t len, const char *format, va_list ap)
{
@@ -5602,35 +5298,49 @@ Perl_my_vsnprintf(char *buffer, const Si
return 0;
#else
int retval;
-#ifdef NEED_VA_COPY
+ dTHX;
+
+# ifdef NEED_VA_COPY
va_list apc;
PERL_ARGS_ASSERT_MY_VSNPRINTF;
Perl_va_copy(ap, apc);
-# ifdef HAS_VSNPRINTF
- retval = vsnprintf(buffer, len, format, apc);
-# else
+# ifdef HAS_VSNPRINTF
+
+ WITH_LC_NUMERIC_SET_TO_NEEDED(
+ retval = vsnprintf(buffer, len, format, apc);
+ );
+# else
PERL_UNUSED_ARG(len);
- retval = vsprintf(buffer, format, apc);
-# endif
+ WITH_LC_NUMERIC_SET_TO_NEEDED(
+ retval = vsprintf(buffer, format, apc);
+ );
+# endif
+
va_end(apc);
-#else
-# ifdef HAS_VSNPRINTF
- retval = vsnprintf(buffer, len, format, ap);
-# else
+# else
+# ifdef HAS_VSNPRINTF
+ WITH_LC_NUMERIC_SET_TO_NEEDED(
+ retval = vsnprintf(buffer, len, format, ap);
+ );
+# else
PERL_UNUSED_ARG(len);
- retval = vsprintf(buffer, format, ap);
-# endif
-#endif /* #ifdef NEED_VA_COPY */
+ WITH_LC_NUMERIC_SET_TO_NEEDED(
+ retval = vsprintf(buffer, format, ap);
+ );
+# endif
+# endif /* #ifdef NEED_VA_COPY */
+
/* vsprintf() shows failure with < 0 */
if (retval < 0
-#ifdef HAS_VSNPRINTF
+# ifdef HAS_VSNPRINTF
/* vsnprintf() shows failure with >= 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<strlcat> if available, or a Perl implementation of it.
-This operates on C C<NUL>-terminated strings.
-
-C<my_strlcat()> appends string C<src> to the end of C<dst>. It will append at
-most S<C<size - strlen(dst) - 1>> characters. It will then C<NUL>-terminate,
-unless C<size> is 0 or the original C<dst> string was longer than C<size> (in
-practice this should not happen as it means that either C<size> is incorrect or
-that C<dst> is not a proper C<NUL>-terminated string).
-
-Note that C<size> is the full size of the destination buffer and
-the result is guaranteed to be C<NUL>-terminated if there is room. Note that
-room for the C<NUL> should be included in C<size>.
-
-The return value is the total length that C<dst> would have if C<size> is
-sufficiently large. Thus it is the initial length of C<dst> plus the length of
-C<src>. If C<size> 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<strlcpy> if available, or a Perl implementation of it.
-This operates on C C<NUL>-terminated strings.
-
-C<my_strlcpy()> copies up to S<C<size - 1>> characters from the string C<src>
-to C<dst>, C<NUL>-terminating the result if C<size> is not 0.
-
-The return value is the total length C<src> would be if the copy completely
-succeeded. If it is larger than C<size>, 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 <sys/statvfs.h>.
+i_syssyscall (i_syssyscall.U):
+ This variable conditionally defines the I_SYS_SYSCALL symbol,
+ and indicates whether a C program should include <sys/syscall.h>.
+
i_systime (i_time.U):
This variable conditionally defines I_SYS_TIME, which indicates
to the C program that it should include <sys/time.h>.
@@ -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<checkAUTHORS.pl>
-
-Used by F<t/porting/authors.t> to ensure the F<AUTHORS> list is up to
-date. See also L<< /"F<updateAUTHORS.pl>" >> for a way to automatically
-fix issues found by this tool.
-
=head2 F<checkcfguse.pl>
Check where the symbols defined in the various F<config.sh>-clones
@@ -146,6 +140,11 @@ The charter of the Perl Documentation Te
List of Perl release epigraphs.
+=head2 F<exclude_contrib.txt>
+
+List of base 64 encoded SHA256 digests of C<< "name <email>" >> data
+which should be ignored by F<updateAUTHORS.pl>.
+
=head2 F<exec-bit.txt>
This file contains a list of files that F<makerel> 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-dist-modules.pl>
+
+Test modules in F<dist/> against the perl in C<PATH>. Used in the
+github workflow to test against older perls.
+
=head2 F<timecheck2.c>
A little program to test the limits of your system's time functions. See
@@ -381,10 +385,15 @@ any previous attempts.
=head2 F<updateAUTHORS.pl>
This script will automatically update AUTHORS and create .mailmap entries
-based on the git commit log history. If F<checkAUTHORS.pl> complains
+based on the git commit log history. If F<t/porting/authors.t> complains
during testing you should run this. It will automatically fix most if not
all AUTHORS related test fails.
+=head2 F<updateAUTHORS.pm>
+
+The class used by F<updateAUTHORS.pl> to do its business. Package name
+C<Porting::updateAUTHORS>.
+
=head2 F<valgrindpp.pl>
A post-processor for C<make test.valgrind>. F<valgrindpp.pl> 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<git bisect>,
+which is much more specifically aimed at finding "what broke the build".
+C<git> 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<bisect.pl> mimics this - you supply some code
+that I<fails> with a perl built B<at or after> the target commit and
+I<succeeds> with a perl built B<before> the target commit, and F<bisect.pl>
+will find the target commit.
+
+The F<bisect.pl> option C<--expect-fail> reverses those expectations
+(and changes nothing else). So with C<--expect-fail>, you should supply
+code that I<fails> only with a perl built B<before> the target commit,
+and I<succeeds> with a perl built B<at or after> the target commit.
+
+By default, I<failure> is a piece of perl code that terminates with
+a non-zero exit code, e.g. by calling C<die()>. 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<miniperl>
@@ -1062,6 +1102,90 @@ L<Commit 125e1a3|https://github.com/Perl
=back
+=head2 When did perl stop segfaulting on certain code?
+
+=over 4
+
+=item * Problem
+
+It was reported that perl was segfaulting on this code in perl-5.36.0:
+
+ @a = sort{eval"("}1,2
+
+Bisection subsequently identified the commit at which the segfaulting first
+appeared. But when we ran that code against what was then the HEAD of blead
+(L<Commit 70d911|https://github.com/Perl/perl5/commit/70d911984f>), 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<miniperl>, 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<GH issue 20261|https://github.com/Perl/perl5/issues/20261>
+
+=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<bigrat> module and
+C<Scalar::Util::looks_like_number()> was called passing a non-integral number
+(I<i.e.,> 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<GH issue 20685|https://github.com/Perl/perl5/issues/20685>
+
+=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 <<EOP
++#include <stdio.h>
++#include <sys/types.h>
++#include <unistd.h>
+ 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 <<EOM
++#include <stdio.h>
+ 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 <stdlib.h> 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+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 <stdio.h> 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/<<!NO!SUBS!/<<'!NO!SUBS!'/;
+ return $code;
+ });
+ }
+
if ($major == 7) {
# Remove commits 9fec149bb652b6e9 and 5bab1179608f81d8, which add/amend
# rules to automatically run regen scripts that rebuild C headers. These
@@ -2941,6 +3454,38 @@ $2!;
}
}
+ if ($^O eq 'darwin' && ($major < 8
+ || ($major < 10
+ && !extract_from_file('ext/DynaLoader/Makefile.PL',
+ qr/sub MY::static /)))) {
+ my $cwd = Cwd::getcwd();
+ my $wrapper = 'miniperl.sh';
+ my $fh = open_or_die($wrapper, '>');
+ 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 <fcntl.h>
++#endif
++
++#ifdef I_SYS_FILE
++# include <sys/file.h>
++#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 <unistd\.h>/)) {
+ 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 <unistd\.h>/)) {
# 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 <signal.h>
+ # 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+ <signal\.h>
+ \n
+ \#endif
+ \n
+ }
+ {\n#include <signal.h>\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 <path>'."
- 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] <git-log-output-file>
-
-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 <authors-file> # 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 (<DATA>) {
- 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: <a href="/Perl/perl5/commits?author=ThisIsMyGitHubID"
- my @github_ids; # up to two entries author and committer
- while ( $content =~ s{\Q<a href="/Perl/perl5/commits?author=\E(.+)"}{} ) {
- push @github_ids, '@' . $1;
- }
-
- warn "Found more than two github ids for $github_url_for_commit" if scalar @github_ids > 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\) <perlbug-followup\@perl\.org>$/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 <arpa/inet.h> to get inet_addr and friends declarations.
*/
-#define I_ARPA_INET /**/
+#define I_ARPA_INET /**/
/* I_DBM:
* This symbol, if defined, indicates that <dbm.h> exists and should
@@ -640,7 +640,7 @@
* This symbol, if defined, indicates to the C program that it should
* include <locale.h>.
*/
-#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 <sys/sockio.h> 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 <sys/stat.h>.
*/
-#define I_SYS_STAT /**/
+#define I_SYS_STAT /**/
/* I_SYS_TIMES:
* This symbol, if defined, indicates to the C program that it should
* include <sys/times.h>.
*/
-#define I_SYS_TIMES /**/
+#define I_SYS_TIMES /**/
/* I_SYS_TYPES:
* This symbol, if defined, indicates to the C program that it should
* include <sys/types.h>.
*/
-#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 <sys/uio.h> 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 <xlocale.h> 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 <bfd.h> exists and
* can be included.
*/
-/*#define I_BFD / **/
+/*#define I_BFD / **/
/* I_CRYPT:
* This symbol, if defined, indicates that <crypt.h> 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 <fp.h> exists and
* should be included.
*/
-/*#define I_FP / **/
+/*#define I_FP / **/
/* I_FP_CLASS:
* This symbol, if defined, indicates that <fp_class.h> exists and
* should be included.
*/
-/*#define I_FP_CLASS / **/
+/*#define I_FP_CLASS / **/
/* I_IEEEFP:
* This symbol, if defined, indicates that <ieeefp.h> 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 <langinfo.h> exists and
* should be included.
*/
-#define I_LANGINFO /**/
+#define I_LANGINFO /**/
/* I_LIBUTIL:
* This symbol, if defined, indicates that <libutil.h> 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 <mntent.h> 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 <poll.h> exists and
* should be included. (see also HAS_POLL)
*/
-#define I_POLL /**/
+#define I_POLL /**/
/* I_PROT:
* This symbol, if defined, indicates that <prot.h> exists and
* should be included.
*/
-/*#define I_PROT / **/
+/*#define I_PROT / **/
/* I_QUADMATH:
* This symbol, if defined, indicates that <quadmath.h> exists and
* should be included.
*/
-#define I_QUADMATH /**/
+#define I_QUADMATH /**/
/* I_SHADOW:
* This symbol, if defined, indicates that <shadow.h> exists and
* should be included.
*/
-#define I_SHADOW /**/
+#define I_SHADOW /**/
/* I_SOCKS:
* This symbol, if defined, indicates that <socks.h> exists and
* should be included.
*/
-/*#define I_SOCKS / **/
+/*#define I_SOCKS / **/
/* I_STDBOOL:
* This symbol, if defined, indicates that <stdbool.h> exists and
* can be included.
*/
-#define I_STDBOOL /**/
+#define I_STDBOOL /**/
/* I_STDINT:
* This symbol, if defined, indicates that <stdint.h> exists and
@@ -3705,54 +3705,54 @@
* This symbol, if defined, indicates that <sunmath.h> exists and
* should be included.
*/
-/*#define I_SUNMATH / **/
+/*#define I_SUNMATH / **/
/* I_SYSLOG:
* This symbol, if defined, indicates that <syslog.h> exists and
* should be included.
*/
-#define I_SYSLOG /**/
+#define I_SYSLOG /**/
/* I_SYSMODE:
* This symbol, if defined, indicates that <sys/mode.h> exists and
* should be included.
*/
-/*#define I_SYSMODE / **/
+/*#define I_SYSMODE / **/
/* I_SYS_MOUNT:
* This symbol, if defined, indicates that <sys/mount.h> exists and
* should be included.
*/
-#define I_SYS_MOUNT /**/
+#define I_SYS_MOUNT /**/
/* I_SYS_STATFS:
* This symbol, if defined, indicates that <sys/statfs.h> exists.
*/
-#define I_SYS_STATFS /**/
+#define I_SYS_STATFS /**/
/* I_SYS_STATVFS:
* This symbol, if defined, indicates that <sys/statvfs.h> exists and
* should be included.
*/
-#define I_SYS_STATVFS /**/
+#define I_SYS_STATVFS /**/
/* I_SYSUTSNAME:
* This symbol, if defined, indicates that <sys/utsname.h> exists and
* should be included.
*/
-#define I_SYSUTSNAME /**/
+#define I_SYSUTSNAME /**/
/* I_SYS_VFS:
* This symbol, if defined, indicates that <sys/vfs.h> exists and
* should be included.
*/
-#define I_SYS_VFS /**/
+#define I_SYS_VFS /**/
/* I_USTAT:
* This symbol, if defined, indicates that <ustat.h> exists and
* should be included.
*/
-#define I_USTAT /**/
+#define I_USTAT /**/
/* I_WCHAR:
* This symbol, if defined, indicates to the C program that <wchar.h>
@@ -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 <netdb.h> 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 <netdb.h> 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 <netdb.h> 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 <netdb.h> 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 <blogs@thing.com>
+#
+# 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{(?<!\A)(\.[^.]+\z)}{\0\0$1};
- # return the original string, and the munged filename
- [ $_, $m ];
- } @_;
+ # return the original string, and the munged filename, and root dir
+ [ $_, $m, $d ];
+ } @pretty_lines;
+
+ return @pretty_lines;
}
1;
Index: gnu/usr.bin/perl/Porting/perldelta_template.pod
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/Porting/perldelta_template.pod,v
diff -u -p -a -u -p -r1.13 perldelta_template.pod
--- gnu/usr.bin/perl/Porting/perldelta_template.pod 23 Dec 2023 21:02:20 -0000 1.13
+++ gnu/usr.bin/perl/Porting/perldelta_template.pod 21 Feb 2024 15:47:00 -0000
@@ -115,7 +115,7 @@ release manager will have to investigate
=item *
-XXX Remove this section if not applicable.
+XXX Remove this section if Porting/corelist-perldelta.pl did not add any content here.
=back
@@ -127,7 +127,7 @@ XXX Remove this section if not applicabl
L<XXX> 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<ext/> and F<lib/> are best summarized in L</Modules and Pragmata>.
+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<Porting/updateAUTHORS.pl>.
-
-(The old method was C<Porting/checkAUTHORS.pl --update --from=5.X.Y> and
-it's still used under the hood, but you should use the
-F<Porting/updateAUTHORS.pl> update.)
-
-In the old method, for MAINT and BLEAD-FINAL releases, C<v5.X.Y> 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<N>
-When running C<make>, pass a C<< -jI<N> >> option to it.
+When running C<make>, pass a C<< -jI<N> >> option to it to enable
+parallel building.
+
+Note that you can also set C<< TEST_JOBS=I<N> >> 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 <return> to continue; ^C to abort ";
+ if ($yes_to_all) {
+ print "\n--yes was used on command line, continuing.\n";
+ } else {
+ my $noop = <STDIN>;
+ }
+ 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 "; <STDIN>;
-}
+ 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 "; <STDIN>;
+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) "; <STDIN>;
-
-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 <DATA>
+my %file_data;
+
+sub _write_from_data {
+ my ($want_name) = @_;
+
+ unless (keys %file_data) {
+ my $name;
+ while (<DATA>) {
+ 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 <<EOS;
+Usage: $^X $0 [options] [distnames]
+ -c | -continue
+ Continue processing after failures
+ Devel::PPPort must successfully build to continue.
+ -s | -separate
+ Install to a work path, not to perl's site_perl.
+ -h | -help
+ Display this message.
+
+Optional distnames should be names of the distributions under dist/ to
+test. If omitted all of the distributions under dist/ are tested.
+Devel-PPPort is always tested.
+
+Test all of the distributions, stop on the first failure:
+
+ $^X $0 -s
+
+Test the various threads distributions, continue on failure:
+
+ $^X $0 -s -c threads threads-shared Thread-Queue Thread-Semaphore
+EOS
+}
+
+__DATA__
+-- t/test.pl --
+#
+# t/test.pl - most of Test::More functionality without the fuss
+
+
+# NOTE:
+#
+# Increment ($x++) has a certain amount of cleverness for things like
+#
+# $x = 'zz';
+# $x++; # $x eq 'aaa';
+#
+# stands more chance of breaking than just a simple
+#
+# $x = $x + 1
+#
+# In this file, we use the latter "Baby Perl" approach, and increment
+# will be worked over by t/op/inc.t
+
+$Level = 1;
+my $test = 1;
+my $planned;
+my $noplan;
+my $Perl; # Safer version of $^X set by which_perl()
+
+$TODO = 0;
+$NO_ENDING = 0;
+
+# Use this instead of print to avoid interference while testing globals.
+sub _print {
+ local($\, $", $,) = (undef, ' ', '');
+ print STDOUT @_;
+}
+
+sub _print_stderr {
+ local($\, $", $,) = (undef, ' ', '');
+ print STDERR @_;
+}
+
+sub plan {
+ my $n;
+ if (@_ == 1) {
+ $n = shift;
+ if ($n eq 'no_plan') {
+ undef $n;
+ $noplan = 1;
+ }
+ } else {
+ my %plan = @_;
+ $n = $plan{tests};
+ }
+ _print "1..$n\n" unless $noplan;
+ $planned = $n;
+}
+
+END {
+ my $ran = $test - 1;
+ if (!$NO_ENDING) {
+ if (defined $planned && $planned != $ran) {
+ _print_stderr
+ "# Looks like you planned $planned tests but ran $ran.\n";
+ } elsif ($noplan) {
+ _print "1..$ran\n";
+ }
+ }
+}
+
+# Use this instead of "print STDERR" when outputing failure diagnostic
+# messages
+sub _diag {
+ return unless @_;
+ my @mess = map { /^#/ ? "$_\n" : "# $_\n" }
+ map { split /\n/ } @_;
+ $TODO ? _print(@mess) : _print_stderr(@mess);
+}
+
+sub diag {
+ _diag(@_);
+}
+
+sub skip_all {
+ if (@_) {
+ _print "1..0 # Skip @_\n";
+ } else {
+ _print "1..0\n";
+ }
+ exit(0);
+}
+
+sub _ok {
+ my ($pass, $where, $name, @mess) = @_;
+ # Do not try to microoptimize by factoring out the "not ".
+ # VMS will avenge.
+ my $out;
+ if ($name) {
+ # escape out '#' or it will interfere with '# skip' and such
+ $name =~ s/#/\\#/g;
+ $out = $pass ? "ok $test - $name" : "not ok $test - $name";
+ } else {
+ $out = $pass ? "ok $test" : "not ok $test";
+ }
+
+ $out .= " # TODO $TODO" if $TODO;
+ _print "$out\n";
+
+ unless ($pass) {
+ _diag "# Failed $where\n";
+ }
+
+ # Ensure that the message is properly escaped.
+ _diag @mess;
+
+ $test = $test + 1; # don't use ++
+
+ return $pass;
+}
+
+sub _where {
+ my @caller = caller($Level);
+ return "at $caller[1] line $caller[2]";
+}
+
+# DON'T use this for matches. Use like() instead.
+sub ok ($@) {
+ my ($pass, $name, @mess) = @_;
+ _ok($pass, _where(), $name, @mess);
+}
+
+sub _q {
+ my $x = shift;
+ return 'undef' unless defined $x;
+ my $q = $x;
+ $q =~ s/\\/\\\\/g;
+ $q =~ s/'/\\'/g;
+ return "'$q'";
+}
+
+sub _qq {
+ my $x = shift;
+ return defined $x ? '"' . display ($x) . '"' : 'undef';
+};
+
+# keys are the codes \n etc map to, values are 2 char strings such as \n
+my %backslash_escape;
+foreach my $x (split //, 'nrtfa\\\'"') {
+ $backslash_escape{ord eval "\"\\$x\""} = "\\$x";
+}
+# A way to display scalars containing control characters and Unicode.
+# Trying to avoid setting $_, or relying on local $_ to work.
+sub display {
+ my @result;
+ foreach my $x (@_) {
+ if (defined $x and not ref $x) {
+ my $y = '';
+ foreach my $c (unpack("U*", $x)) {
+ if ($c > 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 <<REQUIRE_OK;
+require $require;
+REQUIRE_OK
+ _ok(!$@, _where(), "require $require");
+}
+
+sub use_ok ($) {
+ my ($use) = @_;
+ eval <<USE_OK;
+use $use;
+USE_OK
+ _ok(!$@, _where(), "use $use");
+}
+
+# runperl - Runs a separate perl interpreter.
+# Arguments :
+# switches => [ 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 <<WHOA;
+WHOA! I tried to call ->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<makedef.pl> that generates the list of exported symbols on
+The script F<makedef.pl> generates the list of exported symbols on
platforms which need this. Functions are declared in F<embed.fnc>, variables
in F<intrpvar.h>. Quite a few of the functions and variables are conditionally
declared there, using C<#ifdef>. However, F<makedef.pl> 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<http://www.xray.mpe.mpg.de/mailing-lis
=head1 Big projects
Tasks that will get your name mentioned in the description of the "Highlights
-of 5.36.3"
+of 5.40.0"
=head2 make ithreads more robust
Index: gnu/usr.bin/perl/Porting/updateAUTHORS.pl
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/Porting/updateAUTHORS.pl,v
diff -u -p -a -u -p -r1.1.1.1 updateAUTHORS.pl
--- gnu/usr.bin/perl/Porting/updateAUTHORS.pl 15 Feb 2023 01:33:12 -0000 1.1.1.1
+++ gnu/usr.bin/perl/Porting/updateAUTHORS.pl 21 Feb 2024 15:47:00 -0000
@@ -1,11 +1,15 @@
#!/usr/bin/env perl
-package Porting::updateAUTHORS;
+package App::Porting::updateAUTHORS;
use strict;
use warnings;
use Getopt::Long qw(GetOptions);
use Pod::Usage qw(pod2usage);
use Data::Dumper;
-use Encode qw(encode_utf8 decode_utf8 decode);
+use Encode qw(encode_utf8 decode_utf8);
+use lib "./";
+use Porting::updateAUTHORS;
+use Test::More;
+use Text::Wrap qw(wrap);
# The style of this file is determined by:
#
@@ -13,649 +17,735 @@ use Encode qw(encode_utf8 decode_utf8 de
# -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 @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*<unknown>\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 .= <<EOF_PROPS;
-sub update_mailmap {
- my ($mailmap_hash, $mailmap_preamble, $mailmap_file)= @_;
- $mailmap_file ||= ".mailmap";
-
- my $mailmap_file_new= $mailmap_file . "_new";
- open my $out, ">", $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 .= <<EOF_EXTRA;
- # [ preferred_name, preferred_email, other_name, other_email ]
- push @recs, [ $1, $2, $3, $4, $line_num ];
- }
- return \@recs;
-}
+Your committer and author details differ. You may want to review your
+git configuration.
-sub _safe_set_key {
- my ($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";
- }
-}
+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 .= " <unknown>";
-
- $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 .= <<EOF_PROPS;
+
+ Name = $author_name
+ Email = $author_email
+EOF_PROPS
}
- return 1;
-}
-sub check_fix_mailmap_hash {
- my ($mailmap_hash, $authors_info)= @_;
- my $parsed= parse_mailmap_hash($mailmap_hash);
- my @fixed;
- my %seen_map;
- my %pref_groups;
-
- # 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= $authors_info->{"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 <blogs> <whatever>
- # where there is a corresponding
- # Joe <blogs> Joe X <blogs>
- 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 "<unknown>") {
- _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<Porting/updateAUTHORS.pl> - Automatically update F<AUTHORS> and F<.mailmap>
+and F<Porting/exclude_contrib.txt> 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<AUTHORS> 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<Porting::updateAUTHORS>. These are as follows:
+Override the default location of the authors file, which is by default
+the F<AUTHORS> 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<Porting/exclude_contrib.txt> 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<< <unknown> >>.
+
+For example:
+
+ Porting/updateAUTHORS.pl --exclude-contrib="Joe B <b@joe.com>"
+
+Would remove all references to "Joe B" from F<AUTHORS> and F<.mailmap>
+and add the required entires to F<Porting/exclude_contrib.txt> 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<Porting/exclude_contrib.txt> 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<AUTHORS>
+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<Porting/checkAUTHORS.pl> 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<somebody@gmail.com> 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<AUTHORS> 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<AUTHORS> 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<git log>.
+
+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<Porting/checkAUTHORS.pl>
+There are several ways to do this:
+
+=over 2
+
+=item Manual Exclusion
+
+Manually modify F<AUTHORS> 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<Porting/exclude_contrib.txt>. 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 <email@provider.com>"
+
+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<AUTHORS> 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<AUTHORS> 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<git log> and other C<git> 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<AUTHORS>, F<.mailmap>, F<Porting/excluded_author.txt>
+
+=head1 TODO
+
+More documentation and testing.
=head1 AUTHOR
Yves Orton <demerphq@gmail.com>
+
+=head1 THANKS
+
+Loosely based on the older F<Porting/checkAUTHORS.pl> 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+<unknown>\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 .= " <unknown>";
+
+ $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 .= " <unknown>"
+ 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 <blogs> <whatever>
+ # where there is a corresponding
+ # Joe <blogs> Joe X <whatever>
+ 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 "<unknown>") {
+ $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 <unknown> with a single word name.
+ # Eg, we wont list "Bob <unknown>"
+ if ($author =~ s/\s*<unknown>\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<Porting/updateAUTHORS.pl> script. It is expected
+to be used B<from> that script and B<by> that script. Most features and
+options are documented in the F<Porting/updateAUTHORS.pl> and are not
+explicitly documented here, read the F<Porting/updateAUTHORS.pl> 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<Porting/updateAUTHORS.pl> 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<read_and_update> and not called directly.
+
+=item read_authors_file()
+
+Read the AUTHORS file into the object, and return data about it.
+
+Normally used via C<read_and_update> and not called directly.
+
+=item read_mailmap_file()
+
+Read the .mailmap file into the object and return data about it.
+
+Normally used via C<read_and_update> and not called directly.
+
+=item read_exclusion_file()
+
+Read the exclusion file into the object and return data about it.
+
+Normally used via C<read_and_update> 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<read_and_update> 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<read_and_update> 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<read_and_update> and not called directly.
+
+=back
+
+=head1 TODO
+
+More documentation and testing.
+
+=head1 SEE ALSO
+
+F<Porting/checkAUTHORS.pl>
+
+=head1 AUTHOR
+
+Yves Orton <demerphq@gmail.com>
+
+=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<GitHub "steering" team|https://github.com/orgs/Perl/teams/perl-steering-council/members> to match incoming Steering Council
=item *
-request that the Perl NOC update the perl-security list to include all incoming
+request that the L<Perl NOC|https://noc.perl.org> 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 <jseward@acm.org>
- 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 <jseward@acm.org>
- 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 <jseward@acm.org>
- 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 <jseward@acm.org>
- 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 <jseward@acm.org>
- 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 <jseward@acm.org>
- 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 <pmqs@cpan.org>
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<ppport.h> 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<ppport.h>.
-
-=head2 --patch=I<file>
-
-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<suffix>
-
-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<Text::Diff> or a C<diff> program to be installed.
-
-=head2 --diff=I<program>
-
-Manually set the diff program and options to use. The default
-is to use C<Text::Diff>, when installed, and output unified
-context diffs.
-
-=head2 --compat-version=I<version>
-
-Tell F<ppport.h> 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<ppport.h> if you intend to be backward compatible only
-down to a certain Perl version.
-
-=head2 --cplusplus
-
-Usually, F<ppport.h> will detect C++ style comments and
-replace them with C style comments for portability reasons.
-Using this option instructs F<ppport.h> 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<ppport.h>.
-This reduces the size of F<ppport.h> dramatically and may be useful
-if you want to include F<ppport.h> in smaller modules without
-increasing their distribution size too much.
-
-The stripped F<ppport.h> will have a C<--unstrip> option that allows
-you to undo the stripping, but only if an appropriate C<Devel::PPPort>
-module is installed.
-
-=head2 --list-provided
-
-Lists the API elements for which compatibility is provided by
-F<ppport.h>. 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<ppport.h> and below which version of Perl they probably
-won't be available or work.
-
-=head2 --api-info=I<name>
-
-Show portability information for API elements matching I<name>.
-If I<name> 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<PL_> prefix is deprecated. Also,
-some API functions used to have a C<perl_> prefix. Using this form is
-also deprecated. You can safely use the supported API, as F<ppport.h>
-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<ppport.h>.
-
-These functions or variables will be marked C<explicit> 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<static> or global
-variants.
-
-For a C<static> 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<DPPP_NAMESPACE>
-macro. Just C<#define> the macro before including C<ppport.h>:
-
- #define DPPP_NAMESPACE MyOwnNamespace_
- #include "ppport.h"
-
-The default namespace is C<DPPP_>.
-
-=back
-
-The good thing is that most of the above can be checked by running
-F<ppport.h> on your source code. See the next section for
-details.
-
-=head1 EXAMPLES
-
-To verify whether F<ppport.h> is needed for your module, whether you
-should make any changes to your code, and whether any special defines
-should be used, F<ppport.h> 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<diff> 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<newSVpvn> 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<ppport.h> is causing failure during
-the compilation of this module, please check if newer versions
-of either this module or C<Devel::PPPort> are available on CPAN
-before sending a bug report.
-
-If F<ppport.h> was generated using the latest version of
-C<Devel::PPPort> and is causing failure of this module, please
-send a bug report to L<perlbug@perl.org|mailto:perlbug@perl.org>.
-
-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<Devel::PPPort>
-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<Devel::PPPort>.
-
-=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 (<DATA>) {
- 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 $/; <IN> };
- 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 = <<HEADER . $diff;
---- $file
-+++ $file.patched
-HEADER
- }
-
- if (!defined $diff) {
- $diff = run_diff('diff -u', $file, $str);
- }
-
- if (!defined $diff) {
- $diff = run_diff('diff', $file, $str);
- }
-
- if (!defined $diff) {
- error("Cannot generate a diff. Please install Text::Diff or use --copy.");
- return;
- }
-
- print F $diff;
-}
-
-sub run_diff
-{
- my($prog, $file, $str) = @_;
- my $tmp = 'dppptemp';
- my $suf = 'aaa';
- my $diff = '';
- local *F;
-
- while (-e "$tmp.$suf") { $suf++ }
- $tmp = "$tmp.$suf";
-
- if (open F, ">$tmp") {
- print F $str;
- close F;
-
- if (open F, "$prog $file $tmp |") {
- while (<F>) {
- 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 <<ENDUSAGE;
-
-Usage: $usage
-
-See perldoc $0 for details.
-
-ENDUSAGE
-
- exit 2;
-}
-
-sub strip
-{
- my $self = do { local(@ARGV,$/)=($0); <> };
- 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 <<END;
-
-Sorry, but this is a stripped version of \$0.
-
-To be able to use its original script and doc functionality,
-please try to regenerate this file using:
-
- \$^X \$0 --unstrip
-
-END
-/ms;
- my($pl, $c) = $self =~ /(.*^__DATA__)(.*)/ms;
- $c =~ s{
- / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]*)
- | ( "[^"\\]*(?:\\.[^"\\]*)*"
- | '[^'\\]*(?:\\.[^'\\]*)*' )
- | ($HS+) }{ defined $2 ? ' ' : ($1 || '') }gsex;
- $c =~ s!\s+$!!mg;
- $c =~ s!^$LF!!mg;
- $c =~ s!^\s*#\s*!#!mg;
- $c =~ s!^\s+!!mg;
-
- open OUT, ">$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 <patchlevel.h>
-# endif
-# if !(defined(PERL_VERSION) || (defined(SUBVERSION) && defined(PATCHLEVEL)))
-# include <could_not_find_Perl_patchlevel.h>
-# 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 <limits.h>
-#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 <values.h> */
-# 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 <values.h> */
-# 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 <note.h>
-# 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 <locale.h>
- 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<which can
-work together>.
-
-=head2 Construction
-
-=over 4
-
-=item B<new>
-
- 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<new> 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<create>.
-
-=cut
-
-my $Test = Test::Builder->new;
-sub new {
- my($class) = shift;
- $Test ||= $class->create;
- return $Test;
-}
-
-
-=item B<create>
-
- 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<new()> if you're testing
-a Test::Builder based module, but otherwise you probably want C<new>.
-
-B<NOTE>: the implementation is not complete. C<level>, for example, is
-still shared amongst B<all> 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<reset>
-
- $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<exported_to>
-
- 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<plan>
-
- $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<expected_tests>
-
- 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<no_plan>
-
- $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<has_plan>
-
- $plan = $Test->has_plan
-
-Find out whether a plan has been defined. $plan is either C<undef> (no plan has been set), C<no_plan> (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<skip_all>
-
- $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<ok>
-
- $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(<<ERR) if defined $name and $name =~ /^[\d\s]+$/;
- You named your test '$name'. You shouldn't use numbers for your test names.
- Very confusing.
-ERR
-
- my($pack, $file, $line) = $self->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<is_eq>
-
- $Test->is_eq($got, $expected, $name);
-
-Like Test::More's is(). Checks if $got eq $expected. This is the
-string version.
-
-=item B<is_num>
-
- $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 <<DIAGNOSTIC, $got, $expect);
- got: %s
- expected: %s
-DIAGNOSTIC
-
-}
-
-=item B<isnt_eq>
-
- $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<isnt_num>
-
- $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<like>
-
- $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<unlike>
-
- $Test->unlike($this, qr/$regex/, $name);
- $Test->unlike($this, '/$regex/', $name);
-
-Like Test::More's unlike(). Checks if $this B<does not match> 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<maybe_regex>
-
- $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 <<DIAGNOSTIC, $this, $match, $regex);
- %s
- %13s '%s'
-DIAGNOSTIC
-
- }
-
- return $ok;
-}
-
-=item B<cmp_ok>
-
- $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 <<DIAGNOSTIC, $got, $type, $expect);
- %s
- %s
- %s
-DIAGNOSTIC
-}
-
-=item B<BAILOUT>
-
- $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<skip>
-
- $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<todo_skip>
-
- $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<skip_rest>
-
- $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<level>
-
- $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<use_numbers>
-
- $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<no_header>
-
- $Test->no_header($no_header);
-
-If set to true, no "1..N" header will be printed.
-
-=item B<no_ending>
-
- $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<diag>
-
- $Test->diag(@msgs);
-
-Prints out the given @msgs. Like C<print>, 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<ok() || diag()>) it "passes through" the failure.
-
- return ok(...) || diag(...);
-
-=for blame transfer
-Mark Fowler <mark@twoshortplanks.com>
-
-=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<output>
-
- $Test->output($fh);
- $Test->output($file);
-
-Where normal "ok/not ok" test output should go.
-
-Defaults to STDOUT.
-
-=item B<failure_output>
-
- $Test->failure_output($fh);
- $Test->failure_output($file);
-
-Where diagnostic output on test failures and diag() should go.
-
-Defaults to STDERR.
-
-=item B<todo_output>
-
- $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<current_test>
-
- 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<summary>
-
- 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<details>
-
- 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<todo>
-
- 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<caller>
-
- 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 <<WHOA;
-WHOA! $desc
-This should never happen! Please contact the author immediately!
-WHOA
- }
-}
-
-=item B<_my_exit>
-
- _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<before>
-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
-E<lt>schwern@pobox.comE<gt>
-
-=head1 COPYRIGHT
-
-Copyright 2002, 2004 by chromatic E<lt>chromatic@wgz.orgE<gt> and
- Michael G Schwern E<lt>schwern@pobox.comE<gt>.
-
-This program is free software; you can redistribute it and/or
-modify it under the same terms as Perl itself.
-
-See F<http://www.perl.com/perl/misc/Artistic.html>
-
-=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<STOP!> 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<ok()> 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>.
-
- 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<NOTE>: using no_plan requires a Test::Harness upgrade else it will
-think everything has failed. See L<BUGS>)
-
-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<Test::Harness> 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>
-
- 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<very> 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<is>
-
-=item B<isnt>
-
- is ( $this, $that, $test_name );
- isnt( $this, $that, $test_name );
-
-Similar to ok(), is() and isnt() compare their two arguments
-with C<eq> and C<ne> 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<exists $brooklyn{tree}> 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<isn't()>
-function which is an alias of isnt().
-
-=cut
-
-sub is ($$;$) {
- $Test->is_eq(@_);
-}
-
-sub isnt ($$;$) {
- $Test->isnt_eq(@_);
-}
-
-*isn't = \&isnt;
-
-
-=item B<like>
-
- like( $this, qr/that/, $test_name );
-
-Similar to ok(), like() matches $this against the regex C<qr/that/>.
-
-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<qr//>) 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>
-
- unlike( $this, qr/that/, $test_name );
-
-Works exactly as like(), only it checks if $this B<does not> match the
-given pattern.
-
-=cut
-
-sub unlike ($$;$) {
- $Test->unlike(@_);
-}
-
-
-=item B<cmp_ok>
-
- 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<eq> will interfere:
-
- cmp_ok( $big_hairy_number, '==', $another_big_hairy_number );
-
-=cut
-
-sub cmp_ok($$$;$) {
- $Test->cmp_ok(@_);
-}
-
-
-=item B<can_ok>
-
- 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>
-
- 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 <<WHOA;
-WHOA! I tried to call ->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<pass>
-
-=item B<fail>
-
- 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<print STDERR>.
-
-=over 4
-
-=item B<diag>
-
- diag(@diagnostic_message);
-
-Prints a diagnostic message which is guaranteed not to interfere with
-test output. Like C<print> @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<ok() or diag()> with the mnemonic C<open() or
-die()>.
-
-All diag()s can be made silent by passing the "no_diag" option to
-Test::More. C<use Test::More tests => 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<NOTE> 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<use_ok> and C<require_ok>.
-
-=over 4
-
-=item B<use_ok>
-
- 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 <<USE;
-package $pack;
-use $module $imports[0];
-USE
- }
- else {
- eval <<USE;
-package $pack;
-use $module \@imports;
-USE
- }
-
- my $ok = $Test->ok( !$@, "use $module;" );
-
- unless( $ok ) {
- chomp $@;
- $@ =~ s{^BEGIN failed--compilation aborted at .*$}
- {BEGIN failed--compilation aborted at $filename line $line.}m;
- $Test->diag(<<DIAGNOSTIC);
- Tried to use '$module'.
- Error: $@
-DIAGNOSTIC
-
- }
-
- return $ok;
-}
-
-=item B<require_ok>
-
- 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 <<REQUIRE;
-package $pack;
-require $module;
-REQUIRE
-
- my $ok = $Test->ok( !$@, "require $module;" );
-
- unless( $ok ) {
- chomp $@;
- $Test->diag(<<DIAGNOSTIC);
- Tried to require '$module'.
- Error: $@
-DIAGNOSTIC
-
- }
-
- return $ok;
-}
-
-
-sub _is_module_name {
- my $module = shift;
-
- # Module names start with a letter.
- # End with an alphanumeric.
- # The rest is an alphanumeric or ::
- $module =~ s/\b::\b//g;
- $module =~ /^[a-zA-Z]\w*$/;
-}
-
-=back
-
-=head2 Conditional tests
-
-Sometimes running a test under certain conditions will cause the
-test script to die. A certain function or method isn't implemented
-(such as fork() on MacOS), some resource isn't available (like a
-net connection) or a module isn't available. In these cases it's
-necessary to skip tests, or declare that they are supposed to fail
-but will work in the future (a todo test).
-
-For more details on the mechanics of skip and todo tests see
-L<Test::Harness>.
-
-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: BLOCK>
-
- 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<won't be run at all>. 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<no_plan> $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<SKIP>, 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: BLOCK>
-
- 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<NOTE>: TODO tests require a Test::Harness upgrade else it will
-treat it as a normal failure. See L<BUGS>)
-
-
-=item B<todo_skip>
-
- 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<eval BLOCK> with and using C<alarm>. 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<SKIP: BLOCK> 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<If it's something the user might not be able to do>, 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<If it's something the programmer hasn't done yet>, 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<NOTE> I'm not quite sure what will happen with filehandles.
-
-=over 4
-
-=item B<is_deeply>
-
- 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 = <<WARNING;
-is_deeply() takes two or three args, you gave %d.
-This usually means you passed an array or hash instead
-of a reference to it
-WARNING
- chop $msg; # clip off newline so carp() will put in line/file
-
- _carp sprintf $msg, scalar @_;
-
- return $Test->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<is_deeply()> can do that better and with diagnostics.
-
- is_deeply( \@this, \@that );
-
-They may be deprecated in future versions.
-
-=over 4
-
-=item B<eq_array>
-
- 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 <<WHOA;
-WHOA! $desc
-This should never happen! Please contact the author immediately!
-WHOA
- }
-}
-
-
-=item B<eq_hash>
-
- 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<eq_set>
-
- my $is_eq = eq_set(\@this, \@that);
-
-Similar to eq_array(), except the order of the elements is B<not>
-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<NOTE> 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<can 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 Test::Builder object like so:
-
-=over 4
-
-=item B<builder>
-
- 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<NOTE> 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<as strings>. 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<before> 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<Test::Simple> 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<Test> is the old testing module. Its main benefit is that it has
-been distributed with Perl since 5.004_05.
-
-L<Test::Harness> for details on how your test results are interpreted
-by Perl.
-
-L<Test::Differences> for more ways to test complex data structures.
-And it plays well with Test::More.
-
-L<Test::Class> is like XUnit but more perlish.
-
-L<Test::Deep> gives you more powerful complex data structure testing.
-
-L<Test::Unit> is XUnit style testing.
-
-L<Test::Inline> shows the idea of embedded testing.
-
-L<Bundle::Test> installs a whole bunch of useful test modules.
-
-
-=head1 AUTHORS
-
-Michael G Schwern E<lt>schwern@pobox.comE<gt> 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<http://rt.cpan.org> to report and view bugs.
-
-
-=head1 COPYRIGHT
-
-Copyright 2001, 2002, 2004 by Michael G Schwern E<lt>schwern@pobox.comE<gt>.
-
-This program is free software; you can redistribute it and/or
-modify it under the same terms as Perl itself.
-
-See F<http://www.perl.com/perl/misc/Artistic.html>
-
-=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<read Test::Tutorial> 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>
-
- 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<Test::More>.
-
-
-=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<explicitly> 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<at all>. 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<Test::More>
-
-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<Test>
-
-The original Perl testing module.
-
-=item L<Test::Unit>
-
-Elaborate unit testing.
-
-=item L<Test::Inline>, L<SelfTest>
-
-Embed tests in your code!
-
-=item L<Test::Harness>
-
-Interprets the output of your test program.
-
-=back
-
-
-=head1 AUTHORS
-
-Idea by Tony Bowden and Paul Johnson, code by Michael G Schwern
-E<lt>schwern@pobox.comE<gt>, wardrobe by Calvin Klein.
-
-
-=head1 COPYRIGHT
-
-Copyright 2001, 2002, 2004 by Michael G Schwern E<lt>schwern@pobox.comE<gt>.
-
-This program is free software; you can redistribute it and/or
-modify it under the same terms as Perl itself.
-
-See F<http://www.perl.com/perl/misc/Artistic.html>
-
-=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)<<s->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<<extra_lbits[code]); n++) {
+ for (n = 0; n < (1 << extra_lbits[code]); n++) {
_length_code[length++] = (uch)code;
}
}
@@ -265,13 +266,13 @@ local void tr_static_init()
* in two different ways: code 284 + 5 bits or code 285, so we
* overwrite length_code[255] to use the best encoding:
*/
- _length_code[length-1] = (uch)code;
+ _length_code[length - 1] = (uch)code;
/* Initialize the mapping dist (0..32K) -> dist code (0..29) */
dist = 0;
for (code = 0 ; code < 16; code++) {
base_dist[code] = dist;
- for (n = 0; n < (1<<extra_dbits[code]); n++) {
+ for (n = 0; n < (1 << extra_dbits[code]); n++) {
_dist_code[dist++] = (uch)code;
}
}
@@ -279,11 +280,11 @@ local void tr_static_init()
dist >>= 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<<MAX_BITS)-1,
+ Assert (code + bl_count[MAX_BITS] - 1 == (1 << MAX_BITS) - 1,
"inconsistent bit counts");
Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
@@ -600,7 +601,7 @@ local void gen_codes (
tree[n].Code = (ush)bi_reverse(next_code[len]++, len);
Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
- n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));
+ n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len] - 1));
}
}
@@ -624,7 +625,7 @@ local void build_tree(
int node; /* new node being created */
/* Construct the initial heap, with least frequent element in
- * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].
+ * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n + 1].
* heap[0] is not used.
*/
s->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 <windows.h>
/* 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 <unistd.h> /* for SEEK_*, off_t, and _LFS64_LARGEFILE */
# ifdef VMS
# include <unixio.h> /* 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 <h.m.brand@xs4all.nl>
=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/<version> 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 (<DATA>), "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 (<DATA>), "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 (<DATA>), "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 (<DATA>), "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 (<DATA>), "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<DB_File> 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<http://www.oracle.com/technology/products/berkeley-db/db/index.html>) 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<AGPL|https://www.oracle.com/downloads/licenses/berkeleydb-oslicense.html> 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 <sys/types.h>
#include <md5.h>
-#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 = <<EOT;
2f93400875dbb56f36691d5f69f3eba5 README
-5956d385c276e47faebef391177ee1d3 MD5.xs
+16d90fd139c5eae51f786daa1ea6eb24 MD5.xs
754b9db19f79dbc4992f7166eb0f37ce rfc1321.txt
EOT
}
Index: gnu/usr.bin/perl/cpan/Digest-SHA/shasum
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Digest-SHA/shasum,v
diff -u -p -a -u -p -r1.5 shasum
--- gnu/usr.bin/perl/cpan/Digest-SHA/shasum 30 Dec 2019 02:13:43 -0000 1.5
+++ gnu/usr.bin/perl/cpan/Digest-SHA/shasum 21 Feb 2024 15:47:01 -0000
@@ -2,10 +2,10 @@
## shasum: filter for computing SHA digests (ref. sha1sum/md5sum)
##
- ## 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
## shasum SYNOPSIS adapted from GNU Coreutils sha1sum. Add
## "-a" option for algorithm selection,
@@ -97,7 +97,7 @@ the 7-bit message I<0001100>:
=head1 AUTHOR
-Copyright (C) 2003-2018 Mark Shelor <mshelor@cpan.org>.
+Copyright (C) 2003-2023 Mark Shelor <mshelor@cpan.org>.
=head1 SEE ALSO
@@ -107,7 +107,7 @@ I<shasum> 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 <schwern@pobox.com>',
);
@@ -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<FOR INTERNAL USE ONLY>
-ExtUtils::MY is a subclass of L<ExtUtils::MM>. Its provided in your
+ExtUtils::MY is a subclass of L<ExtUtils::MM>. 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<Makefile.PL> genera
is installed). Clients like L<CPAN> or L<CPANPLUS> 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<NO_MYMETA>
-C<WriteMakeFile()> flag to true.
+C<WriteMakefile()> 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 </ .. /^End of search / } `$Config{cc} -E -v - </dev/null 2>&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<WriteMakeFile()> function in your F<Makefile.PL>, specify
+Now, inside of the C<WriteMakefile()> function in your F<Makefile.PL>, specify
where your tests are located with the C<test> 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<WriteMakeFile()> in your I<Makefile.PL> file
+To do this, you need to inform C<WriteMakefile()> in your I<Makefile.PL> 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, <<OUT, 'hint files produce errors' );
+Argh!
+OUT
}
END {
Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/min_perl_version.t
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/min_perl_version.t,v
diff -u -p -a -u -p -r1.4 min_perl_version.t
--- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/min_perl_version.t 15 Feb 2023 01:36:17 -0000 1.4
+++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/min_perl_version.t 21 Feb 2024 15:47:00 -0000
@@ -17,7 +17,7 @@ use ExtUtils::MM;
use Test::More
!MM->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<number> [ I<desttype> ]
Like C<:i>, but if the value is omitted, the I<number> will be assigned.
+
+If the I<number> is octal, hexadecimal or binary, behaves like C<:o>.
=item : + [ I<desttype> ]
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<timeout> — 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<verify_SSL> — A boolean that indicates whether to validate the SSL
-#pod certificate of an C<https> — connection (default is false)
+#pod * C<verify_SSL> — A boolean that indicates whether to validate the TLS/SSL
+#pod certificate of an C<https> — connection (default is true). Changed from false
+#pod to true in version 0.083.
#pod * C<SSL_options> — A hashref of C<SSL_*> — options to pass through to
#pod L<IO::Socket::SSL>
+#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<verify_SSL> 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<status> or C<headers>
#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<request> 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<timeout> — Request timeout in second
=item *
-C<verify_SSL> — A boolean that indicates whether to validate the SSL certificate of an C<https> — connection (default is false)
+C<verify_SSL> — A boolean that indicates whether to validate the TLS/SSL certificate of an C<https> — connection (default is true). Changed from false to true in version 0.083.
=item *
C<SSL_options> — A hashref of C<SSL_*> — options to pass through to L<IO::Socket::SSL>
+=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<verify_SSL> 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<status> or C<headers>
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<request> 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<https> connections are supported only if L<IO::Socket::SSL> 1.56 or
greater and L<Net::SSLeay> 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<HTTP::Tiny::can_ssl()> utility function
that returns boolean to see if the required modules are installed.
@@ -2055,7 +2086,7 @@ An C<https> connection may be made via a
command (i.e. RFC 2817). You may not proxy C<https> via a proxy that itself
requires C<https> 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<By default, HTTP::Tiny does not verify server identity>.
+B<By default, HTTP::Tiny verifies server identity>.
-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<CAcert.org|http://cacert.org>.
-
-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<verify_SSL> 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<man-in-the-middle
-attack|http://en.wikipedia.org/wiki/Man-in-the-middle_attack>. 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<machine-in-the-middle
+attacks|http://en.wikipedia.org/wiki/Machine-in-the-middle_attack>.
Certificate verification requires a file containing trusted CA certificates.
@@ -2094,9 +2118,7 @@ If the environment variable C<SSL_CERT_F
will try to find a CA certificate file in that location.
If the L<Mozilla::CA> 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<verify_SSL> is true and no CA certificate file
is available.
-If you desire complete control over SSL connections, the C<SSL_options> attribute
-lets you provide a hash reference that will be passed through to
+If you desire complete control over TLS/SSL connections, the C<SSL_options>
+attribute lets you provide a hash reference that will be passed through to
C<IO::Socket::SSL::start_SSL()>, 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<SSL_options> 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<IO::Socket::SSL> documentation for
+cipher used for the TLS/SSL connection. See L<IO::Socket::SSL> documentation for
details.
=head1 PROXY SUPPORT
@@ -2337,7 +2379,7 @@ David Golden <dagolden@cpan.org>
=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 <felipe@felipegasper.com>
=item *
+Graham Knop <haarg@haarg.org>
+
+=item *
+
Greg Kennedy <kennedy.greg@gmail.com>
=item *
@@ -2495,6 +2541,10 @@ Steve Grazzini <steve.grazzini@grantstre
=item *
+Stig Palmquist <git@stig.io>
+
+=item *
+
Syohei YOSHIDA <syohex@gmail.com>
=item *
@@ -2517,7 +2567,7 @@ Xavier Guimard <yadd@debian.org>
=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<pmqs@cpan.org>.
=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<gzip@prep.ai.mit.edu> and Mark Adler C
The primary site for the I<zlib> compression library is
L<http://www.zlib.org>.
+The primary site for the I<zlib-ng> compression library is
+L<https://github.com/zlib-ng/zlib-ng>.
+
The primary site for gzip is L<http://www.gzip.org>.
=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<gzip@prep.ai.mit.edu> and Mark Adler C
The primary site for the I<zlib> compression library is
L<http://www.zlib.org>.
+The primary site for the I<zlib-ng> compression library is
+L<https://github.com/zlib-ng/zlib-ng>.
+
The primary site for gzip is L<http://www.gzip.org>.
=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<gzip@prep.ai.mit.edu> and Mark Adler C
The primary site for the I<zlib> compression library is
L<http://www.zlib.org>.
+The primary site for the I<zlib-ng> compression library is
+L<https://github.com/zlib-ng/zlib-ng>.
+
The primary site for gzip is L<http://www.gzip.org>.
=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<gzip@prep.ai.mit.edu> and Mark Adler C
The primary site for the I<zlib> compression library is
L<http://www.zlib.org>.
+The primary site for the I<zlib-ng> compression library is
+L<https://github.com/zlib-ng/zlib-ng>.
+
The primary site for gzip is L<http://www.gzip.org>.
=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<File::GlobMapper|File::GlobMapper>
If the C<$input_filename_or_reference> parameter is any other type,
C<undef> will be returned.
-In addition, if C<$input_filename_or_reference> is a simple filename,
-the default values for
-the C<Name>, C<Time>, C<TextFlag>, C<ExtAttr>, C<exUnixN> and C<exTime> options will be sourced from that file.
+In addition, if C<$input_filename_or_reference> corresponds to a filename
+from the filesystem, a number of zip file header fields will be populated by default
+using the following attributes from the input file
+
+=over 5
+
+=item * the full filename contained in C<$input_filename_or_reference>
+
+=item * the file protection attributes
+
+=item * the UID/GID for the file
+
+=item * the file timestamps
+
+=back
If you do not want to use these defaults they can be overridden by
-explicitly setting the C<Name>, C<Time>, C<TextFlag>, C<ExtAttr>, C<exUnixN> and C<exTime> options or by setting the
+explicitly setting one, or more, of the C<Name>, C<Time>, C<TextFlag>, C<ExtAttr>, C<exUnixN> and C<exTime> options or by setting the
C<Minimal> parameter.
=head3 The C<$output_filename_or_reference> parameter
@@ -2131,6 +2151,9 @@ C<gzip@prep.ai.mit.edu> and Mark Adler C
The primary site for the I<zlib> compression library is
L<http://www.zlib.org>.
+The primary site for the I<zlib-ng> compression library is
+L<https://github.com/zlib-ng/zlib-ng>.
+
The primary site for gzip is L<http://www.gzip.org>.
=head1 AUTHOR
@@ -2143,7 +2166,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/Adapter/Bzip2.pm
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Adapter/Bzip2.pm,v
diff -u -p -a -u -p -r1.7 Bzip2.pm
--- gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Adapter/Bzip2.pm 15 Feb 2023 01:36:18 -0000 1.7
+++ gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Adapter/Bzip2.pm 21 Feb 2024 15:47:01 -0000
@@ -4,12 +4,12 @@ use strict;
use warnings;
use bytes;
-use IO::Compress::Base::Common 2.106 qw(:Status);
+use IO::Compress::Base::Common 2.204 qw(:Status);
-use Compress::Raw::Bzip2 2.103 ;
+use Compress::Raw::Bzip2 2.204 ;
our ($VERSION);
-$VERSION = '2.106';
+$VERSION = '2.204';
sub mkCompObject
{
Index: gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Adapter/Deflate.pm
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Adapter/Deflate.pm,v
diff -u -p -a -u -p -r1.7 Deflate.pm
--- gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Adapter/Deflate.pm 15 Feb 2023 01:36:18 -0000 1.7
+++ gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Adapter/Deflate.pm 21 Feb 2024 15:47:01 -0000
@@ -4,13 +4,13 @@ use strict;
use warnings;
use bytes;
-use IO::Compress::Base::Common 2.106 qw(:Status);
-use Compress::Raw::Zlib 2.103 qw( !crc32 !adler32 ) ;
+use IO::Compress::Base::Common 2.204 qw(:Status);
+use Compress::Raw::Zlib 2.204 qw( !crc32 !adler32 ) ;
require Exporter;
our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, @EXPORT, %DEFLATE_CONSTANTS);
-$VERSION = '2.106';
+$VERSION = '2.204';
@ISA = qw(Exporter);
@EXPORT_OK = @Compress::Raw::Zlib::DEFLATE_CONSTANTS;
%EXPORT_TAGS = %Compress::Raw::Zlib::DEFLATE_CONSTANTS;
@@ -31,6 +31,29 @@ sub mkCompObject
-Level => $level,
-Strategy => $strategy,
-WindowBits => - MAX_WBITS);
+
+ return (undef, "Cannot create Deflate object: $status", $status)
+ if $status != Z_OK;
+
+ return bless {'Def' => $def,
+ 'Error' => '',
+ } ;
+}
+
+sub mkCompObject1
+{
+ my $crc32 = shift ;
+ my $adler32 = shift ;
+ my $level = shift ;
+ my $strategy = shift ;
+
+ my ($def, $status) = Compress::Raw::Zlib::Deflate->new(
+ -AppendOutput => 1,
+ -CRC32 => $crc32,
+ -ADLER32 => $adler32,
+ -Level => $level,
+ -Strategy => $strategy,
+ -WindowBits => MAX_WBITS);
return (undef, "Cannot create Deflate object: $status", $status)
if $status != Z_OK;
Index: gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Adapter/Identity.pm
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Adapter/Identity.pm,v
diff -u -p -a -u -p -r1.7 Identity.pm
--- gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Adapter/Identity.pm 15 Feb 2023 01:36:18 -0000 1.7
+++ gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Adapter/Identity.pm 21 Feb 2024 15:47:01 -0000
@@ -4,10 +4,10 @@ use strict;
use warnings;
use bytes;
-use IO::Compress::Base::Common 2.106 qw(:Status);
+use IO::Compress::Base::Common 2.204 qw(:Status);
our ($VERSION);
-$VERSION = '2.106';
+$VERSION = '2.204';
sub mkCompObject
{
Index: gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Base/Common.pm
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Base/Common.pm,v
diff -u -p -a -u -p -r1.7 Common.pm
--- gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Base/Common.pm 15 Feb 2023 01:36:18 -0000 1.7
+++ gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Base/Common.pm 21 Feb 2024 15:47:01 -0000
@@ -11,7 +11,7 @@ use File::GlobMapper;
require Exporter;
our ($VERSION, @ISA, @EXPORT, %EXPORT_TAGS, $HAS_ENCODE);
@ISA = qw(Exporter);
-$VERSION = '2.106';
+$VERSION = '2.204';
@EXPORT = qw( isaFilehandle isaFilename isaScalar
whatIsInput whatIsOutput
Index: gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Gzip/Constants.pm
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Gzip/Constants.pm,v
diff -u -p -a -u -p -r1.7 Constants.pm
--- gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Gzip/Constants.pm 15 Feb 2023 01:36:18 -0000 1.7
+++ gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Gzip/Constants.pm 21 Feb 2024 15:47:01 -0000
@@ -9,7 +9,7 @@ require Exporter;
our ($VERSION, @ISA, @EXPORT, %GZIP_OS_Names);
our ($GZIP_FNAME_INVALID_CHAR_RE, $GZIP_FCOMMENT_INVALID_CHAR_RE);
-$VERSION = '2.106';
+$VERSION = '2.204';
@ISA = qw(Exporter);
Index: gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Zip/Constants.pm
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Zip/Constants.pm,v
diff -u -p -a -u -p -r1.7 Constants.pm
--- gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Zip/Constants.pm 15 Feb 2023 01:36:18 -0000 1.7
+++ gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Zip/Constants.pm 21 Feb 2024 15:47:01 -0000
@@ -7,7 +7,7 @@ require Exporter;
our ($VERSION, @ISA, @EXPORT, %ZIP_CM_MIN_VERSIONS);
-$VERSION = '2.106';
+$VERSION = '2.204';
@ISA = qw(Exporter);
Index: gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Zlib/Constants.pm
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Zlib/Constants.pm,v
diff -u -p -a -u -p -r1.7 Constants.pm
--- gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Zlib/Constants.pm 15 Feb 2023 01:36:18 -0000 1.7
+++ gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Zlib/Constants.pm 21 Feb 2024 15:47:01 -0000
@@ -9,7 +9,7 @@ require Exporter;
our ($VERSION, @ISA, @EXPORT);
-$VERSION = '2.106';
+$VERSION = '2.204';
@ISA = qw(Exporter);
Index: gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Zlib/Extra.pm
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Zlib/Extra.pm,v
diff -u -p -a -u -p -r1.7 Extra.pm
--- gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Zlib/Extra.pm 15 Feb 2023 01:36:18 -0000 1.7
+++ gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Zlib/Extra.pm 21 Feb 2024 15:47:01 -0000
@@ -8,9 +8,9 @@ use bytes;
our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS);
-$VERSION = '2.106';
+$VERSION = '2.204';
-use IO::Compress::Gzip::Constants 2.106 ;
+use IO::Compress::Gzip::Constants 2.204 ;
sub ExtraFieldError
{
Index: gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/AnyInflate.pm
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/AnyInflate.pm,v
diff -u -p -a -u -p -r1.7 AnyInflate.pm
--- gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/AnyInflate.pm 15 Feb 2023 01:36:18 -0000 1.7
+++ gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/AnyInflate.pm 21 Feb 2024 15:47:01 -0000
@@ -6,22 +6,22 @@ use strict;
use warnings;
use bytes;
-use IO::Compress::Base::Common 2.106 qw(:Parse);
+use IO::Compress::Base::Common 2.204 qw(:Parse);
-use IO::Uncompress::Adapter::Inflate 2.106 ();
+use IO::Uncompress::Adapter::Inflate 2.204 ();
-use IO::Uncompress::Base 2.106 ;
-use IO::Uncompress::Gunzip 2.106 ;
-use IO::Uncompress::Inflate 2.106 ;
-use IO::Uncompress::RawInflate 2.106 ;
-use IO::Uncompress::Unzip 2.106 ;
+use IO::Uncompress::Base 2.204 ;
+use IO::Uncompress::Gunzip 2.204 ;
+use IO::Uncompress::Inflate 2.204 ;
+use IO::Uncompress::RawInflate 2.204 ;
+use IO::Uncompress::Unzip 2.204 ;
require Exporter ;
our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $AnyInflateError);
-$VERSION = '2.106';
+$VERSION = '2.204';
$AnyInflateError = '';
@ISA = qw(IO::Uncompress::Base Exporter);
@@ -986,6 +986,9 @@ C<gzip@prep.ai.mit.edu> and Mark Adler C
The primary site for the I<zlib> compression library is
L<http://www.zlib.org>.
+The primary site for the I<zlib-ng> compression library is
+L<https://github.com/zlib-ng/zlib-ng>.
+
The primary site for gzip is L<http://www.gzip.org>.
=head1 AUTHOR
@@ -998,7 +1001,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/Uncompress/AnyUncompress.pm
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/AnyUncompress.pm,v
diff -u -p -a -u -p -r1.7 AnyUncompress.pm
--- gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/AnyUncompress.pm 15 Feb 2023 01:36:18 -0000 1.7
+++ gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/AnyUncompress.pm 21 Feb 2024 15:47:01 -0000
@@ -4,16 +4,16 @@ use strict;
use warnings;
use bytes;
-use IO::Compress::Base::Common 2.106 ();
+use IO::Compress::Base::Common 2.204 ();
-use IO::Uncompress::Base 2.106 ;
+use IO::Uncompress::Base 2.204 ;
require Exporter ;
our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $AnyUncompressError);
-$VERSION = '2.106';
+$VERSION = '2.204';
$AnyUncompressError = '';
@ISA = qw(IO::Uncompress::Base Exporter);
@@ -33,26 +33,26 @@ BEGIN
# Don't trigger any __DIE__ Hooks.
local $SIG{__DIE__};
- eval ' use IO::Uncompress::Adapter::Inflate 2.103 ;';
- eval ' use IO::Uncompress::Adapter::Bunzip2 2.103 ;';
- eval ' use IO::Uncompress::Adapter::LZO 2.103 ;';
- eval ' use IO::Uncompress::Adapter::Lzf 2.103 ;';
- eval ' use IO::Uncompress::Adapter::UnLzma 2.103 ;';
- eval ' use IO::Uncompress::Adapter::UnXz 2.103 ;';
- eval ' use IO::Uncompress::Adapter::UnZstd 2.103 ;';
- eval ' use IO::Uncompress::Adapter::UnLzip 2.103 ;';
-
- eval ' use IO::Uncompress::Bunzip2 2.103 ;';
- eval ' use IO::Uncompress::UnLzop 2.103 ;';
- eval ' use IO::Uncompress::Gunzip 2.103 ;';
- eval ' use IO::Uncompress::Inflate 2.103 ;';
- eval ' use IO::Uncompress::RawInflate 2.103 ;';
- eval ' use IO::Uncompress::Unzip 2.103 ;';
- eval ' use IO::Uncompress::UnLzf 2.103 ;';
- eval ' use IO::Uncompress::UnLzma 2.103 ;';
- eval ' use IO::Uncompress::UnXz 2.103 ;';
- eval ' use IO::Uncompress::UnZstd 2.103 ;';
- eval ' use IO::Uncompress::UnLzip 2.103 ;';
+ eval ' use IO::Uncompress::Adapter::Inflate 2.204 ;';
+ eval ' use IO::Uncompress::Adapter::Bunzip2 2.204 ;';
+ eval ' use IO::Uncompress::Adapter::LZO 2.204 ;';
+ eval ' use IO::Uncompress::Adapter::Lzf 2.204 ;';
+ eval ' use IO::Uncompress::Adapter::UnLzma 2.204 ;';
+ eval ' use IO::Uncompress::Adapter::UnXz 2.204 ;';
+ eval ' use IO::Uncompress::Adapter::UnZstd 2.204 ;';
+ eval ' use IO::Uncompress::Adapter::UnLzip 2.204 ;';
+
+ eval ' use IO::Uncompress::Bunzip2 2.204 ;';
+ eval ' use IO::Uncompress::UnLzop 2.204 ;';
+ eval ' use IO::Uncompress::Gunzip 2.204 ;';
+ eval ' use IO::Uncompress::Inflate 2.204 ;';
+ eval ' use IO::Uncompress::RawInflate 2.204 ;';
+ eval ' use IO::Uncompress::Unzip 2.204 ;';
+ eval ' use IO::Uncompress::UnLzf 2.204 ;';
+ eval ' use IO::Uncompress::UnLzma 2.204 ;';
+ eval ' use IO::Uncompress::UnXz 2.204 ;';
+ eval ' use IO::Uncompress::UnZstd 2.204 ;';
+ eval ' use IO::Uncompress::UnLzip 2.204 ;';
}
@@ -1077,7 +1077,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/Uncompress/Base.pm
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/Base.pm,v
diff -u -p -a -u -p -r1.7 Base.pm
--- gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/Base.pm 15 Feb 2023 01:36:18 -0000 1.7
+++ gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/Base.pm 21 Feb 2024 15:47:01 -0000
@@ -9,12 +9,12 @@ our (@ISA, $VERSION, @EXPORT_OK, %EXPORT
@ISA = qw(IO::File Exporter);
-$VERSION = '2.106';
+$VERSION = '2.204';
use constant G_EOF => 0 ;
use constant G_ERR => -1 ;
-use IO::Compress::Base::Common 2.106 ;
+use IO::Compress::Base::Common 2.204 ;
use IO::File ;
use Symbol;
@@ -1567,7 +1567,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/Uncompress/Bunzip2.pm
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/Bunzip2.pm,v
diff -u -p -a -u -p -r1.7 Bunzip2.pm
--- gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/Bunzip2.pm 15 Feb 2023 01:36:19 -0000 1.7
+++ gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/Bunzip2.pm 21 Feb 2024 15:47:01 -0000
@@ -4,15 +4,15 @@ use strict ;
use warnings;
use bytes;
-use IO::Compress::Base::Common 2.106 qw(:Status );
+use IO::Compress::Base::Common 2.204 qw(:Status );
-use IO::Uncompress::Base 2.106 ;
-use IO::Uncompress::Adapter::Bunzip2 2.106 ;
+use IO::Uncompress::Base 2.204 ;
+use IO::Uncompress::Adapter::Bunzip2 2.204 ;
require Exporter ;
our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $Bunzip2Error);
-$VERSION = '2.106';
+$VERSION = '2.204';
$Bunzip2Error = '';
@ISA = qw(IO::Uncompress::Base Exporter);
@@ -909,7 +909,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/Uncompress/Gunzip.pm
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/Gunzip.pm,v
diff -u -p -a -u -p -r1.7 Gunzip.pm
--- gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/Gunzip.pm 15 Feb 2023 01:36:19 -0000 1.7
+++ gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/Gunzip.pm 21 Feb 2024 15:47:01 -0000
@@ -9,12 +9,12 @@ use strict ;
use warnings;
use bytes;
-use IO::Uncompress::RawInflate 2.106 ;
+use IO::Uncompress::RawInflate 2.204 ;
-use Compress::Raw::Zlib 2.103 () ;
-use IO::Compress::Base::Common 2.106 qw(:Status );
-use IO::Compress::Gzip::Constants 2.106 ;
-use IO::Compress::Zlib::Extra 2.106 ;
+use Compress::Raw::Zlib 2.204 () ;
+use IO::Compress::Base::Common 2.204 qw(:Status );
+use IO::Compress::Gzip::Constants 2.204 ;
+use IO::Compress::Zlib::Extra 2.204 ;
require Exporter ;
@@ -28,7 +28,7 @@ Exporter::export_ok_tags('all');
$GunzipError = '';
-$VERSION = '2.106';
+$VERSION = '2.204';
sub new
{
@@ -1110,6 +1110,9 @@ C<gzip@prep.ai.mit.edu> and Mark Adler C
The primary site for the I<zlib> compression library is
L<http://www.zlib.org>.
+The primary site for the I<zlib-ng> compression library is
+L<https://github.com/zlib-ng/zlib-ng>.
+
The primary site for gzip is L<http://www.gzip.org>.
=head1 AUTHOR
@@ -1122,7 +1125,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/Uncompress/Inflate.pm
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/Inflate.pm,v
diff -u -p -a -u -p -r1.7 Inflate.pm
--- gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/Inflate.pm 15 Feb 2023 01:36:19 -0000 1.7
+++ gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/Inflate.pm 21 Feb 2024 15:47:01 -0000
@@ -5,15 +5,15 @@ use strict ;
use warnings;
use bytes;
-use IO::Compress::Base::Common 2.106 qw(:Status );
-use IO::Compress::Zlib::Constants 2.106 ;
+use IO::Compress::Base::Common 2.204 qw(:Status );
+use IO::Compress::Zlib::Constants 2.204 ;
-use IO::Uncompress::RawInflate 2.106 ;
+use IO::Uncompress::RawInflate 2.204 ;
require Exporter ;
our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $InflateError);
-$VERSION = '2.106';
+$VERSION = '2.204';
$InflateError = '';
@ISA = qw(IO::Uncompress::RawInflate Exporter);
@@ -982,6 +982,9 @@ C<gzip@prep.ai.mit.edu> and Mark Adler C
The primary site for the I<zlib> compression library is
L<http://www.zlib.org>.
+The primary site for the I<zlib-ng> compression library is
+L<https://github.com/zlib-ng/zlib-ng>.
+
The primary site for gzip is L<http://www.gzip.org>.
=head1 AUTHOR
@@ -994,7 +997,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/Uncompress/RawInflate.pm
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/RawInflate.pm,v
diff -u -p -a -u -p -r1.7 RawInflate.pm
--- gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/RawInflate.pm 15 Feb 2023 01:36:19 -0000 1.7
+++ gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/RawInflate.pm 21 Feb 2024 15:47:01 -0000
@@ -5,16 +5,16 @@ use strict ;
use warnings;
use bytes;
-use Compress::Raw::Zlib 2.103 ;
-use IO::Compress::Base::Common 2.106 qw(:Status );
+use Compress::Raw::Zlib 2.204 ;
+use IO::Compress::Base::Common 2.204 qw(:Status );
-use IO::Uncompress::Base 2.106 ;
-use IO::Uncompress::Adapter::Inflate 2.106 ;
+use IO::Uncompress::Base 2.204 ;
+use IO::Uncompress::Adapter::Inflate 2.204 ;
require Exporter ;
our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, %DEFLATE_CONSTANTS, $RawInflateError);
-$VERSION = '2.106';
+$VERSION = '2.204';
$RawInflateError = '';
@ISA = qw(IO::Uncompress::Base Exporter);
@@ -1110,6 +1110,9 @@ C<gzip@prep.ai.mit.edu> and Mark Adler C
The primary site for the I<zlib> compression library is
L<http://www.zlib.org>.
+The primary site for the I<zlib-ng> compression library is
+L<https://github.com/zlib-ng/zlib-ng>.
+
The primary site for gzip is L<http://www.gzip.org>.
=head1 AUTHOR
@@ -1122,7 +1125,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/Uncompress/Unzip.pm
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/Unzip.pm,v
diff -u -p -a -u -p -r1.7 Unzip.pm
--- gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/Unzip.pm 15 Feb 2023 01:36:19 -0000 1.7
+++ gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/Unzip.pm 21 Feb 2024 15:47:01 -0000
@@ -9,14 +9,14 @@ use warnings;
use bytes;
use IO::File;
-use IO::Uncompress::RawInflate 2.106 ;
-use IO::Compress::Base::Common 2.106 qw(:Status );
-use IO::Uncompress::Adapter::Inflate 2.106 ;
-use IO::Uncompress::Adapter::Identity 2.106 ;
-use IO::Compress::Zlib::Extra 2.106 ;
-use IO::Compress::Zip::Constants 2.106 ;
+use IO::Uncompress::RawInflate 2.204 ;
+use IO::Compress::Base::Common 2.204 qw(:Status );
+use IO::Uncompress::Adapter::Inflate 2.204 ;
+use IO::Uncompress::Adapter::Identity 2.204 ;
+use IO::Compress::Zlib::Extra 2.204 ;
+use IO::Compress::Zip::Constants 2.204 ;
-use Compress::Raw::Zlib 2.103 () ;
+use Compress::Raw::Zlib 2.204 () ;
BEGIN
{
@@ -38,7 +38,7 @@ require Exporter ;
our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $UnzipError, %headerLookup);
-$VERSION = '2.106';
+$VERSION = '2.204';
$UnzipError = '';
@ISA = qw(IO::Uncompress::RawInflate Exporter);
@@ -812,12 +812,11 @@ sub _dosToUnixTime
my $min = ( ( $dt >> 5 ) & 0x3f );
my $sec = ( ( $dt << 1 ) & 0x3e );
-
- use POSIX 'mktime';
-
- my $time_t = mktime( $sec, $min, $hour, $mday, $mon, $year, 0, 0, -1 );
+ use Time::Local ;
+ my $time_t = Time::Local::timelocal( $sec, $min, $hour, $mday, $mon, $year);
return 0 if ! defined $time_t;
- return $time_t;
+ return $time_t;
+
}
#sub scanCentralDirectory
@@ -1953,6 +1952,9 @@ C<gzip@prep.ai.mit.edu> and Mark Adler C
The primary site for the I<zlib> compression library is
L<http://www.zlib.org>.
+The primary site for the I<zlib-ng> compression library is
+L<https://github.com/zlib-ng/zlib-ng>.
+
The primary site for gzip is L<http://www.gzip.org>.
=head1 AUTHOR
@@ -1965,7 +1967,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/Uncompress/Adapter/Bunzip2.pm
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/Adapter/Bunzip2.pm,v
diff -u -p -a -u -p -r1.7 Bunzip2.pm
--- gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/Adapter/Bunzip2.pm 15 Feb 2023 01:36:19 -0000 1.7
+++ gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/Adapter/Bunzip2.pm 21 Feb 2024 15:47:01 -0000
@@ -4,12 +4,12 @@ use strict;
use warnings;
use bytes;
-use IO::Compress::Base::Common 2.106 qw(:Status);
+use IO::Compress::Base::Common 2.204 qw(:Status);
-use Compress::Raw::Bzip2 2.103 ;
+use Compress::Raw::Bzip2 2.204 ;
our ($VERSION, @ISA);
-$VERSION = '2.106';
+$VERSION = '2.204';
sub mkUncompObject
{
Index: gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/Adapter/Identity.pm
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/Adapter/Identity.pm,v
diff -u -p -a -u -p -r1.7 Identity.pm
--- gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/Adapter/Identity.pm 15 Feb 2023 01:36:19 -0000 1.7
+++ gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/Adapter/Identity.pm 21 Feb 2024 15:47:01 -0000
@@ -4,14 +4,14 @@ use warnings;
use strict;
use bytes;
-use IO::Compress::Base::Common 2.106 qw(:Status);
+use IO::Compress::Base::Common 2.204 qw(:Status);
use IO::Compress::Zip::Constants ;
our ($VERSION);
-$VERSION = '2.106';
+$VERSION = '2.204';
-use Compress::Raw::Zlib 2.103 ();
+use Compress::Raw::Zlib 2.204 ();
sub mkUncompObject
{
Index: gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/Adapter/Inflate.pm
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/Adapter/Inflate.pm,v
diff -u -p -a -u -p -r1.7 Inflate.pm
--- gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/Adapter/Inflate.pm 15 Feb 2023 01:36:19 -0000 1.7
+++ gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/Adapter/Inflate.pm 21 Feb 2024 15:47:01 -0000
@@ -4,11 +4,11 @@ use strict;
use warnings;
use bytes;
-use IO::Compress::Base::Common 2.106 qw(:Status);
-use Compress::Raw::Zlib 2.103 qw(Z_OK Z_BUF_ERROR Z_STREAM_END Z_FINISH MAX_WBITS);
+use IO::Compress::Base::Common 2.204 qw(:Status);
+use Compress::Raw::Zlib 2.204 qw(Z_OK Z_BUF_ERROR Z_STREAM_END Z_FINISH MAX_WBITS);
our ($VERSION);
-$VERSION = '2.106';
+$VERSION = '2.204';
Index: gnu/usr.bin/perl/cpan/IO-Compress/t/000prereq.t
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Compress/t/000prereq.t,v
diff -u -p -a -u -p -r1.6 000prereq.t
--- gnu/usr.bin/perl/cpan/IO-Compress/t/000prereq.t 15 Feb 2023 01:36:19 -0000 1.6
+++ gnu/usr.bin/perl/cpan/IO-Compress/t/000prereq.t 21 Feb 2024 15:47:01 -0000
@@ -25,7 +25,7 @@ BEGIN
if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 };
- my $VERSION = '2.103';
+ my $VERSION = '2.204';
my @NAMES = qw(
Compress::Raw::Bzip2
Compress::Raw::Zlib
@@ -86,9 +86,9 @@ BEGIN
}
}
- # need zlib 1.2.0 or better
+ # need zlib 1.2.0 or better or zlib-ng
- cmp_ok Compress::Raw::Zlib::ZLIB_VERNUM(), ">=", 0x1200
+ ok Compress::Raw::Zlib::is_zlibng() || Compress::Raw::Zlib::ZLIB_VERNUM() >= 0x1200
or diag "IO::Compress needs zlib 1.2.0 or better, you have " . Compress::Raw::Zlib::zlib_version();
use_ok('Scalar::Util') ;
Index: gnu/usr.bin/perl/cpan/IO-Compress/t/005defhdr.t
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Compress/t/005defhdr.t,v
diff -u -p -a -u -p -r1.1.1.3 005defhdr.t
--- gnu/usr.bin/perl/cpan/IO-Compress/t/005defhdr.t 15 Feb 2023 01:32:41 -0000 1.1.1.3
+++ gnu/usr.bin/perl/cpan/IO-Compress/t/005defhdr.t 21 Feb 2024 15:47:01 -0000
@@ -19,7 +19,7 @@ BEGIN {
$extra = 1
if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 };
- plan tests => 595 + $extra ;
+ plan tests => 114 + $extra ;
use_ok('Compress::Raw::Zlib') ;
@@ -123,6 +123,7 @@ EOM
}
+if (0) # disable these tests: IO::Compress::Deflate doesn't create the zlib header itself so no need to test
{
title "Check user-defined header settings match zlib" ;
@@ -168,13 +169,16 @@ EOM
my $hdr1 = ReadHeaderInfoZlib($string, %$opts);
+ # zlib-ng <= 2.0.6 with Level 1 sets the CINFO value to 5 . All other zlib & zlib-ng use expected value of 7
+ # Note that zlib-ng 2.0.x uses a 16-bit encoding for ZLIBNG_VERNUM
+ my $cinfoValue = Compress::Raw::Zlib::is_zlibng() && Compress::Raw::Zlib::ZLIBNG_VERNUM() <= 0x2060 && defined $opts->{'-Level'} && $opts->{'-Level'} == 1 ? 5 : 7;
is $hdr->{CM}, 8, " CM is 8";
- is $hdr->{CINFO}, 7, " CINFO is 7";
+ is $hdr->{CINFO}, $cinfoValue, " CINFO is $cinfoValue";
is $hdr->{FDICT}, 0, " FDICT is 0";
while (my ($k, $v) = each %$expect)
{
- if (ZLIB_VERNUM >= 0x1220)
+ if (Compress::Raw::Zlib::is_zlibng() || ZLIB_VERNUM >= 0x1220)
{ is $hdr->{$k}, $v, " $k is $v" }
else
{ ok 1, " Skip test for $k" }
@@ -357,4 +361,3 @@ EOM
ok $gunz->close ;
}
}
-
Index: gnu/usr.bin/perl/cpan/IO-Compress/t/011-streamzip.t
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Compress/t/011-streamzip.t,v
diff -u -p -a -u -p -r1.1.1.2 011-streamzip.t
--- gnu/usr.bin/perl/cpan/IO-Compress/t/011-streamzip.t 15 Feb 2023 01:32:41 -0000 1.1.1.2
+++ gnu/usr.bin/perl/cpan/IO-Compress/t/011-streamzip.t 21 Feb 2024 15:47:01 -0000
@@ -87,7 +87,7 @@ sub check
# streamzip
-# ########
+# #########
{
title "streamzip" ;
@@ -123,27 +123,33 @@ for my $method (qw(store deflate bzip2 l
{
if ($method eq 'lzma')
{
- eval { require IO::Compress::Lzma } ;
+ no warnings;
+ eval { require IO::Compress::Lzma && defined &{ 'IO::Compress::Adapter::Bzip2::mkRawZipCompObject' } } ;
skip "Method 'lzma' needs IO::Compress::Lzma\n", 8
if $@;
}
if ($method eq 'zstd')
{
- eval { require IO::Compress::Zstd } ;
+ no warnings;
+ eval { require IO::Compress::Zstd && defined &{ 'IO::Compress::Adapter::Zstd::mkRawZipCompObject' }} ;
skip "Method 'zstd' needs IO::Compress::Zstd\n", 8
if $@;
}
if ($method eq 'xz')
{
- eval { require IO::Compress::Xz } ;
- skip "Method 'zstd' needs IO::Compress::Xz\n", 8
+ no warnings;
+ eval { require IO::Compress::Xz && defined &{ 'IO::Compress::Adapter::Xz::mkRawZipCompObject' }} ;
+ skip "Method 'xz' needs IO::Compress::Xz\n", 8
if $@;
}
{
title "streamzip method $method" ;
+
+ skip "streaming unzip not supported with zstd\n", 7
+ if $method eq 'zstd' ;
my ($infile, $outfile);
my $lex = LexFile->new( $infile, $outfile );
Index: gnu/usr.bin/perl/cpan/IO-Compress/t/101truncate-rawdeflate.t
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Compress/t/101truncate-rawdeflate.t,v
diff -u -p -a -u -p -r1.3 101truncate-rawdeflate.t
--- gnu/usr.bin/perl/cpan/IO-Compress/t/101truncate-rawdeflate.t 15 Feb 2023 01:36:19 -0000 1.3
+++ gnu/usr.bin/perl/cpan/IO-Compress/t/101truncate-rawdeflate.t 21 Feb 2024 15:47:01 -0000
@@ -11,6 +11,8 @@ use warnings;
use Test::More ;
+use Compress::Raw::Zlib;
+
BEGIN {
plan skip_all => "Lengthy Tests Disabled\n" .
"set COMPRESS_ZLIB_RUN_ALL or COMPRESS_ZLIB_RUN_MOST to run this test suite"
@@ -21,8 +23,8 @@ BEGIN {
$extra = 1
if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 };
- plan tests => 625 + $extra;
-
+ my $tests = Compress::Raw::Zlib::is_zlibng() ? 615 : 625;
+ plan tests => $tests + $extra;
};
Index: gnu/usr.bin/perl/cpan/IO-Compress/t/cz-03zlib-v1.t
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Compress/t/cz-03zlib-v1.t,v
diff -u -p -a -u -p -r1.1.1.3 cz-03zlib-v1.t
--- gnu/usr.bin/perl/cpan/IO-Compress/t/cz-03zlib-v1.t 15 Feb 2023 01:32:41 -0000 1.1.1.3
+++ gnu/usr.bin/perl/cpan/IO-Compress/t/cz-03zlib-v1.t 21 Feb 2024 15:47:01 -0000
@@ -703,7 +703,8 @@ EOM
($GOT, $status) = $k->inflate($rest) ;
# Z_STREAM_END returned by 1.12.2, Z_DATA_ERROR for older zlib
- if (ZLIB_VERNUM >= ZLIB_1_2_12_0)
+ # always Z_STREAM_ENDin zlib_ng
+ if (ZLIB_VERNUM >= ZLIB_1_2_12_0 || Compress::Raw::Zlib::is_zlibng)
{
cmp_ok $status, '==', Z_STREAM_END ;
}
Index: gnu/usr.bin/perl/cpan/IO-Socket-IP/lib/IO/Socket/IP.pm
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Socket-IP/lib/IO/Socket/IP.pm,v
diff -u -p -a -u -p -r1.6 IP.pm
--- gnu/usr.bin/perl/cpan/IO-Socket-IP/lib/IO/Socket/IP.pm 15 Feb 2023 01:36:19 -0000 1.6
+++ gnu/usr.bin/perl/cpan/IO-Socket-IP/lib/IO/Socket/IP.pm 21 Feb 2024 15:47:00 -0000
@@ -12,7 +12,8 @@ use warnings;
# $VERSION needs to be set before use base 'IO::Socket'
# - https://rt.cpan.org/Ticket/Display.html?id=92107
BEGIN {
- our $VERSION = '0.41';
+ our $VERSION = '0.41_01';
+ $VERSION = eval $VERSION;
}
use base qw( IO::Socket );
@@ -154,6 +155,12 @@ sub import
die "Cannot socket(PF_INET6) - $!";
if( setsockopt $testsock, IPPROTO_IPV6, IPV6_V6ONLY, 0 ) {
+ if ($^O eq "dragonfly") {
+ # dragonflybsd 6.4 lies about successfully turning this off
+ if (getsockopt $testsock, IPPROTO_IPV6, IPV6_V6ONLY) {
+ return $can_disable_v6only = 0;
+ }
+ }
return $can_disable_v6only = 1;
}
elsif( $! == EINVAL || $! == EOPNOTSUPP ) {
Index: gnu/usr.bin/perl/cpan/IO-Zlib/Zlib.pm
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Zlib/Zlib.pm,v
diff -u -p -a -u -p -r1.1.1.2 Zlib.pm
--- gnu/usr.bin/perl/cpan/IO-Zlib/Zlib.pm 15 Feb 2023 01:32:35 -0000 1.1.1.2
+++ gnu/usr.bin/perl/cpan/IO-Zlib/Zlib.pm 21 Feb 2024 15:47:01 -0000
@@ -291,7 +291,7 @@ use Fcntl qw(SEEK_SET);
use Symbol;
use Tie::Handle;
-our $VERSION = "1.11";
+our $VERSION = "1.14";
our $AUTOLOAD;
our @ISA = qw(Tie::Handle);
Index: gnu/usr.bin/perl/cpan/IO-Zlib/t/basic.t
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Zlib/t/basic.t,v
diff -u -p -a -u -p -r1.1.1.2 basic.t
--- gnu/usr.bin/perl/cpan/IO-Zlib/t/basic.t 15 Feb 2023 01:32:35 -0000 1.1.1.2
+++ gnu/usr.bin/perl/cpan/IO-Zlib/t/basic.t 21 Feb 2024 15:47:01 -0000
@@ -10,7 +10,7 @@ sub ok
print "not ok $no\n" unless $ok ;
}
-my $name = "test.gz";
+my $name = "test_basic_$$.gz";
print "1..17\n";
Index: gnu/usr.bin/perl/cpan/IO-Zlib/t/external.t
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Zlib/t/external.t,v
diff -u -p -a -u -p -r1.1.1.2 external.t
--- gnu/usr.bin/perl/cpan/IO-Zlib/t/external.t 15 Feb 2023 01:32:35 -0000 1.1.1.2
+++ gnu/usr.bin/perl/cpan/IO-Zlib/t/external.t 21 Feb 2024 15:47:01 -0000
@@ -70,7 +70,7 @@ ok(14, $@ =~ /^IO::Zlib::gzopen_external
# The following is a copy of the basic.t, shifted up by 14 tests,
# the difference being that now we should be using the external gzip.
-my $name="test.gz";
+my $name="test_external_$$.gz";
my $hello = <<EOM ;
hello world
Index: gnu/usr.bin/perl/cpan/IO-Zlib/t/getc.t
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Zlib/t/getc.t,v
diff -u -p -a -u -p -r1.1.1.2 getc.t
--- gnu/usr.bin/perl/cpan/IO-Zlib/t/getc.t 15 Feb 2023 01:32:35 -0000 1.1.1.2
+++ gnu/usr.bin/perl/cpan/IO-Zlib/t/getc.t 21 Feb 2024 15:47:01 -0000
@@ -10,7 +10,7 @@ sub ok
print "not ok $no\n" unless $ok ;
}
-my $name = "test.gz";
+my $name = "test_getc_$$.gz";
print "1..10\n";
Index: gnu/usr.bin/perl/cpan/IO-Zlib/t/getline.t
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Zlib/t/getline.t,v
diff -u -p -a -u -p -r1.1.1.2 getline.t
--- gnu/usr.bin/perl/cpan/IO-Zlib/t/getline.t 15 Feb 2023 01:32:35 -0000 1.1.1.2
+++ gnu/usr.bin/perl/cpan/IO-Zlib/t/getline.t 21 Feb 2024 15:47:01 -0000
@@ -10,7 +10,7 @@ sub ok
print "not ok $no\n" unless $ok ;
}
-my $name = "test.gz";
+my $name = "test_getline_$$.gz";
print "1..23\n";
Index: gnu/usr.bin/perl/cpan/IO-Zlib/t/large.t
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Zlib/t/large.t,v
diff -u -p -a -u -p -r1.1.1.2 large.t
--- gnu/usr.bin/perl/cpan/IO-Zlib/t/large.t 15 Feb 2023 01:32:35 -0000 1.1.1.2
+++ gnu/usr.bin/perl/cpan/IO-Zlib/t/large.t 21 Feb 2024 15:47:01 -0000
@@ -10,7 +10,7 @@ sub ok
print "not ok $no\n" unless $ok ;
}
-my $name = "test.gz";
+my $name = "test_large_$$.gz";
print "1..7\n";
Index: gnu/usr.bin/perl/cpan/IO-Zlib/t/tied.t
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Zlib/t/tied.t,v
diff -u -p -a -u -p -r1.1.1.2 tied.t
--- gnu/usr.bin/perl/cpan/IO-Zlib/t/tied.t 15 Feb 2023 01:32:35 -0000 1.1.1.2
+++ gnu/usr.bin/perl/cpan/IO-Zlib/t/tied.t 21 Feb 2024 15:47:01 -0000
@@ -10,7 +10,7 @@ sub ok
print "not ok $no\n" unless $ok ;
}
-my $name = "test.gz";
+my $name = "test_tied_$$.gz";
print "1..11\n";
Index: gnu/usr.bin/perl/cpan/IO-Zlib/t/uncomp1.t
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Zlib/t/uncomp1.t,v
diff -u -p -a -u -p -r1.1.1.2 uncomp1.t
--- gnu/usr.bin/perl/cpan/IO-Zlib/t/uncomp1.t 15 Feb 2023 01:32:35 -0000 1.1.1.2
+++ gnu/usr.bin/perl/cpan/IO-Zlib/t/uncomp1.t 21 Feb 2024 15:47:01 -0000
@@ -17,7 +17,7 @@ hello world
this is a test
EOM
-my $name = "test$$";
+my $name = "test_uncomp1_$$";
if (open(FH, ">$name"))
{
Index: gnu/usr.bin/perl/cpan/IO-Zlib/t/uncomp2.t
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Zlib/t/uncomp2.t,v
diff -u -p -a -u -p -r1.1.1.2 uncomp2.t
--- gnu/usr.bin/perl/cpan/IO-Zlib/t/uncomp2.t 15 Feb 2023 01:32:35 -0000 1.1.1.2
+++ gnu/usr.bin/perl/cpan/IO-Zlib/t/uncomp2.t 21 Feb 2024 15:47:01 -0000
@@ -17,7 +17,7 @@ hello world
this is a test
EOM
-my $name = "test$$";
+my $name = "test_uncomp2_$$";
if (open(FH, ">$name"))
{
Index: gnu/usr.bin/perl/cpan/JSON-PP/lib/JSON/PP.pm
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/JSON-PP/lib/JSON/PP.pm,v
diff -u -p -a -u -p -r1.7 PP.pm
--- gnu/usr.bin/perl/cpan/JSON-PP/lib/JSON/PP.pm 15 Feb 2023 01:36:19 -0000 1.7
+++ gnu/usr.bin/perl/cpan/JSON-PP/lib/JSON/PP.pm 21 Feb 2024 15:47:01 -0000
@@ -2,21 +2,22 @@ package JSON::PP;
# JSON-2.0
-use 5.005;
+use 5.008;
use strict;
use Exporter ();
-BEGIN { @JSON::PP::ISA = ('Exporter') }
+BEGIN { our @ISA = ('Exporter') }
use overload ();
use JSON::PP::Boolean;
use Carp ();
+use Scalar::Util qw(blessed reftype refaddr);
#use Devel::Peek;
-$JSON::PP::VERSION = '4.07';
+our $VERSION = '4.16';
-@JSON::PP::EXPORT = qw(encode_json decode_json from_json to_json);
+our @EXPORT = qw(encode_json decode_json from_json to_json);
# instead of hash-access, i tried index-access for speed.
# but this method is not faster than what i expected. so it will be changed.
@@ -44,8 +45,19 @@ use constant P_AS_NONBLESSED => 1
use constant P_ALLOW_UNKNOWN => 18;
use constant P_ALLOW_TAGS => 19;
-use constant OLD_PERL => $] < 5.008 ? 1 : 0;
use constant USE_B => $ENV{PERL_JSON_PP_USE_B} || 0;
+use constant CORE_BOOL => defined &builtin::is_bool;
+
+my $invalid_char_re;
+
+BEGIN {
+ $invalid_char_re = "[";
+ for my $i (0 .. 0x01F, 0x22, 0x5c) { # '/' is ok
+ $invalid_char_re .= quotemeta chr utf8::unicode_to_native($i);
+ }
+
+ $invalid_char_re = qr/$invalid_char_re]/;
+}
BEGIN {
if (USE_B) {
@@ -64,14 +76,6 @@ BEGIN {
allow_barekey escape_slash as_nonblessed
);
- # Perl version check, Unicode handling is enabled?
- # Helper module sets @JSON::PP::_properties.
- if ( OLD_PERL ) {
- my $helper = $] >= 5.006 ? 'JSON::PP::Compat5006' : 'JSON::PP::Compat5005';
- eval qq| require $helper |;
- if ($@) { Carp::croak $@; }
- }
-
for my $name (@xs_compati_bit_properties, @pp_bit_properties) {
my $property_id = 'P_' . uc($name);
@@ -201,13 +205,54 @@ sub boolean_values {
my ($false, $true) = @_;
$self->{false} = $false;
$self->{true} = $true;
+ if (CORE_BOOL) {
+ BEGIN { CORE_BOOL and warnings->unimport(qw(experimental::builtin)) }
+ if (builtin::is_bool($true) && builtin::is_bool($false) && $true && !$false) {
+ $self->{core_bools} = !!1;
+ }
+ else {
+ delete $self->{core_bools};
+ }
+ }
} else {
delete $self->{false};
delete $self->{true};
+ delete $self->{core_bools};
}
return $self;
}
+sub core_bools {
+ my $self = shift;
+ my $core_bools = defined $_[0] ? $_[0] : 1;
+ if ($core_bools) {
+ $self->{true} = !!1;
+ $self->{false} = !!0;
+ $self->{core_bools} = !!1;
+ }
+ else {
+ $self->{true} = $JSON::PP::true;
+ $self->{false} = $JSON::PP::false;
+ $self->{core_bools} = !!0;
+ }
+ return $self;
+}
+
+sub get_core_bools {
+ my $self = shift;
+ return !!$self->{core_bools};
+}
+
+sub unblessed_bool {
+ my $self = shift;
+ return $self->core_bools(@_);
+}
+
+sub get_unblessed_bool {
+ my $self = shift;
+ return $self->get_core_bools(@_);
+}
+
sub get_boolean_values {
my $self = shift;
if (exists $self->{true} and exists $self->{false}) {
@@ -326,14 +371,6 @@ sub allow_bigint {
$str .= "\n" if ( $indent ); # JSON::XS 2.26 compatible
- unless ($ascii or $latin1 or $utf8) {
- utf8::upgrade($str);
- }
-
- if ($props->[ P_SHRINK ]) {
- utf8::downgrade($str, 1);
- }
-
return $str;
}
@@ -412,7 +449,6 @@ sub allow_bigint {
my $del = ($space_before ? ' ' : '') . ':' . ($space_after ? ' ' : '');
for my $k ( _sort( $obj ) ) {
- if ( OLD_PERL ) { utf8::decode($k) } # key for Perl 5.6 / be optimized
push @res, $self->string_to_json( $k )
. $del
. ( ref $obj->{$k} ? $self->object_to_json( $obj->{$k} ) : $self->value_to_json( $obj->{$k} ) );
@@ -476,7 +512,11 @@ sub allow_bigint {
my $type = ref($value);
if (!$type) {
- if (_looks_like_number($value)) {
+ BEGIN { CORE_BOOL and warnings->unimport('experimental::builtin') }
+ if (CORE_BOOL && builtin::is_bool($value)) {
+ return $value ? 'true' : 'false';
+ }
+ elsif (_looks_like_number($value)) {
return $value;
}
return $self->string_to_json($value);
@@ -527,16 +567,18 @@ sub allow_bigint {
sub string_to_json {
my ($self, $arg) = @_;
- $arg =~ s/([\x22\x5c\n\r\t\f\b])/$esc{$1}/g;
+ $arg =~ s/(["\\\n\r\t\f\b])/$esc{$1}/g;
$arg =~ s/\//\\\//g if ($escape_slash);
- $arg =~ s/([\x00-\x08\x0b\x0e-\x1f])/'\\u00' . unpack('H2', $1)/eg;
+
+ # On ASCII platforms, matches [\x00-\x08\x0b\x0e-\x1f]
+ $arg =~ s/([^\n\t\c?[:^cntrl:][:^ascii:]])/'\\u00' . unpack('H2', $1)/eg;
if ($ascii) {
- $arg = JSON_PP_encode_ascii($arg);
+ $arg = _encode_ascii($arg);
}
if ($latin1) {
- $arg = JSON_PP_encode_latin1($arg);
+ $arg = _encode_latin1($arg);
}
if ($utf8) {
@@ -604,7 +646,7 @@ sub allow_bigint {
sub _encode_ascii {
join('',
map {
- $_ <= 127 ?
+ chr($_) =~ /[[:ascii:]]/ ?
chr($_) :
$_ <= 65535 ?
sprintf('\u%04x', $_) : sprintf('\u%x\u%x', _encode_surrogates($_));
@@ -658,11 +700,11 @@ BEGIN {
{ # PARSE
my %escapes = ( # by Jeremy Muhlich <jmuhlich [at] bitflood.org>
- b => "\x8",
- t => "\x9",
- n => "\xA",
- f => "\xC",
- r => "\xD",
+ b => "\b",
+ t => "\t",
+ n => "\n",
+ f => "\f",
+ r => "\r",
'\\' => '\\',
'"' => '"',
'/' => '/',
@@ -736,7 +778,6 @@ BEGIN {
}
}
else {
- utf8::upgrade( $text );
utf8::encode( $text );
}
@@ -845,7 +886,7 @@ BEGIN {
decode_error("missing high surrogate character in surrogate pair");
}
$is_utf8 = 1;
- $s .= JSON_PP_decode_surrogates($utf16, $u) || next;
+ $s .= _decode_surrogates($utf16, $u) || next;
$utf16 = undef;
}
else {
@@ -853,9 +894,10 @@ BEGIN {
decode_error("surrogate pair expected");
}
- if ( ( my $hex = hex( $u ) ) > 127 ) {
+ my $hex = hex( $u );
+ if ( chr $u =~ /[[:^ascii:]]/ ) {
$is_utf8 = 1;
- $s .= JSON_PP_decode_unicode($u) || next;
+ $s .= _decode_unicode($u) || next;
}
else {
$s .= chr $hex;
@@ -873,7 +915,7 @@ BEGIN {
}
else{
- if ( ord $ch > 127 ) {
+ if ( $ch =~ /[[:^ascii:]]/ ) {
unless( $ch = is_valid_utf8($ch) ) {
$at -= 1;
decode_error("malformed UTF-8 character in JSON string");
@@ -886,10 +928,12 @@ BEGIN {
}
if (!$loose) {
- if ($ch =~ /[\x00-\x1f\x22\x5c]/) { # '/' ok
+ if ($ch =~ $invalid_char_re) { # '/' ok
if (!$relaxed or $ch ne "\t") {
$at--;
- decode_error('invalid character encountered while parsing JSON string');
+ decode_error(sprintf "invalid character 0x%X"
+ . " encountered while parsing JSON string",
+ ord $ch);
}
}
}
@@ -1102,7 +1146,7 @@ BEGIN {
sub bareKey { # doesn't strictly follow Standard ECMA-262 3rd Edition
my $key;
- while($ch =~ /[^\x00-\x23\x25-\x2F\x3A-\x40\x5B-\x5E\x60\x7B-\x7F]/){
+ while($ch =~ /[\$\w[:^ascii:]]/){
$key .= $ch;
next_chr();
}
@@ -1235,31 +1279,55 @@ BEGIN {
return $is_dec ? $v/1.0 : 0+$v;
}
+ # Compute how many bytes are in the longest legal official Unicode
+ # character
+ my $max_unicode_length = do {
+ no warnings 'utf8';
+ chr 0x10FFFF;
+ };
+ utf8::encode($max_unicode_length);
+ $max_unicode_length = length $max_unicode_length;
sub is_valid_utf8 {
- $utf8_len = $_[0] =~ /[\x00-\x7F]/ ? 1
- : $_[0] =~ /[\xC2-\xDF]/ ? 2
- : $_[0] =~ /[\xE0-\xEF]/ ? 3
- : $_[0] =~ /[\xF0-\xF4]/ ? 4
- : 0
- ;
-
- return unless $utf8_len;
-
- my $is_valid_utf8 = substr($text, $at - 1, $utf8_len);
-
- return ( $is_valid_utf8 =~ /^(?:
- [\x00-\x7F]
- |[\xC2-\xDF][\x80-\xBF]
- |[\xE0][\xA0-\xBF][\x80-\xBF]
- |[\xE1-\xEC][\x80-\xBF][\x80-\xBF]
- |[\xED][\x80-\x9F][\x80-\xBF]
- |[\xEE-\xEF][\x80-\xBF][\x80-\xBF]
- |[\xF0][\x90-\xBF][\x80-\xBF][\x80-\xBF]
- |[\xF1-\xF3][\x80-\xBF][\x80-\xBF][\x80-\xBF]
- |[\xF4][\x80-\x8F][\x80-\xBF][\x80-\xBF]
- )$/x ) ? $is_valid_utf8 : '';
+ # Returns undef (setting $utf8_len to 0) unless the next bytes in $text
+ # comprise a well-formed UTF-8 encoded character, in which case,
+ # return those bytes, setting $utf8_len to their count.
+
+ my $start_point = substr($text, $at - 1);
+
+ # Look no further than the maximum number of bytes in a single
+ # character
+ my $limit = $max_unicode_length;
+ $limit = length($start_point) if $limit > length($start_point);
+
+ # Find the number of bytes comprising the first character in $text
+ # (without having to know the details of its internal representation).
+ # This loop will iterate just once on well-formed input.
+ while ($limit > 0) { # Until we succeed or exhaust the input
+ my $copy = substr($start_point, 0, $limit);
+
+ # decode() will return true if all bytes are valid; false
+ # if any aren't.
+ if (utf8::decode($copy)) {
+
+ # Is valid: get the first character, convert back to bytes,
+ # and return those bytes.
+ $copy = substr($copy, 0, 1);
+ utf8::encode($copy);
+ $utf8_len = length $copy;
+ return substr($start_point, 0, $utf8_len);
+ }
+
+ # If it didn't work, it could be that there is a full legal character
+ # followed by a partial or malformed one. Narrow the window and
+ # try again.
+ $limit--;
+ }
+
+ # Failed to find a legal UTF-8 character.
+ $utf8_len = 0;
+ return;
}
@@ -1270,22 +1338,15 @@ BEGIN {
my $mess = '';
my $type = 'U*';
- if ( OLD_PERL ) {
- my $type = $] < 5.006 ? 'C*'
- : utf8::is_utf8( $str ) ? 'U*' # 5.6
- : 'C*'
- ;
- }
-
for my $c ( unpack( $type, $str ) ) { # emulate pv_uni_display() ?
- $mess .= $c == 0x07 ? '\a'
- : $c == 0x09 ? '\t'
- : $c == 0x0a ? '\n'
- : $c == 0x0d ? '\r'
- : $c == 0x0c ? '\f'
- : $c < 0x20 ? sprintf('\x{%x}', $c)
- : $c == 0x5c ? '\\\\'
- : $c < 0x80 ? chr($c)
+ my $chr_c = chr($c);
+ $mess .= $chr_c eq '\\' ? '\\\\'
+ : $chr_c =~ /[[:print:]]/ ? $chr_c
+ : $chr_c eq '\a' ? '\a'
+ : $chr_c eq '\t' ? '\t'
+ : $chr_c eq '\n' ? '\n'
+ : $chr_c eq '\r' ? '\r'
+ : $chr_c eq '\f' ? '\f'
: sprintf('\x{%x}', $c)
;
if ( length $mess >= 20 ) {
@@ -1364,136 +1425,54 @@ sub _decode_unicode {
return $un;
}
-#
-# Setup for various Perl versions (the code from JSON::PP58)
-#
-
-BEGIN {
-
- unless ( defined &utf8::is_utf8 ) {
- require Encode;
- *utf8::is_utf8 = *Encode::is_utf8;
- }
-
- if ( !OLD_PERL ) {
- *JSON::PP::JSON_PP_encode_ascii = \&_encode_ascii;
- *JSON::PP::JSON_PP_encode_latin1 = \&_encode_latin1;
- *JSON::PP::JSON_PP_decode_surrogates = \&_decode_surrogates;
- *JSON::PP::JSON_PP_decode_unicode = \&_decode_unicode;
-
- if ($] < 5.008003) { # join() in 5.8.0 - 5.8.2 is broken.
- package JSON::PP;
- require subs;
- subs->import('join');
- eval q|
- sub join {
- return '' if (@_ < 2);
- my $j = shift;
- my $str = shift;
- for (@_) { $str .= $j . $_; }
- return $str;
- }
- |;
- }
- }
+sub incr_parse {
+ local $Carp::CarpLevel = 1;
+ ( $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new )->incr_parse( @_ );
+}
- sub JSON::PP::incr_parse {
- local $Carp::CarpLevel = 1;
- ( $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new )->incr_parse( @_ );
- }
+sub incr_skip {
+ ( $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new )->incr_skip;
+}
- sub JSON::PP::incr_skip {
- ( $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new )->incr_skip;
- }
+sub incr_reset {
+ ( $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new )->incr_reset;
+}
+sub incr_text : lvalue {
+ $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new;
- sub JSON::PP::incr_reset {
- ( $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new )->incr_reset;
+ if ( $_[0]->{_incr_parser}->{incr_pos} ) {
+ Carp::croak("incr_text cannot be called when the incremental parser already started parsing");
}
-
- eval q{
- sub JSON::PP::incr_text : lvalue {
- $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new;
-
- if ( $_[0]->{_incr_parser}->{incr_pos} ) {
- Carp::croak("incr_text cannot be called when the incremental parser already started parsing");
- }
- $_[0]->{_incr_parser}->{incr_text};
- }
- } if ( $] >= 5.006 );
-
-} # Setup for various Perl versions (the code from JSON::PP58)
+ $_[0]->{_incr_parser}->{incr_text};
+}
###############################
# Utilities
#
-BEGIN {
- eval 'require Scalar::Util';
- unless($@){
- *JSON::PP::blessed = \&Scalar::Util::blessed;
- *JSON::PP::reftype = \&Scalar::Util::reftype;
- *JSON::PP::refaddr = \&Scalar::Util::refaddr;
- }
- else{ # This code is from Scalar::Util.
- # warn $@;
- eval 'sub UNIVERSAL::a_sub_not_likely_to_be_here { ref($_[0]) }';
- *JSON::PP::blessed = sub {
- local($@, $SIG{__DIE__}, $SIG{__WARN__});
- ref($_[0]) ? eval { $_[0]->a_sub_not_likely_to_be_here } : undef;
- };
- require B;
- my %tmap = qw(
- B::NULL SCALAR
- B::HV HASH
- B::AV ARRAY
- B::CV CODE
- B::IO IO
- B::GV GLOB
- B::REGEXP REGEXP
- );
- *JSON::PP::reftype = sub {
- my $r = shift;
-
- return undef unless length(ref($r));
-
- my $t = ref(B::svref_2object($r));
-
- return
- exists $tmap{$t} ? $tmap{$t}
- : length(ref($$r)) ? 'REF'
- : 'SCALAR';
- };
- *JSON::PP::refaddr = sub {
- return undef unless length(ref($_[0]));
-
- my $addr;
- if(defined(my $pkg = blessed($_[0]))) {
- $addr .= bless $_[0], 'Scalar::Util::Fake';
- bless $_[0], $pkg;
- }
- else {
- $addr .= $_[0]
- }
-
- $addr =~ /0x(\w+)/;
- local $^W;
- #no warnings 'portable';
- hex($1);
- }
- }
-}
-
-
# shamelessly copied and modified from JSON::XS code.
$JSON::PP::true = do { bless \(my $dummy = 1), "JSON::PP::Boolean" };
$JSON::PP::false = do { bless \(my $dummy = 0), "JSON::PP::Boolean" };
-sub is_bool { blessed $_[0] and ( $_[0]->isa("JSON::PP::Boolean") or $_[0]->isa("Types::Serialiser::BooleanBase") or $_[0]->isa("JSON::XS::Boolean") ); }
+sub is_bool {
+ if (blessed $_[0]) {
+ return (
+ $_[0]->isa("JSON::PP::Boolean")
+ or $_[0]->isa("Types::Serialiser::BooleanBase")
+ or $_[0]->isa("JSON::XS::Boolean")
+ );
+ }
+ elsif (CORE_BOOL) {
+ BEGIN { CORE_BOOL and warnings->unimport('experimental::builtin') }
+ return builtin::is_bool($_[0]);
+ }
+ return !!0;
+}
sub true { $JSON::PP::true }
sub false { $JSON::PP::false }
@@ -1514,7 +1493,7 @@ use constant INCR_M_C1 => 5;
use constant INCR_M_TFN => 6;
use constant INCR_M_NUM => 7;
-$JSON::PP::IncrParser::VERSION = '1.01';
+our $VERSION = '1.01';
sub new {
my ( $class ) = @_;
@@ -1534,10 +1513,6 @@ sub incr_parse {
$self->{incr_text} = '' unless ( defined $self->{incr_text} );
if ( defined $text ) {
- if ( utf8::is_utf8( $text ) and !utf8::is_utf8( $self->{incr_text} ) ) {
- utf8::upgrade( $self->{incr_text} ) ;
- utf8::decode( $self->{incr_text} ) ;
- }
$self->{incr_text} .= $text;
}
@@ -1564,7 +1539,6 @@ sub incr_parse {
}
unless ( $coder->get_utf8 ) {
- utf8::upgrade( $self->{incr_text} );
utf8::decode( $self->{incr_text} );
}
@@ -1605,7 +1579,7 @@ INCR_PARSE:
while ( $len > $p ) {
$s = substr( $text, $p, 1 );
last INCR_PARSE unless defined $s;
- if ( ord($s) > 0x20 ) {
+ if ( ord($s) > ord " " ) {
if ( $s eq '#' ) {
$self->{incr_mode} = INCR_M_C0;
redo INCR_PARSE;
@@ -1632,6 +1606,7 @@ INCR_PARSE:
}
next;
} elsif ( $mode == INCR_M_TFN ) {
+ last INCR_PARSE if $p >= $len && $self->{incr_nest};
while ( $len > $p ) {
$s = substr( $text, $p++, 1 );
next if defined $s and $s =~ /[rueals]/;
@@ -1643,6 +1618,7 @@ INCR_PARSE:
last INCR_PARSE unless $self->{incr_nest};
redo INCR_PARSE;
} elsif ( $mode == INCR_M_NUM ) {
+ last INCR_PARSE if $p >= $len && $self->{incr_nest};
while ( $len > $p ) {
$s = substr( $text, $p++, 1 );
next if defined $s and $s =~ /[0-9eE.+\-]/;
@@ -1679,7 +1655,7 @@ INCR_PARSE:
if ( $s eq "\x00" ) {
$p--;
last INCR_PARSE;
- } elsif ( $s eq "\x09" or $s eq "\x0a" or $s eq "\x0d" or $s eq "\x20" ) {
+ } elsif ( $s =~ /^[\t\n\r ]$/) {
if ( !$self->{incr_nest} ) {
$p--; # do not eat the whitespace, let the next round do it
last INCR_PARSE;
@@ -1834,6 +1810,9 @@ Returns true if the passed scalar repres
JSON::PP::false, two constants that act like C<1> and C<0> respectively
and are also used to represent JSON C<true> and C<false> in Perl strings.
+On perl 5.36 and above, will also return true when given one of perl's
+standard boolean values, such as the result of a comparison.
+
See L<MAPPING>, below, for more information on how JSON values are mapped to
Perl.
@@ -2249,6 +2228,22 @@ to their default values.
C<get_boolean_values> will return both C<$false> and C<$true> values, or
the empty list when they are set to the default.
+
+=head2 core_bools
+
+ $json->core_bools([$enable]);
+
+If C<$enable> is true (or missing), then C<decode>, will produce standard
+perl boolean values. Equivalent to calling:
+
+ $json->boolean_values(!!1, !!0)
+
+C<get_core_bools> will return true if this has been set. On perl 5.36, it will
+also return true if the boolean values have been set to perl's core booleans
+using the C<boolean_values> method.
+
+The methods C<unblessed_bool> and C<get_unblessed_bool> are provided as aliases
+for compatibility with L<Cpanel::JSON::XS>.
=head2 filter_json_object
Index: gnu/usr.bin/perl/cpan/JSON-PP/lib/JSON/PP/Boolean.pm
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/JSON-PP/lib/JSON/PP/Boolean.pm,v
diff -u -p -a -u -p -r1.1.1.5 Boolean.pm
--- gnu/usr.bin/perl/cpan/JSON-PP/lib/JSON/PP/Boolean.pm 15 Feb 2023 01:32:42 -0000 1.1.1.5
+++ gnu/usr.bin/perl/cpan/JSON-PP/lib/JSON/PP/Boolean.pm 21 Feb 2024 15:47:01 -0000
@@ -1,8 +1,9 @@
package JSON::PP::Boolean;
use strict;
-require overload;
-local $^W;
+use warnings;
+use overload ();
+overload::unimport('overload', qw(0+ ++ -- fallback));
overload::import('overload',
"0+" => sub { ${$_[0]} },
"++" => sub { $_[0] = ${$_[0]} + 1 },
@@ -10,7 +11,7 @@ overload::import('overload',
fallback => 1,
);
-$JSON::PP::Boolean::VERSION = '4.07';
+our $VERSION = '4.16';
1;
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/001_utf8.t
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/JSON-PP/t/001_utf8.t,v
diff -u -p -a -u -p -r1.1.1.4 001_utf8.t
--- gnu/usr.bin/perl/cpan/JSON-PP/t/001_utf8.t 15 Feb 2023 01:32:42 -0000 1.1.1.4
+++ gnu/usr.bin/perl/cpan/JSON-PP/t/001_utf8.t 21 Feb 2024 15:47:01 -0000
@@ -10,17 +10,23 @@ BEGIN { $ENV{PERL_JSON_BACKEND} = 0; }
use utf8;
use JSON::PP;
+my $pilcrow_utf8 = (ord "^" == 0x5E) ? "\xc2\xb6" # 8859-1
+ : (ord "^" == 0x5F) ? "\x80\x65" # CP 1024
+ : "\x78\x64"; # assume CP 037
+is (JSON::PP->new->allow_nonref (1)->utf8 (1)->encode ("¶"), "\"$pilcrow_utf8\"");
+is (JSON::PP->new->allow_nonref (1)->encode ("¶"), "\"¶\"");
+is (JSON::PP->new->allow_nonref (1)->ascii (1)->utf8 (1)->encode (chr 0x8000), '"\u8000"');
+is (JSON::PP->new->allow_nonref (1)->ascii (1)->utf8 (1)->pretty (1)->encode (chr 0x10402), "\"\\ud801\\udc02\"\n");
-ok (JSON::PP->new->allow_nonref (1)->utf8 (1)->encode ("ü") eq "\"\xc3\xbc\"");
-ok (JSON::PP->new->allow_nonref (1)->encode ("ü") eq "\"ü\"");
-ok (JSON::PP->new->allow_nonref (1)->ascii (1)->utf8 (1)->encode (chr 0x8000) eq '"\u8000"');
-ok (JSON::PP->new->allow_nonref (1)->ascii (1)->utf8 (1)->pretty (1)->encode (chr 0x10402) eq "\"\\ud801\\udc02\"\n");
-
-eval { JSON::PP->new->allow_nonref (1)->utf8 (1)->decode ('"ü"') };
+eval { JSON::PP->new->allow_nonref (1)->utf8 (1)->decode ('"¶"') };
ok $@ =~ /malformed UTF-8/;
-ok (JSON::PP->new->allow_nonref (1)->decode ('"ü"') eq "ü");
-ok (JSON::PP->new->allow_nonref (1)->decode ('"\u00fc"') eq "ü");
-ok (JSON::PP->new->allow_nonref (1)->decode ('"\ud801\udc02' . "\x{10204}\"") eq "\x{10402}\x{10204}");
-ok (JSON::PP->new->allow_nonref (1)->decode ('"\"\n\\\\\r\t\f\b"') eq "\"\012\\\015\011\014\010");
+is (JSON::PP->new->allow_nonref (1)->decode ('"¶"'), "¶");
+is (JSON::PP->new->allow_nonref (1)->decode ('"\u00b6"'), "¶");
+is (JSON::PP->new->allow_nonref (1)->decode ('"\ud801\udc02' . "\x{10204}\""), "\x{10402}\x{10204}");
+
+my $controls = (ord "^" == 0x5E) ? "\012\\\015\011\014\010"
+ : (ord "^" == 0x5F) ? "\025\\\015\005\014\026" # CP 1024
+ : "\045\\\015\005\014\026"; # assume CP 037
+is (JSON::PP->new->allow_nonref (1)->decode ('"\"\n\\\\\r\t\f\b"'), "\"$controls");
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/003_types.t
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/JSON-PP/t/003_types.t,v
diff -u -p -a -u -p -r1.1.1.4 003_types.t
--- gnu/usr.bin/perl/cpan/JSON-PP/t/003_types.t 15 Feb 2023 01:32:42 -0000 1.1.1.4
+++ gnu/usr.bin/perl/cpan/JSON-PP/t/003_types.t 21 Feb 2024 15:47:01 -0000
@@ -3,7 +3,7 @@
use strict;
use warnings;
use Test::More;
-BEGIN { plan tests => 76 + 2 };
+BEGIN { plan tests => 78 + 2 };
BEGIN { $ENV{PERL_JSON_BACKEND} = 0; }
@@ -46,6 +46,14 @@ ok ('[false]' eq encode_json [\0]);
ok ('[null]' eq encode_json [undef]);
ok ('[true]' eq encode_json [JSON::PP::true]);
ok ('[false]' eq encode_json [JSON::PP::false]);
+
+SKIP: {
+ skip "core booleans not supported", 2
+ unless JSON::PP->can("CORE_BOOL") && JSON::PP::CORE_BOOL();
+
+ ok ('[true]' eq encode_json [!!1]);
+ ok ('[false]' eq encode_json [!!0]);
+}
for my $v (1, 2, 3, 5, -1, -2, -3, -4, 100, 1000, 10000, -999, -88, -7, 7, 88, 999, -1e5, 1e6, 1e7, 1e8) {
ok ($v == ((decode_json "[$v]")->[0]));
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/004_dwiw_encode.t
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/JSON-PP/t/004_dwiw_encode.t,v
diff -u -p -a -u -p -r1.1.1.2 004_dwiw_encode.t
--- gnu/usr.bin/perl/cpan/JSON-PP/t/004_dwiw_encode.t 15 Feb 2023 01:32:42 -0000 1.1.1.2
+++ gnu/usr.bin/perl/cpan/JSON-PP/t/004_dwiw_encode.t 21 Feb 2024 15:47:01 -0000
@@ -7,12 +7,10 @@
use strict;
use warnings;
-use Test;
+use Test::More tests => 5;
# main
{
- BEGIN { plan tests => 5 }
-
BEGIN { $ENV{PERL_JSON_BACKEND} = 0; }
use JSON::PP;
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/005_dwiw_decode.t
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/JSON-PP/t/005_dwiw_decode.t,v
diff -u -p -a -u -p -r1.1.1.1 005_dwiw_decode.t
--- gnu/usr.bin/perl/cpan/JSON-PP/t/005_dwiw_decode.t 30 Dec 2019 02:10:33 -0000 1.1.1.1
+++ gnu/usr.bin/perl/cpan/JSON-PP/t/005_dwiw_decode.t 21 Feb 2024 15:47:01 -0000
@@ -7,12 +7,10 @@
use strict;
use warnings;
-use Test;
+use Test::More tests => 7;
# main
{
- BEGIN { plan tests => 7 }
-
BEGIN { $ENV{PERL_JSON_BACKEND} = 0; }
use JSON::PP;
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/008_pc_base.t
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/JSON-PP/t/008_pc_base.t,v
diff -u -p -a -u -p -r1.1.1.4 008_pc_base.t
--- gnu/usr.bin/perl/cpan/JSON-PP/t/008_pc_base.t 15 Feb 2023 01:32:42 -0000 1.1.1.4
+++ gnu/usr.bin/perl/cpan/JSON-PP/t/008_pc_base.t 21 Feb 2024 15:47:01 -0000
@@ -77,7 +77,7 @@ $obj = $pc->decode($js);
is($obj->[0],"\x01");
$obj = ["\e"];
-is($js = $pc->encode($obj),'["\\u001b"]');
+is($js = $pc->encode($obj), (ord("A") == 65) ? '["\\u001b"]' : '["\\u0027"]');
$obj = $pc->decode($js);
is($obj->[0],"\e");
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/014_latin1.t
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/JSON-PP/t/014_latin1.t,v
diff -u -p -a -u -p -r1.1.1.4 014_latin1.t
--- gnu/usr.bin/perl/cpan/JSON-PP/t/014_latin1.t 15 Feb 2023 01:32:42 -0000 1.1.1.4
+++ gnu/usr.bin/perl/cpan/JSON-PP/t/014_latin1.t 21 Feb 2024 15:47:01 -0000
@@ -11,9 +11,9 @@ use JSON::PP;
my $pp = JSON::PP->new->latin1->allow_nonref;
-ok ($pp->encode ("\x{12}\x{89} ") eq "\"\\u0012\x{89} \"");
-ok ($pp->encode ("\x{12}\x{89}\x{abc}") eq "\"\\u0012\x{89}\\u0abc\"");
+ok ($pp->encode ("\x{12}\x{b6} ") eq "\"\\u0012\x{b6} \"");
+ok ($pp->encode ("\x{12}\x{b6}\x{abc}") eq "\"\\u0012\x{b6}\\u0abc\"");
-ok ($pp->decode ("\"\\u0012\x{89}\"" ) eq "\x{12}\x{89}");
-ok ($pp->decode ("\"\\u0012\x{89}\\u0abc\"") eq "\x{12}\x{89}\x{abc}");
+ok ($pp->decode ("\"\\u0012\x{b6}\"" ) eq "\x{12}\x{b6}");
+ok ($pp->decode ("\"\\u0012\x{b6}\\u0abc\"") eq "\x{12}\x{b6}\x{abc}");
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/020_faihu.t
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/JSON-PP/t/020_faihu.t,v
diff -u -p -a -u -p -r1.1.1.1 020_faihu.t
--- gnu/usr.bin/perl/cpan/JSON-PP/t/020_faihu.t 30 Dec 2019 02:10:33 -0000 1.1.1.1
+++ gnu/usr.bin/perl/cpan/JSON-PP/t/020_faihu.t 21 Feb 2024 15:47:01 -0000
@@ -7,8 +7,6 @@ use warnings;
BEGIN { $ENV{PERL_JSON_BACKEND} = 0; }
-BEGIN { if ($] < 5.008) { require Test::More; Test::More::plan(skip_all => "requires Perl 5.8 or later"); } };
-
use JSON::PP;
use Encode qw(encode decode);
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/020_unknown.t
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/JSON-PP/t/020_unknown.t,v
diff -u -p -a -u -p -r1.1.1.3 020_unknown.t
--- gnu/usr.bin/perl/cpan/JSON-PP/t/020_unknown.t 15 Feb 2023 01:32:42 -0000 1.1.1.3
+++ gnu/usr.bin/perl/cpan/JSON-PP/t/020_unknown.t 21 Feb 2024 15:47:01 -0000
@@ -29,10 +29,6 @@ is( $json->encode( [ \undef ] ), '[null]
is( $json->encode( [ \{} ] ), '[null]' );
-SKIP: {
-
- skip "this test is for Perl 5.8 or later", 2 if( $] < 5.008 );
-
$json->allow_unknown(0);
my $fh;
@@ -48,5 +44,3 @@ is( $json->encode( [ $fh ] ), '[null]
close $fh;
unlink('hoge.txt');
-
-}
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary.pl
===================================================================
RCS file: gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary.pl
diff -N gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary.pl
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary.pl 21 Feb 2024 15:47:01 -0000
@@ -0,0 +1,52 @@
+# copied over from JSON::XS and modified to use JSON::PP
+
+use strict;
+use warnings;
+use Test::More;
+BEGIN {
+ if (defined(my $n= $ENV{JSONPP_CHUNK})) {
+ $ENV{JSONPP_FROM}= 1 + $n * 48;
+ $ENV{JSONPP_TO}= (1 + $n) * 48;
+ }
+ $ENV{JSONPP_FROM} = 1 unless defined $ENV{JSONPP_FROM};
+ $ENV{JSONPP_TO} = 768 unless defined $ENV{JSONPP_TO};
+}
+BEGIN { plan tests => 32 * ($ENV{JSONPP_TO} - $ENV{JSONPP_FROM} + 1) };
+
+BEGIN { $ENV{PERL_JSON_BACKEND} = 0; }
+
+use JSON::PP;
+
+
+sub test($) {
+ my $js;
+
+ $js = JSON::PP->new->allow_nonref(0)->utf8->ascii->shrink->encode ([$_[0]]);
+ ok ($_[0] eq ((decode_json $js)->[0]), " - 0");
+ $js = JSON::PP->new->allow_nonref(0)->utf8->ascii->encode ([$_[0]]);
+ ok ($_[0] eq (JSON::PP->new->utf8->shrink->decode($js))->[0], " - 1");
+
+ $js = JSON::PP->new->allow_nonref(0)->utf8->shrink->encode ([$_[0]]);
+ ok ($_[0] eq ((decode_json $js)->[0]), " - 2");
+ $js = JSON::PP->new->allow_nonref(1)->utf8->encode ([$_[0]]);
+ ok ($_[0] eq (JSON::PP->new->utf8->shrink->decode($js))->[0], " - 3");
+
+ $js = JSON::PP->new->allow_nonref(1)->ascii->encode ([$_[0]]);
+ ok ($_[0] eq JSON::PP->new->decode ($js)->[0], " - 4");
+ $js = JSON::PP->new->allow_nonref(0)->ascii->encode ([$_[0]]);
+ ok ($_[0] eq JSON::PP->new->shrink->decode ($js)->[0], " - 5");
+
+ $js = JSON::PP->new->allow_nonref(1)->shrink->encode ([$_[0]]);
+ ok ($_[0] eq JSON::PP->new->decode ($js)->[0], " - 6");
+ $js = JSON::PP->new->allow_nonref(0)->encode ([$_[0]]);
+ ok ($_[0] eq JSON::PP->new->shrink->decode ($js)->[0], " - 7");
+}
+
+srand $ENV{JSONPP_FROM}; # doesn't help too much, but its at least more deterministic
+
+for ($ENV{JSONPP_FROM} .. $ENV{JSONPP_TO}) {
+ test join "", map chr ($_ & 255), 0..$_;
+ test join "", map chr rand 255, 0..$_;
+ test join "", map chr ($_ * 97 & ~0x4000), 0..$_;
+ test join "", map chr (rand (2**20) & ~0x800), 0..$_;
+}
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary.t
===================================================================
RCS file: gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary.t
diff -N gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary.t
--- gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary.t 15 Feb 2023 01:32:42 -0000 1.1.1.4
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,45 +0,0 @@
-# copied over from JSON::XS and modified to use JSON::PP
-
-use strict;
-use warnings;
-use Test::More;
-BEGIN { plan tests => 24576 };
-
-BEGIN { $ENV{PERL_JSON_BACKEND} = 0; }
-
-use JSON::PP;
-
-
-sub test($) {
- my $js;
-
- $js = JSON::PP->new->allow_nonref(0)->utf8->ascii->shrink->encode ([$_[0]]);
- ok ($_[0] eq ((decode_json $js)->[0]), " - 0");
- $js = JSON::PP->new->allow_nonref(0)->utf8->ascii->encode ([$_[0]]);
- ok ($_[0] eq (JSON::PP->new->utf8->shrink->decode($js))->[0], " - 1");
-
- $js = JSON::PP->new->allow_nonref(0)->utf8->shrink->encode ([$_[0]]);
- ok ($_[0] eq ((decode_json $js)->[0]), " - 2");
- $js = JSON::PP->new->allow_nonref(1)->utf8->encode ([$_[0]]);
- ok ($_[0] eq (JSON::PP->new->utf8->shrink->decode($js))->[0], " - 3");
-
- $js = JSON::PP->new->allow_nonref(1)->ascii->encode ([$_[0]]);
- ok ($_[0] eq JSON::PP->new->decode ($js)->[0], " - 4");
- $js = JSON::PP->new->allow_nonref(0)->ascii->encode ([$_[0]]);
- ok ($_[0] eq JSON::PP->new->shrink->decode ($js)->[0], " - 5");
-
- $js = JSON::PP->new->allow_nonref(1)->shrink->encode ([$_[0]]);
- ok ($_[0] eq JSON::PP->new->decode ($js)->[0], " - 6");
- $js = JSON::PP->new->allow_nonref(0)->encode ([$_[0]]);
- ok ($_[0] eq JSON::PP->new->shrink->decode ($js)->[0], " - 7");
-}
-
-srand 0; # doesn't help too much, but its at least more deterministic
-
-for (1..768) {
- test join "", map chr ($_ & 255), 0..$_;
- test join "", map chr rand 255, 0..$_;
- test join "", map chr ($_ * 97 & ~0x4000), 0..$_;
- test join "", map chr (rand (2**20) & ~0x800), 0..$_;
-}
-
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary00.t
===================================================================
RCS file: gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary00.t
diff -N gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary00.t
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary00.t 21 Feb 2024 15:47:01 -0000
@@ -0,0 +1,3 @@
+$0=~/binary(\d\d)/ or die "Could not detect chunk from '$0'";
+$ENV{JSONPP_CHUNK} = 0+$1;
+do "./t/099_binary.pl";
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary01.t
===================================================================
RCS file: gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary01.t
diff -N gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary01.t
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary01.t 21 Feb 2024 15:47:01 -0000
@@ -0,0 +1,3 @@
+$0=~/binary(\d\d)/ or die "Could not detect chunk from '$0'";
+$ENV{JSONPP_CHUNK} = 0+$1;
+do "./t/099_binary.pl";
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary02.t
===================================================================
RCS file: gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary02.t
diff -N gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary02.t
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary02.t 21 Feb 2024 15:47:01 -0000
@@ -0,0 +1,3 @@
+$0=~/binary(\d\d)/ or die "Could not detect chunk from '$0'";
+$ENV{JSONPP_CHUNK} = 0+$1;
+do "./t/099_binary.pl";
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary03.t
===================================================================
RCS file: gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary03.t
diff -N gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary03.t
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary03.t 21 Feb 2024 15:47:01 -0000
@@ -0,0 +1,3 @@
+$0=~/binary(\d\d)/ or die "Could not detect chunk from '$0'";
+$ENV{JSONPP_CHUNK} = 0+$1;
+do "./t/099_binary.pl";
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary04.t
===================================================================
RCS file: gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary04.t
diff -N gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary04.t
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary04.t 21 Feb 2024 15:47:01 -0000
@@ -0,0 +1,3 @@
+$0=~/binary(\d\d)/ or die "Could not detect chunk from '$0'";
+$ENV{JSONPP_CHUNK} = 0+$1;
+do "./t/099_binary.pl";
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary05.t
===================================================================
RCS file: gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary05.t
diff -N gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary05.t
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary05.t 21 Feb 2024 15:47:01 -0000
@@ -0,0 +1,3 @@
+$0=~/binary(\d\d)/ or die "Could not detect chunk from '$0'";
+$ENV{JSONPP_CHUNK} = 0+$1;
+do "./t/099_binary.pl";
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary06.t
===================================================================
RCS file: gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary06.t
diff -N gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary06.t
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary06.t 21 Feb 2024 15:47:01 -0000
@@ -0,0 +1,3 @@
+$0=~/binary(\d\d)/ or die "Could not detect chunk from '$0'";
+$ENV{JSONPP_CHUNK} = 0+$1;
+do "./t/099_binary.pl";
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary07.t
===================================================================
RCS file: gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary07.t
diff -N gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary07.t
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary07.t 21 Feb 2024 15:47:01 -0000
@@ -0,0 +1,3 @@
+$0=~/binary(\d\d)/ or die "Could not detect chunk from '$0'";
+$ENV{JSONPP_CHUNK} = 0+$1;
+do "./t/099_binary.pl";
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary08.t
===================================================================
RCS file: gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary08.t
diff -N gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary08.t
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary08.t 21 Feb 2024 15:47:01 -0000
@@ -0,0 +1,3 @@
+$0=~/binary(\d\d)/ or die "Could not detect chunk from '$0'";
+$ENV{JSONPP_CHUNK} = 0+$1;
+do "./t/099_binary.pl";
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary09.t
===================================================================
RCS file: gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary09.t
diff -N gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary09.t
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary09.t 21 Feb 2024 15:47:01 -0000
@@ -0,0 +1,3 @@
+$0=~/binary(\d\d)/ or die "Could not detect chunk from '$0'";
+$ENV{JSONPP_CHUNK} = 0+$1;
+do "./t/099_binary.pl";
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary10.t
===================================================================
RCS file: gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary10.t
diff -N gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary10.t
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary10.t 21 Feb 2024 15:47:01 -0000
@@ -0,0 +1,3 @@
+$0=~/binary(\d\d)/ or die "Could not detect chunk from '$0'";
+$ENV{JSONPP_CHUNK} = 0+$1;
+do "./t/099_binary.pl";
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary11.t
===================================================================
RCS file: gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary11.t
diff -N gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary11.t
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary11.t 21 Feb 2024 15:47:01 -0000
@@ -0,0 +1,3 @@
+$0=~/binary(\d\d)/ or die "Could not detect chunk from '$0'";
+$ENV{JSONPP_CHUNK} = 0+$1;
+do "./t/099_binary.pl";
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary12.t
===================================================================
RCS file: gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary12.t
diff -N gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary12.t
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary12.t 21 Feb 2024 15:47:01 -0000
@@ -0,0 +1,3 @@
+$0=~/binary(\d\d)/ or die "Could not detect chunk from '$0'";
+$ENV{JSONPP_CHUNK} = 0+$1;
+do "./t/099_binary.pl";
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary13.t
===================================================================
RCS file: gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary13.t
diff -N gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary13.t
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary13.t 21 Feb 2024 15:47:01 -0000
@@ -0,0 +1,3 @@
+$0=~/binary(\d\d)/ or die "Could not detect chunk from '$0'";
+$ENV{JSONPP_CHUNK} = 0+$1;
+do "./t/099_binary.pl";
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary14.t
===================================================================
RCS file: gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary14.t
diff -N gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary14.t
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary14.t 21 Feb 2024 15:47:01 -0000
@@ -0,0 +1,3 @@
+$0=~/binary(\d\d)/ or die "Could not detect chunk from '$0'";
+$ENV{JSONPP_CHUNK} = 0+$1;
+do "./t/099_binary.pl";
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary15.t
===================================================================
RCS file: gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary15.t
diff -N gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary15.t
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gnu/usr.bin/perl/cpan/JSON-PP/t/099_binary15.t 21 Feb 2024 15:47:01 -0000
@@ -0,0 +1,3 @@
+$0=~/binary(\d\d)/ or die "Could not detect chunk from '$0'";
+$ENV{JSONPP_CHUNK} = 0+$1;
+do "./t/099_binary.pl";
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/105_esc_slash.t
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/JSON-PP/t/105_esc_slash.t,v
diff -u -p -a -u -p -r1.1.1.2 105_esc_slash.t
--- gnu/usr.bin/perl/cpan/JSON-PP/t/105_esc_slash.t 15 Feb 2023 01:32:42 -0000 1.1.1.2
+++ gnu/usr.bin/perl/cpan/JSON-PP/t/105_esc_slash.t 21 Feb 2024 15:47:01 -0000
@@ -1,6 +1,6 @@
use Test::More;
-use strict;
+use strict;
use warnings;
BEGIN { plan tests => 2 };
BEGIN { $ENV{PERL_JSON_BACKEND} = 0; }
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/106_allow_barekey.t
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/JSON-PP/t/106_allow_barekey.t,v
diff -u -p -a -u -p -r1.1.1.2 106_allow_barekey.t
--- gnu/usr.bin/perl/cpan/JSON-PP/t/106_allow_barekey.t 15 Feb 2023 01:32:42 -0000 1.1.1.2
+++ gnu/usr.bin/perl/cpan/JSON-PP/t/106_allow_barekey.t 21 Feb 2024 15:47:01 -0000
@@ -1,6 +1,6 @@
use Test::More;
-use strict;
+use strict;
use warnings;
BEGIN { plan tests => 2 };
BEGIN { $ENV{PERL_JSON_BACKEND} = 0; }
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/107_allow_singlequote.t
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/JSON-PP/t/107_allow_singlequote.t,v
diff -u -p -a -u -p -r1.1.1.2 107_allow_singlequote.t
--- gnu/usr.bin/perl/cpan/JSON-PP/t/107_allow_singlequote.t 15 Feb 2023 01:32:42 -0000 1.1.1.2
+++ gnu/usr.bin/perl/cpan/JSON-PP/t/107_allow_singlequote.t 21 Feb 2024 15:47:01 -0000
@@ -1,6 +1,6 @@
use Test::More;
-use strict;
+use strict;
use warnings;
BEGIN { plan tests => 4 };
BEGIN { $ENV{PERL_JSON_BACKEND} = 0; }
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/108_decode.t
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/JSON-PP/t/108_decode.t,v
diff -u -p -a -u -p -r1.1.1.4 108_decode.t
--- gnu/usr.bin/perl/cpan/JSON-PP/t/108_decode.t 15 Feb 2023 01:32:42 -0000 1.1.1.4
+++ gnu/usr.bin/perl/cpan/JSON-PP/t/108_decode.t 21 Feb 2024 15:47:01 -0000
@@ -5,10 +5,12 @@ use strict;
use warnings;
use Test::More;
-BEGIN { plan tests => 6 };
+BEGIN { plan tests => 7 };
BEGIN { $ENV{PERL_JSON_BACKEND} = 0; }
+my $isASCII = ord "A" == 65;
+
use JSON::PP;
no utf8;
@@ -22,16 +24,23 @@ is($json->decode(q|"\u00c3\u00bc"|), "\x
my $str = 'あ'; # Japanese 'a' in utf8
-is($json->decode(q|"\u00e3\u0081\u0082"|), $str);
+is($json->decode(($isASCII) ? q|"\u00e3\u0081\u0082"|
+ : q|"\u00ce\u0043\u0043"|),
+ $str);
utf8::decode($str); # usually UTF-8 flagged on, but no-op for 5.005.
is($json->decode(q|"\u3042"|), $str);
-my $utf8 = $json->decode(q|"\ud808\udf45"|); # chr 12345
+# chr 0x12400, which was chosen because it has the same representation in
+# both EBCDIC 1047 and 037
+my $utf8 = $json->decode(q|"\ud809\udc00"|);
utf8::encode($utf8); # UTF-8 flagged off
-is($utf8, "\xf0\x92\x8d\x85");
+is($utf8, ($isASCII) ? "\xf0\x92\x90\x80" : "\xDE\x4A\x41\x41");
+eval { $json->decode(q|{"action":"foo" "method":"bar","tid":1}|) };
+my $error = $@;
+like $error => qr!""method":"bar","tid"..."!;
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/109_encode.t
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/JSON-PP/t/109_encode.t,v
diff -u -p -a -u -p -r1.1.1.3 109_encode.t
--- gnu/usr.bin/perl/cpan/JSON-PP/t/109_encode.t 15 Feb 2023 01:32:42 -0000 1.1.1.3
+++ gnu/usr.bin/perl/cpan/JSON-PP/t/109_encode.t 21 Feb 2024 15:47:01 -0000
@@ -15,21 +15,30 @@ no utf8;
my $json = JSON::PP->new->allow_nonref;
-is($json->encode("ü"), q|"ü"|); # as is
+# U+00B6 chosen because it works on both ASCII and EBCDIC
+is($json->encode("¶"), q|"¶"|); # as is
$json->ascii;
-is($json->encode("\xfc"), q|"\u00fc"|); # latin1
-is($json->encode("\xc3\xbc"), q|"\u00c3\u00bc"|); # utf8
-is($json->encode("ü"), q|"\u00c3\u00bc"|); # utf8
-is($json->encode('あ'), q|"\u00e3\u0081\u0082"|);
+is($json->encode("\xb6"), q|"\u00b6"|); # latin1
-if ($] >= 5.006) {
- is($json->encode(chr hex 3042 ), q|"\u3042"|);
- is($json->encode(chr hex 12345 ), q|"\ud808\udf45"|);
+if (ord "A" == 65) {
+ is($json->encode("\xc2\xb6"), q|"\u00c2\u00b6"|); # utf8
+ is($json->encode("¶"), q|"\u00c2\u00b6"|); # utf8
+ is($json->encode('あ'), q|"\u00e3\u0081\u0082"|);
}
else {
- is($json->encode(chr hex 3042 ), $json->encode(chr 66));
- is($json->encode(chr hex 12345 ), $json->encode(chr 69));
+ if (ord '^' == 95) { # EBCDIC 1047
+ is($json->encode("\x80\x65"), q|"\u0080\u0065"|); # utf8
+ is($json->encode("¶"), q|"\u0080\u0065"|); # utf8
+ }
+ else { # Assume EBCDIC 037
+ is($json->encode("\x78\x64"), q|"\u0078\u0064"|); # utf8
+ is($json->encode("¶"), q|"\u0078\u0064"|); # utf8
+ }
+
+ is($json->encode('あ'), (q|"\u00ce\u0043\u0043"|));
}
+is($json->encode(chr hex 3042 ), q|"\u3042"|);
+is($json->encode(chr hex 12345 ), q|"\ud808\udf45"|);
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/112_upgrade.t
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/JSON-PP/t/112_upgrade.t,v
diff -u -p -a -u -p -r1.1.1.3 112_upgrade.t
--- gnu/usr.bin/perl/cpan/JSON-PP/t/112_upgrade.t 15 Feb 2023 01:32:42 -0000 1.1.1.3
+++ gnu/usr.bin/perl/cpan/JSON-PP/t/112_upgrade.t 21 Feb 2024 15:47:01 -0000
@@ -9,17 +9,17 @@ BEGIN { $ENV{PERL_JSON_BACKEND} = 0; }
use JSON::PP;
my $json = JSON::PP->new->allow_nonref->utf8;
-my $str = '\\u00c8';
+my $str = '\\u00b6';
-my $value = $json->decode( '"\\u00c8"' );
+my $value = $json->decode( '"\\u00b6"' );
#use Devel::Peek;
#Dump( $value );
-is( $value, chr 0xc8 );
+is( $value, chr 0xb6 );
ok( utf8::is_utf8( $value ) );
-eval { $json->decode( '"' . chr(0xc8) . '"' ) };
+eval { $json->decode( '"' . chr(0xb6) . '"' ) };
ok( $@ =~ /malformed UTF-8 character in JSON string/ );
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/118_boolean_values.t
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/JSON-PP/t/118_boolean_values.t,v
diff -u -p -a -u -p -r1.1.1.2 118_boolean_values.t
--- gnu/usr.bin/perl/cpan/JSON-PP/t/118_boolean_values.t 15 Feb 2023 01:32:42 -0000 1.1.1.2
+++ gnu/usr.bin/perl/cpan/JSON-PP/t/118_boolean_values.t 21 Feb 2024 15:47:01 -0000
@@ -4,8 +4,6 @@ use Test::More;
BEGIN { $ENV{PERL_JSON_BACKEND} = 0; }
use JSON::PP;
-BEGIN { plan skip_all => "requires Perl 5.008 or later" if $] < 5.008 }
-
#SKIP_ALL_UNLESS_XS4_COMPAT
package #
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/119_incr_parse_utf8.t
===================================================================
RCS file: gnu/usr.bin/perl/cpan/JSON-PP/t/119_incr_parse_utf8.t
diff -N gnu/usr.bin/perl/cpan/JSON-PP/t/119_incr_parse_utf8.t
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gnu/usr.bin/perl/cpan/JSON-PP/t/119_incr_parse_utf8.t 21 Feb 2024 15:47:01 -0000
@@ -0,0 +1,75 @@
+use strict;
+use warnings;
+use Test::More tests => 24;
+
+use utf8;
+use JSON::PP;
+use Encode;
+use charnames qw< :full >;
+
+use vars qw< @vs >;
+
+############################################################
+### These first tests mimic the ones in `t/001_utf8.t` ###
+############################################################
+
+scalar eval { JSON::PP->new->allow_nonref (1)->utf8 (1)->incr_parse ('"ü"') };
+like $@, qr/malformed UTF-8/;
+
+ok (JSON::PP->new->allow_nonref (1)->incr_parse ('"ü"') eq "ü");
+ok (JSON::PP->new->allow_nonref (1)->incr_parse ('"\u00fc"') eq "ü");
+ok (JSON::PP->new->allow_nonref (1)->incr_parse ('"\ud801\udc02' . "\x{10204}\"") eq "\x{10402}\x{10204}");
+ok (JSON::PP->new->allow_nonref (1)->incr_parse ('"\"\n\\\\\r\t\f\b"') eq "\"\012\\\015\011\014\010");
+
+
+my $JSON_TXT = <<JSON_TXT;
+{ "a": "1" }
+{ "b": "\N{BULLET}" }
+{ "c": "3" }
+JSON_TXT
+
+#######################
+### With '->utf8' ###
+#######################
+
+@vs = eval { JSON::PP->new->utf8->incr_parse( $JSON_TXT ) };
+like $@, qr/Wide character in subroutine entry/;
+
+
+@vs = eval { JSON::PP->new->utf8->incr_parse( encode 'UTF-8' => $JSON_TXT ) };
+
+ok( !$@ );
+ok( scalar @vs == 3 );
+
+is_deeply( \@vs, [ { a => "1" }, { b => "\N{BULLET}" }, { c => "3" } ] );
+is_deeply( $vs[0], { a => "1" } );
+is_deeply( $vs[1], { b => "\N{BULLET}" } );
+is_deeply( $vs[2], { c => "3" } );
+
+
+# Double-Encoded => "You Get What You Ask For"
+
+@vs = eval { JSON::PP->new->utf8->incr_parse( encode 'UTF-8' => ( encode 'UTF-8' => $JSON_TXT ) ) };
+
+ok( !$@ );
+ok( scalar @vs == 3 );
+
+is_deeply( \@vs, [ { a => "1" }, { b => "\x{E2}\x{80}\x{A2}" }, { c => "3" } ] );
+is_deeply( $vs[0], { a => "1" } );
+is_deeply( $vs[1], { b => "\x{E2}\x{80}\x{A2}" } );
+is_deeply( $vs[2], { c => "3" } );
+
+
+##########################
+### Without '->utf8' ###
+##########################
+
+@vs = eval { JSON::PP->new->incr_parse( $JSON_TXT ) };
+
+ok( !$@ );
+ok( scalar @vs == 3 );
+
+is_deeply( \@vs, [ { a => "1" }, { b => "\N{BULLET}" }, { c => "3" } ] );
+is_deeply( $vs[0], { a => "1" } );
+is_deeply( $vs[1], { b => "\N{BULLET}" } );
+is_deeply( $vs[2], { c => "3" } );
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/120_incr_parse_truncated.t
===================================================================
RCS file: gnu/usr.bin/perl/cpan/JSON-PP/t/120_incr_parse_truncated.t
diff -N gnu/usr.bin/perl/cpan/JSON-PP/t/120_incr_parse_truncated.t
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gnu/usr.bin/perl/cpan/JSON-PP/t/120_incr_parse_truncated.t 21 Feb 2024 15:47:01 -0000
@@ -0,0 +1,218 @@
+use strict;
+use warnings;
+use Test::More;
+use JSON::PP;
+
+plan tests => 19 * 3 + 1 * 6;
+
+sub run_test {
+ my ($input, $sub) = @_;
+ $sub->($input);
+}
+
+run_test('{"one": 1}', sub {
+ my $input = shift;
+ my $coder = JSON::PP->new;
+ my $res = eval { $coder->incr_parse($input) };
+ my $e = $@; # test more clobbers $@, we need it twice
+ ok ($res, "curly braces okay -- '$input'");
+ ok (!$e, "no error -- '$input'");
+ unlike ($e, qr/, or \} expected while parsing object\/hash/, "No '} expected' json string error");
+});
+
+run_test('{"one": 1]', sub {
+ my $input = shift;
+ my $coder = JSON::PP->new;
+ my $res = eval { $coder->incr_parse($input) };
+ my $e = $@; # test more clobbers $@, we need it twice
+ ok (!$res, "unbalanced curly braces -- '$input'");
+ ok ($e, "got error -- '$input'");
+ like ($e, qr/, or \} expected while parsing object\/hash/, "'} expected' json string error");
+});
+
+run_test('"', sub {
+ my $input = shift;
+ my $coder = JSON::PP->new;
+ my $res = eval { $coder->incr_parse($input) };
+ my $e = $@; # test more clobbers $@, we need it twice
+ ok (!$res, "truncated input='$input'");
+ ok (!$e, "no error for input='$input'");
+ unlike ($e, qr/, or \} expected while parsing object\/hash/, "No '} expected' json string error for input='$input'");
+});
+
+run_test('{', sub {
+ my $input = shift;
+ my $coder = JSON::PP->new;
+ my $res = eval { $coder->incr_parse($input) };
+ my $e = $@; # test more clobbers $@, we need it twice
+ ok (!$res, "truncated input='$input'");
+ ok (!$e, "no error for input='$input'");
+ unlike ($e, qr/, or \} expected while parsing object\/hash/, "No '} expected' json string error for input='$input'");
+});
+
+run_test('[', sub {
+ my $input = shift;
+ my $coder = JSON::PP->new;
+ my $res = eval { $coder->incr_parse($input) };
+ my $e = $@; # test more clobbers $@, we need it twice
+ ok (!$res, "truncated input='$input'");
+ ok (!$e, "no error for input='$input'");
+ unlike ($e, qr/, or \} expected while parsing object\/hash/, "No '} expected' json string error for input='$input'");
+});
+
+run_test('}', sub {
+ my $input = shift;
+ my $coder = JSON::PP->new;
+ my $res = eval { $coder->incr_parse($input) };
+ my $e = $@; # test more clobbers $@, we need it twice
+ ok (!$res, "truncated input='$input'");
+ ok ($e, "no error for input='$input'");
+ like ($e, qr/malformed JSON string/, "'malformed JSON string' json string error for input='$input'");
+});
+
+run_test(']', sub {
+ my $input = shift;
+ my $coder = JSON::PP->new;
+ my $res = eval { $coder->incr_parse($input) };
+ my $e = $@; # test more clobbers $@, we need it twice
+ ok (!$res, "truncated input='$input'");
+ ok ($e, "no error for input='$input'");
+ like ($e, qr/malformed JSON string/, "'malformed JSON string' json string error for input='$input'");
+});
+
+run_test('1', sub {
+ my $input = shift;
+ my $coder = JSON::PP->new;
+ my $res = eval { $coder->incr_parse($input) };
+ my $e = $@; # test more clobbers $@, we need it twice
+ ok ($res, "truncated input='$input'");
+ ok (!$e, "no error for input='$input'");
+ unlike ($e, qr/malformed JSON string/, "'malformed JSON string' json string error for input='$input'");
+});
+
+run_test('1', sub {
+ my $input = shift;
+ my $coder = JSON::PP->new->allow_nonref(0);
+ my $res = eval { $coder->incr_parse($input) };
+ my $e = $@; # test more clobbers $@, we need it twice
+ ok (!$res, "truncated input='$input'");
+ ok ($e, "no error for input='$input'");
+ like ($e, qr/JSON text must be an object or array/, "'JSON text must be an object or array' json string error for input='$input'");
+});
+
+run_test('"1', sub {
+ my $input = shift;
+ my $coder = JSON::PP->new;
+ my $res = eval { $coder->incr_parse($input) };
+ my $e = $@; # test more clobbers $@, we need it twice
+ ok (!$res, "truncated input='$input'");
+ ok (!$e, "no error for input='$input'");
+ unlike ($e, qr/malformed JSON string/, "'malformed JSON string' json string error for input='$input'");
+});
+
+run_test('\\', sub {
+ my $input = shift;
+ my $coder = JSON::PP->new;
+ my $res = eval { $coder->incr_parse($input) };
+ my $e = $@; # test more clobbers $@, we need it twice
+ ok (!$res, "truncated input='$input'");
+ ok ($e, "no error for input='$input'");
+ like ($e, qr/malformed JSON string/, "'malformed JSON string' json string error for input='$input'");
+});
+
+run_test('{"one": "', sub {
+ my $input = shift;
+ my $coder = JSON::PP->new;
+ my $res = eval { $coder->incr_parse($input) };
+ my $e = $@; # test more clobbers $@, we need it twice
+ ok (!$res, "truncated input='$input'");
+ ok (!$e, "no error for input='$input'");
+ unlike ($e, qr/, or \} expected while parsing object\/hash/, "No '} expected' json string error for input='$input'");
+});
+
+run_test('{"one": {', sub {
+ my $input = shift;
+ my $coder = JSON::PP->new;
+ my $res = eval { $coder->incr_parse($input) };
+ my $e = $@; # test more clobbers $@, we need it twice
+ ok (!$res, "truncated input='$input'");
+ ok (!$e, "no error for input='$input'");
+ unlike ($e, qr/, or \} expected while parsing object\/hash/, "No '} expected' json string error for input='$input'");
+});
+
+run_test('{"one": [', sub {
+ my $input = shift;
+ my $coder = JSON::PP->new;
+ my $res = eval { $coder->incr_parse($input) };
+ my $e = $@; # test more clobbers $@, we need it twice
+ ok (!$res, "truncated input='$input'");
+ ok (!$e, "no error for input='$input'");
+ unlike ($e, qr/, or \} expected while parsing object\/hash/, "No '} expected' json string error for input='$input'");
+});
+
+run_test('{"one": t', sub {
+ my $input = shift;
+ my $coder = JSON::PP->new;
+ my $res = eval { $coder->incr_parse($input) };
+ my $e = $@; # test more clobbers $@, we need it twice
+ ok (!$res, "truncated input='$input'");
+ ok (!$e, "no error for input='$input'");
+ unlike ($e, qr/, or \} expected while parsing object\/hash/, "No '} expected' json string error for input='$input'");
+});
+
+run_test('{"one": \\', sub {
+ my $input = shift;
+ my $coder = JSON::PP->new;
+ my $res = eval { $coder->incr_parse($input) };
+ my $e = $@; # test more clobbers $@, we need it twice
+ ok (!$res, "truncated input='$input'");
+ ok (!$e, "no error for input='$input'");
+ unlike ($e, qr/, or \} expected while parsing object\/hash/, "No '} expected' json string error for input='$input'");
+});
+
+run_test('{"one": ', sub {
+ my $input = shift;
+ my $coder = JSON::PP->new;
+ my $res = eval { $coder->incr_parse($input) };
+ my $e = $@; # test more clobbers $@, we need it twice
+ ok (!$res, "truncated input='$input'");
+ ok (!$e, "no error for input='$input'");
+ unlike ($e, qr/, or \} expected while parsing object\/hash/, "No '} expected' json string error for input='$input'");
+});
+
+run_test('{"one": 1', sub {
+ my $input = shift;
+ my $coder = JSON::PP->new;
+ my $res = eval { $coder->incr_parse($input) };
+ my $e = $@; # test more clobbers $@, we need it twice
+ ok (!$res, "truncated input='$input'");
+ ok (!$e, "no error for input='$input'");
+ unlike ($e, qr/, or \} expected while parsing object\/hash/, "No '} expected' json string error for input='$input'");
+});
+
+run_test('{"one": {"two": 2', sub {
+ my $input = shift;
+ my $coder = JSON::PP->new;
+ my $res = eval { $coder->incr_parse($input) };
+ my $e = $@; # test more clobbers $@, we need it twice
+ ok (!$res, "truncated '$input'");
+ ok (!$e, "no error -- '$input'");
+ unlike ($e, qr/, or \} expected while parsing object\/hash/, "No '} expected' json string error -- $input");
+});
+
+# Test Appending Closing '}' Curly Bracket
+run_test('{"one": 1', sub {
+ my $input = shift;
+ my $coder = JSON::PP->new;
+ my $res = eval { $coder->incr_parse($input) };
+ my $e = $@; # test more clobbers $@, we need it twice
+ ok (!$res, "truncated input='$input'");
+ ok (!$e, "no error for input='$input'");
+ unlike ($e, qr/, or \} expected while parsing object\/hash/, "No '} expected' json string error for input='$input'");
+
+ $res = eval { $coder->incr_parse('}') };
+ $e = $@; # test more clobbers $@, we need it twice
+ ok ($res, "truncated input='$input' . '}'");
+ ok (!$e, "no error for input='$input' . '}'");
+ unlike ($e, qr/, or \} expected while parsing object\/hash/, "No '} expected' json string error for input='$input' . '}'");
+});
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/core_bools.t
===================================================================
RCS file: gnu/usr.bin/perl/cpan/JSON-PP/t/core_bools.t
diff -N gnu/usr.bin/perl/cpan/JSON-PP/t/core_bools.t
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gnu/usr.bin/perl/cpan/JSON-PP/t/core_bools.t 21 Feb 2024 15:47:01 -0000
@@ -0,0 +1,85 @@
+use strict;
+use warnings;
+use JSON::PP;
+use Test::More;
+BEGIN {
+ # this is only for JSON.pm
+ plan skip_all => 'no support for core boolean options'
+ unless JSON::PP->can('CORE_BOOL');
+}
+
+plan tests => 24;
+
+my $json = JSON::PP->new;
+
+is $json->get_core_bools, !!0, 'core_bools initially false';
+
+$json->boolean_values(!!0, !!1);
+SKIP: {
+ skip "core_bools option doesn't register as true for core bools without core boolean support", 1
+ unless JSON::PP::CORE_BOOL;
+
+ is $json->get_core_bools, !!1, 'core_bools true when setting bools to core bools';
+}
+
+$json->boolean_values(!!1, !!0);
+is $json->get_core_bools, !!0, 'core_bools false when setting bools to anything other than correct core bools';
+
+my $ret = $json->core_bools;
+is $ret, $json,
+ "returns the same object";
+
+my ($new_false, $new_true) = $json->get_boolean_values;
+
+# ensure this registers as true on older perls where the boolean values
+# themselves can't be tracked.
+is $json->get_core_bools, !!1, 'core_bools true when setting core_bools';
+
+ok defined $new_true, "core true value is defined";
+ok defined $new_false, "core false value is defined";
+
+ok !ref $new_true, "core true value is not blessed";
+ok !ref $new_false, "core falase value is not blessed";
+
+{
+ my @warnings;
+ local $SIG{__WARN__} = sub {
+ push @warnings, @_;
+ warn @_;
+ };
+
+ cmp_ok $new_true, 'eq', '1', 'core true value is "1"';
+ cmp_ok $new_true, '==', 1, 'core true value is 1';
+
+ cmp_ok $new_false, 'eq', '', 'core false value is ""';
+ cmp_ok $new_false, '==', 0, 'core false value is 0';
+
+ is scalar @warnings, 0, 'no warnings';
+}
+
+SKIP: {
+ skip "core boolean support needed to detect core booleans", 4
+ unless JSON::PP::CORE_BOOL;
+ BEGIN { JSON::PP::CORE_BOOL and warnings->unimport(qw(experimental::builtin)) }
+ ok JSON::PP::is_bool($new_true), 'core true is a boolean';
+ ok JSON::PP::is_bool($new_false), 'core false is a boolean';
+
+ ok builtin::is_bool($new_true), 'core true is a core boolean';
+ ok builtin::is_bool($new_false), 'core false is a core boolean';
+}
+
+my $should_true = $json->allow_nonref(1)->decode('true');
+my $should_false = $json->allow_nonref(1)->decode('false');
+
+ok !ref $should_true && $should_true, "JSON true turns into an unblessed true value";
+ok !ref $should_false && !$should_false, "JSON false turns into an unblessed false value";
+
+SKIP: {
+ skip "core boolean support needed to detect core booleans", 4
+ unless JSON::PP::CORE_BOOL;
+ ok JSON::PP::is_bool($should_true), 'decoded true is a boolean';
+ ok JSON::PP::is_bool($should_false), 'decoded false is a boolean';
+
+ ok JSON::PP::is_bool($should_true), 'decoded true is a core boolean';
+ ok JSON::PP::is_bool($should_false), 'decoded false is a core boolean';
+}
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/gh_28_json_test_suite.t
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/JSON-PP/t/gh_28_json_test_suite.t,v
diff -u -p -a -u -p -r1.1.1.2 gh_28_json_test_suite.t
--- gnu/usr.bin/perl/cpan/JSON-PP/t/gh_28_json_test_suite.t 15 Feb 2023 01:32:42 -0000 1.1.1.2
+++ gnu/usr.bin/perl/cpan/JSON-PP/t/gh_28_json_test_suite.t 21 Feb 2024 15:47:01 -0000
@@ -5,8 +5,6 @@ use strict;
use warnings;
use Test::More;
-BEGIN { plan skip_all => 'this test is for Perl 5.8 or later' if $] < 5.008; }
-
BEGIN { plan tests => 20 };
BEGIN { $ENV{PERL_JSON_BACKEND} = 0; }
Index: gnu/usr.bin/perl/cpan/JSON-PP/t/rt_122270_old_xs_boolean.t
===================================================================
RCS file: gnu/usr.bin/perl/cpan/JSON-PP/t/rt_122270_old_xs_boolean.t
diff -N gnu/usr.bin/perl/cpan/JSON-PP/t/rt_122270_old_xs_boolean.t
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gnu/usr.bin/perl/cpan/JSON-PP/t/rt_122270_old_xs_boolean.t 21 Feb 2024 15:47:01 -0000
@@ -0,0 +1,33 @@
+# copied over from JSON::XS and modified to use JSON::PP
+
+use strict;
+use warnings;
+use Test::More;
+BEGIN { plan tests => 10 };
+
+BEGIN { $ENV{PERL_JSON_BACKEND} = 0; }
+
+use utf8;
+use JSON::PP;
+
+SKIP: {
+ skip "no JSON::XS < 3", 5 unless eval { require JSON::XS; JSON::XS->VERSION < 3 };
+
+ my $false = JSON::XS::false();
+ ok (JSON::PP::is_bool $false);
+ ok (++$false == 1);
+ ok (!JSON::PP::is_bool $false);
+ ok (!JSON::PP::is_bool "JSON::PP::Boolean");
+ ok (!JSON::PP::is_bool {}); # GH-34
+}
+
+SKIP: {
+ skip "no Types::Serialiser 0.01", 5 unless eval { require JSON::XS; JSON::XS->VERSION(3.00); require Types::Serialiser; Types::Serialiser->VERSION == 0.01 };
+
+ my $false = JSON::XS::false();
+ ok (JSON::PP::is_bool $false);
+ ok (++$false == 1);
+ ok (!JSON::PP::is_bool $false);
+ ok (!JSON::PP::is_bool "JSON::PP::Boolean");
+ ok (!JSON::PP::is_bool {}); # GH-34
+}
Index: gnu/usr.bin/perl/cpan/MIME-Base64/Base64.xs
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/MIME-Base64/Base64.xs,v
diff -u -p -a -u -p -r1.5 Base64.xs
--- gnu/usr.bin/perl/cpan/MIME-Base64/Base64.xs 15 Feb 2023 01:36:19 -0000 1.5
+++ gnu/usr.bin/perl/cpan/MIME-Base64/Base64.xs 21 Feb 2024 15:47:01 -0000
@@ -67,7 +67,7 @@ static const unsigned char index_64[256]
((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK) \
? ((lp = SvCUR(sv)), SvPVX(sv)) : my_sv_2pvbyte(aTHX_ sv, &lp))
static char *
- my_sv_2pvbyte(pTHX_ register SV *sv, STRLEN *lp)
+ my_sv_2pvbyte(pTHX_ SV *sv, STRLEN *lp)
{
sv_utf8_downgrade(sv,0);
return SvPV(sv,*lp);
@@ -180,7 +180,7 @@ decode_base64(sv)
PREINIT:
STRLEN len;
- register unsigned char *str = (unsigned char*)SvPV(sv, len);
+ unsigned char *str = (unsigned char*)SvPV(sv, len);
unsigned char const* end = str + len;
char *r;
unsigned char c[4];
@@ -276,7 +276,7 @@ decoded_base64_length(sv)
PREINIT:
STRLEN len;
- register unsigned char *str = (unsigned char*)SvPV(sv, len);
+ unsigned char *str = (unsigned char*)SvPV(sv, len);
unsigned char const* end = str + len;
int i = 0;
Index: gnu/usr.bin/perl/cpan/MIME-Base64/lib/MIME/Base64.pm
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/MIME-Base64/lib/MIME/Base64.pm,v
diff -u -p -a -u -p -r1.1.1.1 Base64.pm
--- gnu/usr.bin/perl/cpan/MIME-Base64/lib/MIME/Base64.pm 15 Feb 2023 01:32:32 -0000 1.1.1.1
+++ gnu/usr.bin/perl/cpan/MIME-Base64/lib/MIME/Base64.pm 21 Feb 2024 15:47:01 -0000
@@ -8,7 +8,7 @@ our @ISA = qw(Exporter);
our @EXPORT = qw(encode_base64 decode_base64);
our @EXPORT_OK = qw(encode_base64url decode_base64url encoded_base64_length decoded_base64_length);
-our $VERSION = '3.16';
+our $VERSION = '3.16_01';
require XSLoader;
XSLoader::load('MIME::Base64', $VERSION);
Index: gnu/usr.bin/perl/cpan/MIME-Base64/lib/MIME/QuotedPrint.pm
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/MIME-Base64/lib/MIME/QuotedPrint.pm,v
diff -u -p -a -u -p -r1.1.1.1 QuotedPrint.pm
--- gnu/usr.bin/perl/cpan/MIME-Base64/lib/MIME/QuotedPrint.pm 15 Feb 2023 01:32:32 -0000 1.1.1.1
+++ gnu/usr.bin/perl/cpan/MIME-Base64/lib/MIME/QuotedPrint.pm 21 Feb 2024 15:47:01 -0000
@@ -7,7 +7,7 @@ require Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw(encode_qp decode_qp);
-our $VERSION = '3.16';
+our $VERSION = '3.16_01';
use MIME::Base64; # will load XS version of {en,de}code_qp()
Index: gnu/usr.bin/perl/cpan/Math-BigInt/lib/Math/BigFloat.pm
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Math-BigInt/lib/Math/BigFloat.pm,v
diff -u -p -a -u -p -r1.7 BigFloat.pm
--- gnu/usr.bin/perl/cpan/Math-BigInt/lib/Math/BigFloat.pm 15 Feb 2023 01:36:19 -0000 1.7
+++ gnu/usr.bin/perl/cpan/Math-BigInt/lib/Math/BigFloat.pm 21 Feb 2024 15:47:01 -0000
@@ -20,7 +20,7 @@ use Carp qw< carp croak >;
use Scalar::Util qw< blessed >;
use Math::BigInt qw< >;
-our $VERSION = '1.999830';
+our $VERSION = '1.999837';
$VERSION =~ tr/_//d;
require Exporter;
@@ -261,8 +261,7 @@ BEGIN {
$rnd_mode = 'even';
tie $rnd_mode, 'Math::BigFloat';
- # we need both of them in this package:
- *as_int = \&as_number;
+ *as_number = \&as_int;
}
sub DESTROY {
@@ -272,7 +271,6 @@ sub DESTROY {
sub AUTOLOAD {
# make fxxx and bxxx both work by selectively mapping fxxx() to MBF::bxxx()
my $name = $AUTOLOAD;
-
$name =~ s/(.*):://; # split package
my $c = $1 || __PACKAGE__;
no strict 'refs';
@@ -286,7 +284,8 @@ sub AUTOLOAD {
# delayed load of Carp and avoid recursion
croak("Can't call $c\-\>$name, not a valid method");
}
- # try one level up, but subst. bxxx() for fxxx() since MBI only got bxxx()
+ # try one level up, but subst. bxxx() for fxxx() since MBI only got
+ # bxxx()
$name =~ s/^f/b/;
return &{"Math::BigInt"."::$name"}(@_);
}
@@ -353,7 +352,8 @@ sub config {
###############################################################################
sub new {
- # Create a new Math::BigFloat object from a string or another bigfloat object.
+ # Create a new Math::BigFloat object from a string or another bigfloat
+ # object.
# _e: exponent
# _m: mantissa
# sign => ("+", "-", "+inf", "-inf", or "NaN")
@@ -394,16 +394,19 @@ sub new {
$self = bless {}, $class unless $selfref;
- # The first following ought to work. However, it causes a 'Deep recursion on
- # subroutine "Math::BigFloat::as_number"' in some tests. Fixme!
+ # Math::BigFloat or subclass
+
+ if (defined(blessed($wanted)) && $wanted -> isa($class)) {
+
+ # Don't copy the accuracy and precision, because a new object should get
+ # them from the global configuration.
- if (defined(blessed($wanted)) && $wanted -> isa('Math::BigFloat')) {
- #if (defined(blessed($wanted)) && UNIVERSAL::isa($wanted, 'Math::BigFloat')) {
$self -> {sign} = $wanted -> {sign};
$self -> {_m} = $LIB -> _copy($wanted -> {_m});
$self -> {_es} = $wanted -> {_es};
$self -> {_e} = $LIB -> _copy($wanted -> {_e});
- $self->round(@r) unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
+ $self = $self->round(@r)
+ unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
return $self;
}
@@ -427,43 +430,54 @@ sub new {
}
}
- # Handle Infs.
+ # Shortcut for simple forms like '123' that have no trailing zeros. Trailing
+ # zeros would require a non-zero exponent.
- if ($wanted =~ /^\s*([+-]?)inf(inity)?\s*\z/i) {
- return $downgrade->new($wanted) if defined $downgrade;
- my $sgn = $1 || '+';
- $self = $class -> binf($sgn);
- $self->round(@r) unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
+ if ($wanted =~
+ / ^
+ \s* # optional leading whitespace
+ ( [+-]? ) # optional sign
+ 0* # optional leading zeros
+ ( [1-9] (?: [0-9]* [1-9] )? ) # significand
+ \s* # optional trailing whitespace
+ $
+ /x)
+ {
+ return $downgrade -> new($1 . $2) if defined $downgrade;
+ $self->{sign} = $1 || '+';
+ $self->{_m} = $LIB -> _new($2);
+ $self->{_es} = '+';
+ $self->{_e} = $LIB -> _zero();
+ $self = $self->round(@r)
+ unless @r >= 2 && !defined $r[0] && !defined $r[1];
return $self;
}
- # Handle explicit NaNs (not the ones returned due to invalid input).
+ # Handle Infs.
- if ($wanted =~ /^\s*([+-]?)nan\s*\z/i) {
- return $downgrade->new($wanted) if defined $downgrade;
- $self = $class -> bnan();
- $self->round(@r) unless @r >= 2 && !defined $r[0] && !defined $r[1];
- return $self;
+ if ($wanted =~ / ^
+ \s*
+ ( [+-]? )
+ inf (?: inity )?
+ \s*
+ \z
+ /ix)
+ {
+ my $sgn = $1 || '+';
+ return $class -> binf($sgn, @r);
}
- # Shortcut for simple forms like '123' that have no trailing zeros.
+ # Handle explicit NaNs (not the ones returned due to invalid input).
if ($wanted =~ / ^
- \s* # optional leading whitespace
- ( [+-]? ) # optional sign
- 0* # optional leading zeros
- ( [1-9] (?: [0-9]* [1-9] )? ) # significand
- \s* # optional trailing whitespace
- $
- /x)
+ \s*
+ ( [+-]? )
+ nan
+ \s*
+ \z
+ /ix)
{
- return $downgrade->new($1 . $2) if defined $downgrade;
- $self->{sign} = $1 || '+';
- $self->{_m} = $LIB -> _new($2);
- $self->{_es} = '+';
- $self->{_e} = $LIB -> _zero();
- $self->round(@r) unless @r >= 2 && !defined $r[0] && !defined $r[1];
- return $self;
+ return $class -> bnan(@r);
}
my @parts;
@@ -473,7 +487,7 @@ sub new {
# have a "0x", "0X", "x", or "X" prefix, cf. CORE::oct().
$wanted =~ /^\s*[+-]?0?[Xx]/ and
- @parts = $class -> _hex_str_to_lib_parts($wanted)
+ @parts = $class -> _hex_str_to_flt_lib_parts($wanted)
or
@@ -481,7 +495,7 @@ sub new {
# "0o", "0O", "o", "O" prefix, cf. CORE::oct().
$wanted =~ /^\s*[+-]?0?[Oo]/ and
- @parts = $class -> _oct_str_to_lib_parts($wanted)
+ @parts = $class -> _oct_str_to_flt_lib_parts($wanted)
or
@@ -489,7 +503,7 @@ sub new {
# "0b", "0B", "b", or "B" prefix, cf. CORE::oct().
$wanted =~ /^\s*[+-]?0?[Bb]/ and
- @parts = $class -> _bin_str_to_lib_parts($wanted)
+ @parts = $class -> _bin_str_to_flt_lib_parts($wanted)
or
@@ -497,34 +511,33 @@ sub new {
# above and octal floating point numbers that don't have any of the
# "0o", "0O", "o", or "O" prefixes. First see if it is a decimal number.
- @parts = $class -> _dec_str_to_lib_parts($wanted)
+ @parts = $class -> _dec_str_to_flt_lib_parts($wanted)
or
# See if it is an octal floating point number. The extra check is
- # included because _oct_str_to_lib_parts() accepts octal numbers that
- # don't have a prefix (this is needed to make it work with, e.g.,
+ # included because _oct_str_to_flt_lib_parts() accepts octal numbers
+ # that don't have a prefix (this is needed to make it work with, e.g.,
# from_oct() that don't require a prefix). However, Perl requires a
# prefix for octal floating point literals. For example, "1p+0" is not
# valid, but "01p+0" and "0__1p+0" are.
$wanted =~ /^\s*[+-]?0_*\d/ and
- @parts = $class -> _oct_str_to_lib_parts($wanted))
+ @parts = $class -> _oct_str_to_flt_lib_parts($wanted))
{
- # The value is an integer iff the exponent is non-negative.
+ ($self->{sign}, $self->{_m}, $self->{_es}, $self->{_e}) = @parts;
- if ($parts[2] eq '+' && $downgrade) {
- return $downgrade->new($wanted, @r);
- }
+ $self = $self->round(@r)
+ unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
- ($self->{sign}, $self->{_m}, $self->{_es}, $self->{_e}) = @parts;
- $self->round(@r) unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
+ return $downgrade -> new($self -> bdstr(), @r)
+ if defined($downgrade) && $self -> is_int();
return $self;
}
# If we get here, the value is neither a valid decimal, binary, octal, or
# hexadecimal number. It is not an explicit Inf or a NaN either.
- return $class -> bnan();
+ return $class -> bnan(@r);
}
sub from_dec {
@@ -534,25 +547,23 @@ sub from_dec {
# Don't modify constant (read-only) objects.
- return if $selfref && $self->modify('from_dec');
+ return $self if $selfref && $self->modify('from_dec');
my $str = shift;
my @r = @_;
# If called as a class method, initialize a new object.
- $self = $class -> bzero() unless $selfref;
-
- if (my @parts = $class -> _dec_str_to_lib_parts($str)) {
+ $self = bless {}, $class unless $selfref;
- # The value is an integer iff the exponent is non-negative.
+ if (my @parts = $class -> _dec_str_to_flt_lib_parts($str)) {
+ ($self->{sign}, $self->{_m}, $self->{_es}, $self->{_e}) = @parts;
- if ($parts[2] eq '+') {
- return $downgrade->new($str, @r) if defined $downgrade;
- }
+ $self = $self->round(@r)
+ unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
- ($self->{sign}, $self->{_m}, $self->{_es}, $self->{_e}) = @parts;
- $self->round(@r) unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
+ return $downgrade -> new($self -> bdstr(), @r)
+ if defined($downgrade) && $self -> is_int();
return $self;
}
@@ -566,25 +577,23 @@ sub from_hex {
# Don't modify constant (read-only) objects.
- return if $selfref && $self->modify('from_hex');
+ return $self if $selfref && $self->modify('from_hex');
my $str = shift;
my @r = @_;
# If called as a class method, initialize a new object.
- $self = $class -> bzero() unless $selfref;
-
- if (my @parts = $class -> _hex_str_to_lib_parts($str)) {
+ $self = bless {}, $class unless $selfref;
- # The value is an integer iff the exponent is non-negative.
+ if (my @parts = $class -> _hex_str_to_flt_lib_parts($str)) {
+ ($self->{sign}, $self->{_m}, $self->{_es}, $self->{_e}) = @parts;
- if ($parts[2] eq '+' && defined $downgrade) {
- return $downgrade -> from_hex($str, @r);
- }
+ $self = $self->round(@r)
+ unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
- ($self->{sign}, $self->{_m}, $self->{_es}, $self->{_e}) = @parts;
- $self->round(@r) unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
+ return $downgrade -> new($self -> bdstr(), @r)
+ if defined($downgrade) && $self -> is_int();
return $self;
}
@@ -598,25 +607,23 @@ sub from_oct {
# Don't modify constant (read-only) objects.
- return if $selfref && $self->modify('from_oct');
+ return $self if $selfref && $self->modify('from_oct');
my $str = shift;
my @r = @_;
# If called as a class method, initialize a new object.
- $self = $class -> bzero() unless $selfref;
-
- if (my @parts = $class -> _oct_str_to_lib_parts($str)) {
+ $self = bless {}, $class unless $selfref;
- # The value is an integer iff the exponent is non-negative.
+ if (my @parts = $class -> _oct_str_to_flt_lib_parts($str)) {
+ ($self->{sign}, $self->{_m}, $self->{_es}, $self->{_e}) = @parts;
- if ($parts[2] eq '+') {
- return $downgrade -> from_oct($str, @r) if defined $downgrade;
- }
+ $self = $self->round(@r)
+ unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
- ($self->{sign}, $self->{_m}, $self->{_es}, $self->{_e}) = @parts;
- $self->round(@r) unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
+ return $downgrade -> new($self -> bdstr(), @r)
+ if defined($downgrade) && $self -> is_int();
return $self;
}
@@ -630,25 +637,23 @@ sub from_bin {
# Don't modify constant (read-only) objects.
- return if $selfref && $self->modify('from_bin');
+ return $self if $selfref && $self->modify('from_bin');
my $str = shift;
my @r = @_;
# If called as a class method, initialize a new object.
- $self = $class -> bzero() unless $selfref;
-
- if (my @parts = $class -> _bin_str_to_lib_parts($str)) {
+ $self = bless {}, $class unless $selfref;
- # The value is an integer iff the exponent is non-negative.
+ if (my @parts = $class -> _bin_str_to_flt_lib_parts($str)) {
+ ($self->{sign}, $self->{_m}, $self->{_es}, $self->{_e}) = @parts;
- if ($parts[2] eq '+') {
- return $downgrade -> from_bin($str, @r) if defined $downgrade;
- }
+ $self = $self->round(@r)
+ unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
- ($self->{sign}, $self->{_m}, $self->{_es}, $self->{_e}) = @parts;
- $self->round(@r) unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
+ return $downgrade -> new($self -> bdstr(), @r)
+ if defined($downgrade) && $self -> is_int();
return $self;
}
@@ -662,14 +667,14 @@ sub from_ieee754 {
# Don't modify constant (read-only) objects.
- return if $selfref && $self->modify('from_ieee754');
+ return $self if $selfref && $self->modify('from_ieee754');
my $in = shift; # input string (or raw bytes)
my $format = shift; # format ("binary32", "decimal64" etc.)
my $enc; # significand encoding (applies only to decimal)
my $k; # storage width in bits
my $b; # base
- my @r = @_;
+ my @r = @_; # rounding parameters, if any
if ($format =~ /^binary(\d+)\z/) {
$k = $1;
@@ -730,7 +735,7 @@ sub from_ieee754 {
# The maximum exponent, minimum exponent, and exponent bias.
- my $emax = Math::BigInt -> new(2) -> bpow($w - 1) -> bdec();
+ my $emax = Math::BigFloat -> new(2) -> bpow($w - 1) -> bdec();
my $emin = 1 - $emax;
my $bias = $emax;
@@ -767,7 +772,7 @@ sub from_ieee754 {
my $x;
- $expo -> bsub($bias); # subtract bias
+ $expo = $expo -> bsub($bias); # subtract bias
if ($expo < $emin) { # zero and subnormals
if ($mant == 0) { # zero
@@ -775,8 +780,8 @@ sub from_ieee754 {
} else { # subnormals
# compute (1/$b)**(N) rather than ($b)**(-N)
$x = $class -> new("0.5"); # 1/$b
- $x -> bpow($bias + $t - 1) -> bmul($mant);
- $x -> bneg() if $sign eq '-';
+ $x = $x -> bpow($bias + $t - 1) -> bmul($mant);
+ $x = $x -> bneg() if $sign eq '-';
}
}
@@ -784,7 +789,7 @@ sub from_ieee754 {
if ($mant == 0) { # inf
$x = $class -> binf($sign);
} else { # nan
- $x = $class -> bnan();
+ $x = $class -> bnan(@r);
}
}
@@ -793,12 +798,12 @@ sub from_ieee754 {
if ($expo < $t) {
# compute (1/$b)**(N) rather than ($b)**(-N)
$x = $class -> new("0.5"); # 1/$b
- $x -> bpow($t - $expo) -> bmul($mant);
+ $x = $x -> bpow($t - $expo) -> bmul($mant);
} else {
$x = $class -> new(2);
- $x -> bpow($expo - $t) -> bmul($mant);
+ $x = $x -> bpow($expo - $t) -> bmul($mant);
}
- $x -> bneg() if $sign eq '-';
+ $x = $x -> bneg() if $sign eq '-';
}
if ($selfref) {
@@ -810,8 +815,8 @@ sub from_ieee754 {
$self = $x;
}
- return $downgrade -> new($x, @r)
- if defined($downgrade) && $x -> is_int();
+ return $downgrade -> new($self -> bdstr(), @r)
+ if defined($downgrade) && $self -> is_int();
return $self -> round(@r);
}
@@ -821,9 +826,12 @@ sub from_ieee754 {
sub bzero {
# create/assign '+0'
- if (@_ == 0) {
- #carp("Using bone() as a function is deprecated;",
- # " use bone() as a method instead");
+ # Class::method(...) -> Class->method(...)
+ unless (@_ && (defined(blessed($_[0])) && $_[0] -> isa(__PACKAGE__) ||
+ $_[0] =~ /^[a-z]\w*(?:::[a-z]\w*)*$/i))
+ {
+ #carp "Using ", (caller(0))[3], "() as a function is deprecated;",
+ # " use is as a method instead";
unshift @_, __PACKAGE__;
}
@@ -832,9 +840,18 @@ sub bzero {
my $class = $selfref || $self;
$self->import() if $IMPORT == 0; # make require work
- return if $selfref && $self->modify('bzero');
- return $downgrade->bzero() if defined $downgrade;
+ # Don't modify constant (read-only) objects.
+
+ return $self if $selfref && $self->modify('bzero');
+
+ # Get the rounding parameters, if any.
+
+ my @r = @_;
+
+ return $downgrade -> bzero(@r) if defined $downgrade;
+
+ # If called as a class method, initialize a new object.
$self = bless {}, $class unless $selfref;
@@ -847,11 +864,13 @@ sub bzero {
# parameters are given, and if called as a class method initialize the new
# instance with the class variables.
- if (@_) {
+ #return $self -> round(@r); # this should work, but doesnt; fixme!
+
+ if (@r) {
croak "can't specify both accuracy and precision"
- if @_ >= 2 && defined $_[0] && defined $_[1];
- $self->{_a} = $_[0];
- $self->{_p} = $_[1];
+ if @r >= 2 && defined($r[0]) && defined($r[1]);
+ $self->{_a} = $r[0];
+ $self->{_p} = $r[1];
} else {
unless($selfref) {
$self->{_a} = $class -> accuracy();
@@ -865,9 +884,12 @@ sub bzero {
sub bone {
# Create or assign '+1' (or -1 if given sign '-').
- if (@_ == 0 || (defined($_[0]) && ($_[0] eq '+' || $_[0] eq '-'))) {
- #carp("Using bone() as a function is deprecated;",
- # " use bone() as a method instead");
+ # Class::method(...) -> Class->method(...)
+ unless (@_ && (defined(blessed($_[0])) && $_[0] -> isa(__PACKAGE__) ||
+ $_[0] =~ /^[a-z]\w*(?:::[a-z]\w*)*$/i))
+ {
+ #carp "Using ", (caller(0))[3], "() as a function is deprecated;",
+ # " use is as a method instead";
unshift @_, __PACKAGE__;
}
@@ -876,12 +898,26 @@ sub bone {
my $class = $selfref || $self;
$self->import() if $IMPORT == 0; # make require work
- return if $selfref && $self->modify('bone');
- return $downgrade->bone() if defined $downgrade;
+ # Don't modify constant (read-only) objects.
+
+ return $self if $selfref && $self->modify('bone');
+
+ return $downgrade -> bone(@_) if defined $downgrade;
- my $sign = shift;
- $sign = defined $sign && $sign =~ /^\s*-/ ? "-" : "+";
+ # Get the sign.
+
+ my $sign = '+'; # default is to return +1
+ if (defined($_[0]) && $_[0] =~ /^\s*([+-])\s*$/) {
+ $sign = $1;
+ shift;
+ }
+
+ # Get the rounding parameters, if any.
+
+ my @r = @_;
+
+ # If called as a class method, initialize a new object.
$self = bless {}, $class unless $selfref;
@@ -894,9 +930,11 @@ sub bone {
# parameters are given, and if called as a class method initialize the new
# instance with the class variables.
- if (@_) {
+ #return $self -> round(@r); # this should work, but doesnt; fixme!
+
+ if (@r) {
croak "can't specify both accuracy and precision"
- if @_ >= 2 && defined $_[0] && defined $_[1];
+ if @r >= 2 && defined($r[0]) && defined($r[1]);
$self->{_a} = $_[0];
$self->{_p} = $_[1];
} else {
@@ -912,16 +950,15 @@ sub bone {
sub binf {
# create/assign a '+inf' or '-inf'
- if (@_ == 0 || (defined($_[0]) && !ref($_[0]) &&
- $_[0] =~ /^\s*[+-](inf(inity)?)?\s*$/))
+ # Class::method(...) -> Class->method(...)
+ unless (@_ && (defined(blessed($_[0])) && $_[0] -> isa(__PACKAGE__) ||
+ $_[0] =~ /^[a-z]\w*(?:::[a-z]\w*)*$/i))
{
- #carp("Using binf() as a function is deprecated;",
- # " use binf() as a method instead");
+ #carp "Using ", (caller(0))[3], "() as a function is deprecated;",
+ # " use is as a method instead";
unshift @_, __PACKAGE__;
}
- return $downgrade->binf(@_) if defined $downgrade;
-
my $self = shift;
my $selfref = ref $self;
my $class = $selfref || $self;
@@ -934,10 +971,26 @@ sub binf {
}
$self->import() if $IMPORT == 0; # make require work
- return if $selfref && $self->modify('binf');
- my $sign = shift;
- $sign = defined $sign && $sign =~ /^\s*-/ ? "-" : "+";
+ # Don't modify constant (read-only) objects.
+
+ return $self if $selfref && $self->modify('binf');
+
+ return $downgrade -> binf(@_) if $downgrade;
+
+ # Get the sign.
+
+ my $sign = '+'; # default is to return positive infinity
+ if (defined($_[0]) && $_[0] =~ /^\s*([+-])(inf|$)/i) {
+ $sign = $1;
+ shift;
+ }
+
+ # Get the rounding parameters, if any.
+
+ my @r = @_;
+
+ # If called as a class method, initialize a new object.
$self = bless {}, $class unless $selfref;
@@ -950,11 +1003,13 @@ sub binf {
# parameters are given, and if called as a class method initialize the new
# instance with the class variables.
- if (@_) {
+ #return $self -> round(@r); # this should work, but doesnt; fixme!
+
+ if (@r) {
croak "can't specify both accuracy and precision"
- if @_ >= 2 && defined $_[0] && defined $_[1];
- $self->{_a} = $_[0];
- $self->{_p} = $_[1];
+ if @r >= 2 && defined($r[0]) && defined($r[1]);
+ $self->{_a} = $r[0];
+ $self->{_p} = $r[1];
} else {
unless($selfref) {
$self->{_a} = $class -> accuracy();
@@ -968,14 +1023,15 @@ sub binf {
sub bnan {
# create/assign a 'NaN'
- if (@_ == 0) {
- #carp("Using bnan() as a function is deprecated;",
- # " use bnan() as a method instead");
+ # Class::method(...) -> Class->method(...)
+ unless (@_ && (defined(blessed($_[0])) && $_[0] -> isa(__PACKAGE__) ||
+ $_[0] =~ /^[a-z]\w*(?:::[a-z]\w*)*$/i))
+ {
+ #carp "Using ", (caller(0))[3], "() as a function is deprecated;",
+ # " use is as a method instead";
unshift @_, __PACKAGE__;
}
- return $downgrade->bnan(@_) if defined $downgrade;
-
my $self = shift;
my $selfref = ref $self;
my $class = $selfref || $self;
@@ -988,7 +1044,18 @@ sub bnan {
}
$self->import() if $IMPORT == 0; # make require work
- return if $selfref && $self->modify('bnan');
+
+ # Don't modify constant (read-only) objects.
+
+ return $self if $selfref && $self->modify('bnan');
+
+ return $downgrade -> bnan(@_) if defined $downgrade;
+
+ # Get the rounding parameters, if any.
+
+ my @r = @_;
+
+ # If called as a class method, initialize a new object.
$self = bless {}, $class unless $selfref;
@@ -1001,11 +1068,13 @@ sub bnan {
# parameters are given, and if called as a class method initialize the new
# instance with the class variables.
- if (@_) {
+ #return $self -> round(@r); # this should work, but doesnt; fixme!
+
+ if (@r) {
croak "can't specify both accuracy and precision"
- if @_ >= 2 && defined $_[0] && defined $_[1];
- $self->{_a} = $_[0];
- $self->{_p} = $_[1];
+ if @r >= 2 && defined($r[0]) && defined($r[1]);
+ $self->{_a} = $r[0];
+ $self->{_p} = $r[1];
} else {
unless($selfref) {
$self->{_a} = $class -> accuracy();
@@ -1018,6 +1087,15 @@ sub bnan {
sub bpi {
+ # Class::method(...) -> Class->method(...)
+ unless (@_ && (defined(blessed($_[0])) && $_[0] -> isa(__PACKAGE__) ||
+ $_[0] =~ /^[a-z]\w*(?:::[a-z]\w*)*$/i))
+ {
+ #carp "Using ", (caller(0))[3], "() as a function is deprecated;",
+ # " use is as a method instead";
+ unshift @_, __PACKAGE__;
+ }
+
# Called as Argument list
# --------- -------------
# Math::BigFloat->bpi() ("Math::BigFloat")
@@ -1039,35 +1117,12 @@ sub bpi {
my $self = shift;
my $selfref = ref $self;
my $class = $selfref || $self;
+ my @r = @_; # rounding paramters
- my @r; # rounding paramters
-
- # If bpi() is called as a function ...
- #
- # This cludge is necessary because we still support bpi() as a function. If
- # bpi() is called with either no argument or one argument, and that one
- # argument is either undefined or a scalar that looks like a number, then
- # we assume bpi() is called as a function.
-
- if (@_ == 0 &&
- (defined($self) && !ref($self) && $self =~ /^\s*[+-]?\d/)
- ||
- !defined($self))
- {
- $r[0] = $self;
- $class = __PACKAGE__;
- $self = bless {}, $class; # initialize
- }
-
- # ... or if bpi() is called as a method ...
-
- else {
- @r = @_;
- if ($selfref) { # bpi() called as instance method
- return $self if $self -> modify('bpi');
- } else { # bpi() called as class method
- $self = bless {}, $class; # initialize
- }
+ if ($selfref) { # bpi() called as an instance method
+ return $self if $self -> modify('bpi');
+ } else { # bpi() called as a class method
+ $self = bless {}, $class; # initialize new instance
}
($self, @r) = $self -> _find_round_parameters(@r);
@@ -1142,13 +1197,19 @@ EOF
if ($last_digit lt '9') {
substr($digits, -1, 1) = ++$last_digit;
} else {
- $digits =~ s/([0-8])(9+)$/ ($1 + 1) . ("0" x CORE::length($2)) /e;
+ $digits =~ s{([0-8])(9+)$}
+ { ($1 + 1) . ("0" x CORE::length($2)) }e;
}
}
- # Append the exponent and convert to an object.
+ # Convert to an object.
- $pi = Math::BigFloat -> new($digits . 'e-' . ($n - 1));
+ $pi = bless {
+ sign => '+',
+ _m => $LIB -> _new($digits),
+ _es => '-',
+ _e => $LIB -> _new($n - 1),
+ }, $class;
} else {
@@ -1159,20 +1220,21 @@ EOF
$n += 8;
$HALF = $class -> new($HALF) unless ref($HALF);
- my ($an, $bn, $tn, $pn) = ($class -> bone, $HALF -> copy() -> bsqrt($n),
- $HALF -> copy() -> bmul($HALF), $class -> bone);
+ my ($an, $bn, $tn, $pn)
+ = ($class -> bone, $HALF -> copy() -> bsqrt($n),
+ $HALF -> copy() -> bmul($HALF), $class -> bone);
while ($pn < $n) {
my $prev_an = $an -> copy();
- $an -> badd($bn) -> bmul($HALF, $n);
- $bn -> bmul($prev_an) -> bsqrt($n);
- $prev_an -> bsub($an);
- $tn -> bsub($pn * $prev_an * $prev_an);
- $pn -> badd($pn);
+ $an = $an -> badd($bn) -> bmul($HALF, $n);
+ $bn = $bn -> bmul($prev_an) -> bsqrt($n);
+ $prev_an = $prev_an -> bsub($an);
+ $tn = $tn -> bsub($pn * $prev_an * $prev_an);
+ $pn = $pn -> badd($pn);
}
- $an -> badd($bn);
- $an -> bmul($an, $n) -> bdiv(4 * $tn, $n);
+ $an = $an -> badd($bn);
+ $an = $an -> bmul($an, $n) -> bdiv(4 * $tn, $n);
- $an -> round(@r);
+ $an = $an -> round(@r);
$pi = $an;
}
@@ -1186,54 +1248,95 @@ EOF
$self -> {$key} = $pi -> {$key};
}
+ return $downgrade -> new($self -> bdstr(), @r)
+ if defined($downgrade) && $self->is_int();
return $self;
}
sub copy {
- my $self = shift;
- my $selfref = ref $self;
- my $class = $selfref || $self;
-
- # If called as a class method, the object to copy is the next argument.
+ my ($x, $class);
+ if (ref($_[0])) { # $y = $x -> copy()
+ $x = shift;
+ $class = ref($x);
+ } else { # $y = Math::BigInt -> copy($y)
+ $class = shift;
+ $x = shift;
+ }
- $self = shift() unless $selfref;
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @_;
my $copy = bless {}, $class;
- $copy->{sign} = $self->{sign};
- $copy->{_es} = $self->{_es};
- $copy->{_m} = $LIB->_copy($self->{_m});
- $copy->{_e} = $LIB->_copy($self->{_e});
- $copy->{_a} = $self->{_a} if exists $self->{_a};
- $copy->{_p} = $self->{_p} if exists $self->{_p};
+ $copy->{sign} = $x->{sign};
+ $copy->{_es} = $x->{_es};
+ $copy->{_m} = $LIB->_copy($x->{_m});
+ $copy->{_e} = $LIB->_copy($x->{_e});
+ $copy->{_a} = $x->{_a} if exists $x->{_a};
+ $copy->{_p} = $x->{_p} if exists $x->{_p};
return $copy;
}
-sub as_number {
+sub as_int {
# return copy as a bigint representation of this Math::BigFloat number
- my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_);
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
- return $x if $x->modify('as_number');
+ return $x -> copy() if $x -> isa("Math::BigInt");
- if (!$x->isa('Math::BigFloat')) {
- # if the object can as_number(), use it
- return $x->as_number() if $x->can('as_number');
- # otherwise, get us a float and then a number
- $x = $x->can('as_float') ? $x->as_float() : $class->new(0+"$x");
- }
+ # disable upgrading and downgrading
- return Math::BigInt->binf($x->sign()) if $x->is_inf();
- return Math::BigInt->bnan() if $x->is_nan();
+ require Math::BigInt;
+ my $upg = Math::BigInt -> upgrade();
+ my $dng = Math::BigInt -> downgrade();
+ Math::BigInt -> upgrade(undef);
+ Math::BigInt -> downgrade(undef);
- my $z = $LIB->_copy($x->{_m});
- if ($x->{_es} eq '-') { # < 0
- $z = $LIB->_rsft($z, $x->{_e}, 10);
- } elsif (! $LIB->_is_zero($x->{_e})) { # > 0
- $z = $LIB->_lsft($z, $x->{_e}, 10);
+ my $y;
+ if ($x -> is_inf()) {
+ $y = Math::BigInt -> binf($x->sign());
+ } elsif ($x -> is_nan()) {
+ $y = Math::BigInt -> bnan();
+ } else {
+ $y = $LIB->_copy($x->{_m});
+ if ($x->{_es} eq '-') { # < 0
+ $y = $LIB->_rsft($y, $x->{_e}, 10);
+ } elsif (! $LIB->_is_zero($x->{_e})) { # > 0
+ $y = $LIB->_lsft($y, $x->{_e}, 10);
+ }
+ $y = Math::BigInt->new($x->{sign} . $LIB->_str($y));
}
- $z = Math::BigInt->new($x->{sign} . $LIB->_str($z));
- $z;
+
+ # reset upgrading and downgrading
+
+ Math::BigInt -> upgrade($upg);
+ Math::BigInt -> downgrade($dng);
+
+ return $y;
+}
+
+sub as_float {
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+ return $x -> copy() if $x -> isa("Math::BigFloat");
+
+ # disable upgrading and downgrading
+
+ require Math::BigFloat;
+ my $upg = Math::BigFloat -> upgrade();
+ my $dng = Math::BigFloat -> downgrade();
+ Math::BigFloat -> upgrade(undef);
+ Math::BigFloat -> downgrade(undef);
+
+ my $y = Math::BigFloat -> new($x);
+
+ # reset upgrading and downgrading
+
+ Math::BigFloat -> upgrade($upg);
+ Math::BigFloat -> downgrade($dng);
+
+ return $y;
}
###############################################################################
@@ -1242,14 +1345,14 @@ sub as_number {
sub is_zero {
# return true if arg (BFLOAT or num_str) is zero
- my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+ my (undef, $x) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
($x->{sign} eq '+' && $LIB->_is_zero($x->{_m})) ? 1 : 0;
}
sub is_one {
# return true if arg (BFLOAT or num_str) is +1 or -1 if signis given
- my ($class, $x, $sign) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+ my (undef, $x, $sign) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
$sign = '+' if !defined $sign || $sign ne '-';
@@ -1260,7 +1363,7 @@ sub is_one {
sub is_odd {
# return true if arg (BFLOAT or num_str) is odd or false if even
- my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+ my (undef, $x) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
(($x->{sign} =~ /^[+-]$/) && # NaN & +-inf aren't
($LIB->_is_zero($x->{_e})) &&
@@ -1269,7 +1372,7 @@ sub is_odd {
sub is_even {
# return true if arg (BINT or num_str) is even or false if odd
- my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+ my (undef, $x) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
(($x->{sign} =~ /^[+-]$/) && # NaN & +-inf aren't
($x->{_es} eq '+') && # 123.45 isn't
@@ -1278,7 +1381,7 @@ sub is_even {
sub is_int {
# return true if arg (BFLOAT or num_str) is an integer
- my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+ my (undef, $x) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
(($x->{sign} =~ /^[+-]$/) && # NaN and +-inf aren't
($x->{_es} eq '+')) ? 1 : 0; # 1e-1 => no integer
@@ -1292,15 +1395,11 @@ sub bcmp {
# Compares 2 values. Returns one of undef, <0, =0, >0. (suitable for sort)
# set up parameters
- my ($class, $x, $y) = (ref($_[0]), @_);
-
- # objectify is costly, so avoid it
- if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
- ($class, $x, $y) = objectify(2, @_);
- }
+ my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (ref($_[0]), @_)
+ : objectify(2, @_);
- return $upgrade->bcmp($x, $y) if defined $upgrade &&
- ((!$x->isa($class)) || (!$y->isa($class)));
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
# Handle all 'nan' cases.
@@ -1339,8 +1438,9 @@ sub bcmp {
my $mxl = $LIB->_len($x->{_m});
my $myl = $LIB->_len($y->{_m});
- # If the mantissas have the same length, there is no point in normalizing the
- # exponents by the length of the mantissas, so treat that as a special case.
+ # If the mantissas have the same length, there is no point in normalizing
+ # the exponents by the length of the mantissas, so treat that as a special
+ # case.
if ($mxl == $myl) {
@@ -1378,8 +1478,8 @@ sub bcmp {
if ($x->{_es} eq '+') {
- # If the exponent of x is >= 0 and the exponent of y is >= 0, there is no
- # need to do anything special.
+ # If the exponent of x is >= 0 and the exponent of y is >= 0, there is
+ # no need to do anything special.
if ($y->{_es} eq '+') {
$ex = $LIB->_copy($x->{_e});
@@ -1428,8 +1528,8 @@ sub bcmp {
return $cmp if $cmp;
# Compare the mantissas, but first normalize them by padding the shorter
- # mantissa with zeros (shift left) until it has the same length as the longer
- # mantissa.
+ # mantissa with zeros (shift left) until it has the same length as the
+ # longer mantissa.
my $mx = $x->{_m};
my $my = $y->{_m};
@@ -1451,14 +1551,11 @@ sub bacmp {
# Returns one of undef, <0, =0, >0. (suitable for sort)
# set up parameters
- my ($class, $x, $y) = (ref($_[0]), @_);
- # objectify is costly, so avoid it
- if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
- ($class, $x, $y) = objectify(2, @_);
- }
+ my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (ref($_[0]), @_)
+ : objectify(2, @_);
- return $upgrade->bacmp($x, $y) if defined $upgrade &&
- ((!$x->isa($class)) || (!$y->isa($class)));
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
# handle +-inf and NaN's
if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/) {
@@ -1509,25 +1606,33 @@ sub bacmp {
sub bneg {
# (BINT or num_str) return BINT
# negate number or make a negated number from string
- my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+ my (undef, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
return $x if $x->modify('bneg');
- # for +0 do not negate (to have always normalized +0). Does nothing for 'NaN'
- $x->{sign} =~ tr/+-/-+/ unless ($x->{sign} eq '+' && $LIB->_is_zero($x->{_m}));
+ return $x -> bnan(@r) if $x -> is_nan();
- return $downgrade -> new($x)
- if defined($downgrade) && ($x -> is_int() || $x -> is_inf() || $x -> is_nan());
- return $x;
+ # For +0 do not negate (to have always normalized +0).
+ $x->{sign} =~ tr/+-/-+/
+ unless $x->{sign} eq '+' && $LIB->_is_zero($x->{_m});
+
+ return $downgrade -> new($x -> bdstr(), @r) if defined($downgrade)
+ && ($x -> is_int() || $x -> is_inf() || $x -> is_nan());
+ return $x -> round(@r);
}
sub bnorm {
+ # bnorm() can't support rounding, because bround() and bfround() call
+ # bnorm(), which would recurse indefinitely.
+
# adjust m and e so that m is smallest possible
- my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+ my (undef, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
# inf, nan etc
if ($x->{sign} !~ /^[+-]$/) {
- return $downgrade->new($x) if defined $downgrade;
+ return $downgrade -> new($x) if defined $downgrade;
return $x;
}
@@ -1548,13 +1653,17 @@ sub bnorm {
}
} else {
# $x can only be 0Ey if there are no trailing zeros ('0' has 0 trailing
- # zeros). So, for something like 0Ey, set y to 1, and -0 => +0
- $x->{sign} = '+', $x->{_es} = '+', $x->{_e} = $LIB->_one()
- if $LIB->_is_zero($x->{_m});
+ # zeros). So, for something like 0Ey, set y to 0, and -0 => +0
+ if ($LIB->_is_zero($x->{_m})) {
+ $x->{sign} = '+';
+ $x->{_es} = '+';
+ $x->{_e} = $LIB->_zero();
+ }
}
- return $downgrade->new($x) if defined($downgrade) && $x->is_int();
- $x;
+ return $downgrade -> new($x)
+ if defined($downgrade) && $x->is_int();
+ return $x;
}
sub binc {
@@ -1563,19 +1672,28 @@ sub binc {
return $x if $x->modify('binc');
+ # Inf and NaN
+
+ return $x -> bnan(@r) if $x -> is_nan();
+ return $x -> binf($x->{sign}, @r) if $x -> is_inf();
+
+ # Non-integer
+
if ($x->{_es} eq '-') {
- return $x->badd($class->bone(), @r); # digits after dot
+ return $x->badd($class->bone(), @r);
}
- if (!$LIB->_is_zero($x->{_e})) # _e == 0 for NaN, inf, -inf
- {
- # 1e2 => 100, so after the shift below _m has a '0' as last digit
+ # If the exponent is non-zero, convert the internal representation, so that,
+ # e.g., 12e+3 becomes 12000e+0 and we can easily increment the mantissa.
+
+ if (!$LIB->_is_zero($x->{_e})) {
$x->{_m} = $LIB->_lsft($x->{_m}, $x->{_e}, 10); # 1e2 => 100
- $x->{_e} = $LIB->_zero(); # normalize
+ $x->{_e} = $LIB->_zero(); # normalize
$x->{_es} = '+';
# we know that the last digit of $x will be '1' or '9', depending on the
# sign
}
+
# now $x->{_e} == 0
if ($x->{sign} eq '+') {
$x->{_m} = $LIB->_inc($x->{_m});
@@ -1585,8 +1703,10 @@ sub binc {
$x->{sign} = '+' if $LIB->_is_zero($x->{_m}); # -1 +1 => -0 => +0
return $x->bnorm()->bround(@r);
}
- # inf, nan handling etc
- $x->badd($class->bone(), @r); # badd() does round
+
+ return $downgrade -> new($x -> bdstr(), @r)
+ if defined($downgrade) && $x -> is_int();
+ return $x;
}
sub bdec {
@@ -1595,78 +1715,82 @@ sub bdec {
return $x if $x->modify('bdec');
+ # Inf and NaN
+
+ return $x -> bnan(@r) if $x -> is_nan();
+ return $x -> binf($x->{sign}, @r) if $x -> is_inf();
+
+ # Non-integer
+
if ($x->{_es} eq '-') {
- return $x->badd($class->bone('-'), @r); # digits after dot
+ return $x->badd($class->bone('-'), @r);
}
+ # If the exponent is non-zero, convert the internal representation, so that,
+ # e.g., 12e+3 becomes 12000e+0 and we can easily increment the mantissa.
+
if (!$LIB->_is_zero($x->{_e})) {
$x->{_m} = $LIB->_lsft($x->{_m}, $x->{_e}, 10); # 1e2 => 100
- $x->{_e} = $LIB->_zero(); # normalize
+ $x->{_e} = $LIB->_zero(); # normalize
$x->{_es} = '+';
}
+
# now $x->{_e} == 0
my $zero = $x->is_zero();
- # <= 0
- if (($x->{sign} eq '-') || $zero) {
+ if (($x->{sign} eq '-') || $zero) { # x <= 0
$x->{_m} = $LIB->_inc($x->{_m});
$x->{sign} = '-' if $zero; # 0 => 1 => -1
$x->{sign} = '+' if $LIB->_is_zero($x->{_m}); # -1 +1 => -0 => +0
return $x->bnorm()->round(@r);
}
- # > 0
- elsif ($x->{sign} eq '+') {
+ elsif ($x->{sign} eq '+') { # x > 0
$x->{_m} = $LIB->_dec($x->{_m});
return $x->bnorm()->round(@r);
}
- # inf, nan handling etc
- $x->badd($class->bone('-'), @r); # does round
+
+ return $downgrade -> new($x -> bdstr(), @r)
+ if defined($downgrade) && $x -> is_int();
+ return $x -> round(@r);
}
sub badd {
- # add second arg (BFLOAT or string) to first (BFLOAT) (modifies first)
- # return result as BFLOAT
-
# set up parameters
- my ($class, $x, $y, @r) = (ref($_[0]), @_);
-
- # objectify is costly, so avoid it
- if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
- ($class, $x, $y, @r) = objectify(2, @_);
- }
+ my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (ref($_[0]), @_)
+ : objectify(2, @_);
return $x if $x->modify('badd');
# inf and NaN handling
if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/) {
- # NaN first
+ # $x is NaN and/or $y is NaN
if ($x->{sign} eq $nan || $y->{sign} eq $nan) {
- $x->bnan();
+ $x = $x->bnan();
}
- # inf handling
+ # $x is Inf and $y is Inf
elsif ($x->{sign} =~ /^[+-]inf$/ && $y->{sign} =~ /^[+-]inf$/) {
- # +inf++inf or -inf+-inf => same, rest is NaN
- $x->bnan() if $x->{sign} ne $y->{sign};
+ # +Inf + +Inf or -Inf + -Inf => same, rest is NaN
+ $x = $x->bnan() if $x->{sign} ne $y->{sign};
}
- # +-inf + something => +inf; something +-inf => +-inf
+ # +-inf + something => +-inf; something +-inf => +-inf
elsif ($y->{sign} =~ /^[+-]inf$/) {
$x->{sign} = $y->{sign};
}
- return $downgrade->new($x, @r) if defined $downgrade;
- return $x;
+ return $downgrade -> new($x -> bdstr(), @r) if defined $downgrade;
+ return $x -> round(@r);
}
- return $upgrade->badd($x, $y, @r) if defined $upgrade &&
- ((!$x->isa($class)) || (!$y->isa($class)));
+ return $upgrade->badd($x, $y, @r) if defined $upgrade;
$r[3] = $y; # no push!
# for speed: no add for $x + 0
if ($y->is_zero()) {
- $x->bround(@r);
+ $x = $x->round(@r);
}
# for speed: no add for 0 + $y
@@ -1676,9 +1800,10 @@ sub badd {
$x->{_es} = $y->{_es};
$x->{_m} = $LIB->_copy($y->{_m});
$x->{sign} = $y->{sign} || $nan;
- $x->round(@r);
+ $x = $x->round(@r);
}
+ # both $x and $y are non-zero
else {
# take lower of the two e's and adapt m1 to it to match m2
@@ -1688,16 +1813,13 @@ sub badd {
my $es;
- ($e, $es) = _e_sub($e, $x->{_e}, $y->{_es} || '+', $x->{_es});
- #($e, $es) = $LIB -> _ssub($e, $y->{_es} || '+', $x->{_e}, $x->{_es});
+ ($e, $es) = $LIB -> _ssub($e, $y->{_es} || '+', $x->{_e}, $x->{_es});
my $add = $LIB->_copy($y->{_m});
if ($es eq '-') { # < 0
$x->{_m} = $LIB->_lsft($x->{_m}, $e, 10);
- ($x->{_e}, $x->{_es}) = _e_add($x->{_e}, $e, $x->{_es}, $es);
- #$x->{_m} = $LIB->_lsft($x->{_m}, $e, 10);
- #($x->{_e}, $x->{_es}) = $LIB -> _sadd($x->{_e}, $x->{_es}, $e, $es);
+ ($x->{_e}, $x->{_es}) = $LIB -> _sadd($x->{_e}, $x->{_es}, $e, $es);
} elsif (!$LIB->_is_zero($e)) { # > 0
$add = $LIB->_lsft($add, $e, 10);
}
@@ -1708,38 +1830,28 @@ sub badd {
$x->{_m} = $LIB->_add($x->{_m}, $add);
} else {
($x->{_m}, $x->{sign}) =
- _e_add($x->{_m}, $add, $x->{sign}, $y->{sign});
- #($x->{_m}, $x->{sign}) =
- # $LIB -> _sadd($x->{_m}, $x->{sign}, $add, $y->{sign});
+ $LIB -> _sadd($x->{_m}, $x->{sign}, $add, $y->{sign});
}
# delete trailing zeros, then round
- $x->bnorm()->round(@r);
+ $x = $x->bnorm()->round(@r);
}
- return $downgrade->new($x, @r) if defined($downgrade) && $x -> is_int();
- return $x;
+ return $downgrade -> new($x -> bdstr(), @r)
+ if defined($downgrade) && $x -> is_int();
+ return $x; # rounding already done above
}
sub bsub {
- # (BINT or num_str, BINT or num_str) return BINT
- # subtract second arg from first, modify first
-
# set up parameters
- my ($class, $x, $y, @r) = (ref($_[0]), @_);
-
- # objectify is costly, so avoid it
- if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
- ($class, $x, $y, @r) = objectify(2, @_);
- }
+ my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (ref($_[0]), @_)
+ : objectify(2, @_);
return $x if $x -> modify('bsub');
- return $upgrade -> new($x) -> bsub($upgrade -> new($y), @r)
- if defined $upgrade && (!$x -> isa($class) || !$y -> isa($class));
-
if ($y -> is_zero()) {
- $x -> round(@r);
+ $x = $x -> round(@r);
} else {
# To correctly handle the special case $x -> bsub($x), we note the sign
@@ -1751,17 +1863,18 @@ sub bsub {
if ($xsign ne $x -> {sign}) {
# special case of $x -> bsub($x) results in 0
if ($xsign =~ /^[+-]$/) {
- $x -> bzero(@r);
+ $x = $x -> bzero(@r);
} else {
- $x -> bnan(); # NaN, -inf, +inf
+ $x = $x -> bnan(); # NaN, -inf, +inf
}
- return $downgrade->new($x, @r) if defined $downgrade;
- return $x;
+ return $downgrade -> new($x -> bdstr(), @r) if defined $downgrade;
+ return $x -> round(@r);
}
$x = $x -> badd($y, @r); # badd does not leave internal zeros
$y -> {sign} =~ tr/+-/-+/; # reset $y (does nothing for NaN)
}
- return $downgrade->new($x, @r)
+
+ return $downgrade -> new($x -> bdstr(), @r)
if defined($downgrade) && ($x->is_int() || $x->is_inf() || $x->is_nan());
$x; # already rounded by badd() or no rounding
}
@@ -1770,72 +1883,73 @@ sub bmul {
# multiply two numbers
# set up parameters
- my ($class, $x, $y, @r) = (ref($_[0]), @_);
- # objectify is costly, so avoid it
- if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
- ($class, $x, $y, @r) = objectify(2, @_);
- }
+ my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (ref($_[0]), @_)
+ : objectify(2, @_);
return $x if $x->modify('bmul');
- return $x->bnan() if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
+ return $x->bnan(@r) if ($x->{sign} eq $nan) || ($y->{sign} eq $nan);
# inf handling
if (($x->{sign} =~ /^[+-]inf$/) || ($y->{sign} =~ /^[+-]inf$/)) {
- return $x->bnan() if $x->is_zero() || $y->is_zero();
+ return $x->bnan(@r) if $x->is_zero() || $y->is_zero();
# result will always be +-inf:
# +inf * +/+inf => +inf, -inf * -/-inf => +inf
# +inf * -/-inf => -inf, -inf * +/+inf => -inf
- return $x->binf() if ($x->{sign} =~ /^\+/ && $y->{sign} =~ /^\+/);
- return $x->binf() if ($x->{sign} =~ /^-/ && $y->{sign} =~ /^-/);
- return $x->binf('-');
+ return $x->binf(@r) if ($x->{sign} =~ /^\+/ && $y->{sign} =~ /^\+/);
+ return $x->binf(@r) if ($x->{sign} =~ /^-/ && $y->{sign} =~ /^-/);
+ return $x->binf('-', @r);
}
- return $upgrade->bmul($x, $y, @r) if defined $upgrade &&
- ((!$x->isa($class)) || (!$y->isa($class)));
+ return $upgrade->bmul($x, $y, @r) if defined $upgrade;
# aEb * cEd = (a*c)E(b+d)
$x->{_m} = $LIB->_mul($x->{_m}, $y->{_m});
- ($x->{_e}, $x->{_es}) = _e_add($x->{_e}, $y->{_e}, $x->{_es}, $y->{_es});
- #($x->{_e}, $x->{_es}) = $LIB -> _sadd($x->{_e}, $x->{_es}, $y->{_e}, $y->{_es});
+ ($x->{_e}, $x->{_es})
+ = $LIB -> _sadd($x->{_e}, $x->{_es}, $y->{_e}, $y->{_es});
$r[3] = $y; # no push!
# adjust sign:
$x->{sign} = $x->{sign} ne $y->{sign} ? '-' : '+';
- $x->bnorm->round(@r);
+ $x = $x->bnorm->round(@r);
+
+ return $downgrade -> new($x -> bdstr(), @r)
+ if defined($downgrade) && ($x->is_int() || $x->is_inf() || $x->is_nan());
+ return $x;
}
sub bmuladd {
# multiply two numbers and add the third to the result
# set up parameters
- my ($class, $x, $y, $z, @r) = objectify(3, @_);
+ my ($class, $x, $y, $z, @r)
+ = ref($_[0]) && ref($_[0]) eq ref($_[1]) && ref($_[1]) eq ref($_[2])
+ ? (ref($_[0]), @_)
+ : objectify(3, @_);
return $x if $x->modify('bmuladd');
- return $x->bnan() if (($x->{sign} eq $nan) ||
- ($y->{sign} eq $nan) ||
- ($z->{sign} eq $nan));
+ return $x->bnan(@r) if (($x->{sign} eq $nan) ||
+ ($y->{sign} eq $nan) ||
+ ($z->{sign} eq $nan));
# inf handling
if (($x->{sign} =~ /^[+-]inf$/) || ($y->{sign} =~ /^[+-]inf$/)) {
- return $x->bnan() if $x->is_zero() || $y->is_zero();
+ return $x->bnan(@r) if $x->is_zero() || $y->is_zero();
# result will always be +-inf:
# +inf * +/+inf => +inf, -inf * -/-inf => +inf
# +inf * -/-inf => -inf, -inf * +/+inf => -inf
- return $x->binf() if ($x->{sign} =~ /^\+/ && $y->{sign} =~ /^\+/);
- return $x->binf() if ($x->{sign} =~ /^-/ && $y->{sign} =~ /^-/);
- return $x->binf('-');
+ return $x->binf(@r) if ($x->{sign} =~ /^\+/ && $y->{sign} =~ /^\+/);
+ return $x->binf(@r) if ($x->{sign} =~ /^-/ && $y->{sign} =~ /^-/);
+ return $x->binf('-', @r);
}
- return $upgrade->bmul($x, $y, @r) if defined $upgrade &&
- ((!$x->isa($class)) || (!$y->isa($class)));
-
# aEb * cEd = (a*c)E(b+d)
$x->{_m} = $LIB->_mul($x->{_m}, $y->{_m});
- ($x->{_e}, $x->{_es}) = _e_add($x->{_e}, $y->{_e}, $x->{_es}, $y->{_es});
- #($x->{_e}, $x->{_es}) = $LIB -> _sadd($x->{_e}, $x->{_es}, $y->{_e}, $y->{_es});
+ ($x->{_e}, $x->{_es})
+ = $LIB -> _sadd($x->{_e}, $x->{_es}, $y->{_e}, $y->{_es});
$r[3] = $y; # no push!
@@ -1845,8 +1959,8 @@ sub bmuladd {
# z=inf handling (z=NaN handled above)
if ($z->{sign} =~ /^[+-]inf$/) {
$x->{sign} = $z->{sign};
- return $downgrade->new($x) if defined $downgrade;
- return $x;
+ return $downgrade -> new($x -> bdstr(), @r) if defined $downgrade;
+ return $x -> round(@r);
}
# take lower of the two e's and adapt m1 to it to match m2
@@ -1856,17 +1970,14 @@ sub bmuladd {
my $es;
- ($e, $es) = _e_sub($e, $x->{_e}, $z->{_es} || '+', $x->{_es});
- #($e, $es) = $LIB -> _ssub($e, $z->{_es} || '+', $x->{_e}, $x->{_es});
+ ($e, $es) = $LIB -> _ssub($e, $z->{_es} || '+', $x->{_e}, $x->{_es});
my $add = $LIB->_copy($z->{_m});
if ($es eq '-') # < 0
{
$x->{_m} = $LIB->_lsft($x->{_m}, $e, 10);
- ($x->{_e}, $x->{_es}) = _e_add($x->{_e}, $e, $x->{_es}, $es);
- #$x->{_m} = $LIB->_lsft($x->{_m}, $e, 10);
- #($x->{_e}, $x->{_es}) = $LIB -> _sadd($x->{_e}, $x->{_es}, $e, $es);
+ ($x->{_e}, $x->{_es}) = $LIB -> _sadd($x->{_e}, $x->{_es}, $e, $es);
} elsif (!$LIB->_is_zero($e)) # > 0
{
$add = $LIB->_lsft($add, $e, 10);
@@ -1878,13 +1989,15 @@ sub bmuladd {
$x->{_m} = $LIB->_add($x->{_m}, $add);
} else {
($x->{_m}, $x->{sign}) =
- _e_add($x->{_m}, $add, $x->{sign}, $z->{sign});
- #($x->{_m}, $x->{sign}) =
- # $LIB -> _sadd($x->{_m}, $x->{sign}, $add, $z->{sign});
+ $LIB -> _sadd($x->{_m}, $x->{sign}, $add, $z->{sign});
}
# delete trailing zeros, then round
- $x->bnorm()->round(@r);
+ $x = $x->bnorm()->round(@r);
+
+ return $downgrade -> new($x -> bdstr(), @r)
+ if defined($downgrade) && ($x->is_int() || $x->is_inf() || $x->is_nan());
+ return $x;
}
sub bdiv {
@@ -1892,10 +2005,10 @@ sub bdiv {
# (BFLOAT, BFLOAT) (quo, rem) or BFLOAT (only quo)
# set up parameters
- my ($class, $x, $y, $a, $p, $r) = (ref($_[0]), @_);
+ my ($class, $x, $y, @r) = (ref($_[0]), @_);
# objectify is costly, so avoid it
if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
- ($class, $x, $y, $a, $p, $r) = objectify(2, @_);
+ ($class, $x, $y, @r) = objectify(2, @_);
}
return $x if $x->modify('bdiv');
@@ -1906,7 +2019,8 @@ sub bdiv {
# Math::BigInt -> bdiv().
if ($x -> is_nan() || $y -> is_nan()) {
- return $wantarray ? ($x -> bnan(), $class -> bnan()) : $x -> bnan();
+ return $wantarray ? ($x -> bnan(@r), $class -> bnan(@r))
+ : $x -> bnan(@r);
}
# Divide by zero and modulo zero. This is handled the same way as in
@@ -1916,12 +2030,14 @@ sub bdiv {
if ($y -> is_zero()) {
my ($quo, $rem);
if ($wantarray) {
- $rem = $x -> copy();
+ $rem = $x -> copy() -> round(@r);
+ $rem = $downgrade -> new($rem, @r)
+ if defined($downgrade) && $rem -> is_int();
}
if ($x -> is_zero()) {
- $quo = $x -> bnan();
+ $quo = $x -> bnan(@r);
} else {
- $quo = $x -> binf($x -> {sign});
+ $quo = $x -> binf($x -> {sign}, @r);
}
return $wantarray ? ($quo, $rem) : $quo;
}
@@ -1932,12 +2048,12 @@ sub bdiv {
if ($x -> is_inf()) {
my ($quo, $rem);
- $rem = $class -> bnan() if $wantarray;
+ $rem = $class -> bnan(@r) if $wantarray;
if ($y -> is_inf()) {
- $quo = $x -> bnan();
+ $quo = $x -> bnan(@r);
} else {
my $sign = $x -> bcmp(0) == $y -> bcmp(0) ? '+' : '-';
- $quo = $x -> binf($sign);
+ $quo = $x -> binf($sign, @r);
}
return $wantarray ? ($quo, $rem) : $quo;
}
@@ -1952,19 +2068,21 @@ sub bdiv {
my ($quo, $rem);
if ($wantarray) {
if ($x -> is_zero() || $x -> bcmp(0) == $y -> bcmp(0)) {
- $rem = $x -> copy();
- $quo = $x -> bzero();
+ $rem = $x -> copy() -> round(@r);
+ $rem = $downgrade -> new($rem, @r)
+ if defined($downgrade) && $rem -> is_int();
+ $quo = $x -> bzero(@r);
} else {
- $rem = $class -> binf($y -> {sign});
- $quo = $x -> bone('-');
+ $rem = $class -> binf($y -> {sign}, @r);
+ $quo = $x -> bone('-', @r);
}
return ($quo, $rem);
} else {
if ($y -> is_inf()) {
if ($x -> is_nan() || $x -> is_inf()) {
- return $x -> bnan();
+ return $x -> bnan(@r);
} else {
- return $x -> bzero();
+ return $x -> bzero(@r);
}
}
}
@@ -1974,21 +2092,37 @@ sub bdiv {
# the denominator (divisor) is non-zero.
# x == 0?
- return wantarray ? ($x, $class->bzero()) : $x if $x->is_zero();
+ if ($x->is_zero()) {
+ my ($quo, $rem);
+ $quo = $x->round(@r);
+ $quo = $downgrade -> new($quo, @r)
+ if defined($downgrade) && $quo -> is_int();
+ if ($wantarray) {
+ $rem = $class -> bzero(@r);
+ return $quo, $rem;
+ }
+ return $quo;
+ }
+
+ # Division might return a value that we can not represent exactly, so
+ # upgrade, if upgrading is enabled.
+
+ return $upgrade -> bdiv($x, $y, @r)
+ if defined($upgrade) && !wantarray && !$LIB -> _is_one($y -> {_m});
# we need to limit the accuracy to protect against overflow
my $fallback = 0;
my (@params, $scale);
- ($x, @params) = $x->_find_round_parameters($a, $p, $r, $y);
+ ($x, @params) = $x->_find_round_parameters($r[0], $r[1], $r[2], $y);
- return $x if $x->is_nan(); # error in _find_round_parameters?
+ return $x -> round(@r) if $x->is_nan(); # error in _find_round_parameters?
# no rounding at all, so must use fallback
if (scalar @params == 0) {
# simulate old behaviour
$params[0] = $class->div_scale(); # and round to it as accuracy
$scale = $params[0]+4; # at least four more for proper round
- $params[2] = $r; # round mode by caller or undef
+ $params[2] = $r[2]; # round mode by caller or undef
$fallback = 1; # to clear a/p afterwards
} else {
# the 4 below is empirical, and there might be cases where it is not
@@ -2001,7 +2135,8 @@ sub bdiv {
$y = $class->new($y) unless $y->isa('Math::BigFloat');
- my $lx = $LIB -> _len($x->{_m}); my $ly = $LIB -> _len($y->{_m});
+ my $lx = $LIB -> _len($x->{_m});
+ my $ly = $LIB -> _len($y->{_m});
$scale = $lx if $lx > $scale;
$scale = $ly if $ly > $scale;
my $diff = $ly - $lx;
@@ -2017,13 +2152,14 @@ sub bdiv {
if ($xsign ne $x->{sign}) {
# special case of $x /= $x results in 1
- $x->bone(); # "fixes" also sign of $y, since $x is $y
+ $x = $x->bone(); # "fixes" also sign of $y, since $x is $y
} else {
# correct $y's sign again
$y->{sign} =~ tr/+-/-+/;
# continue with normal div code:
- # make copy of $x in case of list context for later remainder calculation
+ # make copy of $x in case of list context for later remainder
+ # calculation
if (wantarray && $y_not_one) {
$rem = $x->copy();
}
@@ -2032,7 +2168,8 @@ sub bdiv {
# check for / +-1 (+/- 1E0)
if ($y_not_one) {
- # promote BigInts and it's subclasses (except when already a Math::BigFloat)
+ # promote Math::BigInt and its subclasses (except when already a
+ # Math::BigFloat)
$y = $class->new($y) unless $y->isa('Math::BigFloat');
# calculate the result to $scale digits and then round it
@@ -2041,80 +2178,77 @@ sub bdiv {
$x->{_m} = $LIB->_div($x->{_m}, $y->{_m}); # a/c
# correct exponent of $x
- ($x->{_e}, $x->{_es}) = _e_sub($x->{_e}, $y->{_e}, $x->{_es}, $y->{_es});
- #($x->{_e}, $x->{_es})
- # = $LIB -> _ssub($x->{_e}, $x->{_es}, $y->{_e}, $y->{_es});
+ ($x->{_e}, $x->{_es})
+ = $LIB -> _ssub($x->{_e}, $x->{_es}, $y->{_e}, $y->{_es});
# correct for 10**scale
- ($x->{_e}, $x->{_es}) = _e_sub($x->{_e}, $LIB->_new($scale), $x->{_es}, '+');
- #($x->{_e}, $x->{_es})
- # = $LIB -> _ssub($x->{_e}, $x->{_es}, $LIB->_new($scale), '+');
- $x->bnorm(); # remove trailing 0's
+ ($x->{_e}, $x->{_es})
+ = $LIB -> _ssub($x->{_e}, $x->{_es}, $LIB->_new($scale), '+');
+ $x = $x->bnorm(); # remove trailing 0's
}
} # end else $x != $y
# shortcut to not run through _find_round_parameters again
if (defined $params[0]) {
delete $x->{_a}; # clear before round
- $x->bround($params[0], $params[2]); # then round accordingly
+ $x = $x->bround($params[0], $params[2]); # then round accordingly
} else {
delete $x->{_p}; # clear before round
- $x->bfround($params[1], $params[2]); # then round accordingly
+ $x = $x->bfround($params[1], $params[2]); # then round accordingly
}
if ($fallback) {
# clear a/p after round, since user did not request it
- delete $x->{_a}; delete $x->{_p};
+ delete $x->{_a};
+ delete $x->{_p};
}
if (wantarray) {
if ($y_not_one) {
- $x -> bfloor();
- $rem->bmod($y, @params); # copy already done
+ $x = $x -> bfloor();
+ $rem = $rem->bmod($y, @params); # copy already done
}
if ($fallback) {
# clear a/p after round, since user did not request it
- delete $rem->{_a}; delete $rem->{_p};
+ delete $rem->{_a};
+ delete $rem->{_p};
}
- $x = $downgrade -> new($x)
+ $x = $downgrade -> new($x -> bdstr(), @r)
if defined($downgrade) && $x -> is_int();
- $rem = $downgrade -> new($rem)
+ $rem = $downgrade -> new($rem -> bdstr(), @r)
if defined($downgrade) && $rem -> is_int();
return ($x, $rem);
}
- $x = $downgrade -> new($x) if defined($downgrade) && $x -> is_int();
- $x;
+ $x = $downgrade -> new($x, @r)
+ if defined($downgrade) && $x -> is_int();
+ $x; # rounding already done above
}
sub bmod {
# (dividend: BFLOAT or num_str, divisor: BFLOAT or num_str) return remainder
# set up parameters
- my ($class, $x, $y, $a, $p, $r) = (ref($_[0]), @_);
- # objectify is costly, so avoid it
- if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
- ($class, $x, $y, $a, $p, $r) = objectify(2, @_);
- }
+ my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (ref($_[0]), @_)
+ : objectify(2, @_);
return $x if $x->modify('bmod');
# At least one argument is NaN. This is handled the same way as in
# Math::BigInt -> bmod().
- if ($x -> is_nan() || $y -> is_nan()) {
- return $x -> bnan();
- }
+ return $x -> bnan(@r) if $x -> is_nan() || $y -> is_nan();
# Modulo zero. This is handled the same way as in Math::BigInt -> bmod().
if ($y -> is_zero()) {
- return $x;
+ return $x -> round(@r);
}
# Numerator (dividend) is +/-inf. This is handled the same way as in
# Math::BigInt -> bmod().
if ($x -> is_inf()) {
- return $x -> bnan();
+ return $x -> bnan(@r);
}
# Denominator (divisor) is +/-inf. This is handled the same way as in
@@ -2122,20 +2256,20 @@ sub bmod {
if ($y -> is_inf()) {
if ($x -> is_zero() || $x -> bcmp(0) == $y -> bcmp(0)) {
- return $x;
+ return $x -> round(@r);
} else {
- return $x -> binf($y -> sign());
+ return $x -> binf($y -> sign(), @r);
}
}
- return $x->bzero() if $x->is_zero()
+ return $x->bzero(@r) if $x->is_zero()
|| ($x->is_int() &&
# check that $y == +1 or $y == -1:
($LIB->_is_zero($y->{_e}) && $LIB->_is_one($y->{_m})));
my $cmp = $x->bacmp($y); # equal or $x < $y?
if ($cmp == 0) { # $x == $y => result 0
- return $x -> bzero($a, $p);
+ return $x -> bzero(@r);
}
# only $y of the operands negative?
@@ -2143,7 +2277,7 @@ sub bmod {
$x->{sign} = $y->{sign}; # calc sign first
if ($cmp < 0 && $neg == 0) { # $x < $y => result $x
- return $x -> round($a, $p, $r);
+ return $x -> round(@r);
}
my $ym = $LIB->_copy($y->{_m});
@@ -2158,7 +2292,8 @@ sub bmod {
{
# 123 % 2.5 => 1230 % 25 => 5 => 0.5
$shifty = $LIB->_num($y->{_e}); # no more digits after dot
- $x->{_m} = $LIB->_lsft($x->{_m}, $y->{_e}, 10); # 123 => 1230, $y->{_m} is already 25
+ # 123 => 1230, $y->{_m} is already 25
+ $x->{_m} = $LIB->_lsft($x->{_m}, $y->{_e}, 10);
}
# $ym is now mantissa of $y based on exponent 0
@@ -2184,48 +2319,60 @@ sub bmod {
$x->{_m} = $LIB->_mod($x->{_m}, $ym);
$x->{sign} = '+' if $LIB->_is_zero($x->{_m}); # fix sign for -0
- $x->bnorm();
+ $x = $x->bnorm();
- if ($neg != 0 && ! $x -> is_zero()) # one of them negative => correct in place
- {
+ # if one of them negative => correct in place
+ if ($neg != 0 && ! $x -> is_zero()) {
my $r = $y - $x;
$x->{_m} = $r->{_m};
$x->{_e} = $r->{_e};
$x->{_es} = $r->{_es};
$x->{sign} = '+' if $LIB->_is_zero($x->{_m}); # fix sign for -0
- $x->bnorm();
+ $x = $x->bnorm();
}
- $x->round($a, $p, $r, $y); # round and return
+ $x = $x->round($r[0], $r[1], $r[2], $y);
+ return $downgrade -> new($x -> bdstr(), @r)
+ if defined($downgrade) && ($x->is_int() || $x->is_inf() || $x->is_nan());
+ return $x;
}
sub bmodpow {
# takes a very large number to a very large exponent in a given very
# large modulus, quickly, thanks to binary exponentiation. Supports
# negative exponents.
- my ($class, $num, $exp, $mod) = objectify(3, @_);
+ my ($class, $num, $exp, $mod, @r)
+ = ref($_[0]) && ref($_[0]) eq ref($_[1]) && ref($_[1]) eq ref($_[2])
+ ? (ref($_[0]), @_)
+ : objectify(3, @_);
return $num if $num->modify('bmodpow');
+ return $num -> bnan(@r)
+ if $mod->is_nan() || $exp->is_nan() || $mod->is_nan();
+
# check modulus for valid values
- return $num->bnan() if ($mod->{sign} ne '+' # NaN, -, -inf, +inf
- || $mod->is_zero());
+ return $num->bnan(@r) if $mod->{sign} ne '+' || $mod->is_zero();
# check exponent for valid values
if ($exp->{sign} =~ /\w/) {
# i.e., if it's NaN, +inf, or -inf...
- return $num->bnan();
+ return $num->bnan(@r);
}
- $num->bmodinv ($mod) if ($exp->{sign} eq '-');
+ $num = $num->bmodinv($mod, @r) if $exp->{sign} eq '-';
# check num for valid values (also NaN if there was no inverse but $exp < 0)
- return $num->bnan() if $num->{sign} !~ /^[+-]$/;
+ return $num->bnan(@r) if $num->{sign} !~ /^[+-]$/;
# $mod is positive, sign on $exp is ignored, result also positive
# XXX TODO: speed it up when all three numbers are integers
- $num->bpow($exp)->bmod($mod);
+ $num = $num->bpow($exp)->bmod($mod);
+
+ return $downgrade -> new($num -> bdstr(), @r) if defined($downgrade)
+ && ($num->is_int() || $num->is_inf() || $num->is_nan());
+ return $num -> round(@r);
}
sub bpow {
@@ -2276,8 +2423,7 @@ sub bpow {
# We don't support complex numbers, so upgrade or return NaN.
if ($x -> is_negative() && !$y -> is_int()) {
- return $upgrade -> bpow($upgrade -> new($x), $y, $a, $p, $r)
- if defined $upgrade;
+ return $upgrade -> bpow($x, $y, $a, $p, $r) if defined $upgrade;
return $x -> bnan();
}
@@ -2302,19 +2448,23 @@ sub bpow {
$x->{_e} = $LIB -> _mul($x->{_e}, $y1);
$x->{sign} = $new_sign;
- $x -> bnorm();
+ $x = $x -> bnorm();
# x ** (-y) = 1 / (x ** y)
if ($y->{sign} eq '-') {
# modify $x in place!
my $z = $x -> copy();
- $x -> bone();
+ $x = $x -> bone();
# round in one go (might ignore y's A!)
return scalar $x -> bdiv($z, $a, $p, $r);
}
- $x -> round($a, $p, $r, $y);
+ $x = $x -> round($a, $p, $r, $y);
+
+ return $downgrade -> new($x)
+ if defined($downgrade) && ($x->is_int() || $x->is_inf() || $x->is_nan());
+ return $x;
}
sub blog {
@@ -2322,29 +2472,32 @@ sub blog {
# value is used as the base, otherwise the base is assumed to be Euler's
# constant.
- my ($class, $x, $base, $a, $p, $r);
+ my ($class, $x, $base, @r);
- # Don't objectify the base, since an undefined base, as in $x->blog() or
- # $x->blog(undef) signals that the base is Euler's number.
+ # Only objectify the base if it is defined, since an undefined base, as in
+ # $x->blog() or $x->blog(undef) signals that the base is Euler's number.
if (!ref($_[0]) && $_[0] =~ /^[A-Za-z]|::/) {
# E.g., Math::BigFloat->blog(256, 2)
- ($class, $x, $base, $a, $p, $r) =
+ ($class, $x, $base, @r) =
defined $_[2] ? objectify(2, @_) : objectify(1, @_);
} else {
# E.g., Math::BigFloat::blog(256, 2) or $x->blog(2)
- ($class, $x, $base, $a, $p, $r) =
+ ($class, $x, $base, @r) =
defined $_[1] ? objectify(2, @_) : objectify(1, @_);
}
return $x if $x->modify('blog');
- return $x -> bnan() if $x -> is_nan();
+ return $x -> bnan(@r) if $x -> is_nan();
+
+ return $upgrade -> blog($x, $base, @r)
+ if defined($upgrade) && $x -> is_neg();
# we need to limit the accuracy to protect against overflow
my $fallback = 0;
my ($scale, @params);
- ($x, @params) = $x->_find_round_parameters($a, $p, $r);
+ ($x, @params) = $x->_find_round_parameters(@r);
# no rounding at all, so must use fallback
if (scalar @params == 0) {
@@ -2352,7 +2505,7 @@ sub blog {
$params[0] = $class->div_scale(); # and round to it as accuracy
$params[1] = undef; # P = undef
$scale = $params[0]+4; # at least four more for proper round
- $params[2] = $r; # round mode by caller or undef
+ $params[2] = $r[2]; # round mode by caller or undef
$fallback = 1; # to clear a/p afterwards
} else {
# the 4 below is empirical, and there might be cases where it is not
@@ -2362,28 +2515,29 @@ sub blog {
my $done = 0;
if (defined $base) {
- $base = $class -> new($base) unless ref $base;
+ $base = $class -> new($base)
+ unless defined(blessed($base)) && $base -> isa($class);
if ($base -> is_nan() || $base -> is_one()) {
- $x -> bnan();
+ $x = $x -> bnan();
$done = 1;
} elsif ($base -> is_inf() || $base -> is_zero()) {
if ($x -> is_inf() || $x -> is_zero()) {
- $x -> bnan();
+ $x = $x -> bnan();
} else {
- $x -> bzero(@params);
+ $x = $x -> bzero(@params);
}
$done = 1;
} elsif ($base -> is_negative()) { # -inf < base < 0
if ($x -> is_one()) { # x = 1
- $x -> bzero(@params);
+ $x = $x -> bzero(@params);
} elsif ($x == $base) {
- $x -> bone('+', @params); # x = base
+ $x = $x -> bone('+', @params); # x = base
} else {
- $x -> bnan(); # otherwise
+ $x = $x -> bnan(); # otherwise
}
$done = 1;
} elsif ($x == $base) {
- $x -> bone('+', @params); # 0 < base && 0 < x < inf
+ $x = $x -> bone('+', @params); # 0 < base && 0 < x < inf
$done = 1;
}
}
@@ -2393,17 +2547,17 @@ sub blog {
unless ($done) {
if ($x -> is_inf()) { # x = +/-inf
my $sign = defined $base && $base < 1 ? '-' : '+';
- $x -> binf($sign);
+ $x = $x -> binf($sign);
$done = 1;
} elsif ($x -> is_neg()) { # -inf < x < 0
- $x -> bnan();
+ $x = $x -> bnan();
$done = 1;
} elsif ($x -> is_one()) { # x = 1
- $x -> bzero(@params);
+ $x = $x -> bzero(@params);
$done = 1;
} elsif ($x -> is_zero()) { # x = 0
my $sign = defined $base && $base < 1 ? '+' : '-';
- $x -> binf($sign);
+ $x = $x -> binf($sign);
$done = 1;
}
}
@@ -2414,69 +2568,61 @@ sub blog {
delete $x->{_a};
delete $x->{_p};
}
+ return $downgrade -> new($x -> bdstr(), @r)
+ if defined($downgrade) && $x->is_int();
return $x;
}
# when user set globals, they would interfere with our calculation, so
# disable them and later re-enable them
no strict 'refs';
- my $abr = "$class\::accuracy"; my $ab = $$abr; $$abr = undef;
- my $pbr = "$class\::precision"; my $pb = $$pbr; $$pbr = undef;
+ my $abr = "$class\::accuracy";
+ my $ab = $$abr;
+ $$abr = undef;
+ my $pbr = "$class\::precision";
+ my $pb = $$pbr;
+ $$pbr = undef;
# we also need to disable any set A or P on $x (_find_round_parameters took
# them already into account), since these would interfere, too
- delete $x->{_a}; delete $x->{_p};
- # need to disable $upgrade in BigInt, to avoid deep recursion
- local $Math::BigInt::upgrade = undef;
- local $Math::BigFloat::downgrade = undef;
-
- # upgrade $x if $x is not a Math::BigFloat (handle BigInt input)
- # XXX TODO: rebless!
- if (!$x->isa('Math::BigFloat')) {
- $x = Math::BigFloat->new($x);
- $class = ref($x);
- }
+ delete $x->{_a};
+ delete $x->{_p};
$done = 0;
- # If the base is defined and an integer, try to calculate integer result
- # first. This is very fast, and in case the real result was found, we can
- # stop right here.
- if (defined $base && $base->is_int() && $x->is_int()) {
- my $xint = Math::BigInt -> new($x -> bdstr());
- my $bint = Math::BigInt -> new($base -> bdstr());
- $xint->blog($bint);
-
- # if we found the exact result, we're done
- if ($bint -> bpow($xint) == $x) {
- my $xflt = Math::BigFloat -> new($xint -> bdstr());
- $x->{sign} = $xflt->{sign};
- $x->{_m} = $xflt->{_m};
- $x->{_es} = $xflt->{_es};
- $x->{_e} = $xflt->{_e};
+ # If both the invocand and the base are integers, try to calculate integer
+ # result first. This is very fast, and in case the real result was found, we
+ # can stop right here.
+
+ if (defined($base) && $base -> is_int() && $x -> is_int()) {
+ my $x_lib = $LIB -> _new($x -> bdstr());
+ my $b_lib = $LIB -> _new($base -> bdstr());
+ ($x_lib, my $exact) = $LIB -> _log_int($x_lib, $b_lib);
+ if ($exact) {
+ $x->{_m} = $x_lib;
+ $x->{_e} = $LIB -> _zero();
+ $x = $x -> bnorm();
$done = 1;
}
}
- if ($done == 0) {
+ unless ($done) {
+
# First calculate the log to base e (using reduction by 10 and possibly
- # also by 2):
- $x->_log_10($scale);
+ # also by 2), and if a different base was requested, convert the result.
- # and if a different base was requested, convert it
+ $x = $x->_log_10($scale);
if (defined $base) {
- $base = Math::BigFloat->new($base)
- unless $base->isa('Math::BigFloat');
# log_b(x) = ln(x) / ln(b), so compute ln(b)
my $base_log_e = $base->copy()->_log_10($scale);
- $x->bdiv($base_log_e, $scale);
+ $x = $x->bdiv($base_log_e, $scale);
}
}
# shortcut to not run through _find_round_parameters again
if (defined $params[0]) {
- $x->bround($params[0], $params[2]); # then round accordingly
+ $x = $x->bround($params[0], $params[2]); # then round accordingly
} else {
- $x->bfround($params[1], $params[2]); # then round accordingly
+ $x = $x->bfround($params[1], $params[2]); # then round accordingly
}
if ($fallback) {
# clear a/p after round, since user did not request it
@@ -2487,25 +2633,28 @@ sub blog {
$$abr = $ab;
$$pbr = $pb;
- $x;
+ return $downgrade -> new($x -> bdstr(), @r)
+ if defined($downgrade) && $x->is_int();
+ return $x;
}
sub bexp {
# Calculate e ** X (Euler's number to the power of X)
- my ($class, $x, $a, $p, $r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
return $x if $x->modify('bexp');
- return $x->binf() if $x->{sign} eq '+inf';
- return $x->bzero() if $x->{sign} eq '-inf';
+ return $x->bnan(@r) if $x -> is_nan();
+ return $x->binf(@r) if $x->{sign} eq '+inf';
+ return $x->bzero(@r) if $x->{sign} eq '-inf';
# we need to limit the accuracy to protect against overflow
my $fallback = 0;
my ($scale, @params);
- ($x, @params) = $x->_find_round_parameters($a, $p, $r);
+ ($x, @params) = $x->_find_round_parameters(@r);
- # also takes care of the "error in _find_round_parameters?" case
- return $x if $x->{sign} eq 'NaN';
+ # error in _find_round_parameters?
+ return $x->bnan(@r) if $x->{sign} eq 'NaN';
# no rounding at all, so must use fallback
if (scalar @params == 0) {
@@ -2513,7 +2662,7 @@ sub bexp {
$params[0] = $class->div_scale(); # and round to it as accuracy
$params[1] = undef; # P = undef
$scale = $params[0]+4; # at least four more for proper round
- $params[2] = $r; # round mode by caller or undef
+ $params[2] = $r[2]; # round mode by caller or undef
$fallback = 1; # to clear a/p afterwards
} else {
# the 4 below is empirical, and there might be cases where it's not
@@ -2531,13 +2680,21 @@ sub bexp {
# when user set globals, they would interfere with our calculation, so
# disable them and later re-enable them
no strict 'refs';
- my $abr = "$class\::accuracy"; my $ab = $$abr; $$abr = undef;
- my $pbr = "$class\::precision"; my $pb = $$pbr; $$pbr = undef;
+ my $abr = "$class\::accuracy";
+ my $ab = $$abr;
+ $$abr = undef;
+ my $pbr = "$class\::precision";
+ my $pb = $$pbr;
+ $$pbr = undef;
# we also need to disable any set A or P on $x (_find_round_parameters took
# them already into account), since these would interfere, too
delete $x->{_a};
delete $x->{_p};
- # need to disable $upgrade in BigInt, to avoid deep recursion
+
+ # Disabling upgrading and downgrading is no longer necessary to avoid an
+ # infinite recursion, but it avoids unnecessary upgrading and downgrading in
+ # the intermediate computations.
+
local $Math::BigInt::upgrade = undef;
local $Math::BigFloat::downgrade = undef;
@@ -2600,13 +2757,15 @@ sub bexp {
} else {
# compute A and B so that e = A / B.
- # After some terms we end up with this, so we use it as a starting point:
+ # After some terms we end up with this, so we use it as a starting
+ # point:
my $A = $LIB->_new("9093339520860578540197197" .
"0164779391644753259799242");
my $F = $LIB->_new(42);
my $step = 42;
- # Compute how many steps we need to take to get $A and $B sufficiently big
+ # Compute how many steps we need to take to get $A and $B sufficiently
+ # big
my $steps = _len_to_steps($scale - 4);
# print STDERR "# Doing $steps steps for ", $scale-4, " digits\n";
while ($step++ <= $steps) {
@@ -2616,7 +2775,9 @@ sub bexp {
# increment f
$F = $LIB->_inc($F);
}
- # compute $B as factorial of $steps (this is faster than doing it manually)
+
+ # Compute $B as factorial of $steps (this is faster than doing it
+ # manually)
my $B = $LIB->_fac($LIB->_new($steps));
# print "A ", $LIB->_str($A), "\nB ", $LIB->_str($B), "\n";
@@ -2631,7 +2792,8 @@ sub bexp {
$x->{_e} = $LIB->_new($scale);
}
- # $x contains now an estimate of e, with some surplus digits, so we can round
+ # $x contains now an estimate of e, with some surplus digits, so we can
+ # round
if (!$x_org->is_one()) {
# Reduce size of fractional part, followup with integer power of two.
my $lshift = 0;
@@ -2640,10 +2802,11 @@ sub bexp {
}
# Raise $x to the wanted power and round it.
if ($lshift == 0) {
- $x->bpow($x_org, @params);
+ $x = $x->bpow($x_org, @params);
} else {
my($mul, $rescale) = (1 << $lshift, $scale+1+$lshift);
- $x->bpow(scalar $x_org->bdiv($mul, $rescale), $rescale)->bpow($mul, @params);
+ $x = $x -> bpow(scalar $x_org->bdiv($mul, $rescale), $rescale)
+ -> bpow($mul, @params);
}
} else {
# else just round the already computed result
@@ -2651,9 +2814,9 @@ sub bexp {
delete $x->{_p};
# shortcut to not run through _find_round_parameters again
if (defined $params[0]) {
- $x->bround($params[0], $params[2]); # then round accordingly
+ $x = $x->bround($params[0], $params[2]); # then round accordingly
} else {
- $x->bfround($params[1], $params[2]); # then round accordingly
+ $x = $x->bfround($params[1], $params[2]); # then round accordingly
}
}
if ($fallback) {
@@ -2665,18 +2828,19 @@ sub bexp {
$$abr = $ab;
$$pbr = $pb;
- $x; # return modified $x
+ return $downgrade -> new($x -> bdstr(), @r)
+ if defined($downgrade) && $x -> is_int();
+ $x;
}
sub bnok {
# Calculate n over k (binomial coefficient or "choose" function) as integer.
# set up parameters
- my ($class, $x, $y, @r) = (ref($_[0]), @_);
+ my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (ref($_[0]), @_)
+ : objectify(2, @_);
- # objectify is costly, so avoid it
- if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
- ($class, $x, $y, @r) = objectify(2, @_);
- }
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
return $x if $x->modify('bnok');
@@ -2686,7 +2850,10 @@ sub bnok {
my $xint = Math::BigInt -> new($x -> bsstr());
my $yint = Math::BigInt -> new($y -> bsstr());
- $xint -> bnok($yint);
+ $xint = $xint -> bnok($yint);
+
+ return $xint if defined $downgrade;
+
my $xflt = Math::BigFloat -> new($xint);
$x->{_m} = $xflt->{_m};
@@ -2705,15 +2872,18 @@ sub bsin {
# sin = x - --- + --- - --- + --- ...
# 3! 5! 7! 9!
+ return $x if $x->modify('bsin');
+
+ return $x -> bzero(@r) if $x->is_zero();
+ return $x -> bnan(@r) if $x->is_nan() || $x->is_inf();
+
# we need to limit the accuracy to protect against overflow
my $fallback = 0;
my ($scale, @params);
($x, @params) = $x->_find_round_parameters(@r);
- # constant object or error in _find_round_parameters?
- return $x if $x->modify('bsin') || $x->is_nan();
- return $x->bnan() if $x->is_inf();
- return $x->bzero(@r) if $x->is_zero();
+ # error in _find_round_parameters?
+ return $x->bnan(@r) if $x->is_nan();
# no rounding at all, so must use fallback
if (scalar @params == 0) {
@@ -2732,26 +2902,35 @@ sub bsin {
# when user set globals, they would interfere with our calculation, so
# disable them and later re-enable them
no strict 'refs';
- my $abr = "$class\::accuracy"; my $ab = $$abr; $$abr = undef;
- my $pbr = "$class\::precision"; my $pb = $$pbr; $$pbr = undef;
+ my $abr = "$class\::accuracy";
+ my $ab = $$abr;
+ $$abr = undef;
+ my $pbr = "$class\::precision";
+ my $pb = $$pbr;
+ $$pbr = undef;
# we also need to disable any set A or P on $x (_find_round_parameters took
# them already into account), since these would interfere, too
delete $x->{_a};
delete $x->{_p};
- # need to disable $upgrade in BigInt, to avoid deep recursion
+
+ # Disabling upgrading and downgrading is no longer necessary to avoid an
+ # infinite recursion, but it avoids unnecessary upgrading and downgrading in
+ # the intermediate computations.
+
local $Math::BigInt::upgrade = undef;
+ local $Math::BigFloat::downgrade = undef;
my $over = $x * $x; # X ^ 2
my $x2 = $over->copy(); # X ^ 2; difference between terms
- $over->bmul($x); # X ^ 3 as starting value
+ $over = $over->bmul($x); # X ^ 3 as starting value
my $sign = 1; # start with -=
- my $below = $class->new(6); my $factorial = $class->new(4);
+ my $below = $class->new(6);
+ my $factorial = $class->new(4);
delete $x->{_a};
delete $x->{_p};
my $limit = $class->new("1E-". ($scale-1));
- #my $steps = 0;
- while (3 < 5) {
+ while (1) {
# we calculate the next term, and add it to the last
# when the next term is below our limit, it won't affect the outcome
# anymore, so we stop:
@@ -2759,22 +2938,24 @@ sub bsin {
last if $next->bacmp($limit) <= 0;
if ($sign == 0) {
- $x->badd($next);
+ $x = $x->badd($next);
} else {
- $x->bsub($next);
+ $x = $x->bsub($next);
}
$sign = 1-$sign; # alternate
# calculate things for the next term
- $over->bmul($x2); # $x*$x
- $below->bmul($factorial); $factorial->binc(); # n*(n+1)
- $below->bmul($factorial); $factorial->binc(); # n*(n+1)
+ $over = $over->bmul($x2); # $x*$x
+ $below = $below->bmul($factorial); # n*(n+1)
+ $factorial = $factorial->binc();
+ $below = $below -> bmul($factorial); # n*(n+1)
+ $factorial = $factorial->binc();
}
# shortcut to not run through _find_round_parameters again
if (defined $params[0]) {
- $x->bround($params[0], $params[2]); # then round accordingly
+ $x = $x->bround($params[0], $params[2]); # then round accordingly
} else {
- $x->bfround($params[1], $params[2]); # then round accordingly
+ $x = $x->bfround($params[1], $params[2]); # then round accordingly
}
if ($fallback) {
# clear a/p after round, since user did not request it
@@ -2784,6 +2965,9 @@ sub bsin {
# restore globals
$$abr = $ab;
$$pbr = $pb;
+
+ return $downgrade -> new($x -> bdstr(), @r)
+ if defined($downgrade) && $x -> is_int();
$x;
}
@@ -2822,20 +3006,23 @@ sub bcos {
# when user set globals, they would interfere with our calculation, so
# disable them and later re-enable them
no strict 'refs';
- my $abr = "$class\::accuracy"; my $ab = $$abr; $$abr = undef;
- my $pbr = "$class\::precision"; my $pb = $$pbr; $$pbr = undef;
+ my $abr = "$class\::accuracy";
+ my $ab = $$abr;
+ $$abr = undef;
+ my $pbr = "$class\::precision";
+ my $pb = $$pbr;
+ $$pbr = undef;
# we also need to disable any set A or P on $x (_find_round_parameters took
# them already into account), since these would interfere, too
- delete $x->{_a}; delete $x->{_p};
- # need to disable $upgrade in BigInt, to avoid deep recursion
- local $Math::BigInt::upgrade = undef;
+ delete $x->{_a};
+ delete $x->{_p};
my $over = $x * $x; # X ^ 2
my $x2 = $over->copy(); # X ^ 2; difference between terms
my $sign = 1; # start with -=
my $below = $class->new(2);
my $factorial = $class->new(3);
- $x->bone();
+ $x = $x->bone();
delete $x->{_a};
delete $x->{_p};
@@ -2849,22 +3036,24 @@ sub bcos {
last if $next->bacmp($limit) <= 0;
if ($sign == 0) {
- $x->badd($next);
+ $x = $x->badd($next);
} else {
- $x->bsub($next);
+ $x = $x->bsub($next);
}
$sign = 1-$sign; # alternate
# calculate things for the next term
- $over->bmul($x2); # $x*$x
- $below->bmul($factorial); $factorial->binc(); # n*(n+1)
- $below->bmul($factorial); $factorial->binc(); # n*(n+1)
+ $over = $over->bmul($x2); # $x*$x
+ $below = $below->bmul($factorial); # n*(n+1)
+ $factorial = $factorial -> binc();
+ $below = $below->bmul($factorial); # n*(n+1)
+ $factorial = $factorial -> binc();
}
# shortcut to not run through _find_round_parameters again
if (defined $params[0]) {
- $x->bround($params[0], $params[2]); # then round accordingly
+ $x = $x->bround($params[0], $params[2]); # then round accordingly
} else {
- $x->bfround($params[1], $params[2]); # then round accordingly
+ $x = $x->bfround($params[1], $params[2]); # then round accordingly
}
if ($fallback) {
# clear a/p after round, since user did not request it
@@ -2874,48 +3063,50 @@ sub bcos {
# restore globals
$$abr = $ab;
$$pbr = $pb;
+
+ return $downgrade -> new($x -> bdstr(), @r)
+ if defined($downgrade) && $x -> is_int();
$x;
}
sub batan {
# Calculate a arcus tangens of x.
-
- my $self = shift;
- my $selfref = ref $self;
- my $class = $selfref || $self;
-
- my (@r) = @_;
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
# taylor: x^3 x^5 x^7 x^9
# atan = x - --- + --- - --- + --- ...
# 3 5 7 9
+ return $x if $x->modify('batan');
+
+ return $x -> bnan(@r) if $x->is_nan();
+
# We need to limit the accuracy to protect against overflow.
my $fallback = 0;
my ($scale, @params);
- ($self, @params) = $self->_find_round_parameters(@r);
+ ($x, @params) = $x->_find_round_parameters(@r);
- # Constant object or error in _find_round_parameters?
+ # Error in _find_round_parameters?
- return $self if $self->modify('batan') || $self->is_nan();
+ return $x -> bnan(@r) if $x->is_nan();
- if ($self->{sign} =~ /^[+-]inf\z/) {
+ if ($x->{sign} =~ /^[+-]inf\z/) {
# +inf result is PI/2
# -inf result is -PI/2
# calculate PI/2
my $pi = $class->bpi(@r);
- # modify $self in place
- $self->{_m} = $pi->{_m};
- $self->{_e} = $pi->{_e};
- $self->{_es} = $pi->{_es};
+ # modify $x in place
+ $x->{_m} = $pi->{_m};
+ $x->{_e} = $pi->{_e};
+ $x->{_es} = $pi->{_es};
# -y => -PI/2, +y => PI/2
- $self->{sign} = substr($self->{sign}, 0, 1); # "+inf" => "+"
- $self -> {_m} = $LIB->_div($self->{_m}, $LIB->_new(2));
- return $self;
+ $x->{sign} = substr($x->{sign}, 0, 1); # "+inf" => "+"
+ $x -> {_m} = $LIB->_div($x->{_m}, $LIB->_new(2));
+ return $x;
}
- return $self->bzero(@r) if $self->is_zero();
+ return $x->bzero(@r) if $x->is_zero();
# no rounding at all, so must use fallback
if (scalar @params == 0) {
@@ -2933,57 +3124,67 @@ sub batan {
# 1 or -1 => PI/4
# inlined is_one() && is_one('-')
- if ($LIB->_is_one($self->{_m}) && $LIB->_is_zero($self->{_e})) {
+ if ($LIB->_is_one($x->{_m}) && $LIB->_is_zero($x->{_e})) {
my $pi = $class->bpi($scale - 3);
- # modify $self in place
- $self->{_m} = $pi->{_m};
- $self->{_e} = $pi->{_e};
- $self->{_es} = $pi->{_es};
- # leave the sign of $self alone (+1 => +PI/4, -1 => -PI/4)
- $self->{_m} = $LIB->_div($self->{_m}, $LIB->_new(4));
- return $self;
+ # modify $x in place
+ $x->{_m} = $pi->{_m};
+ $x->{_e} = $pi->{_e};
+ $x->{_es} = $pi->{_es};
+ # leave the sign of $x alone (+1 => +PI/4, -1 => -PI/4)
+ $x->{_m} = $LIB->_div($x->{_m}, $LIB->_new(4));
+ return $x;
}
# This series is only valid if -1 < x < 1, so for other x we need to
# calculate PI/2 - atan(1/x):
my $pi = undef;
- if ($self->bacmp($self->copy()->bone) >= 0) {
+ if ($x->bacmp($x->copy()->bone) >= 0) {
# calculate PI/2
$pi = $class->bpi($scale - 3);
$pi->{_m} = $LIB->_div($pi->{_m}, $LIB->_new(2));
- # calculate 1/$self:
- my $self_copy = $self->copy();
- # modify $self in place
- $self->bone();
- $self->bdiv($self_copy, $scale);
+ # calculate 1/$x:
+ my $x_copy = $x->copy();
+ # modify $x in place
+ $x = $x->bone();
+ $x = $x->bdiv($x_copy, $scale);
}
my $fmul = 1;
foreach (0 .. int($scale / 20)) {
$fmul *= 2;
- $self->bdiv($self->copy()->bmul($self)->binc->bsqrt($scale + 4)->binc, $scale + 4);
+ $x = $x->bdiv($x->copy()->bmul($x)->binc()->bsqrt($scale + 4)->binc(),
+ $scale + 4);
}
# When user set globals, they would interfere with our calculation, so
# disable them and later re-enable them.
no strict 'refs';
- my $abr = "$class\::accuracy"; my $ab = $$abr; $$abr = undef;
- my $pbr = "$class\::precision"; my $pb = $$pbr; $$pbr = undef;
- # We also need to disable any set A or P on $self (_find_round_parameters
+ my $abr = "$class\::accuracy";
+ my $ab = $$abr;
+ $$abr = undef;
+ my $pbr = "$class\::precision";
+ my $pb = $$pbr;
+ $$pbr = undef;
+ # We also need to disable any set A or P on $x (_find_round_parameters
# took them already into account), since these would interfere, too
- delete $self->{_a};
- delete $self->{_p};
- # Need to disable $upgrade in BigInt, to avoid deep recursion.
+ delete $x->{_a};
+ delete $x->{_p};
+
+ # Disabling upgrading and downgrading is no longer necessary to avoid an
+ # infinite recursion, but it avoids unnecessary upgrading and downgrading in
+ # the intermediate computations.
+
local $Math::BigInt::upgrade = undef;
+ local $Math::BigFloat::downgrade = undef;
- my $over = $self * $self; # X ^ 2
- my $self2 = $over->copy(); # X ^ 2; difference between terms
- $over->bmul($self); # X ^ 3 as starting value
+ my $over = $x * $x; # X ^ 2
+ my $x2 = $over->copy(); # X ^ 2; difference between terms
+ $over = $over->bmul($x); # X ^ 3 as starting value
my $sign = 1; # start with -=
my $below = $class->new(3);
my $two = $class->new(2);
- delete $self->{_a};
- delete $self->{_p};
+ delete $x->{_a};
+ delete $x->{_p};
my $limit = $class->new("1E-". ($scale-1));
#my $steps = 0;
@@ -2995,55 +3196,55 @@ sub batan {
last if $next->bacmp($limit) <= 0;
if ($sign == 0) {
- $self->badd($next);
+ $x = $x->badd($next);
} else {
- $self->bsub($next);
+ $x = $x->bsub($next);
}
$sign = 1-$sign; # alternatex
# calculate things for the next term
- $over->bmul($self2); # $self*$self
- $below->badd($two); # n += 2
+ $over = $over->bmul($x2); # $x*$x
+ $below = $below->badd($two); # n += 2
}
- $self->bmul($fmul);
+ $x = $x->bmul($fmul);
if (defined $pi) {
- my $self_copy = $self->copy();
- # modify $self in place
- $self->{_m} = $pi->{_m};
- $self->{_e} = $pi->{_e};
- $self->{_es} = $pi->{_es};
- # PI/2 - $self
- $self->bsub($self_copy);
+ my $x_copy = $x->copy();
+ # modify $x in place
+ $x->{_m} = $pi->{_m};
+ $x->{_e} = $pi->{_e};
+ $x->{_es} = $pi->{_es};
+ # PI/2 - $x
+ $x = $x->bsub($x_copy);
}
# Shortcut to not run through _find_round_parameters again.
if (defined $params[0]) {
- $self->bround($params[0], $params[2]); # then round accordingly
+ $x = $x->bround($params[0], $params[2]); # then round accordingly
} else {
- $self->bfround($params[1], $params[2]); # then round accordingly
+ $x = $x->bfround($params[1], $params[2]); # then round accordingly
}
if ($fallback) {
# Clear a/p after round, since user did not request it.
- delete $self->{_a};
- delete $self->{_p};
+ delete $x->{_a};
+ delete $x->{_p};
}
# restore globals
$$abr = $ab;
$$pbr = $pb;
- $self;
+
+ return $downgrade -> new($x -> bdstr(), @r)
+ if defined($downgrade) && ($x -> is_int() || $x -> is_inf());
+ $x;
}
sub batan2 {
# $y -> batan2($x) returns the arcus tangens of $y / $x.
# Set up parameters.
- my ($class, $y, $x, @r) = (ref($_[0]), @_);
-
- # Objectify is costly, so avoid it if we can.
- if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
- ($class, $y, $x, @r) = objectify(2, @_);
- }
+ my ($class, $y, $x, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (ref($_[0]), @_)
+ : objectify(2, @_);
# Quick exit if $y is read-only.
return $y if $y -> modify('batan2');
@@ -3073,52 +3274,52 @@ sub batan2 {
$scale = abs($params[0] || $params[1]) + 4; # take whatever is defined
}
- if ($x -> is_inf("+")) { # x = inf
- if ($y -> is_inf("+")) { # y = inf
- $y -> bpi($scale) -> bmul("0.25"); # pi/4
- } elsif ($y -> is_inf("-")) { # y = -inf
- $y -> bpi($scale) -> bmul("-0.25"); # -pi/4
- } else { # -inf < y < inf
- return $y -> bzero(@r); # 0
- }
- } elsif ($x -> is_inf("-")) { # x = -inf
- if ($y -> is_inf("+")) { # y = inf
- $y -> bpi($scale) -> bmul("0.75"); # 3/4 pi
- } elsif ($y -> is_inf("-")) { # y = -inf
- $y -> bpi($scale) -> bmul("-0.75"); # -3/4 pi
- } elsif ($y >= 0) { # y >= 0
- $y -> bpi($scale); # pi
- } else { # y < 0
- $y -> bpi($scale) -> bneg(); # -pi
- }
- } elsif ($x > 0) { # 0 < x < inf
- if ($y -> is_inf("+")) { # y = inf
- $y -> bpi($scale) -> bmul("0.5"); # pi/2
- } elsif ($y -> is_inf("-")) { # y = -inf
- $y -> bpi($scale) -> bmul("-0.5"); # -pi/2
- } else { # -inf < y < inf
- $y -> bdiv($x, $scale) -> batan($scale); # atan(y/x)
+ if ($x -> is_inf("+")) { # x = inf
+ if ($y -> is_inf("+")) { # y = inf
+ $y = $y -> bpi($scale) -> bmul("0.25"); # pi/4
+ } elsif ($y -> is_inf("-")) { # y = -inf
+ $y = $y -> bpi($scale) -> bmul("-0.25"); # -pi/4
+ } else { # -inf < y < inf
+ return $y -> bzero(@r); # 0
+ }
+ } elsif ($x -> is_inf("-")) { # x = -inf
+ if ($y -> is_inf("+")) { # y = inf
+ $y = $y -> bpi($scale) -> bmul("0.75"); # 3/4 pi
+ } elsif ($y -> is_inf("-")) { # y = -inf
+ $y = $y -> bpi($scale) -> bmul("-0.75"); # -3/4 pi
+ } elsif ($y >= 0) { # y >= 0
+ $y = $y -> bpi($scale); # pi
+ } else { # y < 0
+ $y = $y -> bpi($scale) -> bneg(); # -pi
+ }
+ } elsif ($x > 0) { # 0 < x < inf
+ if ($y -> is_inf("+")) { # y = inf
+ $y = $y -> bpi($scale) -> bmul("0.5"); # pi/2
+ } elsif ($y -> is_inf("-")) { # y = -inf
+ $y = $y -> bpi($scale) -> bmul("-0.5"); # -pi/2
+ } else { # -inf < y < inf
+ $y = $y -> bdiv($x, $scale) -> batan($scale); # atan(y/x)
}
- } elsif ($x < 0) { # -inf < x < 0
+ } elsif ($x < 0) { # -inf < x < 0
my $pi = $class -> bpi($scale);
- if ($y >= 0) { # y >= 0
- $y -> bdiv($x, $scale) -> batan() # atan(y/x) + pi
+ if ($y >= 0) { # y >= 0
+ $y = $y -> bdiv($x, $scale) -> batan() # atan(y/x) + pi
-> badd($pi);
- } else { # y < 0
- $y -> bdiv($x, $scale) -> batan() # atan(y/x) - pi
+ } else { # y < 0
+ $y = $y -> bdiv($x, $scale) -> batan() # atan(y/x) - pi
-> bsub($pi);
}
- } else { # x = 0
- if ($y > 0) { # y > 0
- $y -> bpi($scale) -> bmul("0.5"); # pi/2
- } elsif ($y < 0) { # y < 0
- $y -> bpi($scale) -> bmul("-0.5"); # -pi/2
- } else { # y = 0
- return $y -> bzero(@r); # 0
+ } else { # x = 0
+ if ($y > 0) { # y > 0
+ $y = $y -> bpi($scale) -> bmul("0.5"); # pi/2
+ } elsif ($y < 0) { # y < 0
+ $y = $y -> bpi($scale) -> bmul("-0.5"); # -pi/2
+ } else { # y = 0
+ return $y -> bzero(@r); # 0
}
}
- $y -> round(@r);
+ $y = $y -> round(@r);
if ($fallback) {
delete $y->{_a};
@@ -3127,31 +3328,40 @@ sub batan2 {
return $y;
}
-##############################################################################
sub bsqrt {
# calculate square root
- my ($class, $x, $a, $p, $r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
return $x if $x->modify('bsqrt');
- return $x->bnan() if $x->{sign} !~ /^\+/; # NaN, -inf or < 0
- return $x if $x->{sign} eq '+inf'; # sqrt(inf) == inf
- return $x->round($a, $p, $r) if $x->is_zero() || $x->is_one();
+ # Handle trivial cases.
+
+ return $x -> bnan(@r) if $x->is_nan();
+ return $x -> binf("+", @r) if $x->{sign} eq '+inf';
+ return $x -> round(@r) if $x->is_zero() || $x->is_one();
+
+ # We don't support complex numbers.
+
+ if ($x -> is_neg()) {
+ return $upgrade -> bsqrt($x, @r) if defined($upgrade);
+ return $x -> bnan(@r);
+ }
# we need to limit the accuracy to protect against overflow
my $fallback = 0;
my (@params, $scale);
- ($x, @params) = $x->_find_round_parameters($a, $p, $r);
+ ($x, @params) = $x->_find_round_parameters(@r);
- return $x if $x->is_nan(); # error in _find_round_parameters?
+ # error in _find_round_parameters?
+ return $x -> bnan(@r) if $x->is_nan();
# no rounding at all, so must use fallback
if (scalar @params == 0) {
# simulate old behaviour
$params[0] = $class->div_scale(); # and round to it as accuracy
$scale = $params[0]+4; # at least four more for proper round
- $params[2] = $r; # round mode by caller or undef
+ $params[2] = $r[2]; # round mode by caller or undef
$fallback = 1; # to clear a/p afterwards
} else {
# the 4 below is empirical, and there might be cases where it is not
@@ -3162,14 +3372,23 @@ sub bsqrt {
# when user set globals, they would interfere with our calculation, so
# disable them and later re-enable them
no strict 'refs';
- my $abr = "$class\::accuracy"; my $ab = $$abr; $$abr = undef;
- my $pbr = "$class\::precision"; my $pb = $$pbr; $$pbr = undef;
+ my $abr = "$class\::accuracy";
+ my $ab = $$abr;
+ $$abr = undef;
+ my $pbr = "$class\::precision";
+ my $pb = $$pbr;
+ $$pbr = undef;
# we also need to disable any set A or P on $x (_find_round_parameters took
# them already into account), since these would interfere, too
delete $x->{_a};
delete $x->{_p};
- # need to disable $upgrade in BigInt, to avoid deep recursion
- local $Math::BigInt::upgrade = undef; # should be really parent class vs MBI
+
+ # Disabling upgrading and downgrading is no longer necessary to avoid an
+ # infinite recursion, but it avoids unnecessary upgrading and downgrading in
+ # the intermediate computations.
+
+ local $Math::BigInt::upgrade = undef;
+ local $Math::BigFloat::downgrade = undef;
my $i = $LIB->_copy($x->{_m});
$i = $LIB->_lsft($i, $x->{_e}, 10) unless $LIB->_is_zero($x->{_e});
@@ -3186,12 +3405,12 @@ sub bsqrt {
$x->{_m} = $gs->{value};
$x->{_e} = $LIB->_zero();
$x->{_es} = '+';
- $x->bnorm();
+ $x = $x->bnorm();
# shortcut to not run through _find_round_parameters again
if (defined $params[0]) {
- $x->bround($params[0], $params[2]); # then round accordingly
+ $x = $x->bround($params[0], $params[2]); # then round accordingly
} else {
- $x->bfround($params[1], $params[2]); # then round accordingly
+ $x = $x->bfround($params[1], $params[2]); # then round accordingly
}
if ($fallback) {
# clear a/p after round, since user did not request it
@@ -3204,9 +3423,10 @@ sub bsqrt {
return $x;
}
- # sqrt(2) = 1.4 because sqrt(2*100) = 1.4*10; so we can increase the accuracy
- # of the result by multiplying the input by 100 and then divide the integer
- # result of sqrt(input) by 10. Rounding afterwards returns the real result.
+ # sqrt(2) = 1.4 because sqrt(2*100) = 1.4*10; so we can increase the
+ # accuracy of the result by multiplying the input by 100 and then divide the
+ # integer result of sqrt(input) by 10. Rounding afterwards returns the real
+ # result.
# The following steps will transform 123.456 (in $x) into 123456 (in $y1)
my $y1 = $LIB->_copy($x->{_m});
@@ -3266,13 +3486,13 @@ sub bsqrt {
$x->{_es} = '+';
}
$x->{_m} = $y1;
- $x->bnorm();
+ $x = $x->bnorm();
# shortcut to not run through _find_round_parameters again
if (defined $params[0]) {
- $x->bround($params[0], $params[2]); # then round accordingly
+ $x = $x->bround($params[0], $params[2]); # then round accordingly
} else {
- $x->bfround($params[1], $params[2]); # then round accordingly
+ $x = $x->bfround($params[1], $params[2]); # then round accordingly
}
if ($fallback) {
# clear a/p after round, since user did not request it
@@ -3282,6 +3502,9 @@ sub bsqrt {
# restore globals
$$abr = $ab;
$$pbr = $pb;
+
+ return $downgrade -> new($x -> bdstr(), @r)
+ if defined($downgrade) && ($x -> is_int() || $x -> is_inf());
$x;
}
@@ -3289,14 +3512,24 @@ sub broot {
# calculate $y'th root of $x
# set up parameters
- my ($class, $x, $y, $a, $p, $r) = (ref($_[0]), @_);
- # objectify is costly, so avoid it
- if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
- ($class, $x, $y, $a, $p, $r) = objectify(2, @_);
- }
+ my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (ref($_[0]), @_)
+ : objectify(2, @_);
return $x if $x->modify('broot');
+ # Handle trivial cases.
+
+ return $x -> bnan(@r) if $x->is_nan() || $y->is_nan();
+
+ if ($x -> is_neg()) {
+ # -27 ** (1/3) = -3
+ return $x -> broot($y -> copy() -> bneg(), @r) -> bneg()
+ if $x -> is_int() && $y -> is_int() && $y -> is_neg();
+ return $upgrade -> broot($x, $y, @r) if defined $upgrade;
+ return $x -> bnan(@r);
+ }
+
# NaN handling: $x ** 1/0, x or y NaN, or y inf/-inf or y == 0
return $x->bnan() if $x->{sign} !~ /^\+/ || $y->is_zero() ||
$y->{sign} !~ /^\+$/;
@@ -3306,7 +3539,7 @@ sub broot {
# we need to limit the accuracy to protect against overflow
my $fallback = 0;
my (@params, $scale);
- ($x, @params) = $x->_find_round_parameters($a, $p, $r);
+ ($x, @params) = $x->_find_round_parameters(@r);
return $x if $x->is_nan(); # error in _find_round_parameters?
@@ -3315,7 +3548,7 @@ sub broot {
# simulate old behaviour
$params[0] = $class->div_scale(); # and round to it as accuracy
$scale = $params[0]+4; # at least four more for proper round
- $params[2] = $r; # round mode by caller or undef
+ $params[2] = $r[2]; # round mode by caller or undef
$fallback = 1; # to clear a/p afterwards
} else {
# the 4 below is empirical, and there might be cases where it is not
@@ -3326,14 +3559,23 @@ sub broot {
# when user set globals, they would interfere with our calculation, so
# disable them and later re-enable them
no strict 'refs';
- my $abr = "$class\::accuracy"; my $ab = $$abr; $$abr = undef;
- my $pbr = "$class\::precision"; my $pb = $$pbr; $$pbr = undef;
+ my $abr = "$class\::accuracy";
+ my $ab = $$abr;
+ $$abr = undef;
+ my $pbr = "$class\::precision";
+ my $pb = $$pbr;
+ $$pbr = undef;
# we also need to disable any set A or P on $x (_find_round_parameters took
# them already into account), since these would interfere, too
delete $x->{_a};
delete $x->{_p};
- # need to disable $upgrade in BigInt, to avoid deep recursion
- local $Math::BigInt::upgrade = undef; # should be really parent class vs MBI
+
+ # Disabling upgrading and downgrading is no longer necessary to avoid an
+ # infinite recursion, but it avoids unnecessary upgrading and downgrading in
+ # the intermediate computations.
+
+ local $Math::BigInt::upgrade = undef;
+ local $Math::BigFloat::downgrade = undef;
# remember sign and make $x positive, since -4 ** (1/2) => -2
my $sign = 0;
@@ -3342,14 +3584,15 @@ sub broot {
my $is_two = 0;
if ($y->isa('Math::BigFloat')) {
- $is_two = ($y->{sign} eq '+' && $LIB->_is_two($y->{_m}) && $LIB->_is_zero($y->{_e}));
+ $is_two = $y->{sign} eq '+' && $LIB->_is_two($y->{_m})
+ && $LIB->_is_zero($y->{_e});
} else {
- $is_two = ($y == 2);
+ $is_two = $y == 2;
}
# normal square root if $y == 2:
if ($is_two) {
- $x->bsqrt($scale+4);
+ $x = $x->bsqrt($scale+4);
} elsif ($y->is_one('-')) {
# $x ** -1 => 1/$x
my $u = $class->bone()->bdiv($x, $scale);
@@ -3367,30 +3610,31 @@ sub broot {
$i = $LIB->_lsft($i, $x->{_e}, 10) unless $LIB->_is_zero($x->{_e});
my $int = Math::BigInt->bzero();
$int->{value} = $i;
- $int->broot($y->as_number());
+ $int = $int->broot($y->as_number());
# if ($exact)
if ($int->copy()->bpow($y) == $x) {
# found result, return it
$x->{_m} = $int->{value};
$x->{_e} = $LIB->_zero();
$x->{_es} = '+';
- $x->bnorm();
+ $x = $x->bnorm();
$done = 1;
}
}
if ($done == 0) {
my $u = $class->bone()->bdiv($y, $scale+4);
- delete $u->{_a}; delete $u->{_p}; # otherwise it conflicts
- $x->bpow($u, $scale+4); # el cheapo
+ delete $u->{_a};
+ delete $u->{_p};
+ $x = $x->bpow($u, $scale+4); # el cheapo
}
}
- $x->bneg() if $sign == 1;
+ $x = $x->bneg() if $sign == 1;
# shortcut to not run through _find_round_parameters again
if (defined $params[0]) {
- $x->bround($params[0], $params[2]); # then round accordingly
+ $x = $x->bround($params[0], $params[2]); # then round accordingly
} else {
- $x->bfround($params[1], $params[2]); # then round accordingly
+ $x = $x->bfround($params[1], $params[2]); # then round accordingly
}
if ($fallback) {
# clear a/p after round, since user did not request it
@@ -3400,6 +3644,9 @@ sub broot {
# restore globals
$$abr = $ab;
$$pbr = $pb;
+
+ return $downgrade -> new($x -> bdstr(), @r)
+ if defined($downgrade) && ($x -> is_int() || $x -> is_inf());
$x;
}
@@ -3408,16 +3655,19 @@ sub bfac {
# compute factorial number, modifies first argument
# set up parameters
- my ($class, $x, @r) = (ref($_[0]), @_);
- # objectify is costly, so avoid it
- ($class, $x, @r) = objectify(1, @_) if !ref($x);
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
# inf => inf
- return $x if $x->modify('bfac') || $x->{sign} eq '+inf';
+ return $x if $x->modify('bfac');
- return $x->bnan()
- if (($x->{sign} ne '+') || # inf, NaN, <0 etc => NaN
- ($x->{_es} ne '+')); # digits after dot?
+ return $x -> bnan(@r) if $x->is_nan() || $x->is_inf("-");
+ return $x -> binf("+", @r) if $x->is_inf("+");
+ return $x -> bone(@r) if $x->is_zero() || $x->is_one();
+
+ if ($x -> is_neg() || !$x -> is_int()) {
+ return $upgrade -> bfac($x, @r) if defined($upgrade);
+ return $x -> bnan(@r);
+ }
if (! $LIB->_is_zero($x->{_e})) {
$x->{_m} = $LIB->_lsft($x->{_m}, $x->{_e}, 10); # change 12e1 to 120e0
@@ -3425,23 +3675,30 @@ sub bfac {
$x->{_es} = '+';
}
$x->{_m} = $LIB->_fac($x->{_m}); # calculate factorial
- $x->bnorm()->round(@r); # norm again and round result
+
+ $x = $x->bnorm()->round(@r); # norm again and round result
+
+ return $downgrade -> new($x -> bdstr(), @r) if defined($downgrade)
+ && ($x -> is_int() || $x -> is_inf());
+ $x;
}
sub bdfac {
# compute double factorial
# set up parameters
- my ($class, $x, @r) = (ref($_[0]), @_);
- # objectify is costly, so avoid it
- ($class, $x, @r) = objectify(1, @_) if !ref($x);
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
- # inf => inf
- return $x if $x->modify('bdfac') || $x->{sign} eq '+inf';
+ return $x if $x->modify('bdfac');
+
+ return $x -> bnan(@r) if $x->is_nan() || $x->is_inf("-");
+ return $x -> binf("+", @r) if $x->is_inf("+");
+
+ if ($x <= -2 || !$x -> is_int()) {
+ return $upgrade -> bdfac($x, @r) if defined($upgrade);
+ return $x -> bnan(@r);
+ }
- return $x->bnan() if ($x->is_nan() ||
- $x->{_es} ne '+'); # digits after dot?
- return $x->bnan() if $x <= -2;
return $x->bone() if $x <= 1;
croak("bdfac() requires a newer version of the $LIB library.")
@@ -3453,108 +3710,137 @@ sub bdfac {
$x->{_es} = '+';
}
$x->{_m} = $LIB->_dfac($x->{_m}); # calculate factorial
- $x->bnorm()->round(@r); # norm again and round result
+
+ $x = $x->bnorm()->round(@r); # norm again and round result
+
+ return $downgrade -> new($x -> bdstr(), @r)
+ if defined($downgrade) && $x -> is_int();
+ return $x;
}
sub btfac {
# compute triple factorial
# set up parameters
- my ($class, $x, @r) = (ref($_[0]), @_);
- # objectify is costly, so avoid it
- ($class, $x, @r) = objectify(1, @_) if !ref($x);
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
- # inf => inf
- return $x if $x->modify('btfac') || $x->{sign} eq '+inf';
+ return $x if $x->modify('btfac');
+
+ return $x -> bnan(@r) if $x->is_nan() || $x->is_inf("-");
+ return $x -> binf("+", @r) if $x->is_inf("+");
- return $x->bnan() if ($x->is_nan() ||
- $x->{_es} ne '+'); # digits after dot?
+ if ($x <= -3 || !$x -> is_int()) {
+ return $upgrade -> btfac($x, @r) if defined($upgrade);
+ return $x -> bnan(@r);
+ }
my $k = $class -> new("3");
- return $x->bnan() if $x <= -$k;
+ return $x->bnan(@r) if $x <= -$k;
my $one = $class -> bone();
- return $x->bone() if $x <= $one;
+ return $x->bone(@r) if $x <= $one;
my $f = $x -> copy();
while ($f -> bsub($k) > $one) {
- $x -> bmul($f);
+ $x = $x -> bmul($f);
}
- $x->round(@r);
+
+ $x = $x->round(@r);
+
+ return $downgrade -> new($x -> bdstr(), @r)
+ if defined($downgrade) && $x -> is_int();
+ return $x;
}
sub bmfac {
- my ($class, $x, $k, @r) = objectify(2, @_);
+ my ($class, $x, $k, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (ref($_[0]), @_)
+ : objectify(2, @_);
- # inf => inf
- return $x if $x->modify('bmfac') || $x->{sign} eq '+inf';
+ return $x if $x->modify('bmfac');
- return $x->bnan() if ($x->is_nan() || $k->is_nan() ||
- $k < 1 || $x <= -$k ||
- $x->{_es} ne '+' || $k->{_es} ne '+');
+ return $x -> bnan(@r) if $x->is_nan() || $x->is_inf("-") || !$k->is_pos();
+ return $x -> binf("+", @r) if $x->is_inf("+");
- return $x->bnan() if $x <= -$k;
+ if ($x <= -$k || !$x -> is_int() ||
+ ($k -> is_finite() && !$k -> is_int()))
+ {
+ return $upgrade -> bmfac($x, $k, @r) if defined($upgrade);
+ return $x -> bnan(@r);
+ }
my $one = $class -> bone();
- return $x->bone() if $x <= $one;
+ return $x->bone(@r) if $x <= $one;
my $f = $x -> copy();
while ($f -> bsub($k) > $one) {
- $x -> bmul($f);
+ $x = $x -> bmul($f);
}
- $x->round(@r);
+
+ $x = $x->round(@r);
+
+ return $downgrade -> new($x -> bdstr(), @r)
+ if defined($downgrade) && $x -> is_int();
+ return $x;
}
sub blsft {
# shift left by $y (multiply by $b ** $y)
# set up parameters
- my ($class, $x, $y, $b, $a, $p, $r) = (ref($_[0]), @_);
-
- # objectify is costly, so avoid it
- if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
- ($class, $x, $y, $b, $a, $p, $r) = objectify(2, @_);
- }
+ my ($class, $x, $y, $b, @r)
+ = ref($_[0]) && ref($_[0]) eq ref($_[1]) && ref($_[1]) eq ref($_[2])
+ ? (ref($_[0]), @_)
+ : objectify(2, @_);
return $x if $x -> modify('blsft');
- return $x if $x -> {sign} !~ /^[+-]$/; # nan, +inf, -inf
+
+ return $x -> bnan(@r) if $x -> is_nan() || $y -> is_nan();
$b = 2 if !defined $b;
$b = $class -> new($b) unless ref($b) && $b -> isa($class);
+ return $x -> bnan(@r) if $b -> is_nan();
- return $x -> bnan() if $x -> is_nan() || $y -> is_nan() || $b -> is_nan();
+ # There needs to be more checking for special cases here. Fixme!
# shift by a negative amount?
return $x -> brsft($y -> copy() -> babs(), $b) if $y -> {sign} =~ /^-/;
- $x -> bmul($b -> bpow($y), $a, $p, $r, $y);
+ $x = $x -> bmul($b -> bpow($y), $r[0], $r[1], $r[2], $y);
+
+ return $downgrade -> new($x -> bdstr(), @r) if defined($downgrade)
+ && ($x -> is_int() || $x -> is_inf() || $x -> is_nan());
+ return $x;
}
sub brsft {
# shift right by $y (divide $b ** $y)
# set up parameters
- my ($class, $x, $y, $b, $a, $p, $r) = (ref($_[0]), @_);
-
- # objectify is costly, so avoid it
- if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
- ($class, $x, $y, $b, $a, $p, $r) = objectify(2, @_);
- }
+ my ($class, $x, $y, $b, @r)
+ = ref($_[0]) && ref($_[0]) eq ref($_[1]) && ref($_[1]) eq ref($_[2])
+ ? (ref($_[0]), @_)
+ : objectify(2, @_);
return $x if $x -> modify('brsft');
- return $x if $x -> {sign} !~ /^[+-]$/; # nan, +inf, -inf
+
+ return $x -> bnan(@r) if $x -> is_nan() || $y -> is_nan();
+
+ # There needs to be more checking for special cases here. Fixme!
$b = 2 if !defined $b;
$b = $class -> new($b) unless ref($b) && $b -> isa($class);
-
- return $x -> bnan() if $x -> is_nan() || $y -> is_nan() || $b -> is_nan();
+ return $x -> bnan(@r) if $b -> is_nan();
# shift by a negative amount?
return $x -> blsft($y -> copy() -> babs(), $b) if $y -> {sign} =~ /^-/;
- # the following call to bdiv() will return either quotient (scalar context)
- # or quotient and remainder (list context).
- $x -> bdiv($b -> bpow($y), $a, $p, $r, $y);
+ # call bdiv()
+ $x = $x -> bdiv($b -> bpow($y), $r[0], $r[1], $r[2], $y);
+
+ return $downgrade -> new($x -> bdstr(), @r) if defined($downgrade)
+ && ($x -> is_int() || $x -> is_inf() || $x -> is_nan());
+ return $x;
}
###############################################################################
@@ -3562,24 +3848,20 @@ sub brsft {
###############################################################################
sub band {
- my $x = shift;
- my $xref = ref($x);
- my $class = $xref || $x;
-
- croak 'band() is an instance method, not a class method' unless $xref;
- croak 'Not enough arguments for band()' if @_ < 1;
+ my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (ref($_[0]), @_)
+ : objectify(2, @_);
return if $x -> modify('band');
- my $y = shift;
- $y = $class -> new($y) unless ref($y);
-
- my @r = @_;
+ return $x -> bnan(@r) if $x -> is_nan() || $y -> is_nan();
my $xtmp = Math::BigInt -> new($x -> bint()); # to Math::BigInt
- $xtmp -> band($y);
- $xtmp = $class -> new($xtmp); # back to Math::BigFloat
+ $xtmp = $xtmp -> band($y);
+ return $xtmp -> round(@r) if defined $downgrade;
+
+ $xtmp = $class -> new($xtmp); # back to Math::BigFloat
$x -> {sign} = $xtmp -> {sign};
$x -> {_m} = $xtmp -> {_m};
$x -> {_es} = $xtmp -> {_es};
@@ -3589,24 +3871,20 @@ sub band {
}
sub bior {
- my $x = shift;
- my $xref = ref($x);
- my $class = $xref || $x;
-
- croak 'bior() is an instance method, not a class method' unless $xref;
- croak 'Not enough arguments for bior()' if @_ < 1;
+ my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (ref($_[0]), @_)
+ : objectify(2, @_);
return if $x -> modify('bior');
- my $y = shift;
- $y = $class -> new($y) unless ref($y);
-
- my @r = @_;
+ return $x -> bnan(@r) if $x -> is_nan() || $y -> is_nan();
my $xtmp = Math::BigInt -> new($x -> bint()); # to Math::BigInt
- $xtmp -> bior($y);
- $xtmp = $class -> new($xtmp); # back to Math::BigFloat
+ $xtmp = $xtmp -> bior($y);
+ return $xtmp -> round(@r) if defined $downgrade;
+
+ $xtmp = $class -> new($xtmp); # back to Math::BigFloat
$x -> {sign} = $xtmp -> {sign};
$x -> {_m} = $xtmp -> {_m};
$x -> {_es} = $xtmp -> {_es};
@@ -3616,24 +3894,20 @@ sub bior {
}
sub bxor {
- my $x = shift;
- my $xref = ref($x);
- my $class = $xref || $x;
-
- croak 'bxor() is an instance method, not a class method' unless $xref;
- croak 'Not enough arguments for bxor()' if @_ < 1;
+ my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (ref($_[0]), @_)
+ : objectify(2, @_);
return if $x -> modify('bxor');
- my $y = shift;
- $y = $class -> new($y) unless ref($y);
-
- my @r = @_;
+ return $x -> bnan(@r) if $x -> is_nan() || $y -> is_nan();
my $xtmp = Math::BigInt -> new($x -> bint()); # to Math::BigInt
- $xtmp -> bxor($y);
- $xtmp = $class -> new($xtmp); # back to Math::BigFloat
+ $xtmp = $xtmp -> bxor($y);
+
+ return $xtmp -> round(@r) if defined $downgrade;
+ $xtmp = $class -> new($xtmp); # back to Math::BigFloat
$x -> {sign} = $xtmp -> {sign};
$x -> {_m} = $xtmp -> {_m};
$x -> {_es} = $xtmp -> {_es};
@@ -3643,20 +3917,18 @@ sub bxor {
}
sub bnot {
- my $x = shift;
- my $xref = ref($x);
- my $class = $xref || $x;
-
- croak 'bnot() is an instance method, not a class method' unless $xref;
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
return if $x -> modify('bnot');
- my @r = @_;
+ return $x -> bnan(@r) if $x -> is_nan();
my $xtmp = Math::BigInt -> new($x -> bint()); # to Math::BigInt
- $xtmp -> bnot();
- $xtmp = $class -> new($xtmp); # back to Math::BigFloat
+ $xtmp = $xtmp -> bnot();
+
+ return $xtmp -> round(@r) if defined $downgrade;
+ $xtmp = $class -> new($xtmp); # back to Math::BigFloat
$x -> {sign} = $xtmp -> {sign};
$x -> {_m} = $xtmp -> {_m};
$x -> {_es} = $xtmp -> {_es};
@@ -3671,19 +3943,18 @@ sub bnot {
sub bround {
# accuracy: preserve $N digits, and overwrite the rest with 0's
- my $x = shift;
- my $class = ref($x) || $x;
- $x = $class->new(shift) if !ref($x);
- if (($_[0] || 0) < 0) {
+ my ($class, $x, @a) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ if (($a[0] || 0) < 0) {
croak('bround() needs positive accuracy');
}
return $x if $x->modify('bround');
- my ($scale, $mode) = $x->_scale_a(@_);
+ my ($scale, $mode) = $x->_scale_a(@a);
if (!defined $scale) { # no-op
- return $downgrade->new($x) if defined($downgrade)
+ return $downgrade -> new($x) if defined($downgrade)
&& ($x->is_int() || $x->is_inf() || $x->is_nan());
return $x;
}
@@ -3694,7 +3965,7 @@ sub bround {
# round a number with A=5 to 5 digits afterwards again
if (defined $x->{_a} && $x->{_a} < $scale) {
- return $downgrade->new($x) if defined($downgrade)
+ return $downgrade -> new($x) if defined($downgrade)
&& ($x->is_int() || $x->is_inf() || $x->is_nan());
return $x;
}
@@ -3704,7 +3975,7 @@ sub bround {
# never round a +-inf, NaN
if ($scale <= 0 || $x->{sign} !~ /^[+-]$/) {
- return $downgrade->new($x) if defined($downgrade)
+ return $downgrade -> new($x) if defined($downgrade)
&& ($x->is_int() || $x->is_inf() || $x->is_nan());
return $x;
}
@@ -3713,7 +3984,7 @@ sub bround {
# 2: if we should keep more digits than the mantissa has, do nothing
if ($x->is_zero() || $LIB->_len($x->{_m}) <= $scale) {
$x->{_a} = $scale if !defined $x->{_a} || $x->{_a} > $scale;
- return $downgrade->new($x) if defined($downgrade)
+ return $downgrade -> new($x) if defined($downgrade)
&& ($x->is_int() || $x->is_inf() || $x->is_nan());
return $x;
}
@@ -3721,10 +3992,10 @@ sub bround {
# pass sign to bround for '+inf' and '-inf' rounding modes
my $m = bless { sign => $x->{sign}, value => $x->{_m} }, 'Math::BigInt';
- $m->bround($scale, $mode); # round mantissa
- $x->{_m} = $m->{value}; # get our mantissa back
- $x->{_a} = $scale; # remember rounding
- delete $x->{_p}; # and clear P
+ $m = $m->bround($scale, $mode); # round mantissa
+ $x->{_m} = $m->{value}; # get our mantissa back
+ $x->{_a} = $scale; # remember rounding
+ delete $x->{_p}; # and clear P
# bnorm() downgrades if necessary, so no need to check whether to downgrade.
$x->bnorm(); # del trailing zeros gen. by bround()
@@ -3734,15 +4005,14 @@ sub bfround {
# precision: round to the $Nth digit left (+$n) or right (-$n) from the '.'
# $n == 0 means round to integer
# expects and returns normalized numbers!
- my $x = shift;
- my $class = ref($x) || $x;
- $x = $class->new(shift) if !ref($x);
+
+ my ($class, $x, @p) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
return $x if $x->modify('bfround'); # no-op
- my ($scale, $mode) = $x->_scale_p(@_);
+ my ($scale, $mode) = $x->_scale_p(@p);
if (!defined $scale) {
- return $downgrade->new($x) if defined($downgrade)
+ return $downgrade -> new($x) if defined($downgrade)
&& ($x->is_int() || $x->is_inf() || $x->is_nan());
return $x;
}
@@ -3751,20 +4021,20 @@ sub bfround {
if ($x->is_zero()) {
$x->{_p} = $scale if !defined $x->{_p} || $x->{_p} < $scale; # -3 < -2
- return $downgrade->new($x) if defined($downgrade)
+ return $downgrade -> new($x) if defined($downgrade)
&& ($x->is_int() || $x->is_inf() || $x->is_nan());
return $x;
}
if ($x->{sign} !~ /^[+-]$/) {
- return $downgrade->new($x) if defined($downgrade)
+ return $downgrade -> new($x) if defined($downgrade)
&& ($x->is_int() || $x->is_inf() || $x->is_nan());
return $x;
}
# don't round if x already has lower precision
if (defined $x->{_p} && $x->{_p} < 0 && $scale < $x->{_p}) {
- return $downgrade->new($x) if defined($downgrade)
+ return $downgrade -> new($x) if defined($downgrade)
&& ($x->is_int() || $x->is_inf() || $x->is_nan());
return $x;
}
@@ -3775,7 +4045,7 @@ sub bfround {
# round right from the '.'
if ($x->{_es} eq '+') { # e >= 0 => nothing to round
- return $downgrade->new($x) if defined($downgrade)
+ return $downgrade -> new($x) if defined($downgrade)
&& ($x->is_int() || $x->is_inf() || $x->is_nan());
return $x;
}
@@ -3800,15 +4070,16 @@ sub bfround {
# do not round after/right of the $dad
if ($scale > $dad) { # 0.123, scale >= 3 => exit
- return $downgrade->new($x) if defined($downgrade)
+ return $downgrade -> new($x) if defined($downgrade)
&& ($x->is_int() || $x->is_inf() || $x->is_nan());
return $x;
}
# round to zero if rounding inside the $zad, but not for last zero like:
- # 0.0065, scale -2, round last '0' with following '65' (scale == zad case)
+ # 0.0065, scale -2, round last '0' with following '65' (scale == zad
+ # case)
if ($scale < $zad) {
- return $downgrade->new($x) if defined($downgrade)
+ return $downgrade -> new($x) if defined($downgrade)
&& ($x->is_int() || $x->is_inf() || $x->is_nan());
return $x->bzero();
}
@@ -3837,7 +4108,7 @@ sub bfround {
$scale = 1 if $scale == 0;
# shortcut if already integer
if ($scale == 1 && $dbt <= $dbd) {
- return $downgrade->new($x) if defined($downgrade)
+ return $downgrade -> new($x) if defined($downgrade)
&& ($x->is_int() || $x->is_inf() || $x->is_nan());
return $x;
}
@@ -3846,7 +4117,7 @@ sub bfround {
if ($scale > $dbd) {
# not enough digits before dot, so round to zero
- return $downgrade->new($x) if defined($downgrade);
+ return $downgrade -> new($x) if defined($downgrade);
return $x->bzero;
} elsif ($scale == $dbd) {
# maximum
@@ -3858,7 +4129,7 @@ sub bfround {
# pass sign to bround for rounding modes '+inf' and '-inf'
my $m = bless { sign => $x->{sign}, value => $x->{_m} }, 'Math::BigInt';
- $m->bround($scale, $mode);
+ $m = $m->bround($scale, $mode);
$x->{_m} = $m->{value}; # get our mantissa back
# bnorm() downgrades if necessary, so no need to check whether to downgrade.
@@ -3871,6 +4142,8 @@ sub bfloor {
return $x if $x->modify('bfloor');
+ return $x -> bnan(@r) if $x -> is_nan();
+
if ($x->{sign} =~ /^[+-]$/) {
# if $x has digits after dot, remove them
if ($x->{_es} eq '-') {
@@ -3880,9 +4153,9 @@ sub bfloor {
# increment if negative
$x->{_m} = $LIB->_inc($x->{_m}) if $x->{sign} eq '-';
}
- $x->round(@r);
+ $x = $x->round(@r);
}
- return $downgrade->new($x, @r) if defined($downgrade);
+ return $downgrade -> new($x -> bdstr(), @r) if defined($downgrade);
return $x;
}
@@ -3892,6 +4165,8 @@ sub bceil {
return $x if $x->modify('bceil');
+ return $x -> bnan(@r) if $x -> is_nan();
+
# if $x has digits after dot, remove them
if ($x->{sign} =~ /^[+-]$/) {
if ($x->{_es} eq '-') {
@@ -3904,10 +4179,10 @@ sub bceil {
$x->{sign} = '+' if $LIB->_is_zero($x->{_m}); # avoid -0
}
}
- $x->round(@r);
+ $x = $x->round(@r);
}
- return $downgrade->new($x, @r) if defined($downgrade);
+ return $downgrade -> new($x -> bdstr(), @r) if defined($downgrade);
return $x;
}
@@ -3917,18 +4192,20 @@ sub bint {
return $x if $x->modify('bint');
+ return $x -> bnan(@r) if $x -> is_nan();
+
if ($x->{sign} =~ /^[+-]$/) {
# if $x has digits after the decimal point
if ($x->{_es} eq '-') {
- $x->{_m} = $LIB->_rsft($x->{_m}, $x->{_e}, 10); # remove fraction part
+ $x->{_m} = $LIB->_rsft($x->{_m}, $x->{_e}, 10); # remove frac part
$x->{_e} = $LIB->_zero(); # truncate/normalize
$x->{_es} = '+'; # abs e
$x->{sign} = '+' if $LIB->_is_zero($x->{_m}); # avoid -0
}
- $x->round(@r);
+ $x = $x->round(@r);
}
- return $downgrade->new($x, @r) if defined($downgrade);
+ return $downgrade -> new($x -> bdstr(), @r) if defined($downgrade);
return $x;
}
@@ -3940,8 +4217,14 @@ sub bgcd {
# (BINT or num_str, BINT or num_str) return BINT
# does not modify arguments, but returns new object
- unshift @_, __PACKAGE__
- unless ref($_[0]) || $_[0] =~ /^[a-z]\w*(?:::[a-z]\w*)*$/i;
+ # Class::method(...) -> Class->method(...)
+ unless (@_ && (defined(blessed($_[0])) && $_[0] -> isa(__PACKAGE__) ||
+ $_[0] =~ /^[a-z]\w*(?:::[a-z]\w*)*$/i))
+ {
+ #carp "Using ", (caller(0))[3], "() as a function is deprecated;",
+ # " use is as a method instead";
+ unshift @_, __PACKAGE__;
+ }
my ($class, @args) = objectify(0, @_);
@@ -3961,7 +4244,11 @@ sub bgcd {
last if $x -> is_one();
}
- return $x -> babs();
+ $x = $x -> babs();
+
+ return $downgrade -> new($x)
+ if defined $downgrade && $x->is_int();
+ return $x;
}
sub blcm {
@@ -3969,8 +4256,14 @@ sub blcm {
# does not modify arguments, but returns new object
# Least Common Multiple
- unshift @_, __PACKAGE__
- unless ref($_[0]) || $_[0] =~ /^[a-z]\w*(?:::[a-z]\w*)*$/i;
+ # Class::method(...) -> Class->method(...)
+ unless (@_ && (defined(blessed($_[0])) && $_[0] -> isa(__PACKAGE__) ||
+ $_[0] =~ /^[a-z]\w*(?:::[a-z]\w*)*$/i))
+ {
+ #carp "Using ", (caller(0))[3], "() as a function is deprecated;",
+ # " use is as a method instead";
+ unshift @_, __PACKAGE__;
+ }
my ($class, @args) = objectify(0, @_);
@@ -3983,10 +4276,14 @@ sub blcm {
$y = $class -> new($y) unless ref($y) && $y -> isa($class);
return $x->bnan() unless $y -> is_int();
my $gcd = $x -> bgcd($y);
- $x -> bdiv($gcd) -> bmul($y);
+ $x = $x -> bdiv($gcd) -> bmul($y);
}
- return $x -> babs();
+ $x = $x -> babs();
+
+ return $downgrade -> new($x)
+ if defined $downgrade && $x->is_int();
+ return $x;
}
###############################################################################
@@ -3994,9 +4291,9 @@ sub blcm {
###############################################################################
sub length {
- my $x = shift;
- my $class = ref($x) || $x;
- $x = $class->new(shift) unless ref($x);
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
return 1 if $LIB->_is_zero($x->{_m});
@@ -4012,7 +4309,13 @@ sub length {
sub mantissa {
# return a copy of the mantissa
- my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_);
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ # The following line causes a lot of noise in the test suits for
+ # the Math-BigRat and bignum distributions. Fixme!
+ #carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+ return $x -> bnan(@r) if $x -> is_nan();
if ($x->{sign} !~ /^[+-]$/) {
my $s = $x->{sign};
@@ -4020,14 +4323,19 @@ sub mantissa {
return Math::BigInt->new($s, undef, undef); # -inf, +inf => +inf
}
my $m = Math::BigInt->new($LIB->_str($x->{_m}), undef, undef);
- $m->bneg() if $x->{sign} eq '-';
-
+ $m = $m->bneg() if $x->{sign} eq '-';
$m;
}
sub exponent {
# return a copy of the exponent
- my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_);
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ # The following line causes a lot of noise in the test suits for
+ # the Math-BigRat and bignum distributions. Fixme!
+ #carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+ return $x -> bnan(@r) if $x -> is_nan();
if ($x->{sign} !~ /^[+-]$/) {
my $s = $x->{sign};
@@ -4039,32 +4347,37 @@ sub exponent {
sub parts {
# return a copy of both the exponent and the mantissa
- my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_);
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
if ($x->{sign} !~ /^[+-]$/) {
my $s = $x->{sign};
$s =~ s/^\+//;
my $se = $s;
$se =~ s/^-//;
- return ($class->new($s), $class->new($se)); # +inf => inf and -inf, +inf => inf
+ # +inf => inf and -inf, +inf => inf
+ return ($class->new($s), $class->new($se));
}
my $m = Math::BigInt->bzero();
$m->{value} = $LIB->_copy($x->{_m});
- $m->bneg() if $x->{sign} eq '-';
+ $m = $m->bneg() if $x->{sign} eq '-';
($m, Math::BigInt->new($x->{_es} . $LIB->_num($x->{_e})));
}
+# Parts used for scientific notation with significand/mantissa and exponent as
+# integers. E.g., "12345.6789" is returned as "123456789" (mantissa) and "-4"
+# (exponent).
+
sub sparts {
- my $self = shift;
- my $class = ref $self;
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
- croak("sparts() is an instance method, not a class method")
- unless $class;
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
# Not-a-number.
- if ($self -> is_nan()) {
- my $mant = $self -> copy(); # mantissa
+ if ($x -> is_nan()) {
+ my $mant = $class -> bnan(); # mantissa
return $mant unless wantarray; # scalar context
my $expo = $class -> bnan(); # exponent
return ($mant, $expo); # list context
@@ -4072,8 +4385,8 @@ sub sparts {
# Infinity.
- if ($self -> is_inf()) {
- my $mant = $self -> copy(); # mantissa
+ if ($x -> is_inf()) {
+ my $mant = $class -> binf($x->{sign}); # mantissa
return $mant unless wantarray; # scalar context
my $expo = $class -> binf('+'); # exponent
return ($mant, $expo); # list context
@@ -4081,56 +4394,46 @@ sub sparts {
# Finite number.
- my $mant = $self -> copy() -> bzero();
- $mant -> {sign} = $self -> {sign};
- $mant -> {_m} = $LIB->_copy($self -> {_m});
+ my $mant = $x -> copy();
+ $mant->{_es} = '+';
+ $mant->{_e} = $LIB->_zero();
+ $mant = $downgrade -> new($mant) if defined $downgrade;
return $mant unless wantarray;
- my $expo = $class -> bzero();
- $expo -> {sign} = $self -> {_es};
- $expo -> {_m} = $LIB->_copy($self -> {_e});
-
+ my $expo = bless { sign => $x -> {_es},
+ _m => $LIB->_copy($x -> {_e}),
+ _es => '+',
+ _e => $LIB->_zero(),
+ }, $class;
+ $expo = $downgrade -> new($expo) if defined $downgrade;
return ($mant, $expo);
}
-sub nparts {
- my $self = shift;
- my $class = ref $self;
+# Parts used for normalized notation with significand/mantissa as either 0 or a
+# number in the semi-open interval [1,10). E.g., "12345.6789" is returned as
+# "1.23456789" and "4".
- croak("nparts() is an instance method, not a class method")
- unless $class;
+sub nparts {
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
- # Not-a-number.
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
- if ($self -> is_nan()) {
- my $mant = $self -> copy(); # mantissa
- return $mant unless wantarray; # scalar context
- my $expo = $class -> bnan(); # exponent
- return ($mant, $expo); # list context
- }
+ # Not-a-number and Infinity.
- # Infinity.
-
- if ($self -> is_inf()) {
- my $mant = $self -> copy(); # mantissa
- return $mant unless wantarray; # scalar context
- my $expo = $class -> binf('+'); # exponent
- return ($mant, $expo); # list context
- }
+ return $x -> sparts() if $x -> is_nan() || $x -> is_inf();
# Finite number.
- my ($mant, $expo) = $self -> sparts();
+ my ($mant, $expo) = $x -> sparts();
if ($mant -> bcmp(0)) {
my ($ndigtot, $ndigfrac) = $mant -> length();
my $expo10adj = $ndigtot - $ndigfrac - 1;
- if ($expo10adj != 0) {
- my $factor = "1e" . -$expo10adj;
- $mant -> bmul($factor);
+ if ($expo10adj > 0) { # if mantissa is not an integer
+ $mant = $mant -> brsft($expo10adj, 10);
return $mant unless wantarray;
- $expo -> badd($expo10adj);
+ $expo = $expo -> badd($expo10adj);
return ($mant, $expo);
}
}
@@ -4139,113 +4442,139 @@ sub nparts {
return ($mant, $expo);
}
+# Parts used for engineering notation with significand/mantissa as either 0 or a
+# number in the semi-open interval [1,1000) and the exponent is a multiple of 3.
+# E.g., "12345.6789" is returned as "12.3456789" and "3".
+
sub eparts {
- my $self = shift;
- my $class = ref $self;
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
- croak("eparts() is an instance method, not a class method")
- unless $class;
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
# Not-a-number and Infinity.
- return $self -> sparts() if $self -> is_nan() || $self -> is_inf();
+ return $x -> sparts() if $x -> is_nan() || $x -> is_inf();
# Finite number.
- my ($mant, $expo) = $self -> nparts();
+ my ($mant, $expo) = $x -> nparts();
my $c = $expo -> copy() -> bmod(3);
- $mant -> blsft($c, 10);
+ $mant = $mant -> blsft($c, 10);
return $mant unless wantarray;
- $expo -> bsub($c);
+ $expo = $expo -> bsub($c);
return ($mant, $expo);
}
+# Parts used for decimal notation, e.g., "12345.6789" is returned as "12345"
+# (integer part) and "0.6789" (fraction part).
+
sub dparts {
- my $self = shift;
- my $class = ref $self;
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
- croak("dparts() is an instance method, not a class method")
- unless $class;
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
- # Not-a-number and Infinity.
+ # Not-a-number.
- if ($self -> is_nan() || $self -> is_inf()) {
- my $int = $self -> copy();
+ if ($x -> is_nan()) {
+ my $int = $class -> bnan();
+ return $int unless wantarray;
+ my $frc = $class -> bzero(); # or NaN?
+ return ($int, $frc);
+ }
+
+ # Infinity.
+
+ if ($x -> is_inf()) {
+ my $int = $class -> binf($x->{sign});
return $int unless wantarray;
my $frc = $class -> bzero();
return ($int, $frc);
}
- my $int = $self -> copy();
- my $frc = $class -> bzero();
+ # Finite number.
+
+ my $int = $x -> copy();
+ my $frc;
- # If the input has a fraction part.
+ # If the input is an integer.
- if ($int->{_es} eq '-') {
+ if ($int->{_es} eq '+') {
+ $frc = $class -> bzero();
+ }
+
+ # If the input has a fraction part
+
+ else {
$int->{_m} = $LIB -> _rsft($int->{_m}, $int->{_e}, 10);
$int->{_e} = $LIB -> _zero();
$int->{_es} = '+';
$int->{sign} = '+' if $LIB->_is_zero($int->{_m}); # avoid -0
-
return $int unless wantarray;
- $frc = $self -> copy() -> bsub($int);
+ $frc = $x -> copy() -> bsub($int);
return ($int, $frc);
}
+ $int = $downgrade -> new($int) if defined $downgrade;
return $int unless wantarray;
- return ($int, $frc);
+ return $int, $frc;
}
+# Fractional parts with the numerator and denominator as integers. E.g.,
+# "123.4375" is returned as "1975" and "16".
+
sub fparts {
- my $x = shift;
- my $class = ref $x;
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
- croak("fparts() is an instance method") unless $class;
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
- return ($class -> bnan(),
- $class -> bnan()) if $x -> is_nan();
+ # NaN => NaN/NaN
- return ($class -> binf($x -> sign()),
- $class -> bone()) if $x -> is_inf();
+ if ($x -> is_nan()) {
+ return $class -> bnan() unless wantarray;
+ return $class -> bnan(), $class -> bnan();
+ }
- return ($class -> bzero(),
- $class -> bone()) if $x -> is_zero();
+ # ±Inf => ±Inf/1
- if ($x -> {_es} eq '-') { # exponent < 0
- my $numer_lib = $LIB -> _copy($x -> {_m});
- my $denom_lib = $LIB -> _1ex($x -> {_e});
- my $gcd_lib = $LIB -> _gcd($LIB -> _copy($numer_lib), $denom_lib);
- $numer_lib = $LIB -> _div($numer_lib, $gcd_lib);
- $denom_lib = $LIB -> _div($denom_lib, $gcd_lib);
- return ($class -> new($x -> {sign} . $LIB -> _str($numer_lib)),
- $class -> new($LIB -> _str($denom_lib)));
+ if ($x -> is_inf()) {
+ my $numer = $class -> binf($x->{sign});
+ return $numer unless wantarray;
+ my $denom = $class -> bone();
+ return $numer, $denom;
}
- elsif (! $LIB -> _is_zero($x -> {_e})) { # exponent > 0
- my $numer_lib = $LIB -> _copy($x -> {_m});
- $numer_lib = $LIB -> _lsft($numer_lib, $x -> {_e}, 10);
- return ($class -> new($x -> {sign} . $LIB -> _str($numer_lib)),
- $class -> bone());
- }
+ # Finite number.
- else { # exponent = 0
- return ($class -> new($x -> {sign} . $LIB -> _str($x -> {_m})),
- $class -> bone());
- }
+ # If we get here, we know that the output is an integer.
+
+ $class = $downgrade if defined $downgrade;
+
+ my @flt_parts = ($x->{sign}, $x->{_m}, $x->{_es}, $x->{_e});
+ my @rat_parts = $class -> _flt_lib_parts_to_rat_lib_parts(@flt_parts);
+ my $num = $class -> new($LIB -> _str($rat_parts[1]));
+ my $den = $class -> new($LIB -> _str($rat_parts[2]));
+ $num = $num -> bneg() if $rat_parts[0] eq "-";
+ return $num unless wantarray;
+ return $num, $den;
}
+# Given "123.4375", returns "1975", since "123.4375" is "1975/16".
+
sub numerator {
- my $x = shift;
- my $class = ref $x;
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
- croak("numerator() is an instance method") unless $class;
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
return $class -> bnan() if $x -> is_nan();
return $class -> binf($x -> sign()) if $x -> is_inf();
return $class -> bzero() if $x -> is_zero();
+ # If we get here, we know that the output is an integer.
+
+ $class = $downgrade if defined $downgrade;
+
if ($x -> {_es} eq '-') { # exponent < 0
my $numer_lib = $LIB -> _copy($x -> {_m});
my $denom_lib = $LIB -> _1ex($x -> {_e});
@@ -4265,14 +4594,19 @@ sub numerator {
}
}
+# Given "123.4375", returns "16", since "123.4375" is "1975/16".
+
sub denominator {
- my $x = shift;
- my $class = ref $x;
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
- croak("denominator() is an instance method") unless $class;
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
return $class -> bnan() if $x -> is_nan();
+ # If we get here, we know that the output is an integer.
+
+ $class = $downgrade if defined $downgrade;
+
if ($x -> {_es} eq '-') { # exponent < 0
my $numer_lib = $LIB -> _copy($x -> {_m});
my $denom_lib = $LIB -> _1ex($x -> {_e});
@@ -4294,13 +4628,19 @@ sub bstr {
# (ref to BFLOAT or num_str) return num_str
# Convert number from internal format to (non-scientific) string format.
# internal format is always normalized (no leading zeros, "-0" => "+0")
- my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
- if ($x->{sign} !~ /^[+-]$/) {
- return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
- return 'inf'; # +inf
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+ # Inf and NaN
+
+ if ($x->{sign} ne '+' && $x->{sign} ne '-') {
+ return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
+ return 'inf'; # +inf
}
+ # Finite number
+
my $es = '0';
my $len = 1;
my $cad = 0;
@@ -4348,91 +4688,243 @@ sub bstr {
$es;
}
-# Decimal notation, e.g., "12345.6789".
+# Decimal notation, e.g., "12345.6789" (no exponent).
sub bdstr {
- my $x = shift;
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+ # Inf and NaN
if ($x->{sign} ne '+' && $x->{sign} ne '-') {
- return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
- return 'inf'; # +inf
+ return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
+ return 'inf'; # +inf
}
+ # Upgrade?
+
+ return $upgrade -> bdstr($x, @r)
+ if defined($upgrade) && !$x -> isa($class);
+
+ # Finite number
+
my $mant = $LIB->_str($x->{_m});
- my $expo = $x -> exponent();
+ my $esgn = $x->{_es};
+ my $eabs = $LIB -> _num($x->{_e});
+
+ my $uintmax = ~0;
my $str = $mant;
- if ($expo >= 0) {
- $str .= "0" x $expo;
+ if ($esgn eq '+') {
+
+ croak("The absolute value of the exponent is too large")
+ if $eabs > $uintmax;
+
+ $str .= "0" x $eabs;
+
} else {
- my $mantlen = CORE::length($mant);
- my $c = $mantlen + $expo;
+ my $mlen = CORE::length($mant);
+ my $c = $mlen - $eabs;
+
+ my $intmax = ($uintmax - 1) / 2;
+ croak("The absolute value of the exponent is too large")
+ if (1 - $c) > $intmax;
+
$str = "0" x (1 - $c) . $str if $c <= 0;
- substr($str, $expo, 0) = '.';
+ substr($str, -$eabs, 0) = '.';
}
- return $x->{sign} eq '-' ? "-$str" : $str;
+ return $x->{sign} eq '-' ? '-' . $str : $str;
}
-# Scientific notation with significand/mantissa as an integer, e.g., "12345.6789"
-# is written as "123456789e-4".
+# Scientific notation with significand/mantissa and exponent as integers, e.g.,
+# "12345.6789" is written as "123456789e-4".
sub bsstr {
- my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+ # Inf and NaN
if ($x->{sign} ne '+' && $x->{sign} ne '-') {
- return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
- return 'inf'; # +inf
+ return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
+ return 'inf'; # +inf
}
- my $str = $LIB->_str($x->{_m}) . 'e' . $x->{_es}. $LIB->_str($x->{_e});
- return $x->{sign} eq '-' ? "-$str" : $str;
+ # Upgrade?
+
+ return $upgrade -> bsstr($x, @r)
+ if defined($upgrade) && !$x -> isa($class);
+
+ # Finite number
+
+ ($x->{sign} eq '-' ? '-' : '') . $LIB->_str($x->{_m})
+ . 'e' . $x->{_es} . $LIB->_str($x->{_e});
}
# Normalized notation, e.g., "12345.6789" is written as "1.23456789e+4".
sub bnstr {
- my $x = shift;
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+ # Inf and NaN
if ($x->{sign} ne '+' && $x->{sign} ne '-') {
- return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
- return 'inf'; # +inf
+ return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
+ return 'inf'; # +inf
}
- my ($mant, $expo) = $x -> nparts();
+ # Upgrade?
+
+ return $upgrade -> bnstr($x, @r)
+ if defined($upgrade) && !$x -> isa($class);
+
+ # Finite number
+
+ my $str = $x->{sign} eq '-' ? '-' : '';
+
+ # Get the mantissa and the length of the mantissa.
+
+ my $mant = $LIB->_str($x->{_m});
+ my $mantlen = CORE::length($mant);
+
+ if ($mantlen == 1) {
+
+ # Not decimal point when the mantissa has length one, i.e., return the
+ # number 2 as the string "2", not "2.".
+
+ $str .= $mant . 'e' . $x->{_es} . $LIB->_str($x->{_e});
+
+ } else {
- my $esgn = $expo < 0 ? '-' : '+';
- my $eabs = $expo -> babs() -> bfround(0) -> bstr();
- #$eabs = '0' . $eabs if length($eabs) < 2;
+ # Compute new exponent where the original exponent is adjusted by the
+ # length of the mantissa minus one (because the decimal point is after
+ # one digit).
- return $mant . 'e' . $esgn . $eabs;
+ my ($eabs, $esgn) = $LIB -> _sadd($LIB -> _copy($x->{_e}), $x->{_es},
+ $LIB -> _new($mantlen - 1), "+");
+ substr $mant, 1, 0, ".";
+ $str .= $mant . 'e' . $esgn . $LIB->_str($eabs);
+
+ }
+
+ return $str;
}
# Engineering notation, e.g., "12345.6789" is written as "12.3456789e+3".
sub bestr {
- my $x = shift;
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+ # Inf and NaN
if ($x->{sign} ne '+' && $x->{sign} ne '-') {
- return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
- return 'inf'; # +inf
+ return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
+ return 'inf'; # +inf
+ }
+
+ # Upgrade?
+
+ return $upgrade -> bestr($x, @r)
+ if defined($upgrade) && !$x -> isa($class);
+
+ # Finite number
+
+ my $str = $x->{sign} eq '-' ? '-' : '';
+
+ # Get the mantissa, the length of the mantissa, and adjust the exponent by
+ # the length of the mantissa minus 1 (because the dot is after one digit).
+
+ my $mant = $LIB->_str($x->{_m});
+ my $mantlen = CORE::length($mant);
+ my ($eabs, $esgn) = $LIB -> _sadd($LIB -> _copy($x->{_e}), $x->{_es},
+ $LIB -> _new($mantlen - 1), "+");
+
+ my $dotpos = 1;
+ my $mod = $LIB -> _mod($LIB -> _copy($eabs), $LIB -> _new("3"));
+ unless ($LIB -> _is_zero($mod)) {
+ if ($esgn eq '+') {
+ $eabs = $LIB -> _sub($eabs, $mod);
+ $dotpos += $LIB -> _num($mod);
+ } else {
+ my $delta = $LIB -> _sub($LIB -> _new("3"), $mod);
+ $eabs = $LIB -> _add($eabs, $delta);
+ $dotpos += $LIB -> _num($delta);
+ }
}
- my ($mant, $expo) = $x -> eparts();
+ if ($dotpos < $mantlen) {
+ substr $mant, $dotpos, 0, ".";
+ } elsif ($dotpos > $mantlen) {
+ $mant .= "0" x ($dotpos - $mantlen);
+ }
- my $esgn = $expo < 0 ? '-' : '+';
- my $eabs = $expo -> babs() -> bfround(0) -> bstr();
- #$eabs = '0' . $eabs if length($eabs) < 2;
+ $str .= $mant . 'e' . $esgn . $LIB->_str($eabs);
- return $mant . 'e' . $esgn . $eabs;
+ return $str;
+}
+
+# Fractional notation, e.g., "123.4375" is written as "1975/16".
+
+sub bfstr {
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+ # Inf and NaN
+
+ if ($x->{sign} ne '+' && $x->{sign} ne '-') {
+ return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
+ return 'inf'; # +inf
+ }
+
+ # Upgrade?
+
+ return $upgrade -> bfstr($x, @r)
+ if defined($upgrade) && !$x -> isa($class);
+
+ # Finite number
+
+ my $str = $x->{sign} eq '-' ? '-' : '';
+
+ if ($x->{_es} eq '+') {
+ $str .= $LIB -> _str($x->{_m}) . ("0" x $LIB -> _num($x->{_e}));
+ } else {
+ my @flt_parts = ($x->{sign}, $x->{_m}, $x->{_es}, $x->{_e});
+ my @rat_parts = $class -> _flt_lib_parts_to_rat_lib_parts(@flt_parts);
+ $str = $LIB -> _str($rat_parts[1]) . "/" . $LIB -> _str($rat_parts[2]);
+ $str = "-" . $str if $rat_parts[0] eq "-";
+ }
+
+ return $str;
}
sub to_hex {
# return number as hexadecimal string (only for integers defined)
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_);
- my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_);
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+ # Inf and NaN
+
+ if ($x->{sign} ne '+' && $x->{sign} ne '-') {
+ return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
+ return 'inf'; # +inf
+ }
+
+ # Upgrade?
+
+ return $upgrade -> to_hex($x, @r)
+ if defined($upgrade) && !$x -> isa($class);
+
+ # Finite number
- return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc
return '0' if $x->is_zero();
return $nan if $x->{_es} ne '+'; # how to do 1e-1 in hex?
@@ -4447,10 +4939,24 @@ sub to_hex {
sub to_oct {
# return number as octal digit string (only for integers defined)
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_);
- my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_);
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+ # Inf and NaN
+
+ if ($x->{sign} ne '+' && $x->{sign} ne '-') {
+ return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
+ return 'inf'; # +inf
+ }
+
+ # Upgrade?
+
+ return $upgrade -> to_hex($x, @r)
+ if defined($upgrade) && !$x -> isa($class);
+
+ # Finite number
- return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc
return '0' if $x->is_zero();
return $nan if $x->{_es} ne '+'; # how to do 1e-1 in octal?
@@ -4465,10 +4971,24 @@ sub to_oct {
sub to_bin {
# return number as binary digit string (only for integers defined)
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_);
- my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_);
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+ # Inf and NaN
+
+ if ($x->{sign} ne '+' && $x->{sign} ne '-') {
+ return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
+ return 'inf'; # +inf
+ }
+
+ # Upgrade?
+
+ return $upgrade -> to_hex($x, @r)
+ if defined($upgrade) && !$x -> isa($class);
+
+ # Finite number
- return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc
return '0' if $x->is_zero();
return $nan if $x->{_es} ne '+'; # how to do 1e-1 in binary?
@@ -4482,9 +5002,9 @@ sub to_bin {
}
sub to_ieee754 {
- my $x = shift;
- my $format = shift;
- my $class = ref $x;
+ my ($class, $x, $format, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
my $enc; # significand encoding (applies only to decimal)
my $k; # storage width in bits
@@ -4621,22 +5141,22 @@ sub to_ieee754 {
$expo = $class -> new($expo_est);
if ($expo_est > 0) {
- $mant -> bmul($binv -> copy() -> bpow($expo));
+ $mant = $mant -> bmul($binv -> copy() -> bpow($expo));
} elsif ($expo_est < 0) {
my $expo_abs = $expo -> copy() -> bneg();
- $mant -> bmul($b -> copy() -> bpow($expo_abs));
+ $mant = $mant -> bmul($b -> copy() -> bpow($expo_abs));
}
# Final adjustment of the estimate above.
while ($mant >= $b && $expo <= $emax) {
- $mant -> bmul($binv);
- $expo -> binc();
+ $mant = $mant -> bmul($binv);
+ $expo = $expo -> binc();
}
while ($mant < $one && $expo >= $emin) {
- $mant -> bmul($b);
- $expo -> bdec();
+ $mant = $mant -> bmul($b);
+ $expo = $expo -> bdec();
}
# This is when the magnitude is larger than what can be represented
@@ -4664,15 +5184,15 @@ sub to_ieee754 {
# Scale up the mantissa (significand), and round to integer.
my $const = $class -> new($b) -> bpow($t - 1);
- $mant -> bmul($const);
- $mant -> bfround(0);
+ $mant = $mant -> bmul($const);
+ $mant = $mant -> bfround(0);
# If the mantissa overflowed, encode as the smallest normal
# number.
if ($mant == $const -> bmul($b)) {
- $mant -> bzero();
- $expo -> binc();
+ $mant = $mant -> bzero();
+ $expo = $expo -> binc();
}
}
@@ -4684,22 +5204,22 @@ sub to_ieee754 {
# Remove implicit leading bit, scale up the mantissa
# (significand) to an integer, and round.
- $mant -> bdec();
+ $mant = $mant -> bdec();
my $const = $class -> new($b) -> bpow($t);
- $mant -> bmul($const) -> bfround(0);
+ $mant = $mant -> bmul($const) -> bfround(0);
# If the mantissa overflowed, encode as the next larger value.
# This works correctly also when the next larger value is
# infinity.
if ($mant == $const) {
- $mant -> bzero();
- $expo -> binc();
+ $mant = $mant -> bzero();
+ $expo = $expo -> binc();
}
}
}
- $expo -> badd($bias); # add bias
+ $expo = $expo -> badd($bias); # add bias
my $signbit = "$sign";
@@ -4719,7 +5239,9 @@ sub to_ieee754 {
sub as_hex {
# return number as hexadecimal string (only for integers defined)
- my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_);
+ my (undef, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc
return '0x0' if $x->is_zero();
@@ -4737,7 +5259,9 @@ sub as_hex {
sub as_oct {
# return number as octal digit string (only for integers defined)
- my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_);
+ my (undef, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc
return '00' if $x->is_zero();
@@ -4755,7 +5279,9 @@ sub as_oct {
sub as_bin {
# return number as binary digit string (only for integers defined)
- my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_);
+ my (undef, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc
return '0b0' if $x->is_zero();
@@ -4772,7 +5298,10 @@ sub as_bin {
sub numify {
# Make a Perl scalar number from a Math::BigFloat object.
- my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+
+ my (undef, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
if ($x -> is_nan()) {
require Math::Complex;
@@ -4787,6 +5316,7 @@ sub numify {
}
# Create a string and let Perl's atoi()/atof() handle the rest.
+
return 0 + $x -> bnstr();
}
@@ -4904,17 +5434,20 @@ sub _len_to_steps {
my $l = 40;
my $r = $d;
- # Otherwise this does not work under -Mbignum and we do not yet have "no bignum;" :(
+ # Otherwise this does not work under -Mbignum and we do not yet have "no
+ # bignum;" :(
$l = $l->numify if ref($l);
$r = $r->numify if ref($r);
$lg2 = $lg2->numify if ref($lg2);
$lg10 = $lg10->numify if ref($lg10);
- # binary search for the right value (could this be written as the reverse of lg(n!)?)
+ # binary search for the right value (could this be written as the reverse of
+ # lg(n!)?)
while ($r - $l > 1) {
my $n = int(($r - $l) / 2) + $l;
- my $ramanujan =
- int(($n * log($n) - $n + log($n * (1 + 4*$n*(1+2*$n))) / 6 + $lg2) / $lg10);
+ my $ramanujan
+ = int(($n * log($n) - $n + log($n * (1 + 4*$n*(1+2*$n))) / 6 + $lg2)
+ / $lg10);
$ramanujan > $d ? $r = $n : $l = $n;
}
$l;
@@ -4948,15 +5481,19 @@ sub _log {
my ($limit, $v, $u, $below, $factor, $next, $over, $f);
- $v = $x->copy(); $v->binc(); # v = x+1
- $x->bdec(); $u = $x->copy(); # u = x-1; x = x-1
- $x->bdiv($v, $scale); # first term: u/v
+ $v = $x->copy();
+ $v = $v -> binc(); # v = x+1
+ $x = $x->bdec();
+ $u = $x->copy(); # u = x-1; x = x-1
+ $x = $x->bdiv($v, $scale); # first term: u/v
$below = $v->copy();
$over = $u->copy();
- $u *= $u; $v *= $v; # u^2, v^2
- $below->bmul($v); # u^3, v^3
- $over->bmul($u);
- $factor = $class->new(3); $f = $class->new(2);
+ $u = $u -> bmul($u); # u^2
+ $v = $v -> bmul($v); # v^2
+ $below = $below->bmul($v); # u^3, v^3
+ $over = $over->bmul($u);
+ $factor = $class->new(3);
+ $f = $class->new(2);
$limit = $class->new("1E-". ($scale-1));
@@ -4972,27 +5509,24 @@ sub _log {
# round $over and $below first, we save a lot of time for the division
# (not with log(1.2345), but try log (123**123) to see what I mean. This
# can introduce a rounding error if the division result would be f.i.
- # 0.1234500000001 and we round it to 5 digits it would become 0.12346, but
- # if we truncated $over and $below we might get 0.12345. Does this matter
- # for the end result? So we give $over and $below 4 more digits to be
- # on the safe side (unscientific error handling as usual... :+D
+ # 0.1234500000001 and we round it to 5 digits it would become 0.12346,
+ # but if we truncated $over and $below we might get 0.12345. Does this
+ # matter for the end result? So we give $over and $below 4 more digits
+ # to be on the safe side (unscientific error handling as usual... :+D
$next = $over->copy()->bround($scale+4)
->bdiv($below->copy()->bmul($factor)->bround($scale+4),
$scale);
- ## old version:
- ## $next = $over->copy()->bdiv($below->copy()->bmul($factor), $scale);
-
last if $next->bacmp($limit) <= 0;
delete $next->{_a};
delete $next->{_p};
- $x->badd($next);
+ $x = $x->badd($next);
# calculate things for the next term
$over *= $u;
$below *= $v;
- $factor->badd($f);
+ $factor = $factor->badd($f);
}
$x->bmul($f); # $x *= 2
}
@@ -5011,9 +5545,9 @@ sub _log_10 {
# long, we make it faster by about a factor of 100 by dividing $x by 10.
# The same observation is valid for numbers smaller than 0.1, e.g. computing
- # log(1) is fastest, and the further away we get from 1, the longer it takes.
- # So we also 'break' this down by multiplying $x with 10 and subtract the
- # log(10) afterwards to get the correct result.
+ # log(1) is fastest, and the further away we get from 1, the longer it
+ # takes. So we also 'break' this down by multiplying $x with 10 and subtract
+ # the log(10) afterwards to get the correct result.
# To get $x even closer to 1, we also divide by 2 and then use log(2) to
# correct for this. For instance if $x is 2.4, we use the formula:
@@ -5044,8 +5578,8 @@ sub _log_10 {
$dbd = 0; # disable shortcut
# we can use the cached value in these cases
if ($scale <= $LOG_10_A) {
- $x->bzero();
- $x->badd($LOG_10); # modify $x in place
+ $x = $x->bzero();
+ $x = $x->badd($LOG_10); # modify $x in place
$calc = 0; # no need to calc, but round
}
# if we can't use the shortcut, we continue normally
@@ -5057,8 +5591,8 @@ sub _log_10 {
$dbd = 0; # disable shortcut
# we can use the cached value in these cases
if ($scale <= $LOG_2_A) {
- $x->bzero();
- $x->badd($LOG_2); # modify $x in place
+ $x = $x->bzero();
+ $x = $x->badd($LOG_2); # modify $x in place
$calc = 0; # no need to calc, but round
}
# if we can't use the shortcut, we continue normally
@@ -5074,8 +5608,8 @@ sub _log_10 {
$dbd = 0; # disable shortcut
# we can use the cached value in these cases
if ($scale <= $LOG_10_A) {
- $x->bzero();
- $x->bsub($LOG_10);
+ $x = $x->bzero();
+ $x = $x->bsub($LOG_10);
$calc = 0; # no need to calc, but round
}
}
@@ -5096,8 +5630,8 @@ sub _log_10 {
$LOG_10 = $class->new($LOG_10, undef, undef) unless ref $LOG_10;
#print "x = $x, dbd = $dbd, calc = $calc\n";
- # got more than one digit before the dot, or more than one zero after the
- # dot, so do:
+ # got more than one digit before the dot, or more than one zero after
+ # the dot, so do:
# log(123) == log(1.23) + log(10) * 2
# log(0.0123) == log(1.23) - log(10) * 2
@@ -5106,7 +5640,12 @@ sub _log_10 {
$l_10 = $LOG_10->copy(); # copy for mul
} else {
# else: slower, compute and cache result
- # also disable downgrade for this code path
+
+ # Disabling upgrading and downgrading is no longer necessary to
+ # avoid an infinite recursion, but it avoids unnecessary upgrading
+ # and downgrading in the intermediate computations.
+
+ local $Math::BigInt::upgrade = undef;
local $Math::BigFloat::downgrade = undef;
# shorten the time to calculate log(10) based on the following:
@@ -5121,7 +5660,7 @@ sub _log_10 {
} else {
# else: slower, compute and cache result
$l_2 = $two->copy();
- $l_2->_log($scale); # scale+4, actually
+ $l_2 = $l_2->_log($scale); # scale+4, actually
$LOG_2 = $l_2->copy(); # cache the result for later
# the copy() is for mul below
$LOG_2_A = $scale;
@@ -5129,27 +5668,25 @@ sub _log_10 {
# now calculate log(1.25):
$l_10 = $class->new('1.25');
- $l_10->_log($scale); # scale+4, actually
+ $l_10 = $l_10->_log($scale); # scale+4, actually
# log(1.25) + log(2) + log(2) + log(2):
- $l_10->badd($l_2);
- $l_10->badd($l_2);
- $l_10->badd($l_2);
+ $l_10 = $l_10->badd($l_2);
+ $l_10 = $l_10->badd($l_2);
+ $l_10 = $l_10->badd($l_2);
$LOG_10 = $l_10->copy(); # cache the result for later
# the copy() is for mul below
$LOG_10_A = $scale;
}
$dbd-- if ($dbd > 1); # 20 => dbd=2, so make it dbd=1
- $l_10->bmul($class->new($dbd)); # log(10) * (digits_before_dot-1)
+ $l_10 = $l_10->bmul($class->new($dbd)); # log(10) * (digits_before_dot-1)
my $dbd_sign = '+';
if ($dbd < 0) {
$dbd = -$dbd;
$dbd_sign = '-';
}
($x->{_e}, $x->{_es}) =
- _e_sub($x->{_e}, $LIB->_new($dbd), $x->{_es}, $dbd_sign); # 123 => 1.23
- #($x->{_e}, $x->{_es}) =
- # $LIB -> _ssub($x->{_e}, $x->{_es}, $LIB->_new($dbd), $dbd_sign);
+ $LIB -> _ssub($x->{_e}, $x->{_es}, $LIB->_new($dbd), $dbd_sign);
}
# Now: 0.1 <= $x < 10 (and possible correction in l_10)
@@ -5162,13 +5699,13 @@ sub _log_10 {
my $twos = 0; # default: none (0 times)
while ($x->bacmp($HALF) <= 0) { # X <= 0.5
$twos--;
- $x->bmul($two);
+ $x = $x->bmul($two);
}
while ($x->bacmp($two) >= 0) { # X >= 2
$twos++;
- $x->bdiv($two, $scale+4); # keep all digits
+ $x = $x->bdiv($two, $scale+4); # keep all digits
}
- $x->bround($scale+4);
+ $x = $x->bround($scale+4);
# $twos > 0 => did mul 2, < 0 => did div 2 (but we never did both)
# So calculate correction factor based on ln(2):
if ($twos != 0) {
@@ -5178,70 +5715,33 @@ sub _log_10 {
$l_2 = $LOG_2->copy(); # copy() for the mul below
} else {
# else: slower, compute and cache result
- # also disable downgrade for this code path
+
+ # Disabling upgrading and downgrading is no longer necessary to
+ # avoid an infinite recursion, but it avoids unnecessary upgrading
+ # and downgrading in the intermediate computations.
+
+ local $Math::BigInt::upgrade = undef;
local $Math::BigFloat::downgrade = undef;
+
$l_2 = $two->copy();
- $l_2->_log($scale); # scale+4, actually
+ $l_2 = $l_2->_log($scale); # scale+4, actually
$LOG_2 = $l_2->copy(); # cache the result for later
# the copy() is for mul below
$LOG_2_A = $scale;
}
- $l_2->bmul($twos); # * -2 => subtract, * 2 => add
+ $l_2 = $l_2->bmul($twos); # * -2 => subtract, * 2 => add
} else {
undef $l_2;
}
- $x->_log($scale); # need to do the "normal" way
- $x->badd($l_10) if defined $l_10; # correct it by ln(10)
- $x->badd($l_2) if defined $l_2; # and maybe by ln(2)
+ $x = $x->_log($scale); # need to do the "normal" way
+ $x = $x->badd($l_10) if defined $l_10; # correct it by ln(10)
+ $x = $x->badd($l_2) if defined $l_2; # and maybe by ln(2)
# all done, $x contains now the result
$x;
}
-sub _e_add {
- # Internal helper sub to take two positive integers and their signs and
- # then add them. Input ($LIB, $LIB, ('+'|'-'), ('+'|'-')), output
- # ($LIB, ('+'|'-')).
-
- my ($x, $y, $xs, $ys) = @_;
-
- # if the signs are equal we can add them (-5 + -3 => -(5 + 3) => -8)
- if ($xs eq $ys) {
- $x = $LIB->_add($x, $y); # +a + +b or -a + -b
- } else {
- my $a = $LIB->_acmp($x, $y);
- if ($a == 0) {
- # This does NOT modify $x in-place. TODO: Fix this?
- $x = $LIB->_zero(); # result is 0
- $xs = '+';
- return ($x, $xs);
- }
- if ($a > 0) {
- $x = $LIB->_sub($x, $y); # abs sub
- } else { # a < 0
- $x = $LIB->_sub ($y, $x, 1); # abs sub
- $xs = $ys;
- }
- }
-
- $xs = '+' if $xs eq '-' && $LIB->_is_zero($x); # no "-0"
-
- return ($x, $xs);
-}
-
-sub _e_sub {
- # Internal helper sub to take two positive integers and their signs and
- # then subtract them. Input ($LIB, $LIB, ('+'|'-'), ('+'|'-')),
- # output ($LIB, ('+'|'-'))
- my ($x, $y, $xs, $ys) = @_;
-
- # flip sign
- $ys = $ys eq '+' ? '-' : '+'; # swap sign of second operand ...
- _e_add($x, $y, $xs, $ys); # ... and let _e_add() do the job
- #$LIB -> _sadd($x, $xs, $y, $ys); # ... and let $LIB -> _sadd() do the job
-}
-
sub _pow {
# Calculate a power where $y is a non-integer, like 2 ** 0.3
my ($x, $y, @r) = @_;
@@ -5284,23 +5784,32 @@ sub _pow {
# when user set globals, they would interfere with our calculation, so
# disable them and later re-enable them
no strict 'refs';
- my $abr = "$class\::accuracy"; my $ab = $$abr; $$abr = undef;
- my $pbr = "$class\::precision"; my $pb = $$pbr; $$pbr = undef;
+ my $abr = "$class\::accuracy";
+ my $ab = $$abr;
+ $$abr = undef;
+ my $pbr = "$class\::precision";
+ my $pb = $$pbr;
+ $$pbr = undef;
# we also need to disable any set A or P on $x (_find_round_parameters took
# them already into account), since these would interfere, too
delete $x->{_a};
delete $x->{_p};
- # need to disable $upgrade in BigInt, to avoid deep recursion
+
+ # Disabling upgrading and downgrading is no longer necessary to avoid an
+ # infinite recursion, but it avoids unnecessary upgrading and downgrading in
+ # the intermediate computations.
+
local $Math::BigInt::upgrade = undef;
+ local $Math::BigFloat::downgrade = undef;
my ($limit, $v, $u, $below, $factor, $next, $over);
$u = $x->copy()->blog(undef, $scale)->bmul($y);
my $do_invert = ($u->{sign} eq '-');
- $u->bneg() if $do_invert;
+ $u = $u->bneg() if $do_invert;
$v = $class->bone(); # 1
$factor = $class->new(2); # 2
- $x->bone(); # first term: 1
+ $x = $x->bone(); # first term: 1
$below = $v->copy();
$over = $u->copy();
@@ -5312,25 +5821,25 @@ sub _pow {
# anymore, so we stop:
$next = $over->copy()->bdiv($below, $scale);
last if $next->bacmp($limit) <= 0;
- $x->badd($next);
+ $x = $x->badd($next);
# calculate things for the next term
$over *= $u;
$below *= $factor;
- $factor->binc();
+ $factor = $factor->binc();
last if $x->{sign} !~ /^[-+]$/;
}
if ($do_invert) {
my $x_copy = $x->copy();
- $x->bone->bdiv($x_copy, $scale);
+ $x = $x->bone->bdiv($x_copy, $scale);
}
# shortcut to not run through _find_round_parameters again
if (defined $params[0]) {
- $x->bround($params[0], $params[2]); # then round accordingly
+ $x = $x->bround($params[0], $params[2]); # then round accordingly
} else {
- $x->bfround($params[1], $params[2]); # then round accordingly
+ $x = $x->bfround($params[1], $params[2]); # then round accordingly
}
if ($fallback) {
# clear a/p after round, since user did not request it
@@ -5343,6 +5852,19 @@ sub _pow {
$x;
}
+# These functions are only provided for backwards compabibility so that old
+# version of Math::BigRat etc. don't complain about missing them.
+
+sub _e_add {
+ my ($x, $y, $xs, $ys) = @_;
+ return $LIB -> _sadd($x, $xs, $y, $ys);
+}
+
+sub _e_sub {
+ my ($x, $y, $xs, $ys) = @_;
+ return $LIB -> _ssub($x, $xs, $y, $ys);
+}
+
1;
__END__
@@ -5395,6 +5917,8 @@ Math::BigFloat - arbitrary size floating
$y = $x->copy(); # make a copy (unlike $y = $x)
$y = $x->as_int(); # return as BigInt
+ $y = $x->as_float(); # return as a Math::BigFloat
+ $y = $x->as_rat(); # return as a Math::BigRat
# Boolean methods (these don't modify the invocand)
@@ -5516,6 +6040,8 @@ Math::BigFloat - arbitrary size floating
$x->bnstr(); # string in normalized notation
$x->bestr(); # string in engineering notation
$x->bdstr(); # string in decimal notation
+ $x->bfstr(); # string in fractional notation
+
$x->as_hex(); # as signed hexadecimal string with prefixed 0x
$x->as_bin(); # as signed binary string with prefixed 0b
$x->as_oct(); # as signed octal string with prefixed 0
@@ -5921,10 +6447,11 @@ supplied to the operation after the I<sc
Math::BigFloat->round_mode('zero');
$y = $x->copy()->bdiv(3,6); # will also give 0.666667
-Note that C<< Math::BigFloat->accuracy() >> and C<< Math::BigFloat->precision() >>
-set the global variables, and thus B<any> newly created number will be subject
-to the global rounding B<immediately>. This means that in the examples above, the
-C<3> as argument to C<bdiv()> will also get an accuracy of B<5>.
+Note that C<< Math::BigFloat->accuracy() >> and
+C<< Math::BigFloat->precision() >> set the global variables, and thus B<any>
+newly created number will be subject to the global rounding B<immediately>. This
+means that in the examples above, the C<3> as argument to C<bdiv()> will also
+get an accuracy of B<5>.
It is less confusing to either calculate the result fully, and afterwards
round it explicitly, or use the additional parameters to the math
@@ -6103,7 +6630,8 @@ math library for directly storing the nu
=head1 EXPORTS
-C<Math::BigFloat> exports nothing by default, but can export the C<bpi()> method:
+C<Math::BigFloat> exports nothing by default, but can export the C<bpi()>
+method:
use Math::BigFloat qw/bpi/;
@@ -6178,7 +6706,8 @@ a certain number of digits:
print "$z\n";
print $z->precision(),"\n"; # 4
-Replacing L</precision()> with L</accuracy()> is probably not what you want, either:
+Replacing L</precision()> with L</accuracy()> is probably not what you want,
+either:
use Math::BigFloat;
Index: gnu/usr.bin/perl/cpan/Math-BigInt/lib/Math/BigInt.pm
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Math-BigInt/lib/Math/BigInt.pm,v
diff -u -p -a -u -p -r1.7 BigInt.pm
--- gnu/usr.bin/perl/cpan/Math-BigInt/lib/Math/BigInt.pm 15 Feb 2023 01:36:19 -0000 1.7
+++ gnu/usr.bin/perl/cpan/Math-BigInt/lib/Math/BigInt.pm 21 Feb 2024 15:47:01 -0000
@@ -21,9 +21,9 @@ use strict;
use warnings;
use Carp qw< carp croak >;
-use Scalar::Util qw< blessed >;
+use Scalar::Util qw< blessed refaddr >;
-our $VERSION = '1.999830';
+our $VERSION = '1.999837';
$VERSION =~ tr/_//d;
require Exporter;
@@ -58,7 +58,6 @@ use overload
'%' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> bmod($_[0])
: $_[0] -> copy() -> bmod($_[1]); },
-
'**' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> bpow($_[0])
: $_[0] -> copy() -> bpow($_[1]); },
@@ -216,7 +215,8 @@ use overload
# These vars are public, but their direct usage is not recommended, use the
# accessor methods instead
-our $round_mode = 'even'; # one of 'even', 'odd', '+inf', '-inf', 'zero', 'trunc' or 'common'
+# $round_mode is 'even', 'odd', '+inf', '-inf', 'zero', 'trunc', or 'common'.
+our $round_mode = 'even';
our $accuracy = undef;
our $precision = undef;
our $div_scale = 40;
@@ -262,9 +262,9 @@ BEGIN {
tie $rnd_mode, 'Math::BigInt';
# set up some handy alias names
- *as_int = \&as_number;
*is_pos = \&is_positive;
*is_neg = \&is_negative;
+ *as_number = \&as_int;
}
###############################################################################
@@ -297,6 +297,7 @@ sub upgrade {
# make Class->upgrade() work
my $self = shift;
my $class = ref($self) || $self || __PACKAGE__;
+
# need to set new value?
if (@_ > 0) {
return ${"${class}::upgrade"} = $_[0];
@@ -361,11 +362,11 @@ sub accuracy {
if (ref($x)) {
# Set instance variable.
- $x->bround($a) if $a; # not for undef, 0
+ $x = $x->bround($a) if $a; # not for undef, 0
$x->{_a} = $a; # set/overwrite, even if not rounded
delete $x->{_p}; # clear P
# Why return class variable here? Fixme!
- $a = ${"${class}::accuracy"} unless defined $a; # proper return value
+ $a = ${"${class}::accuracy"} unless defined $a;
} else {
# Set class variable.
${"${class}::accuracy"} = $a; # set global A
@@ -376,7 +377,7 @@ sub accuracy {
}
# Return instance variable.
- return $x->{_a} if ref($x) && (defined $x->{_a} || defined $x->{_p});
+ return $x->{_a} if ref($x) && (defined($x->{_a}) || defined($x->{_p}));
# Return class variable.
return ${"${class}::accuracy"};
@@ -403,11 +404,11 @@ sub precision {
if (ref($x)) {
# Set instance variable.
- $x->bfround($p) if $p; # not for undef, 0
+ $x = $x->bfround($p) if $p; # not for undef, 0
$x->{_p} = $p; # set/overwrite, even if not rounded
delete $x->{_a}; # clear A
# Why return class variable here? Fixme!
- $p = ${"${class}::precision"} unless defined $p; # proper return value
+ $p = ${"${class}::precision"} unless defined $p;
} else {
# Set class variable.
${"${class}::precision"} = $p; # set global P
@@ -418,7 +419,7 @@ sub precision {
}
# Return instance variable.
- return $x->{_p} if ref($x) && (defined $x->{_a} || defined $x->{_p});
+ return $x->{_p} if ref($x) && (defined($x->{_a}) || defined($x->{_p}));
# Return class variable.
return ${"${class}::precision"};
@@ -551,26 +552,22 @@ sub new {
$class -> import() if $IMPORT == 0;
- # Although this use has been discouraged for more than 10 years, people
- # apparently still use it, so we still support it.
+ # Calling new() with no input arguments has been discouraged for more than
+ # 10 years, but people apparently still use it, so we still support it.
return $class -> bzero() unless @_;
my ($wanted, @r) = @_;
if (!defined($wanted)) {
- #if (warnings::enabled("uninitialized")) {
- # warnings::warn("uninitialized",
- # "Use of uninitialized value in new()");
- #}
+ #carp("Use of uninitialized value in new()")
+ # if warnings::enabled("uninitialized");
return $class -> bzero(@r);
}
if (!ref($wanted) && $wanted eq "") {
- #if (warnings::enabled("numeric")) {
- # warnings::warn("numeric",
- # q|Argument "" isn't numeric in new()|);
- #}
+ #carp(q|Argument "" isn't numeric in new()|)
+ # if warnings::enabled("numeric");
#return $class -> bzero(@r);
return $class -> bnan(@r);
}
@@ -583,48 +580,60 @@ sub new {
if (defined(blessed($wanted)) && $wanted -> isa($class)) {
- # We don't copy the accuracy and precision, because a new object should
- # get them from the global configuration.
+ # Don't copy the accuracy and precision, because a new object should get
+ # them from the global configuration.
$self -> {sign} = $wanted -> {sign};
$self -> {value} = $LIB -> _copy($wanted -> {value});
- $self->round(@r) unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
+ $self = $self->round(@r)
+ unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
return $self;
}
# Shortcut for non-zero scalar integers with no non-zero exponent.
- if ($wanted =~ / ^
- ([+-]?) # optional sign
- ([1-9][0-9]*) # non-zero significand
- (\.0*)? # ... with optional zero fraction
- ([Ee][+-]?0+)? # optional zero exponent
- \z
- /x)
+ if ($wanted =~
+ / ^
+ ( [+-]? ) # optional sign
+ ( [1-9] [0-9]* ) # non-zero significand
+ ( \.0* )? # ... with optional zero fraction
+ ( [Ee] [+-]? 0+ )? # optional zero exponent
+ \z
+ /x)
{
my $sgn = $1;
my $abs = $2;
$self->{sign} = $sgn || '+';
$self->{value} = $LIB->_new($abs);
- $self->round(@r) unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
+ $self = $self->round(@r);
return $self;
}
# Handle Infs.
- if ($wanted =~ /^\s*([+-]?)inf(inity)?\s*\z/i) {
+ if ($wanted =~ / ^
+ \s*
+ ( [+-]? )
+ inf (?: inity )?
+ \s*
+ \z
+ /ix)
+ {
my $sgn = $1 || '+';
- $self = $class -> binf($sgn);
- $self->round(@r) unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
- return $self;
+ return $class -> binf($sgn, @r);
}
# Handle explicit NaNs (not the ones returned due to invalid input).
- if ($wanted =~ /^\s*([+-]?)nan\s*\z/i) {
- $self = $class -> bnan();
- $self->round(@r) unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
- return $self;
+ if ($wanted =~ / ^
+ \s*
+ ( [+-]? )
+ nan
+ \s*
+ \z
+ /ix)
+ {
+ return $class -> bnan(@r);
}
my @parts;
@@ -634,7 +643,7 @@ sub new {
# have a "0x", "0X", "x", or "X" prefix, cf. CORE::oct().
$wanted =~ /^\s*[+-]?0?[Xx]/ and
- @parts = $class -> _hex_str_to_lib_parts($wanted)
+ @parts = $class -> _hex_str_to_flt_lib_parts($wanted)
or
@@ -642,7 +651,7 @@ sub new {
# "0o", "0O", "o", "O" prefix, cf. CORE::oct().
$wanted =~ /^\s*[+-]?0?[Oo]/ and
- @parts = $class -> _oct_str_to_lib_parts($wanted)
+ @parts = $class -> _oct_str_to_flt_lib_parts($wanted)
or
@@ -650,7 +659,7 @@ sub new {
# "0b", "0B", "b", or "B" prefix, cf. CORE::oct().
$wanted =~ /^\s*[+-]?0?[Bb]/ and
- @parts = $class -> _bin_str_to_lib_parts($wanted)
+ @parts = $class -> _bin_str_to_flt_lib_parts($wanted)
or
@@ -658,38 +667,38 @@ sub new {
# above and octal floating point numbers that don't have any of the
# "0o", "0O", "o", or "O" prefixes. First see if it is a decimal number.
- @parts = $class -> _dec_str_to_lib_parts($wanted)
+ @parts = $class -> _dec_str_to_flt_lib_parts($wanted)
or
# See if it is an octal floating point number. The extra check is
- # included because _oct_str_to_lib_parts() accepts octal numbers that
- # don't have a prefix (this is needed to make it work with, e.g.,
+ # included because _oct_str_to_flt_lib_parts() accepts octal numbers
+ # that don't have a prefix (this is needed to make it work with, e.g.,
# from_oct() that don't require a prefix). However, Perl requires a
# prefix for octal floating point literals. For example, "1p+0" is not
# valid, but "01p+0" and "0__1p+0" are.
$wanted =~ /^\s*[+-]?0_*\d/ and
- @parts = $class -> _oct_str_to_lib_parts($wanted))
+ @parts = $class -> _oct_str_to_flt_lib_parts($wanted))
{
# The value is an integer iff the exponent is non-negative.
if ($parts[2] eq '+') {
$self -> {sign} = $parts[0];
$self -> {value} = $LIB -> _lsft($parts[1], $parts[3], 10);
- $self->round(@r) unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
+ $self = $self->round(@r)
+ unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
return $self;
}
- # If we get here, the value is a valid number, but it is not an integer.
+ # The value is not an integer, so upgrade if upgrading is enabled.
return $upgrade -> new($wanted, @r) if defined $upgrade;
- return $class -> bnan();
}
# If we get here, the value is neither a valid decimal, binary, octal, or
# hexadecimal number. It is not explicit an Inf or a NaN either.
- return $class -> bnan();
+ return $class -> bnan(@r);
}
# Create a Math::BigInt from a decimal string. This is an equivalent to
@@ -703,16 +712,16 @@ sub from_dec {
# Don't modify constant (read-only) objects.
- return if $selfref && $self->modify('from_dec');
+ return $self if $selfref && $self->modify('from_dec');
my $str = shift;
my @r = @_;
# If called as a class method, initialize a new object.
- $self = $class -> bzero() unless $selfref;
+ $self = $class -> bzero(@r) unless $selfref;
- if (my @parts = $class -> _dec_str_to_lib_parts($str)) {
+ if (my @parts = $class -> _dec_str_to_flt_lib_parts($str)) {
# The value is an integer iff the exponent is non-negative.
@@ -722,6 +731,8 @@ sub from_dec {
return $self -> round(@r);
}
+ # The value is not an integer, so upgrade if upgrading is enabled.
+
return $upgrade -> new($str, @r) if defined $upgrade;
}
@@ -737,16 +748,16 @@ sub from_hex {
# Don't modify constant (read-only) objects.
- return if $selfref && $self->modify('from_hex');
+ return $self if $selfref && $self->modify('from_hex');
my $str = shift;
my @r = @_;
# If called as a class method, initialize a new object.
- $self = $class -> bzero() unless $selfref;
+ $self = $class -> bzero(@r) unless $selfref;
- if (my @parts = $class -> _hex_str_to_lib_parts($str)) {
+ if (my @parts = $class -> _hex_str_to_flt_lib_parts($str)) {
# The value is an integer iff the exponent is non-negative.
@@ -756,6 +767,8 @@ sub from_hex {
return $self -> round(@r);
}
+ # The value is not an integer, so upgrade if upgrading is enabled.
+
return $upgrade -> new($str, @r) if defined $upgrade;
}
@@ -771,16 +784,16 @@ sub from_oct {
# Don't modify constant (read-only) objects.
- return if $selfref && $self->modify('from_oct');
+ return $self if $selfref && $self->modify('from_oct');
my $str = shift;
my @r = @_;
# If called as a class method, initialize a new object.
- $self = $class -> bzero() unless $selfref;
+ $self = $class -> bzero(@r) unless $selfref;
- if (my @parts = $class -> _oct_str_to_lib_parts($str)) {
+ if (my @parts = $class -> _oct_str_to_flt_lib_parts($str)) {
# The value is an integer iff the exponent is non-negative.
@@ -790,6 +803,8 @@ sub from_oct {
return $self -> round(@r);
}
+ # The value is not an integer, so upgrade if upgrading is enabled.
+
return $upgrade -> new($str, @r) if defined $upgrade;
}
@@ -805,16 +820,16 @@ sub from_bin {
# Don't modify constant (read-only) objects.
- return if $selfref && $self->modify('from_bin');
+ return $self if $selfref && $self->modify('from_bin');
my $str = shift;
my @r = @_;
# If called as a class method, initialize a new object.
- $self = $class -> bzero() unless $selfref;
+ $self = $class -> bzero(@r) unless $selfref;
- if (my @parts = $class -> _bin_str_to_lib_parts($str)) {
+ if (my @parts = $class -> _bin_str_to_flt_lib_parts($str)) {
# The value is an integer iff the exponent is non-negative.
@@ -824,6 +839,8 @@ sub from_bin {
return $self -> round(@r);
}
+ # The value is not an integer, so upgrade if upgrading is enabled.
+
return $upgrade -> new($str, @r) if defined $upgrade;
}
@@ -839,7 +856,7 @@ sub from_bytes {
# Don't modify constant (read-only) objects.
- return if $selfref && $self->modify('from_bytes');
+ return $self if $selfref && $self->modify('from_bytes');
croak("from_bytes() requires a newer version of the $LIB library.")
unless $LIB->can('_from_bytes');
@@ -849,7 +866,7 @@ sub from_bytes {
# If called as a class method, initialize a new object.
- $self = $class -> bzero() unless $selfref;
+ $self = $class -> bzero(@r) unless $selfref;
$self -> {sign} = '+';
$self -> {value} = $LIB -> _from_bytes($str);
return $self -> round(@r);
@@ -862,11 +879,10 @@ sub from_base {
# Don't modify constant (read-only) objects.
- return if $selfref && $self->modify('from_base');
+ return $self if $selfref && $self->modify('from_base');
- my $str = shift;
+ my ($str, $base, $cs, @r) = @_; # $cs is the collation sequence
- my $base = shift;
$base = $class->new($base) unless ref($base);
croak("the base must be a finite integer >= 2")
@@ -879,14 +895,15 @@ sub from_base {
# If no collating sequence is given, pass some of the conversions to
# methods optimized for those cases.
- if (! @_) {
- return $self -> from_bin($str) if $base == 2;
- return $self -> from_oct($str) if $base == 8;
- return $self -> from_hex($str) if $base == 16;
+ unless (defined $cs) {
+ return $self -> from_bin($str, @r) if $base == 2;
+ return $self -> from_oct($str, @r) if $base == 8;
+ return $self -> from_hex($str, @r) if $base == 16;
if ($base == 10) {
- my $tmp = $class -> new($str);
+ my $tmp = $class -> from_dec($str, @r);
$self -> {value} = $tmp -> {value};
$self -> {sign} = '+';
+ return $self -> bround(@r);
}
}
@@ -895,8 +912,8 @@ sub from_base {
$self -> {sign} = '+';
$self -> {value}
- = $LIB->_from_base($str, $base -> {value}, @_ ? shift() : ());
- return $self;
+ = $LIB->_from_base($str, $base -> {value}, defined($cs) ? $cs : ());
+ return $self -> bround(@r);
}
sub from_base_num {
@@ -906,7 +923,7 @@ sub from_base_num {
# Don't modify constant (read-only) objects.
- return if $selfref && $self->modify('from_base_num');
+ return $self if $selfref && $self->modify('from_base_num');
# Make sure we have an array of non-negative, finite, numerical objects.
@@ -929,7 +946,7 @@ sub from_base_num {
# If called as a class method, initialize a new object.
- $self = $class -> bzero() unless $selfref;
+ $self = $class -> bzero(@r) unless $selfref;
croak("from_base_num() requires a newer version of the $LIB library.")
unless $LIB->can('_from_base_num');
@@ -944,9 +961,12 @@ sub from_base_num {
sub bzero {
# create/assign '+0'
- if (@_ == 0) {
- #carp("Using bzero() as a function is deprecated;",
- # " use bzero() as a method instead");
+ # Class::method(...) -> Class->method(...)
+ unless (@_ && (defined(blessed($_[0])) && $_[0] -> isa(__PACKAGE__) ||
+ $_[0] =~ /^[a-z]\w*(?:::[a-z]\w*)*$/i))
+ {
+ #carp "Using ", (caller(0))[3], "() as a function is deprecated;",
+ # " use is as a method instead";
unshift @_, __PACKAGE__;
}
@@ -958,7 +978,13 @@ sub bzero {
# Don't modify constant (read-only) objects.
- return if $selfref && $self->modify('bzero');
+ return $self if $selfref && $self->modify('bzero');
+
+ # Get the rounding parameters, if any.
+
+ my @r = @_;
+
+ # If called as a class method, initialize a new object.
$self = bless {}, $class unless $selfref;
@@ -966,19 +992,17 @@ sub bzero {
$self->{value} = $LIB->_zero();
# If rounding parameters are given as arguments, use them. If no rounding
- # parameters are given, and if called as a class method initialize the new
+ # parameters are given, and if called as a class method, initialize the new
# instance with the class variables.
- if (@_) {
+ if (@r) {
croak "can't specify both accuracy and precision"
- if @_ >= 2 && defined $_[0] && defined $_[1];
+ if @r >= 2 && defined($r[0]) && defined($r[1]);
$self->{_a} = $_[0];
$self->{_p} = $_[1];
- } else {
- unless($selfref) {
- $self->{_a} = $class -> accuracy();
- $self->{_p} = $class -> precision();
- }
+ } elsif (!$selfref) {
+ $self->{_a} = $class -> accuracy();
+ $self->{_p} = $class -> precision();
}
return $self;
@@ -987,9 +1011,12 @@ sub bzero {
sub bone {
# Create or assign '+1' (or -1 if given sign '-').
- if (@_ == 0 || (defined($_[0]) && ($_[0] eq '+' || $_[0] eq '-'))) {
- #carp("Using bone() as a function is deprecated;",
- # " use bone() as a method instead");
+ # Class::method(...) -> Class->method(...)
+ unless (@_ && (defined(blessed($_[0])) && $_[0] -> isa(__PACKAGE__) ||
+ $_[0] =~ /^[a-z]\w*(?:::[a-z]\w*)*$/i))
+ {
+ #carp "Using ", (caller(0))[3], "() as a function is deprecated;",
+ # " use is as a method instead";
unshift @_, __PACKAGE__;
}
@@ -1001,33 +1028,38 @@ sub bone {
# Don't modify constant (read-only) objects.
- return if $selfref && $self->modify('bone');
+ return $self if $selfref && $self->modify('bone');
+
+ my ($sign, @r) = @_;
+
+ # Get the sign.
- my $sign = '+'; # default
- if (@_) {
- $sign = shift;
- $sign = $sign =~ /^\s*-/ ? "-" : "+";
+ if (defined($_[0]) && $_[0] =~ /^\s*([+-])\s*$/) {
+ $sign = $1;
+ shift;
+ } else {
+ $sign = '+';
}
+ # If called as a class method, initialize a new object.
+
$self = bless {}, $class unless $selfref;
$self->{sign} = $sign;
$self->{value} = $LIB->_one();
# If rounding parameters are given as arguments, use them. If no rounding
- # parameters are given, and if called as a class method initialize the new
+ # parameters are given, and if called as a class method, initialize the new
# instance with the class variables.
- if (@_) {
+ if (@r) {
croak "can't specify both accuracy and precision"
- if @_ >= 2 && defined $_[0] && defined $_[1];
+ if @r >= 2 && defined($r[0]) && defined($r[1]);
$self->{_a} = $_[0];
$self->{_p} = $_[1];
- } else {
- unless($selfref) {
- $self->{_a} = $class -> accuracy();
- $self->{_p} = $class -> precision();
- }
+ } elsif (!$selfref) {
+ $self->{_a} = $class -> accuracy();
+ $self->{_p} = $class -> precision();
}
return $self;
@@ -1036,11 +1068,12 @@ sub bone {
sub binf {
# create/assign a '+inf' or '-inf'
- if (@_ == 0 || (defined($_[0]) && !ref($_[0]) &&
- $_[0] =~ /^\s*[+-](inf(inity)?)?\s*$/))
+ # Class::method(...) -> Class->method(...)
+ unless (@_ && (defined(blessed($_[0])) && $_[0] -> isa(__PACKAGE__) ||
+ $_[0] =~ /^[a-z]\w*(?:::[a-z]\w*)*$/i))
{
- #carp("Using binf() as a function is deprecated;",
- # " use binf() as a method instead");
+ #carp "Using ", (caller(0))[3], "() as a function is deprecated;",
+ # " use is as a method instead";
unshift @_, __PACKAGE__;
}
@@ -1059,10 +1092,21 @@ sub binf {
# Don't modify constant (read-only) objects.
- return if $selfref && $self->modify('binf');
+ return $self if $selfref && $self->modify('binf');
+
+ # Get the sign.
- my $sign = shift;
- $sign = defined $sign && $sign =~ /^\s*-/ ? "-" : "+";
+ my $sign = '+'; # default is to return positive infinity
+ if (defined($_[0]) && $_[0] =~ /^\s*([+-])(inf|$)/i) {
+ $sign = $1;
+ shift;
+ }
+
+ # Get the rounding parameters, if any.
+
+ my @r = @_;
+
+ # If called as a class method, initialize a new object.
$self = bless {}, $class unless $selfref;
@@ -1070,19 +1114,17 @@ sub binf {
$self -> {value} = $LIB -> _zero();
# If rounding parameters are given as arguments, use them. If no rounding
- # parameters are given, and if called as a class method initialize the new
+ # parameters are given, and if called as a class method, initialize the new
# instance with the class variables.
- if (@_) {
+ if (@r) {
croak "can't specify both accuracy and precision"
- if @_ >= 2 && defined $_[0] && defined $_[1];
+ if @r >= 2 && defined($r[0]) && defined($r[1]);
$self->{_a} = $_[0];
$self->{_p} = $_[1];
- } else {
- unless($selfref) {
- $self->{_a} = $class -> accuracy();
- $self->{_p} = $class -> precision();
- }
+ } elsif (!$selfref) {
+ $self->{_a} = $class -> accuracy();
+ $self->{_p} = $class -> precision();
}
return $self;
@@ -1091,9 +1133,12 @@ sub binf {
sub bnan {
# create/assign a 'NaN'
- if (@_ == 0) {
- #carp("Using bnan() as a function is deprecated;",
- # " use bnan() as a method instead");
+ # Class::method(...) -> Class->method(...)
+ unless (@_ && (defined(blessed($_[0])) && $_[0] -> isa(__PACKAGE__) ||
+ $_[0] =~ /^[a-z]\w*(?:::[a-z]\w*)*$/i))
+ {
+ #carp "Using ", (caller(0))[3], "() as a function is deprecated;",
+ # " use is as a method instead";
unshift @_, __PACKAGE__;
}
@@ -1112,7 +1157,11 @@ sub bnan {
# Don't modify constant (read-only) objects.
- return if $selfref && $self->modify('bnan');
+ return $self if $selfref && $self->modify('bnan');
+
+ # Get the rounding parameters, if any.
+
+ my @r = @_;
$self = bless {}, $class unless $selfref;
@@ -1120,19 +1169,17 @@ sub bnan {
$self -> {value} = $LIB -> _zero();
# If rounding parameters are given as arguments, use them. If no rounding
- # parameters are given, and if called as a class method initialize the new
+ # parameters are given, and if called as a class method, initialize the new
# instance with the class variables.
- if (@_) {
+ if (@r) {
croak "can't specify both accuracy and precision"
- if @_ >= 2 && defined $_[0] && defined $_[1];
+ if @r >= 2 && defined($r[0]) && defined($r[1]);
$self->{_a} = $_[0];
$self->{_p} = $_[1];
- } else {
- unless($selfref) {
- $self->{_a} = $class -> accuracy();
- $self->{_p} = $class -> precision();
- }
+ } elsif (!$selfref) {
+ $self->{_a} = $class -> accuracy();
+ $self->{_p} = $class -> precision();
}
return $self;
@@ -1140,19 +1187,28 @@ sub bnan {
sub bpi {
- # Called as Argument list
- # --------- -------------
- # Math::BigInt->bpi() ("Math::BigInt")
- # Math::BigInt->bpi(10) ("Math::BigInt", 10)
- # $x->bpi() ($x)
- # $x->bpi(10) ($x, 10)
- # Math::BigInt::bpi() ()
- # Math::BigInt::bpi(10) (10)
+ # Class::method(...) -> Class->method(...)
+ unless (@_ && (defined(blessed($_[0])) && $_[0] -> isa(__PACKAGE__) ||
+ $_[0] =~ /^[a-z]\w*(?:::[a-z]\w*)*$/i))
+ {
+ #carp "Using ", (caller(0))[3], "() as a function is deprecated;",
+ # " use is as a method instead";
+ unshift @_, __PACKAGE__;
+ }
+
+ # Called as Argument list
+ # --------- -------------
+ # Math::BigFloat->bpi() ("Math::BigFloat")
+ # Math::BigFloat->bpi(10) ("Math::BigFloat", 10)
+ # $x->bpi() ($x)
+ # $x->bpi(10) ($x, 10)
+ # Math::BigFloat::bpi() ()
+ # Math::BigFloat::bpi(10) (10)
#
# In ambiguous cases, we favour the OO-style, so the following case
#
- # $n = Math::BigInt->new("10");
- # $x = Math::BigInt->bpi($n);
+ # $n = Math::BigFloat->new("10");
+ # $x = Math::BigFloat->bpi($n);
#
# which gives an argument list with the single element $n, is resolved as
#
@@ -1161,35 +1217,12 @@ sub bpi {
my $self = shift;
my $selfref = ref $self;
my $class = $selfref || $self;
+ my @r = @_; # rounding paramters
- my @r; # rounding paramters
-
- # If bpi() is called as a function ...
- #
- # This cludge is necessary because we still support bpi() as a function. If
- # bpi() is called with either no argument or one argument, and that one
- # argument is either undefined or a scalar that looks like a number, then
- # we assume bpi() is called as a function.
-
- if (@_ == 0 &&
- (defined($self) && !ref($self) && $self =~ /^\s*[+-]?\d/)
- ||
- !defined($self))
- {
- $r[0] = $self;
- $class = __PACKAGE__;
- $self = bless {}, $class;
- }
-
- # ... or if bpi() is called as a method ...
-
- else {
- @r = @_;
- if ($selfref) { # bpi() called as instance method
- return $self if $self -> modify('bpi');
- } else { # bpi() called as class method
- $self = bless {}, $class;
- }
+ if ($selfref) { # bpi() called as an instance method
+ return $self if $self -> modify('bpi');
+ } else { # bpi() called as a class method
+ $self = bless {}, $class; # initialize new instance
}
return $upgrade -> bpi(@r) if defined $upgrade;
@@ -1197,34 +1230,100 @@ sub bpi {
# hard-wired to "3"
$self -> {sign} = '+';
$self -> {value} = $LIB -> _new("3");
- $self -> round(@r) unless @r >= 2 && !defined($r[0]) && !defined($r[1]);
+ $self = $self -> round(@r);
return $self;
}
sub copy {
- my $self = shift;
- my $selfref = ref $self;
- my $class = $selfref || $self;
-
- # If called as a class method, the object to copy is the next argument.
+ my ($x, $class);
+ if (ref($_[0])) { # $y = $x -> copy()
+ $x = shift;
+ $class = ref($x);
+ } else { # $y = Math::BigInt -> copy($y)
+ $class = shift;
+ $x = shift;
+ }
- $self = shift() unless $selfref;
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @_;
my $copy = bless {}, $class;
- $copy->{sign} = $self->{sign};
- $copy->{value} = $LIB->_copy($self->{value});
- $copy->{_a} = $self->{_a} if exists $self->{_a};
- $copy->{_p} = $self->{_p} if exists $self->{_p};
+ $copy->{sign} = $x->{sign};
+ $copy->{value} = $LIB->_copy($x->{value});
+ $copy->{_a} = $x->{_a} if exists $x->{_a};
+ $copy->{_p} = $x->{_p} if exists $x->{_p};
return $copy;
}
-sub as_number {
- # An object might be asked to return itself as bigint on certain overloaded
- # operations. This does exactly this, so that sub classes can simple inherit
- # it or override with their own integer conversion routine.
- $_[0]->copy();
+sub as_int {
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+ # If called as an instance method, and the instance class is something we
+ # upgrade to, $x might not be a Math::BigInt, so don't just call copy().
+
+ return $x -> copy() if $x -> isa("Math::BigInt");
+
+ # disable upgrading and downgrading
+
+ my $upg = Math::BigInt -> upgrade();
+ my $dng = Math::BigInt -> downgrade();
+ Math::BigInt -> upgrade(undef);
+ Math::BigInt -> downgrade(undef);
+
+ my $y = Math::BigInt -> new($x);
+
+ # reset upgrading and downgrading
+
+ Math::BigInt -> upgrade($upg);
+ Math::BigInt -> downgrade($dng);
+
+ return $y;
+}
+
+sub as_float {
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+ # disable upgrading and downgrading
+
+ require Math::BigFloat;
+ my $upg = Math::BigFloat -> upgrade();
+ my $dng = Math::BigFloat -> downgrade();
+ Math::BigFloat -> upgrade(undef);
+ Math::BigFloat -> downgrade(undef);
+
+ my $y = Math::BigFloat -> new($x);
+
+ # reset upgrading and downgrading
+
+ Math::BigFloat -> upgrade($upg);
+ Math::BigFloat -> downgrade($dng);
+
+ return $y;
+}
+
+sub as_rat {
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+ # disable upgrading and downgrading
+
+ require Math::BigRat;
+ my $upg = Math::BigRat -> upgrade();
+ my $dng = Math::BigRat -> downgrade();
+ Math::BigRat -> upgrade(undef);
+ Math::BigRat -> downgrade(undef);
+
+ my $y = Math::BigRat -> new($x);
+
+ # reset upgrading and downgrading
+
+ Math::BigRat -> upgrade($upg);
+ Math::BigRat -> downgrade($dng);
+
+ return $y;
}
###############################################################################
@@ -1233,7 +1332,7 @@ sub as_number {
sub is_zero {
# return true if arg (BINT or num_str) is zero (array '+', '0')
- my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+ my (undef, $x) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
return 0 if $x->{sign} !~ /^\+$/; # -, NaN & +-inf aren't
$LIB->_is_zero($x->{value});
@@ -1241,22 +1340,22 @@ sub is_zero {
sub is_one {
# return true if arg (BINT or num_str) is +1, or -1 if sign is given
- my ($class, $x, $sign) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+ my (undef, $x, $sign) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
- $sign = '+' if !defined $sign || $sign ne '-';
+ $sign = '+' if !defined($sign) || $sign ne '-';
return 0 if $x->{sign} ne $sign; # -1 != +1, NaN, +-inf aren't either
$LIB->_is_one($x->{value});
}
sub is_finite {
- my $x = shift;
+ my (undef, $x) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
return $x->{sign} eq '+' || $x->{sign} eq '-';
}
sub is_inf {
# return true if arg (BINT or num_str) is +-inf
- my ($class, $x, $sign) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+ my (undef, $x, $sign) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
if (defined $sign) {
$sign = '[+-]inf' if $sign eq ''; # +- doesn't matter, only that's inf
@@ -1268,14 +1367,14 @@ sub is_inf {
sub is_nan {
# return true if arg (BINT or num_str) is NaN
- my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+ my (undef, $x) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
$x->{sign} eq $nan ? 1 : 0;
}
sub is_positive {
# return true when arg (BINT or num_str) is positive (> 0)
- my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+ my (undef, $x) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
return 1 if $x->{sign} eq '+inf'; # +inf is positive
@@ -1285,14 +1384,14 @@ sub is_positive {
sub is_negative {
# return true when arg (BINT or num_str) is negative (< 0)
- my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+ my (undef, $x) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
$x->{sign} =~ /^-/ ? 1 : 0; # -inf is negative, but NaN is not
}
sub is_non_negative {
# Return true if argument is non-negative (>= 0).
- my ($class, $x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+ my (undef, $x) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
return 1 if $x->{sign} =~ /^\+/;
return 1 if $x -> is_zero();
@@ -1301,7 +1400,7 @@ sub is_non_negative {
sub is_non_positive {
# Return true if argument is non-positive (<= 0).
- my ($class, $x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
+ my (undef, $x) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
return 1 if $x->{sign} =~ /^\-/;
return 1 if $x -> is_zero();
@@ -1310,7 +1409,7 @@ sub is_non_positive {
sub is_odd {
# return true when arg (BINT or num_str) is odd, false for even
- my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+ my (undef, $x) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
return 0 if $x->{sign} !~ /^[+-]$/; # NaN & +-inf aren't
$LIB->_is_odd($x->{value});
@@ -1318,7 +1417,7 @@ sub is_odd {
sub is_even {
# return true when arg (BINT or num_str) is even, false for odd
- my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+ my (undef, $x) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
return 0 if $x->{sign} !~ /^[+-]$/; # NaN & +-inf aren't
$LIB->_is_even($x->{value});
@@ -1326,8 +1425,7 @@ sub is_even {
sub is_int {
# return true when arg (BINT or num_str) is an integer
- # always true for Math::BigInt, but different for Math::BigFloat objects
- my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+ my (undef, $x) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
$x->{sign} =~ /^[+-]$/ ? 1 : 0; # inf/-inf/NaN aren't
}
@@ -1341,12 +1439,14 @@ sub bcmp {
# (BINT or num_str, BINT or num_str) return cond_code
# set up parameters
- my ($class, $x, $y) = ref($_[0]) && ref($_[0]) eq ref($_[1])
- ? (ref($_[0]), @_)
- : objectify(2, @_);
+ my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (ref($_[0]), @_)
+ : objectify(2, @_);
- return $upgrade->bcmp($x, $y) if defined $upgrade &&
- ((!$x->isa($class)) || (!$y->isa($class)));
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+ return $upgrade->bcmp($x, $y)
+ if defined($upgrade) && (!$x->isa($class) || !$y->isa($class));
if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/)) {
# handle +-inf and NaN
@@ -1357,6 +1457,7 @@ sub bcmp {
return -1 if $y->{sign} eq '+inf';
return +1;
}
+
# check sign for speed first
return 1 if $x->{sign} eq '+' && $y->{sign} eq '-'; # does also 0 <=> -y
return -1 if $x->{sign} eq '-' && $y->{sign} eq '+'; # does also -x <=> 0
@@ -1381,12 +1482,14 @@ sub bacmp {
# (BINT, BINT) return cond_code
# set up parameters
- my ($class, $x, $y) = ref($_[0]) && ref($_[0]) eq ref($_[1])
- ? (ref($_[0]), @_)
- : objectify(2, @_);
+ my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (ref($_[0]), @_)
+ : objectify(2, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
- return $upgrade->bacmp($x, $y) if defined $upgrade &&
- ((!$x->isa($class)) || (!$y->isa($class)));
+ return $upgrade->bacmp($x, $y)
+ if defined($upgrade) && (!$x->isa($class) || !$y->isa($class));
if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/)) {
# handle +-inf and NaN
@@ -1399,69 +1502,68 @@ sub bacmp {
}
sub beq {
- my $self = shift;
- my $selfref = ref $self;
+ my (undef, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (undef, @_)
+ : objectify(2, @_);
- croak 'beq() is an instance method, not a class method' unless $selfref;
- croak 'Wrong number of arguments for beq()' unless @_ == 1;
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
- my $cmp = $self -> bcmp(shift);
- return defined($cmp) && ! $cmp;
+ my $cmp = $x -> bcmp($y); # bcmp() upgrades if necessary
+ return defined($cmp) && !$cmp;
}
sub bne {
- my $self = shift;
- my $selfref = ref $self;
+ my (undef, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (undef, @_)
+ : objectify(2, @_);
- croak 'bne() is an instance method, not a class method' unless $selfref;
- croak 'Wrong number of arguments for bne()' unless @_ == 1;
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
- my $cmp = $self -> bcmp(shift);
- return defined($cmp) && ! $cmp ? '' : 1;
+ my $cmp = $x -> bcmp($y); # bcmp() upgrades if necessary
+ return defined($cmp) && !$cmp ? '' : 1;
}
sub blt {
- my $self = shift;
- my $selfref = ref $self;
+ my (undef, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (undef, @_)
+ : objectify(2, @_);
- croak 'blt() is an instance method, not a class method' unless $selfref;
- croak 'Wrong number of arguments for blt()' unless @_ == 1;
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
- my $cmp = $self -> bcmp(shift);
+ my $cmp = $x -> bcmp($y); # bcmp() upgrades if necessary
return defined($cmp) && $cmp < 0;
}
sub ble {
- my $self = shift;
- my $selfref = ref $self;
+ my (undef, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (undef, @_)
+ : objectify(2, @_);
- croak 'ble() is an instance method, not a class method' unless $selfref;
- croak 'Wrong number of arguments for ble()' unless @_ == 1;
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
- my $cmp = $self -> bcmp(shift);
+ my $cmp = $x -> bcmp($y); # bcmp() upgrades if necessary
return defined($cmp) && $cmp <= 0;
}
sub bgt {
- my $self = shift;
- my $selfref = ref $self;
+ my (undef, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (undef, @_)
+ : objectify(2, @_);
- croak 'bgt() is an instance method, not a class method' unless $selfref;
- croak 'Wrong number of arguments for bgt()' unless @_ == 1;
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
- my $cmp = $self -> bcmp(shift);
+ my $cmp = $x -> bcmp($y); # bcmp() upgrades if necessary
return defined($cmp) && $cmp > 0;
}
sub bge {
- my $self = shift;
- my $selfref = ref $self;
+ my (undef, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (undef, @_)
+ : objectify(2, @_);
- croak 'bge() is an instance method, not a class method'
- unless $selfref;
- croak 'Wrong number of arguments for bge()' unless @_ == 1;
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
- my $cmp = $self -> bcmp(shift);
+ my $cmp = $x -> bcmp($y); # bcmp() upgrades if necessary
return defined($cmp) && $cmp >= 0;
}
@@ -1472,84 +1574,104 @@ sub bge {
sub bneg {
# (BINT or num_str) return BINT
# negate number or make a negated number from string
- my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
return $x if $x->modify('bneg');
- # for +0 do not negate (to have always normalized +0). Does nothing for 'NaN'
- $x->{sign} =~ tr/+-/-+/ unless ($x->{sign} eq '+' && $LIB->_is_zero($x->{value}));
- $x;
+ return $upgrade -> bneg($x, @r) if defined($upgrade) && !$x->isa($class);
+
+ # Don't negate +0 so we always have the normalized form +0. Does nothing for
+ # 'NaN'.
+ $x->{sign} =~ tr/+-/-+/
+ unless $x->{sign} eq '+' && $LIB->_is_zero($x->{value});
+
+ $x -> round(@r);
}
sub babs {
# (BINT or num_str) return BINT
# make number absolute, or return absolute BINT from string
- my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
return $x if $x->modify('babs');
- # post-normalized abs for internal use (does nothing for NaN)
+
+ return $upgrade -> babs($x, @r) if defined($upgrade) && !$x->isa($class);
+
$x->{sign} =~ s/^-/+/;
- $x;
+
+ $x -> round(@r);
}
sub bsgn {
# Signum function.
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
- my $self = shift;
+ return $x if $x->modify('bsgn');
+
+ return $upgrade -> bsgn($x, @r) if defined($upgrade) && !$x->isa($class);
- return $self if $self->modify('bsgn');
+ return $x -> bone("+", @r) if $x -> is_pos();
+ return $x -> bone("-", @r) if $x -> is_neg();
- return $self -> bone("+") if $self -> is_pos();
- return $self -> bone("-") if $self -> is_neg();
- return $self; # zero or NaN
+ $x -> round(@r);
}
sub bnorm {
# (numstr or BINT) return BINT
# Normalize number -- no-op here
- my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+ my ($class, $x, @r) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+
+ # This method is called from the rounding methods, so if this method
+ # supports rounding by calling the rounding methods, we get an infinite
+ # recursion.
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
$x;
}
sub binc {
# increment arg by one
- my ($class, $x, $a, $p, $r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
return $x if $x->modify('binc');
+ return $x->round(@r) if $x -> is_inf() || $x -> is_nan();
+
+ return $upgrade -> binc($x, @r) if defined($upgrade) && !$x -> isa($class);
+
if ($x->{sign} eq '+') {
$x->{value} = $LIB->_inc($x->{value});
- return $x->round($a, $p, $r);
} elsif ($x->{sign} eq '-') {
$x->{value} = $LIB->_dec($x->{value});
$x->{sign} = '+' if $LIB->_is_zero($x->{value}); # -1 +1 => -0 => +0
- return $x->round($a, $p, $r);
}
- # inf, nan handling etc
- $x->badd($class->bone(), $a, $p, $r); # badd does round
+
+ return $x->round(@r);
}
sub bdec {
# decrement arg by one
my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
return $x if $x->modify('bdec');
+ return $x->round(@r) if $x -> is_inf() || $x -> is_nan();
+
+ return $upgrade -> bdec($x, @r) if defined($upgrade) && !$x -> isa($class);;
+
if ($x->{sign} eq '-') {
- # x already < 0
$x->{value} = $LIB->_inc($x->{value});
- } else {
- return $x->badd($class->bone('-'), @r)
- unless $x->{sign} eq '+'; # inf or NaN
- # >= 0
- if ($LIB->_is_zero($x->{value})) {
- # == 0
+ } elsif ($x->{sign} eq '+') {
+ if ($LIB->_is_zero($x->{value})) { # +1 - 1 => +0
$x->{value} = $LIB->_one();
- $x->{sign} = '-'; # 0 => -1
+ $x->{sign} = '-';
} else {
- # > 0
$x->{value} = $LIB->_dec($x->{value});
}
}
- $x->round(@r);
+
+ return $x->round(@r);
}
#sub bstrcmp {
@@ -1643,56 +1765,41 @@ sub bdec {
#}
sub badd {
-
# add second arg (BINT or string) to first (BINT) (modifies first)
# return result as BINT
# set up parameters
- my ($class, $x, $y, @r) = (ref($_[0]), @_);
- # objectify is costly, so avoid it
- if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
- ($class, $x, $y, @r) = objectify(2, @_);
- }
+ my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (ref($_[0]), @_)
+ : objectify(2, @_);
return $x if $x->modify('badd');
- return $upgrade->badd($upgrade->new($x), $upgrade->new($y), @r) if defined $upgrade &&
- ((!$x->isa($class)) || (!$y->isa($class)));
$r[3] = $y; # no push!
- # inf and NaN handling
+
+ return $upgrade->badd($x, $y, @r)
+ if defined($upgrade) && (!$x->isa($class) || !$y->isa($class));
+
+ # Inf and NaN handling
if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/) {
# NaN first
- return $x->bnan() if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
- # inf handling
+ return $x->bnan(@r) if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
+ # Inf handling
if (($x->{sign} =~ /^[+-]inf$/) && ($y->{sign} =~ /^[+-]inf$/)) {
- # +inf++inf or -inf+-inf => same, rest is NaN
- return $x if $x->{sign} eq $y->{sign};
- return $x->bnan();
- }
- # +-inf + something => +inf
- # something +-inf => +-inf
- $x->{sign} = $y->{sign}, return $x if $y->{sign} =~ /^[+-]inf$/;
- return $x;
- }
-
- my ($sx, $sy) = ($x->{sign}, $y->{sign}); # get signs
-
- if ($sx eq $sy) {
- $x->{value} = $LIB->_add($x->{value}, $y->{value}); # same sign, abs add
- } else {
- my $a = $LIB->_acmp ($y->{value}, $x->{value}); # absolute compare
- if ($a > 0) {
- $x->{value} = $LIB->_sub($y->{value}, $x->{value}, 1); # abs sub w/ swap
- $x->{sign} = $sy;
- } elsif ($a == 0) {
- # speedup, if equal, set result to 0
- $x->{value} = $LIB->_zero();
- $x->{sign} = '+';
- } else # a < 0
- {
- $x->{value} = $LIB->_sub($x->{value}, $y->{value}); # abs sub
+ # +Inf + +Inf or -Inf + -Inf => same, rest is NaN
+ return $x->round(@r) if $x->{sign} eq $y->{sign};
+ return $x->bnan(@r);
+ }
+ # ±Inf + something => ±Inf
+ # something + ±Inf => ±Inf
+ if ($y->{sign} =~ /^[+-]inf$/) {
+ $x->{sign} = $y->{sign};
}
+ return $x -> round(@r);
}
+
+ ($x->{value}, $x->{sign})
+ = $LIB -> _sadd($x->{value}, $x->{sign}, $y->{value}, $y->{sign});
$x->round(@r);
}
@@ -1701,17 +1808,14 @@ sub bsub {
# subtract second arg from first, modify first
# set up parameters
- my ($class, $x, $y, @r) = (ref($_[0]), @_);
-
- # objectify is costly, so avoid it
- if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
- ($class, $x, $y, @r) = objectify(2, @_);
- }
+ my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (ref($_[0]), @_)
+ : objectify(2, @_);
return $x if $x -> modify('bsub');
- return $upgrade -> bsub($upgrade -> new($x), $upgrade -> new($y), @r)
- if defined $upgrade && (!$x -> isa($class) || !$y -> isa($class));
+ return $upgrade -> bsub($x, $y, @r)
+ if defined($upgrade) && (!$x->isa($class) || !$y->isa($class));
return $x -> round(@r) if $y -> is_zero();
@@ -1724,9 +1828,10 @@ sub bsub {
if ($xsign ne $x -> {sign}) {
# special case of $x -> bsub($x) results in 0
return $x -> bzero(@r) if $xsign =~ /^[+-]$/;
- return $x -> bnan(); # NaN, -inf, +inf
+ return $x -> bnan(@r); # NaN, -inf, +inf
}
- $x -> badd($y, @r); # badd does not leave internal zeros
+
+ $x = $x -> badd($y, @r); # badd() does not leave internal zeros
$y -> {sign} =~ tr/+-/-+/; # refix $y (does nothing for NaN)
$x; # already rounded by badd() or no rounding
}
@@ -1736,29 +1841,27 @@ sub bmul {
# (BINT or num_str, BINT or num_str) return BINT
# set up parameters
- my ($class, $x, $y, @r) = (ref($_[0]), @_);
- # objectify is costly, so avoid it
- if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
- ($class, $x, $y, @r) = objectify(2, @_);
- }
+ my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (ref($_[0]), @_)
+ : objectify(2, @_);
return $x if $x->modify('bmul');
- return $x->bnan() if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
+ return $x->bnan(@r) if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
# inf handling
if (($x->{sign} =~ /^[+-]inf$/) || ($y->{sign} =~ /^[+-]inf$/)) {
- return $x->bnan() if $x->is_zero() || $y->is_zero();
+ return $x->bnan(@r) if $x->is_zero() || $y->is_zero();
# result will always be +-inf:
# +inf * +/+inf => +inf, -inf * -/-inf => +inf
# +inf * -/-inf => -inf, -inf * +/+inf => -inf
- return $x->binf() if ($x->{sign} =~ /^\+/ && $y->{sign} =~ /^\+/);
- return $x->binf() if ($x->{sign} =~ /^-/ && $y->{sign} =~ /^-/);
- return $x->binf('-');
+ return $x->binf(@r) if ($x->{sign} =~ /^\+/ && $y->{sign} =~ /^\+/);
+ return $x->binf(@r) if ($x->{sign} =~ /^-/ && $y->{sign} =~ /^-/);
+ return $x->binf('-', @r);
}
- return $upgrade->bmul($x, $upgrade->new($y), @r)
- if defined $upgrade && !$y->isa($class);
+ return $upgrade->bmul($x, $y, @r)
+ if defined($upgrade) && (!$x->isa($class) || !$y->isa($class));
$r[3] = $y; # no push here
@@ -1775,60 +1878,143 @@ sub bmuladd {
# (BINT or num_str, BINT or num_str, BINT or num_str) return BINT
# set up parameters
- my ($class, $x, $y, $z, @r) = objectify(3, @_);
+ my ($class, $x, $y, $z, @r)
+ = ref($_[0]) && ref($_[0]) eq ref($_[1]) && ref($_[1]) eq ref($_[2])
+ ? (ref($_[0]), @_)
+ : objectify(3, @_);
return $x if $x->modify('bmuladd');
- return $x->bnan() if (($x->{sign} eq $nan) ||
- ($y->{sign} eq $nan) ||
- ($z->{sign} eq $nan));
+ # x, y, and z are finite numbers
- # inf handling of x and y
- if (($x->{sign} =~ /^[+-]inf$/) || ($y->{sign} =~ /^[+-]inf$/)) {
- return $x->bnan() if $x->is_zero() || $y->is_zero();
- # result will always be +-inf:
- # +inf * +/+inf => +inf, -inf * -/-inf => +inf
- # +inf * -/-inf => -inf, -inf * +/+inf => -inf
- return $x->binf() if ($x->{sign} =~ /^\+/ && $y->{sign} =~ /^\+/);
- return $x->binf() if ($x->{sign} =~ /^-/ && $y->{sign} =~ /^-/);
- return $x->binf('-');
- }
- # inf handling x*y and z
- if (($z->{sign} =~ /^[+-]inf$/)) {
- # something +-inf => +-inf
- $x->{sign} = $z->{sign}, return $x if $z->{sign} =~ /^[+-]inf$/;
+ if ($x->{sign} =~ /^[+-]$/ &&
+ $y->{sign} =~ /^[+-]$/ &&
+ $z->{sign} =~ /^[+-]$/)
+ {
+ return $upgrade->bmuladd($x, $y, $z, @r)
+ if defined($upgrade)
+ && (!$x->isa($class) || !$y->isa($class) || !$z->isa($class));
+
+ # TODO: what if $y and $z have A or P set?
+ $r[3] = $z; # no push here
+
+ my $zs = $z->{sign};
+ my $zv = $z->{value};
+ $zv = $LIB -> _copy($zv) if refaddr($x) eq refaddr($z);
+
+ $x->{sign} = $x->{sign} eq $y->{sign} ? '+' : '-'; # +1 * +1 or -1 * -1 => +
+ $x->{value} = $LIB->_mul($x->{value}, $y->{value}); # do actual math
+ $x->{sign} = '+' if $LIB->_is_zero($x->{value}); # no -0
+
+ ($x->{value}, $x->{sign})
+ = $LIB -> _sadd($x->{value}, $x->{sign}, $zv, $zs);
+ return $x->round(@r);
}
- return $upgrade->bmuladd($x, $upgrade->new($y), $upgrade->new($z), @r)
- if defined $upgrade && (!$y->isa($class) || !$z->isa($class) || !$x->isa($class));
+ # At least one of x, y, and z is a NaN
- # TODO: what if $y and $z have A or P set?
- $r[3] = $z; # no push here
+ return $x->bnan(@r) if (($x->{sign} eq $nan) ||
+ ($y->{sign} eq $nan) ||
+ ($z->{sign} eq $nan));
- $x->{sign} = $x->{sign} eq $y->{sign} ? '+' : '-'; # +1 * +1 or -1 * -1 => +
+ # At least one of x, y, and z is an Inf
- $x->{value} = $LIB->_mul($x->{value}, $y->{value}); # do actual math
- $x->{sign} = '+' if $LIB->_is_zero($x->{value}); # no -0
+ if ($x->{sign} eq "-inf") {
+
+ if ($y -> is_neg()) { # x = -inf, y < 0
+ if ($z->{sign} eq "-inf") {
+ return $x->bnan(@r);
+ } else {
+ return $x->binf("+", @r);
+ }
+ } elsif ($y -> is_zero()) { # x = -inf, y = 0
+ return $x->bnan(@r);
+ } else { # x = -inf, y > 0
+ if ($z->{sign} eq "+inf") {
+ return $x->bnan(@r);
+ } else {
+ return $x->binf("-", @r);
+ }
+ }
- my ($sx, $sz) = ( $x->{sign}, $z->{sign} ); # get signs
+ } elsif ($x->{sign} eq "+inf") {
- if ($sx eq $sz) {
- $x->{value} = $LIB->_add($x->{value}, $z->{value}); # same sign, abs add
- } else {
- my $a = $LIB->_acmp ($z->{value}, $x->{value}); # absolute compare
- if ($a > 0) {
- $x->{value} = $LIB->_sub($z->{value}, $x->{value}, 1); # abs sub w/ swap
- $x->{sign} = $sz;
- } elsif ($a == 0) {
- # speedup, if equal, set result to 0
- $x->{value} = $LIB->_zero();
- $x->{sign} = '+';
- } else # a < 0
- {
- $x->{value} = $LIB->_sub($x->{value}, $z->{value}); # abs sub
+ if ($y -> is_neg()) { # x = +inf, y < 0
+ if ($z->{sign} eq "+inf") {
+ return $x->bnan(@r);
+ } else {
+ return $x->binf("-", @r);
+ }
+ } elsif ($y -> is_zero()) { # x = +inf, y = 0
+ return $x->bnan(@r);
+ } else { # x = +inf, y > 0
+ if ($z->{sign} eq "-inf") {
+ return $x->bnan(@r);
+ } else {
+ return $x->binf("+", @r);
+ }
+ }
+
+ } elsif ($x -> is_neg()) {
+
+ if ($y->{sign} eq "-inf") { # -inf < x < 0, y = -inf
+ if ($z->{sign} eq "-inf") {
+ return $x->bnan(@r);
+ } else {
+ return $x->binf("+", @r);
+ }
+ } elsif ($y->{sign} eq "+inf") { # -inf < x < 0, y = +inf
+ if ($z->{sign} eq "+inf") {
+ return $x->bnan(@r);
+ } else {
+ return $x->binf("-", @r);
+ }
+ } else { # -inf < x < 0, -inf < y < +inf
+ if ($z->{sign} eq "-inf") {
+ return $x->binf("-", @r);
+ } elsif ($z->{sign} eq "+inf") {
+ return $x->binf("+", @r);
+ }
+ }
+
+ } elsif ($x -> is_zero()) {
+
+ if ($y->{sign} eq "-inf") { # x = 0, y = -inf
+ return $x->bnan(@r);
+ } elsif ($y->{sign} eq "+inf") { # x = 0, y = +inf
+ return $x->bnan(@r);
+ } else { # x = 0, -inf < y < +inf
+ if ($z->{sign} eq "-inf") {
+ return $x->binf("-", @r);
+ } elsif ($z->{sign} eq "+inf") {
+ return $x->binf("+", @r);
+ }
+ }
+
+ } elsif ($x -> is_pos()) {
+
+ if ($y->{sign} eq "-inf") { # 0 < x < +inf, y = -inf
+ if ($z->{sign} eq "+inf") {
+ return $x->bnan(@r);
+ } else {
+ return $x->binf("-", @r);
+ }
+ } elsif ($y->{sign} eq "+inf") { # 0 < x < +inf, y = +inf
+ if ($z->{sign} eq "-inf") {
+ return $x->bnan(@r);
+ } else {
+ return $x->binf("+", @r);
+ }
+ } else { # 0 < x < +inf, -inf < y < +inf
+ if ($z->{sign} eq "-inf") {
+ return $x->binf("-", @r);
+ } elsif ($z->{sign} eq "+inf") {
+ return $x->binf("+", @r);
+ }
}
}
- $x->round(@r);
+
+ die;
}
sub bdiv {
@@ -1837,12 +2023,9 @@ sub bdiv {
# sign as the divisor.
# Set up parameters.
- my ($class, $x, $y, @r) = (ref($_[0]), @_);
-
- # objectify() is costly, so avoid it if we can.
- if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
- ($class, $x, $y, @r) = objectify(2, @_);
- }
+ my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (ref($_[0]), @_)
+ : objectify(2, @_);
return $x if $x -> modify('bdiv');
@@ -1852,7 +2035,8 @@ sub bdiv {
# modulo/remainder.
if ($x -> is_nan() || $y -> is_nan()) {
- return $wantarray ? ($x -> bnan(), $class -> bnan()) : $x -> bnan();
+ return $wantarray ? ($x -> bnan(@r), $class -> bnan(@r))
+ : $x -> bnan(@r);
}
# Divide by zero and modulo zero.
@@ -1875,12 +2059,12 @@ sub bdiv {
if ($y -> is_zero()) {
my $rem;
if ($wantarray) {
- $rem = $x -> copy();
+ $rem = $x -> copy() -> round(@r);
}
if ($x -> is_zero()) {
- $x -> bnan();
+ $x = $x -> bnan(@r);
} else {
- $x -> binf($x -> {sign});
+ $x = $x -> binf($x -> {sign}, @r);
}
return $wantarray ? ($x, $rem) : $x;
}
@@ -1901,12 +2085,12 @@ sub bdiv {
if ($x -> is_inf()) {
my $rem;
- $rem = $class -> bnan() if $wantarray;
+ $rem = $class -> bnan(@r) if $wantarray;
if ($y -> is_inf()) {
- $x -> bnan();
+ $x = $x -> bnan(@r);
} else {
my $sign = $x -> bcmp(0) == $y -> bcmp(0) ? '+' : '-';
- $x -> binf($sign);
+ $x = $x -> binf($sign, @r);
}
return $wantarray ? ($x, $rem) : $x;
}
@@ -1927,11 +2111,11 @@ sub bdiv {
if ($y -> is_inf()) {
my $rem;
if ($x -> is_zero() || $x -> bcmp(0) == $y -> bcmp(0)) {
- $rem = $x -> copy() if $wantarray;
- $x -> bzero();
+ $rem = $x -> copy() -> round(@r) if $wantarray;
+ $x = $x -> bzero(@r);
} else {
- $rem = $class -> binf($y -> {sign}) if $wantarray;
- $x -> bone('-');
+ $rem = $class -> binf($y -> {sign}, @r) if $wantarray;
+ $x = $x -> bone('-', @r);
}
return $wantarray ? ($x, $rem) : $x;
}
@@ -1939,8 +2123,10 @@ sub bdiv {
# At this point, both the numerator and denominator are finite numbers, and
# the denominator (divisor) is non-zero.
- return $upgrade -> bdiv($upgrade -> new($x), $upgrade -> new($y), @r)
- if defined $upgrade;
+ # Division might return a non-integer result, so upgrade unconditionally, if
+ # upgrading is enabled.
+
+ return $upgrade -> bdiv($x, $y, @r) if defined $upgrade;
$r[3] = $y; # no push!
@@ -1959,7 +2145,7 @@ sub bdiv {
$y -> {sign} = $ysign; # Re-insert the original sign.
if ($same) {
- $x -> bone();
+ $x = $x -> bone();
} else {
($x -> {value}, $rem -> {value}) =
$LIB -> _div($x -> {value}, $y -> {value});
@@ -1975,16 +2161,16 @@ sub bdiv {
$x -> {sign} = '+';
} else {
if ($xsign eq '+') {
- $x -> badd(1);
+ $x = $x -> badd(1);
} else {
- $x -> bsub(1);
+ $x = $x -> bsub(1);
}
$x -> {sign} = '-';
}
}
}
- $x -> round(@r);
+ $x = $x -> round(@r);
if ($wantarray) {
unless ($LIB -> _is_zero($rem -> {value})) {
@@ -1995,7 +2181,7 @@ sub bdiv {
}
$rem -> {_a} = $x -> {_a};
$rem -> {_p} = $x -> {_p};
- $rem -> round(@r);
+ $rem = $rem -> round(@r);
return ($x, $rem);
}
@@ -2010,12 +2196,9 @@ sub btdiv {
# and $q * $y + $r = $x.
# Set up parameters
- my ($class, $x, $y, @r) = (ref($_[0]), @_);
-
- # objectify is costly, so avoid it if we can.
- if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
- ($class, $x, $y, @r) = objectify(2, @_);
- }
+ my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (ref($_[0]), @_)
+ : objectify(2, @_);
return $x if $x -> modify('btdiv');
@@ -2025,7 +2208,8 @@ sub btdiv {
# modulo/remainder.
if ($x -> is_nan() || $y -> is_nan()) {
- return $wantarray ? ($x -> bnan(), $class -> bnan()) : $x -> bnan();
+ return $wantarray ? ($x -> bnan(@r), $class -> bnan(@r))
+ : $x -> bnan(@r);
}
# Divide by zero and modulo zero.
@@ -2048,12 +2232,12 @@ sub btdiv {
if ($y -> is_zero()) {
my $rem;
if ($wantarray) {
- $rem = $x -> copy();
+ $rem = $x -> copy(@r);
}
if ($x -> is_zero()) {
- $x -> bnan();
+ $x = $x -> bnan(@r);
} else {
- $x -> binf($x -> {sign});
+ $x = $x -> binf($x -> {sign}, @r);
}
return $wantarray ? ($x, $rem) : $x;
}
@@ -2074,12 +2258,12 @@ sub btdiv {
if ($x -> is_inf()) {
my $rem;
- $rem = $class -> bnan() if $wantarray;
+ $rem = $class -> bnan(@r) if $wantarray;
if ($y -> is_inf()) {
- $x -> bnan();
+ $x = $x -> bnan(@r);
} else {
my $sign = $x -> bcmp(0) == $y -> bcmp(0) ? '+' : '-';
- $x -> binf($sign);
+ $x = $x -> binf($sign,@r );
}
return $wantarray ? ($x, $rem) : $x;
}
@@ -2099,13 +2283,15 @@ sub btdiv {
if ($y -> is_inf()) {
my $rem;
- $rem = $x -> copy() if $wantarray;
- $x -> bzero();
+ $rem = $x -> copy() -> round(@r) if $wantarray;
+ $x = $x -> bzero(@r);
return $wantarray ? ($x, $rem) : $x;
}
- return $upgrade -> btdiv($upgrade -> new($x), $upgrade -> new($y), @r)
- if defined $upgrade;
+ # Division might return a non-integer result, so upgrade unconditionally, if
+ # upgrading is enabled.
+
+ return $upgrade -> btdiv($x, $y, @r) if defined $upgrade;
$r[3] = $y; # no push!
@@ -2124,14 +2310,14 @@ sub btdiv {
$y -> {sign} = $ysign; # Re-insert the original sign.
if ($same) {
- $x -> bone();
+ $x = $x -> bone(@r);
} else {
($x -> {value}, $rem -> {value}) =
$LIB -> _div($x -> {value}, $y -> {value});
$x -> {sign} = $xsign eq $ysign ? '+' : '-';
$x -> {sign} = '+' if $LIB -> _is_zero($x -> {value});
- $x -> round(@r);
+ $x = $x -> round(@r);
}
if (wantarray) {
@@ -2139,7 +2325,7 @@ sub btdiv {
$rem -> {sign} = '+' if $LIB -> _is_zero($rem -> {value});
$rem -> {_a} = $x -> {_a};
$rem -> {_p} = $x -> {_p};
- $rem -> round(@r);
+ $rem = $rem -> round(@r);
return ($x, $rem);
}
@@ -2150,44 +2336,45 @@ sub bmod {
# This is the remainder after floored division.
# Set up parameters.
- my ($class, $x, $y, @r) = (ref($_[0]), @_);
-
- # objectify is costly, so avoid it
- if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
- ($class, $x, $y, @r) = objectify(2, @_);
- }
+ my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (ref($_[0]), @_)
+ : objectify(2, @_);
return $x if $x -> modify('bmod');
+
$r[3] = $y; # no push!
# At least one argument is NaN.
if ($x -> is_nan() || $y -> is_nan()) {
- return $x -> bnan();
+ return $x -> bnan(@r);
}
# Modulo zero. See documentation for bdiv().
if ($y -> is_zero()) {
- return $x;
+ return $x -> round(@r);
}
# Numerator (dividend) is +/-inf.
if ($x -> is_inf()) {
- return $x -> bnan();
+ return $x -> bnan(@r);
}
# Denominator (divisor) is +/-inf.
if ($y -> is_inf()) {
if ($x -> is_zero() || $x -> bcmp(0) == $y -> bcmp(0)) {
- return $x;
+ return $x -> round(@r);
} else {
- return $x -> binf($y -> sign());
+ return $x -> binf($y -> sign(), @r);
}
}
+ return $upgrade -> bmod($x, $y, @r)
+ if defined($upgrade) && (!$x -> isa($class) || !$y -> isa($class));
+
# Calc new sign and in case $y == +/- 1, return $x.
$x -> {value} = $LIB -> _mod($x -> {value}, $y -> {value});
@@ -2206,41 +2393,38 @@ sub btmod {
# Remainder after truncated division.
# set up parameters
- my ($class, $x, $y, @r) = (ref($_[0]), @_);
-
- # objectify is costly, so avoid it
- if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
- ($class, $x, $y, @r) = objectify(2, @_);
- }
+ my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (ref($_[0]), @_)
+ : objectify(2, @_);
return $x if $x -> modify('btmod');
# At least one argument is NaN.
if ($x -> is_nan() || $y -> is_nan()) {
- return $x -> bnan();
+ return $x -> bnan(@r);
}
# Modulo zero. See documentation for btdiv().
if ($y -> is_zero()) {
- return $x;
+ return $x -> round(@r);
}
# Numerator (dividend) is +/-inf.
if ($x -> is_inf()) {
- return $x -> bnan();
+ return $x -> bnan(@r);
}
# Denominator (divisor) is +/-inf.
if ($y -> is_inf()) {
- return $x;
+ return $x -> round(@r);
}
- return $upgrade -> btmod($upgrade -> new($x), $upgrade -> new($y), @r)
- if defined $upgrade;
+ return $upgrade -> btmod($x, $y, @r)
+ if defined($upgrade) && (!$x -> isa($class) || !$y -> isa($class));
$r[3] = $y; # no push!
@@ -2251,7 +2435,6 @@ sub btmod {
$x -> {sign} = $xsign;
$x -> {sign} = '+' if $LIB -> _is_zero($x -> {value});
$x -> round(@r);
- return $x;
}
sub bmodinv {
@@ -2267,28 +2450,29 @@ sub bmodinv {
# If no modular multiplicative inverse exists, NaN is returned.
# set up parameters
- my ($class, $x, $y, @r) = (undef, @_);
- # objectify is costly, so avoid it
- if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
- ($class, $x, $y, @r) = objectify(2, @_);
- }
+ my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (ref($_[0]), @_)
+ : objectify(2, @_);
return $x if $x->modify('bmodinv');
# Return NaN if one or both arguments is +inf, -inf, or nan.
- return $x->bnan() if ($y->{sign} !~ /^[+-]$/ ||
- $x->{sign} !~ /^[+-]$/);
+ return $x->bnan(@r) if ($y->{sign} !~ /^[+-]$/ ||
+ $x->{sign} !~ /^[+-]$/);
# Return NaN if $y is zero; 1 % 0 makes no sense.
- return $x->bnan() if $y->is_zero();
+ return $x->bnan(@r) if $y->is_zero();
# Return 0 in the trivial case. $x % 1 or $x % -1 is zero for all finite
# integers $x.
- return $x->bzero() if ($y->is_one() ||
- $y->is_one('-'));
+ return $x->bzero(@r) if ($y->is_one('+') ||
+ $y->is_one('-'));
+
+ return $upgrade -> bmodinv($x, $y, @r)
+ if defined($upgrade) && (!$x -> isa($class) || !$y -> isa($class));
# Return NaN if $x = 0, or $x modulo $y is zero. The only valid case when
# $x = 0 is when $y = 1 or $y = -1, but that was covered above.
@@ -2299,14 +2483,14 @@ sub bmodinv {
# $y = 7, the values fed to _modinv() are $x = 2 (= -5 % 7) and $y = 7.
# The value if $x is affected only when $x and $y have opposite signs.
- $x->bmod($y);
- return $x->bnan() if $x->is_zero();
+ $x = $x->bmod($y);
+ return $x->bnan(@r) if $x->is_zero();
# Compute the modular multiplicative inverse of the absolute values. We'll
# correct for the signs of $x and $y later. Return NaN if no GCD is found.
($x->{value}, $x->{sign}) = $LIB->_modinv($x->{value}, $y->{value});
- return $x->bnan() if !defined $x->{value};
+ return $x->bnan(@r) if !defined($x->{value});
# Library inconsistency workaround: _modinv() in Math::BigInt::GMP versions
# <= 1.32 return undef rather than a "+" for the sign.
@@ -2325,20 +2509,23 @@ sub bmodinv {
# inverse modulo. The net effect is that we must swap the sign of the
# result if $y is negative.
- $x -> bneg() if $y->{sign} eq '-';
+ $x = $x -> bneg() if $y->{sign} eq '-';
# Compute $x modulo $y again after correcting the sign.
- $x -> bmod($y) if $x->{sign} ne $y->{sign};
+ $x = $x -> bmod($y) if $x->{sign} ne $y->{sign};
- return $x;
+ $x -> round(@r);
}
sub bmodpow {
- # Modular exponentiation. Raises a very large number to a very large exponent
- # in a given very large modulus quickly, thanks to binary exponentiation.
- # Supports negative exponents.
- my ($class, $num, $exp, $mod, @r) = objectify(3, @_);
+ # Modular exponentiation. Raises a very large number to a very large
+ # exponent in a given very large modulus quickly, thanks to binary
+ # exponentiation. Supports negative exponents.
+ my ($class, $num, $exp, $mod, @r)
+ = ref($_[0]) && ref($_[0]) eq ref($_[1]) && ref($_[1]) eq ref($_[2])
+ ? (ref($_[0]), @_)
+ : objectify(3, @_);
return $num if $num->modify('bmodpow');
@@ -2347,25 +2534,30 @@ sub bmodpow {
#
# b^(-e) (mod m) = d^e (mod m) where b*d = 1 (mod m)
- $num->bmodinv($mod) if ($exp->{sign} eq '-');
+ $num = $num -> bmodinv($mod) if ($exp->{sign} eq '-');
- # Check for valid input. All operands must be finite, and the modulus must be
- # non-zero.
+ # Check for valid input. All operands must be finite, and the modulus must
+ # be non-zero.
- return $num->bnan() if ($num->{sign} =~ /NaN|inf/ || # NaN, -inf, +inf
- $exp->{sign} =~ /NaN|inf/ || # NaN, -inf, +inf
- $mod->{sign} =~ /NaN|inf/); # NaN, -inf, +inf
+ return $num->bnan(@r) if ($num->{sign} =~ /NaN|inf/ || # NaN, -inf, +inf
+ $exp->{sign} =~ /NaN|inf/ || # NaN, -inf, +inf
+ $mod->{sign} =~ /NaN|inf/); # NaN, -inf, +inf
# Modulo zero. See documentation for Math::BigInt's bmod() method.
if ($mod -> is_zero()) {
if ($num -> is_zero()) {
- return $class -> bnan();
+ return $class -> bnan(@r);
} else {
- return $num -> copy();
+ return $num -> copy(@r);
}
}
+ return $upgrade -> bmodinv($num, $exp, $mod, @r)
+ if defined($upgrade) && (!$num -> isa($class) ||
+ !$exp -> isa($class) ||
+ !$mod -> ($class));
+
# Compute 'a (mod m)', ignoring the signs on 'a' and 'm'. If the resulting
# value is zero, the output is also zero, regardless of the signs on 'a' and
# 'm'.
@@ -2438,62 +2630,60 @@ sub bpow {
# modifies first argument
# set up parameters
- my ($class, $x, $y, @r) = (ref($_[0]), @_);
- # objectify is costly, so avoid it
- if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
- ($class, $x, $y, @r) = objectify(2, @_);
- }
+ my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (ref($_[0]), @_)
+ : objectify(2, @_);
return $x if $x -> modify('bpow');
# $x and/or $y is a NaN
- return $x -> bnan() if $x -> is_nan() || $y -> is_nan();
+ return $x -> bnan(@r) if $x -> is_nan() || $y -> is_nan();
# $x and/or $y is a +/-Inf
if ($x -> is_inf("-")) {
- return $x -> bzero() if $y -> is_negative();
- return $x -> bnan() if $y -> is_zero();
- return $x if $y -> is_odd();
- return $x -> bneg();
+ return $x -> bzero(@r) if $y -> is_negative();
+ return $x -> bnan(@r) if $y -> is_zero();
+ return $x -> round(@r) if $y -> is_odd();
+ return $x -> bneg(@r);
} elsif ($x -> is_inf("+")) {
- return $x -> bzero() if $y -> is_negative();
- return $x -> bnan() if $y -> is_zero();
- return $x;
+ return $x -> bzero(@r) if $y -> is_negative();
+ return $x -> bnan(@r) if $y -> is_zero();
+ return $x -> round(@r);
} elsif ($y -> is_inf("-")) {
- return $x -> bnan() if $x -> is_one("-");
- return $x -> binf("+") if $x -> is_zero();
- return $x -> bone() if $x -> is_one("+");
- return $x -> bzero();
+ return $x -> bnan(@r) if $x -> is_one("-");
+ return $x -> binf("+", @r) if $x -> is_zero();
+ return $x -> bone(@r) if $x -> is_one("+");
+ return $x -> bzero(@r);
} elsif ($y -> is_inf("+")) {
- return $x -> bnan() if $x -> is_one("-");
- return $x -> bzero() if $x -> is_zero();
- return $x -> bone() if $x -> is_one("+");
- return $x -> binf("+");
+ return $x -> bnan(@r) if $x -> is_one("-");
+ return $x -> bzero(@r) if $x -> is_zero();
+ return $x -> bone(@r) if $x -> is_one("+");
+ return $x -> binf("+", @r);
}
if ($x -> is_zero()) {
- return $x -> bone() if $y -> is_zero();
- return $x -> binf() if $y -> is_negative();
- return $x;
+ return $x -> bone(@r) if $y -> is_zero();
+ return $x -> binf(@r) if $y -> is_negative();
+ return $x -> round(@r);
}
if ($x -> is_one("+")) {
- return $x;
+ return $x -> round(@r);
}
if ($x -> is_one("-")) {
- return $x if $y -> is_odd();
- return $x -> bneg();
+ return $x -> round(@r) if $y -> is_odd();
+ return $x -> bneg(@r);
}
- # We don't support finite non-integers, so upgrade or return zero. The
- # reason for returning zero, not NaN, is that all output is in the open
- # interval (0,1), and truncating that to integer gives zero.
+ return $upgrade -> bpow($x, $y, @r) if defined $upgrade;
+
+ # We don't support finite non-integers, so return zero. The reason for
+ # returning zero, not NaN, is that all output is in the open interval (0,1),
+ # and truncating that to integer gives zero.
if ($y->{sign} eq '-' || !$y -> isa($class)) {
- return $upgrade -> bpow($upgrade -> new($x), $y, @r)
- if defined $upgrade;
- return $x -> bzero();
+ return $x -> bzero(@r);
}
$r[3] = $y; # no push!
@@ -2513,12 +2703,12 @@ sub blog {
# Don't objectify the base, since an undefined base, as in $x->blog() or
# $x->blog(undef) signals that the base is Euler's number.
- if (!ref($_[0]) && $_[0] =~ /^[A-Za-z]|::/) {
+ if (!ref($_[0]) && $_[0] =~ /^[a-z]\w*(?:::[a-z]\w*)*$/i) {
# E.g., Math::BigInt->blog(256, 2)
($class, $x, $base, @r) =
defined $_[2] ? objectify(2, @_) : objectify(1, @_);
} else {
- # E.g., Math::BigInt::blog(256, 2) or $x->blog(2)
+ # E.g., $x->blog(2) or the deprecated Math::BigInt::blog(256, 2)
($class, $x, $base, @r) =
defined $_[1] ? objectify(2, @_) : objectify(1, @_);
}
@@ -2528,80 +2718,70 @@ sub blog {
# Handle all exception cases and all trivial cases. I have used Wolfram
# Alpha (http://www.wolframalpha.com) as the reference for these cases.
- return $x -> bnan() if $x -> is_nan();
+ return $x -> bnan(@r) if $x -> is_nan();
if (defined $base) {
$base = $class -> new($base) unless ref $base;
if ($base -> is_nan() || $base -> is_one()) {
- return $x -> bnan();
+ return $x -> bnan(@r);
} elsif ($base -> is_inf() || $base -> is_zero()) {
- return $x -> bnan() if $x -> is_inf() || $x -> is_zero();
- return $x -> bzero();
- } elsif ($base -> is_negative()) { # -inf < base < 0
- return $x -> bzero() if $x -> is_one(); # x = 1
- return $x -> bone() if $x == $base; # x = base
- return $x -> bnan(); # otherwise
+ return $x -> bnan(@r) if $x -> is_inf() || $x -> is_zero();
+ return $x -> bzero(@r);
+ } elsif ($base -> is_negative()) { # -inf < base < 0
+ return $x -> bzero(@r) if $x -> is_one(); # x = 1
+ return $x -> bone(@r) if $x == $base; # x = base
+ return $x -> bnan(@r); # otherwise
}
- return $x -> bone() if $x == $base; # 0 < base && 0 < x < inf
+ return $x -> bone(@r) if $x == $base; # 0 < base && 0 < x < inf
}
# We now know that the base is either undefined or >= 2 and finite.
- return $x -> binf('+') if $x -> is_inf(); # x = +/-inf
- return $x -> bnan() if $x -> is_neg(); # -inf < x < 0
- return $x -> bzero() if $x -> is_one(); # x = 1
- return $x -> binf('-') if $x -> is_zero(); # x = 0
+ return $x -> binf('+', @r) if $x -> is_inf(); # x = +/-inf
+ return $x -> bnan(@r) if $x -> is_neg(); # -inf < x < 0
+ return $x -> bzero(@r) if $x -> is_one(); # x = 1
+ return $x -> binf('-', @r) if $x -> is_zero(); # x = 0
# At this point we are done handling all exception cases and trivial cases.
- return $upgrade -> blog($upgrade -> new($x), $base, @r) if defined $upgrade;
+ return $upgrade -> blog($x, $base, @r) if defined $upgrade;
# fix for bug #24969:
# the default base is e (Euler's number) which is not an integer
if (!defined $base) {
require Math::BigFloat;
- my $u = Math::BigFloat->blog(Math::BigFloat->new($x))->as_int();
+ my $u = Math::BigFloat->blog($x)->as_int();
# modify $x in place
$x->{value} = $u->{value};
$x->{sign} = $u->{sign};
- return $x;
+ return $x -> round(@r);
}
my ($rc) = $LIB->_log_int($x->{value}, $base->{value});
- return $x->bnan() unless defined $rc; # not possible to take log?
+ return $x->bnan(@r) unless defined $rc; # not possible to take log?
$x->{value} = $rc;
- $x->round(@r);
+ $x = $x -> round(@r);
}
sub bexp {
# Calculate e ** $x (Euler's number to the power of X), truncated to
# an integer value.
my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
return $x if $x->modify('bexp');
# inf, -inf, NaN, <0 => NaN
- return $x->bnan() if $x->{sign} eq 'NaN';
- return $x->bone() if $x->is_zero();
- return $x if $x->{sign} eq '+inf';
- return $x->bzero() if $x->{sign} eq '-inf';
+ return $x -> bnan(@r) if $x->{sign} eq 'NaN';
+ return $x -> bone(@r) if $x->is_zero();
+ return $x -> round(@r) if $x->{sign} eq '+inf';
+ return $x -> bzero(@r) if $x->{sign} eq '-inf';
- my $u;
- {
- # run through Math::BigFloat unless told otherwise
- require Math::BigFloat unless defined $upgrade;
- local $upgrade = 'Math::BigFloat' unless defined $upgrade;
- # calculate result, truncate it to integer
- $u = $upgrade->bexp($upgrade->new($x), @r);
- }
+ return $upgrade -> bexp($x, @r) if defined $upgrade;
- if (defined $upgrade) {
- $x = $u;
- } else {
- $u = $u->as_int();
- # modify $x in place
- $x->{value} = $u->{value};
- $x->round(@r);
- }
+ require Math::BigFloat;
+ my $tmp = Math::BigFloat -> bexp($x, @r) -> as_int();
+ $x->{value} = $tmp->{value};
+ return $x -> round(@r);
}
sub bnok {
@@ -2609,49 +2789,51 @@ sub bnok {
# integer.
# Set up parameters.
- my ($self, $n, $k, @r) = (ref($_[0]), @_);
+ my ($class, $n, $k, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (ref($_[0]), @_)
+ : objectify(2, @_);
- # Objectify is costly, so avoid it.
- if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
- ($self, $n, $k, @r) = objectify(2, @_);
- }
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
return $n if $n->modify('bnok');
# All cases where at least one argument is NaN.
- return $n->bnan() if $n->{sign} eq 'NaN' || $k->{sign} eq 'NaN';
+ return $n->bnan(@r) if $n->{sign} eq 'NaN' || $k->{sign} eq 'NaN';
# All cases where at least one argument is +/-inf.
if ($n -> is_inf()) {
if ($k -> is_inf()) { # bnok(+/-inf,+/-inf)
- return $n -> bnan();
+ return $n -> bnan(@r);
} elsif ($k -> is_neg()) { # bnok(+/-inf,k), k < 0
- return $n -> bzero();
+ return $n -> bzero(@r);
} elsif ($k -> is_zero()) { # bnok(+/-inf,k), k = 0
- return $n -> bone();
+ return $n -> bone(@r);
} else {
- if ($n -> is_inf("+")) { # bnok(+inf,k), 0 < k < +inf
+ if ($n -> is_inf("+", @r)) { # bnok(+inf,k), 0 < k < +inf
return $n -> binf("+");
} else { # bnok(-inf,k), k > 0
my $sign = $k -> is_even() ? "+" : "-";
- return $n -> binf($sign);
+ return $n -> binf($sign, @r);
}
}
}
elsif ($k -> is_inf()) { # bnok(n,+/-inf), -inf <= n <= inf
- return $n -> bnan();
+ return $n -> bnan(@r);
}
# At this point, both n and k are real numbers.
+ return $upgrade -> bnok($n, $k, @r)
+ if defined($upgrade) && (!$n -> isa($class) || !$k -> isa($class));
+
my $sign = 1;
if ($n >= 0) {
if ($k < 0 || $k > $n) {
- return $n -> bzero();
+ return $n -> bzero(@r);
}
} else {
@@ -2660,7 +2842,7 @@ sub bnok {
# n < 0 and k >= 0: bnok(n,k) = (-1)^k * bnok(-n+k-1,k)
$sign = (-1) ** $k;
- $n -> bneg() -> badd($k) -> bdec();
+ $n = $n -> bneg() -> badd($k) -> bdec();
} elsif ($k <= $n) {
@@ -2668,22 +2850,22 @@ sub bnok {
$sign = (-1) ** ($n - $k);
my $x0 = $n -> copy();
- $n -> bone() -> badd($k) -> bneg();
+ $n = $n -> bone() -> badd($k) -> bneg();
$k = $k -> copy();
- $k -> bneg() -> badd($x0);
+ $k = $k -> bneg() -> badd($x0);
} else {
# n < 0 and n < k < 0:
- return $n -> bzero();
+ return $n -> bzero(@r);
}
}
$n->{value} = $LIB->_nok($n->{value}, $k->{value});
- $n -> bneg() if $sign == -1;
+ $n = $n -> bneg() if $sign == -1;
- $n->round(@r);
+ $n -> round(@r);
}
sub buparrow {
@@ -2796,9 +2978,9 @@ sub ackermann {
} elsif ($m == $three) {
$n = $class -> bone() -> blsft($n + $three) -> bsub($three);
} elsif ($m == $two) {
- $n -> bmul($two) -> badd($three);
+ $n = $n -> bmul($two) -> badd($three);
} elsif ($m >= 0) {
- $n -> badd($m) -> binc();
+ $n = $n -> badd($m) -> binc();
} else {
die "negative m!";
}
@@ -2807,109 +2989,102 @@ sub ackermann {
}
sub bsin {
- # Calculate sinus(x) to N digits. Unless upgrading is in effect, returns the
+ # Calculate sin(x) to N digits. Unless upgrading is in effect, returns the
# result truncated to an integer.
- my ($class, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
return $x if $x->modify('bsin');
- return $x->bnan() if $x->{sign} !~ /^[+-]\z/; # -inf +inf or NaN => NaN
+ return $x->bnan(@r) if $x->{sign} !~ /^[+-]\z/; # -inf +inf or NaN => NaN
+ return $x->bzero(@r) if $x->is_zero();
- return $upgrade -> bsin($upgrade -> new($x, @r)) if defined $upgrade;
+ return $upgrade -> bsin($x, @r) if defined $upgrade;
require Math::BigFloat;
# calculate the result and truncate it to integer
my $t = Math::BigFloat->new($x)->bsin(@r)->as_int();
- $x->bone() if $t->is_one();
- $x->bzero() if $t->is_zero();
+ $x = $x->bone(@r) if $t->is_one();
+ $x = $x->bzero(@r) if $t->is_zero();
$x->round(@r);
}
sub bcos {
- # Calculate cosinus(x) to N digits. Unless upgrading is in effect, returns the
+ # Calculate cos(x) to N digits. Unless upgrading is in effect, returns the
# result truncated to an integer.
- my ($class, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
return $x if $x->modify('bcos');
- return $x->bnan() if $x->{sign} !~ /^[+-]\z/; # -inf +inf or NaN => NaN
+ return $x->bnan(@r) if $x->{sign} !~ /^[+-]\z/; # -inf +inf or NaN => NaN
+ return $x->bone(@r) if $x->is_zero();
- return $upgrade -> bcos($upgrade -> new($x), @r) if defined $upgrade;
+ return $upgrade -> bcos($x, @r) if defined $upgrade;
require Math::BigFloat;
- # calculate the result and truncate it to integer
- my $t = Math::BigFloat -> bcos(Math::BigFloat -> new($x), @r) -> as_int();
-
- $x->bone() if $t->is_one();
- $x->bzero() if $t->is_zero();
- $x->round(@r);
+ my $tmp = Math::BigFloat -> bcos($x, @r) -> as_int();
+ $x->{value} = $tmp->{value};
+ return $x -> round(@r);
}
sub batan {
- # Calculate arcus tangens of x to N digits. Unless upgrading is in effect, returns the
- # result truncated to an integer.
- my ($class, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+ # Calculate arctan(x) to N digits. Unless upgrading is in effect, returns
+ # the result truncated to an integer.
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
return $x if $x->modify('batan');
- return $x->bnan() if $x->{sign} !~ /^[+-]\z/; # -inf +inf or NaN => NaN
+ return $x -> bnan(@r) if $x -> is_nan();
+ return $x -> bzero(@r) if $x -> is_zero();
- return $upgrade->new($x)->batan(@r) if defined $upgrade;
+ return $upgrade -> batan($x, @r) if defined $upgrade;
- # calculate the result and truncate it to integer
- my $tmp = Math::BigFloat->new($x)->batan(@r);
+ return $x -> bone("+", @r) if $x -> bgt("1");
+ return $x -> bone("-", @r) if $x -> blt("-1");
- $x->{value} = $LIB->_new($tmp->as_int()->bstr());
- $x->round(@r);
+ $x -> bzero(@r);
}
sub batan2 {
# calculate arcus tangens of ($y/$x)
- # set up parameters
- my ($class, $y, $x, @r) = (ref($_[0]), @_);
- # objectify is costly, so avoid it
- if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
- ($class, $y, $x, @r) = objectify(2, @_);
- }
+ my ($class, $y, $x, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (ref($_[0]), @_) : objectify(2, @_);
return $y if $y->modify('batan2');
return $y->bnan() if ($y->{sign} eq $nan) || ($x->{sign} eq $nan);
+ return $upgrade->batan2($y, $x, @r) if defined $upgrade;
+
# Y X
# != 0 -inf result is +- pi
if ($x->is_inf() || $y->is_inf()) {
- # upgrade to Math::BigFloat etc.
- return $upgrade->new($y)->batan2($upgrade->new($x), @r) if defined $upgrade;
if ($y->is_inf()) {
if ($x->{sign} eq '-inf') {
# calculate 3 pi/4 => 2.3.. => 2
- $y->bone(substr($y->{sign}, 0, 1));
- $y->bmul($class->new(2));
+ $y = $y->bone(substr($y->{sign}, 0, 1));
+ $y = $y->bmul($class->new(2));
} elsif ($x->{sign} eq '+inf') {
# calculate pi/4 => 0.7 => 0
- $y->bzero();
+ $y = $y->bzero();
} else {
# calculate pi/2 => 1.5 => 1
- $y->bone(substr($y->{sign}, 0, 1));
+ $y = $y->bone(substr($y->{sign}, 0, 1));
}
} else {
if ($x->{sign} eq '+inf') {
# calculate pi/4 => 0.7 => 0
- $y->bzero();
+ $y = $y->bzero();
} else {
# PI => 3.1415.. => 3
- $y->bone(substr($y->{sign}, 0, 1));
- $y->bmul($class->new(3));
+ $y = $y->bone(substr($y->{sign}, 0, 1));
+ $y = $y->bmul($class->new(3));
}
}
return $y;
}
- return $upgrade->new($y)->batan2($upgrade->new($x), @r) if defined $upgrade;
-
require Math::BigFloat;
my $r = Math::BigFloat->new($y)
->batan2(Math::BigFloat->new($x), @r)
@@ -2918,17 +3093,17 @@ sub batan2 {
$x->{value} = $r->{value};
$x->{sign} = $r->{sign};
- $x;
+ $x->round(@r);
}
sub bsqrt {
# calculate square root of $x
- my ($class, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
return $x if $x->modify('bsqrt');
- return $x->bnan() if $x->{sign} !~ /^\+/; # -x or -inf or NaN => NaN
- return $x if $x->{sign} eq '+inf'; # sqrt(+inf) == inf
+ return $x->bnan(@r) if $x->{sign} !~ /^\+/; # -x or -inf or NaN => NaN
+ return $x->round(@r) if $x->{sign} eq '+inf'; # sqrt(+inf) == inf
return $upgrade->bsqrt($x, @r) if defined $upgrade;
@@ -2940,25 +3115,22 @@ sub broot {
# calculate $y'th root of $x
# set up parameters
- my ($class, $x, $y, @r) = (ref($_[0]), @_);
- $y = $class->new(2) unless defined $y;
+ my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (ref($_[0]), @_) : objectify(2, @_);
- # objectify is costly, so avoid it
- if ((!ref($x)) || (ref($x) ne ref($y))) {
- ($class, $x, $y, @r) = objectify(2, $class || $class, @_);
- }
+ $y = $class->new(2) unless defined $y;
return $x if $x->modify('broot');
# NaN handling: $x ** 1/0, x or y NaN, or y inf/-inf or y == 0
- return $x->bnan() if $x->{sign} !~ /^\+/ || $y->is_zero() ||
- $y->{sign} !~ /^\+$/;
+ return $x->bnan(@r) if $x->{sign} !~ /^\+/ || $y->is_zero() ||
+ $y->{sign} !~ /^\+$/;
return $x->round(@r)
if $x->is_zero() || $x->is_one() || $x->is_inf() || $y->is_one();
- return $upgrade->new($x)->broot($upgrade->new($y), @r) if defined $upgrade;
+ return $upgrade->broot($x, $y, @r) if defined $upgrade;
$x->{value} = $LIB->_root($x->{value}, $y->{value});
$x->round(@r);
@@ -2967,10 +3139,14 @@ sub broot {
sub bfac {
# (BINT or num_str, BINT or num_str) return BINT
# compute factorial number from $x, modify $x in place
- my ($class, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
return $x if $x->modify('bfac') || $x->{sign} eq '+inf'; # inf => inf
- return $x->bnan() if $x->{sign} ne '+'; # NaN, <0 => NaN
+
+ return $x->bnan(@r) if $x->{sign} ne '+'; # NaN, <0 => NaN
+
+ return $upgrade -> bfac($x, @r)
+ if defined($upgrade) && !$x -> isa($class);
$x->{value} = $LIB->_fac($x->{value});
$x->round(@r);
@@ -2978,11 +3154,15 @@ sub bfac {
sub bdfac {
# compute double factorial, modify $x in place
- my ($class, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
return $x if $x->modify('bdfac') || $x->{sign} eq '+inf'; # inf => inf
- return $x->bnan() if $x->is_nan() || $x <= -2;
- return $x->bone() if $x <= 1;
+
+ return $x->bnan(@r) if $x->is_nan() || $x <= -2;
+ return $x->bone(@r) if $x <= 1;
+
+ return $upgrade -> bdfac($x, @r)
+ if defined($upgrade) && !$x -> isa($class);
croak("bdfac() requires a newer version of the $LIB library.")
unless $LIB->can('_dfac');
@@ -2993,57 +3173,67 @@ sub bdfac {
sub btfac {
# compute triple factorial, modify $x in place
- my ($class, $x, @r) = objectify(1, @_);
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
return $x if $x->modify('btfac') || $x->{sign} eq '+inf'; # inf => inf
- return $x->bnan() if $x->is_nan();
+ return $x->bnan(@r) if $x->is_nan();
+
+ return $upgrade -> btfac($x, @r) if defined($upgrade) && !$x -> isa($class);
my $k = $class -> new("3");
- return $x->bnan() if $x <= -$k;
+ return $x->bnan(@r) if $x <= -$k;
my $one = $class -> bone();
- return $x->bone() if $x <= $one;
+ return $x->bone(@r) if $x <= $one;
my $f = $x -> copy();
while ($f -> bsub($k) > $one) {
- $x -> bmul($f);
+ $x = $x -> bmul($f);
}
$x->round(@r);
}
sub bmfac {
# compute multi-factorial
- my ($class, $x, $k, @r) = objectify(2, @_);
+
+ my ($class, $x, $k, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (ref($_[0]), @_) : objectify(2, @_);
return $x if $x->modify('bmfac') || $x->{sign} eq '+inf';
- return $x->bnan() if $x->is_nan() || $k->is_nan() || $k < 1 || $x <= -$k;
+ return $x->bnan(@r) if $x->is_nan() || $k->is_nan() || $k < 1 || $x <= -$k;
+
+ return $upgrade -> bmfac($x, $k, @r)
+ if defined($upgrade) && !$x -> isa($class);
my $one = $class -> bone();
- return $x->bone() if $x <= $one;
+ return $x->bone(@r) if $x <= $one;
my $f = $x -> copy();
while ($f -> bsub($k) > $one) {
- $x -> bmul($f);
+ $x = $x -> bmul($f);
}
$x->round(@r);
}
sub bfib {
# compute Fibonacci number(s)
- my ($class, $x, @r) = objectify(1, @_);
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
croak("bfib() requires a newer version of the $LIB library.")
unless $LIB->can('_fib');
return $x if $x->modify('bfib');
+ return $upgrade -> bfib($x, @r)
+ if defined($upgrade) && !$x -> isa($class);
+
# List context.
if (wantarray) {
- return () if $x -> is_nan();
+ return () if $x -> is_nan();
croak("bfib() can't return an infinitely long list of numbers")
- if $x -> is_inf();
+ if $x -> is_inf();
# Use the backend library to compute the first $x Fibonacci numbers.
@@ -3053,7 +3243,7 @@ sub bfib {
# invocand.
for (my $i = 0 ; $i < $#values ; ++ $i) {
- my $fib = $class -> bzero();
+ my $fib = $class -> bzero();
$fib -> {value} = $values[$i];
$values[$i] = $fib;
}
@@ -3087,13 +3277,16 @@ sub bfib {
sub blucas {
# compute Lucas number(s)
- my ($class, $x, @r) = objectify(1, @_);
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
croak("blucas() requires a newer version of the $LIB library.")
unless $LIB->can('_lucas');
return $x if $x->modify('blucas');
+ return $upgrade -> blucas($x, @r)
+ if defined($upgrade) && !$x -> isa($class);
+
# List context.
if (wantarray) {
@@ -3164,8 +3357,19 @@ sub blsft {
return $x -> bnan() if ($x -> {sign} !~ /^[+-]$/ ||
$y -> {sign} !~ /^[+-]$/);
return $x -> round(@r) if $y -> is_zero();
+ return $x -> bzero(@r) if $x -> is_zero(); # 0 => 0
- $b = defined($b) ? $b -> numify() : 2;
+ $b = 2 if !defined $b;
+ return $x -> bnan(@r) if $b <= 0 || $y -> {sign} eq '-';
+ $b = $class -> new($b) unless defined(blessed($b));
+
+ #return $upgrade -> blsft($x, $y, $b, @r)
+ # if defined($upgrade) && (!$x -> isa($class) ||
+ # !$y -> isa($class) ||
+ # !$b -> isa($class));
+
+ # shift by a negative amount?
+ #return $x -> brsft($y -> copy() -> babs(), $b) if $y -> {sign} =~ /^-/;
# While some of the libraries support an arbitrarily large base, not all of
# them do, so rather than returning an incorrect result in those cases,
@@ -3174,6 +3378,8 @@ sub blsft {
my $uintmax = ~0;
croak("Base is too large.") if $b > $uintmax;
+ $b = $b -> numify();
+
return $x -> bnan() if $b <= 0 || $y -> {sign} eq '-';
$x -> {value} = $LIB -> _lsft($x -> {value}, $y -> {value}, $b);
@@ -3184,21 +3390,48 @@ sub brsft {
# (BINT or num_str, BINT or num_str) return BINT
# compute x >> y, base n, y >= 0
- # set up parameters
my ($class, $x, $y, $b, @r) = (ref($_[0]), @_);
- # objectify is costly, so avoid it
- if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
- ($class, $x, $y, $b, @r) = objectify(2, @_);
+ # Objectify the base only when it is defined, since an undefined base, as
+ # in $x->blsft(3) or $x->blog(3, undef) means use the default base 2.
+
+ if (!ref($_[0]) && $_[0] =~ /^[A-Za-z]|::/) {
+ # E.g., Math::BigInt->blog(256, 5, 2)
+ ($class, $x, $y, $b, @r) =
+ defined $_[3] ? objectify(3, @_) : objectify(2, @_);
+ } else {
+ # E.g., Math::BigInt::blog(256, 5, 2) or $x->blog(5, 2)
+ ($class, $x, $y, $b, @r) =
+ defined $_[2] ? objectify(3, @_) : objectify(2, @_);
}
return $x if $x -> modify('brsft');
- return $x -> bnan() if ($x -> {sign} !~ /^[+-]$/ || $y -> {sign} !~ /^[+-]$/);
+ return $x -> bnan(@r) if $x -> {sign} !~ /^[+-]$/ ||
+ $y -> {sign} !~ /^[+-]$/;
return $x -> round(@r) if $y -> is_zero();
return $x -> bzero(@r) if $x -> is_zero(); # 0 => 0
$b = 2 if !defined $b;
- return $x -> bnan() if $b <= 0 || $y -> {sign} eq '-';
+ return $x -> bnan(@r) if $b <= 0 || $y -> {sign} eq '-';
+ $b = $class -> new($b) unless defined(blessed($b));
+
+ # Shifting right by a positive amount might lead to a non-integer result, so
+ # include this case in the test.
+
+ return $upgrade -> brsft($x, $y, $b, @r)
+ if defined($upgrade) && (!$x -> isa($class) ||
+ !$y -> isa($class) ||
+ !$b -> isa($class) ||
+ $y -> is_pos());
+
+ # While some of the libraries support an arbitrarily large base, not all of
+ # them do, so rather than returning an incorrect result in those cases,
+ # disallow bases that don't work with all libraries.
+
+ my $uintmax = ~0;
+ croak("Base is too large.") if $b > $uintmax;
+
+ $b = $b -> numify();
# this only works for negative numbers when shifting in base 2
if (($x -> {sign} eq '-') && ($b == 2)) {
@@ -3209,7 +3442,7 @@ sub brsft {
# shift...
# if $y != 1, we must simulate it by doing:
# convert to bin, flip all bits, shift, and be done
- $x -> binc(); # -3 => -2
+ $x = $x -> binc(); # -3 => -2
my $bin = $x -> as_bin();
$bin =~ s/^-0b//; # strip '-0b' prefix
$bin =~ tr/10/01/; # flip bits
@@ -3225,13 +3458,13 @@ sub brsft {
$bin =~ tr/10/01/; # flip bits back
}
my $res = $class -> new('0b' . $bin); # add prefix and convert back
- $res -> binc(); # remember to increment
+ $res = $res -> binc(); # remember to increment
$x -> {value} = $res -> {value}; # take over value
return $x -> round(@r); # we are done now, magic, isn't?
}
# x < 0, n == 2, y == 1
- $x -> bdec(); # n == 2, but $y == 1: this fixes it
+ $x = $x -> bdec(); # n == 2, but $y == 1: this fixes it
}
$x -> {value} = $LIB -> _rsft($x -> {value}, $y -> {value}, $b);
@@ -3246,18 +3479,18 @@ sub band {
#(BINT or num_str, BINT or num_str) return BINT
# compute x & y
- # set up parameters
- my ($class, $x, $y, @r) = (ref($_[0]), @_);
- # objectify is costly, so avoid it
- if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
- ($class, $x, $y, @r) = objectify(2, @_);
- }
+ my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (ref($_[0]), @_) : objectify(2, @_);
return $x if $x->modify('band');
+ return $upgrade -> band($x, $y, @r)
+ if defined($upgrade) && (!$x -> isa($class) ||
+ !$y -> isa($class));
+
$r[3] = $y; # no push!
- return $x->bnan() if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/);
+ return $x->bnan(@r) if $x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/;
if ($x->{sign} eq '+' && $y->{sign} eq '+') {
$x->{value} = $LIB->_and($x->{value}, $y->{value});
@@ -3272,15 +3505,15 @@ sub bior {
#(BINT or num_str, BINT or num_str) return BINT
# compute x | y
- # set up parameters
- my ($class, $x, $y, @r) = (ref($_[0]), @_);
- # objectify is costly, so avoid it
- if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
- ($class, $x, $y, @r) = objectify(2, @_);
- }
+ my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (ref($_[0]), @_) : objectify(2, @_);
return $x if $x->modify('bior');
+ return $upgrade -> bior($x, $y, @r)
+ if defined($upgrade) && (!$x -> isa($class) ||
+ !$y -> isa($class));
+
$r[3] = $y; # no push!
return $x->bnan() if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/);
@@ -3298,18 +3531,18 @@ sub bxor {
#(BINT or num_str, BINT or num_str) return BINT
# compute x ^ y
- # set up parameters
- my ($class, $x, $y, @r) = (ref($_[0]), @_);
- # objectify is costly, so avoid it
- if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) {
- ($class, $x, $y, @r) = objectify(2, @_);
- }
+ my ($class, $x, $y, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (ref($_[0]), @_) : objectify(2, @_);
return $x if $x->modify('bxor');
+ return $upgrade -> bxor($x, $y, @r)
+ if defined($upgrade) && (!$x -> isa($class) ||
+ !$y -> isa($class));
+
$r[3] = $y; # no push!
- return $x->bnan() if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/);
+ return $x->bnan(@r) if $x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/;
if ($x->{sign} eq '+' && $y->{sign} eq '+') {
$x->{value} = $LIB->_xor($x->{value}, $y->{value});
@@ -3323,11 +3556,14 @@ sub bxor {
sub bnot {
# (num_str or BINT) return BINT
# represent ~x as twos-complement number
- # we don't need $class, so undef instead of ref($_[0]) make it slightly faster
- my ($class, $x) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
return $x if $x->modify('bnot');
- $x->binc()->bneg(); # binc already does round
+
+ return $upgrade -> bnot($x, @r)
+ if defined($upgrade) && !$x -> isa($class);
+
+ $x -> binc() -> bneg(@r);
}
###############################################################################
@@ -3338,22 +3574,39 @@ sub round {
# Round $self according to given parameters, or given second argument's
# parameters or global defaults
- # for speed reasons, _find_round_parameters is embedded here:
+ my ($class, $self, @args) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ # $x->round(undef, undef) signals no rounding
+
+ if (@args >= 2 && @args <= 3 && !defined($args[0]) && !defined($args[1])) {
+ $self->{_a} = undef;
+ $self->{_p} = undef;
+ return $self;
+ }
+
+ my ($a, $p, $r) = splice @args, 0, 3;
- my ($self, $a, $p, $r, @args) = @_;
# $a accuracy, if given by caller
# $p precision, if given by caller
# $r round_mode, if given by caller
# @args all 'other' arguments (0 for unary, 1 for binary ops)
- my $class = ref($self); # find out class of argument(s)
- no strict 'refs';
+ if (defined $a) {
+ croak "accuracy must be a number, not '$a'"
+ unless $a =~/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[Ee][+-]?\d+)?\z/;
+ }
+
+ if (defined $p) {
+ croak "precision must be a number, not '$p'"
+ unless $p =~/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[Ee][+-]?\d+)?\z/;
+ }
# now pick $a or $p, but only if we have got "arguments"
if (!defined $a) {
foreach ($self, @args) {
# take the defined one, or if both defined, the one that is smaller
- $a = $_->{_a} if (defined $_->{_a}) && (!defined $a || $_->{_a} < $a);
+ $a = $_->{_a}
+ if (defined $_->{_a}) && (!defined $a || $_->{_a} < $a);
}
}
if (!defined $p) {
@@ -3361,10 +3614,13 @@ sub round {
foreach ($self, @args) {
# take the defined one, or if both defined, the one that is bigger
# -2 > -3, and 3 > 2
- $p = $_->{_p} if (defined $_->{_p}) && (!defined $p || $_->{_p} > $p);
+ $p = $_->{_p}
+ if (defined $_->{_p}) && (!defined $p || $_->{_p} > $p);
}
}
+ no strict 'refs';
+
# if still none defined, use globals
unless (defined $a || defined $p) {
$a = ${"$class\::accuracy"};
@@ -3387,9 +3643,11 @@ sub round {
# now round, by calling either bround or bfround:
if (defined $a) {
- $self->bround(int($a), $r) if !defined $self->{_a} || $self->{_a} >= $a;
+ $self = $self->bround(int($a), $r)
+ if !defined $self->{_a} || $self->{_a} >= $a;
} else { # both can't be undefined due to early out
- $self->bfround(int($p), $r) if !defined $self->{_p} || $self->{_p} <= $p;
+ $self = $self->bfround(int($p), $r)
+ if !defined $self->{_p} || $self->{_p} <= $p;
}
# bround() or bfround() already called bnorm() if nec.
@@ -3403,9 +3661,9 @@ sub bround {
# and overwrite the rest with 0's, return normalized number
# do not return $x->bnorm(), but $x
- my $x = shift;
- $x = __PACKAGE__->new($x) unless ref $x;
- my ($scale, $mode) = $x->_scale_a(@_);
+ my ($class, $x, @a) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ my ($scale, $mode) = $x->_scale_a(@a);
return $x if !defined $scale || $x->modify('bround'); # no-op
if ($x->is_zero() || $scale == 0) {
@@ -3417,8 +3675,8 @@ sub bround {
# we have fewer digits than we want to scale to
my $len = $x->length();
# convert $scale to a scalar in case it is an object (put's a limit on the
- # number length, but this would already limited by memory constraints), makes
- # it faster
+ # number length, but this would already limited by memory constraints),
+ # makes it faster
$scale = $scale->numify() if ref ($scale);
# scale < 0, but > -len (not >=!)
@@ -3469,7 +3727,7 @@ sub bround {
$xs =~ s/^0+(\d)/$1/; # "00000" -> "0"
$put_back = 1; # need to put back
} elsif ($pad > $len) {
- $x->bzero(); # round to '0'
+ $x = $x->bzero(); # round to '0'
}
if ($round_up) { # what gave test above?
@@ -3502,16 +3760,15 @@ sub bround {
sub bfround {
# precision: round to the $Nth digit left (+$n) or right (-$n) from the '.'
# $n == 0 || $n == 1 => round to integer
- my $x = shift;
- my $class = ref($x) || $x;
- $x = $class->new($x) unless ref $x;
- my ($scale, $mode) = $x->_scale_p(@_);
+ my ($class, $x, @p) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ my ($scale, $mode) = $x->_scale_p(@p);
return $x if !defined $scale || $x->modify('bfround'); # no-op
# no-op for Math::BigInt objects if $n <= 0
- $x->bround($x->length()-$scale, $mode) if $scale > 0;
+ $x = $x->bround($x->length()-$scale, $mode) if $scale > 0;
delete $x->{_a}; # delete to save memory
$x->{_p} = $scale; # store new _p
@@ -3528,21 +3785,30 @@ sub fround {
sub bfloor {
# round towards minus infinity; no-op since it's already integer
- my ($class, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ return $upgrade -> bfloor($x)
+ if defined($upgrade) && !$x -> isa($class);
$x->round(@r);
}
sub bceil {
# round towards plus infinity; no-op since it's already int
- my ($class, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ return $upgrade -> bceil($x)
+ if defined($upgrade) && !$x -> isa($class);
$x->round(@r);
}
sub bint {
# round towards zero; no-op since it's already integer
- my ($class, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ return $upgrade -> bint($x)
+ if defined($upgrade) && !$x -> isa($class);
$x->round(@r);
}
@@ -3556,8 +3822,30 @@ sub bgcd {
# does not modify arguments, but returns new object
# GCD -- Euclid's algorithm, variant C (Knuth Vol 3, pg 341 ff)
+ # Class::method(...) -> Class->method(...)
+ unless (@_ && (defined(blessed($_[0])) && $_[0] -> isa(__PACKAGE__) ||
+ $_[0] =~ /^[a-z]\w*(?:::[a-z]\w*)*$/i))
+ {
+ #carp "Using ", (caller(0))[3], "() as a function is deprecated;",
+ # " use is as a method instead";
+ unshift @_, __PACKAGE__;
+ }
+
my ($class, @args) = objectify(0, @_);
+ # Upgrade?
+
+ if (defined $upgrade) {
+ my $do_upgrade = 0;
+ for my $arg (@args) {
+ unless ($arg -> isa($class)) {
+ $do_upgrade = 1;
+ last;
+ }
+ }
+ return $upgrade -> bgcd(@args) if $do_upgrade;
+ }
+
my $x = shift @args;
$x = ref($x) && $x -> isa($class) ? $x -> copy() : $class -> new($x);
@@ -3579,8 +3867,30 @@ sub blcm {
# does not modify arguments, but returns new object
# Least Common Multiple
+ # Class::method(...) -> Class->method(...)
+ unless (@_ && (defined(blessed($_[0])) && $_[0] -> isa(__PACKAGE__) ||
+ $_[0] =~ /^[a-z]\w*(?:::[a-z]\w*)*$/i))
+ {
+ #carp "Using ", (caller(0))[3], "() as a function is deprecated;",
+ # " use is as a method instead";
+ unshift @_, __PACKAGE__;
+ }
+
my ($class, @args) = objectify(0, @_);
+ # Upgrade?
+
+ if (defined $upgrade) {
+ my $do_upgrade = 0;
+ for my $arg (@args) {
+ unless ($arg -> isa($class)) {
+ $do_upgrade = 1;
+ last;
+ }
+ }
+ return $upgrade -> blcm(@args) if $do_upgrade;
+ }
+
my $x = shift @args;
$x = ref($x) && $x -> isa($class) ? $x -> copy() : $class -> new($x);
return $class->bnan() if $x->{sign} !~ /^[+-]$/; # x NaN?
@@ -3601,14 +3911,18 @@ sub blcm {
sub sign {
# return the sign of the number: +/-/-inf/+inf/NaN
- my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
$x->{sign};
}
sub digit {
# return the nth decimal digit, negative values count backward, 0 is right
- my ($class, $x, $n) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+ my (undef, $x, $n, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
$n = $n->numify() if ref($n);
$LIB->_digit($x->{value}, $n || 0);
@@ -3616,7 +3930,9 @@ sub digit {
sub bdigitsum {
# like digitsum(), but assigns the result to the invocand
- my $x = shift;
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
return $x if $x -> is_nan();
return $x -> bnan() if $x -> is_inf();
@@ -3628,19 +3944,22 @@ sub bdigitsum {
sub digitsum {
# compute sum of decimal digits and return it
- my $x = shift;
- my $class = ref $x;
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
return $class -> bnan() if $x -> is_nan();
return $class -> bnan() if $x -> is_inf();
my $y = $class -> bzero();
$y -> {value} = $LIB -> _digitsum($x -> {value});
- return $y;
+ $y -> round(@r);
}
sub length {
- my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
my $e = $LIB->_len($x->{value});
wantarray ? ($e, 0) : $e;
@@ -3648,26 +3967,40 @@ sub length {
sub exponent {
# return a copy of the exponent (here always 0, NaN or 1 for $m == 0)
- my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_);
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+ # Upgrade?
+
+ return $upgrade -> exponent($x, @r)
+ if defined($upgrade) && !$x -> isa($class);
if ($x->{sign} !~ /^[+-]$/) {
my $s = $x->{sign};
$s =~ s/^[+-]//; # NaN, -inf, +inf => NaN or inf
- return $class->new($s);
+ return $class->new($s, @r);
}
- return $class->bzero() if $x->is_zero();
+ return $class->bzero(@r) if $x->is_zero();
# 12300 => 2 trailing zeros => exponent is 2
- $class->new($LIB->_zeros($x->{value}));
+ $class->new($LIB->_zeros($x->{value}), @r);
}
sub mantissa {
# return the mantissa (compatible to Math::BigFloat, e.g. reduced)
- my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_);
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+ # Upgrade?
+
+ return $upgrade -> mantissa($x, @r)
+ if defined($upgrade) && !$x -> isa($class);
if ($x->{sign} !~ /^[+-]$/) {
# for NaN, +inf, -inf: keep the sign
- return $class->new($x->{sign});
+ return $class->new($x->{sign}, @r);
}
my $m = $x->copy();
delete $m->{_p};
@@ -3675,92 +4008,100 @@ sub mantissa {
# that's a bit inefficient:
my $zeros = $LIB->_zeros($m->{value});
- $m->brsft($zeros, 10) if $zeros != 0;
- $m;
+ $m = $m->brsft($zeros, 10) if $zeros != 0;
+ $m -> round(@r);
}
sub parts {
# return a copy of both the exponent and the mantissa
- my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
- ($x->mantissa(), $x->exponent());
+ # Upgrade?
+
+ return $upgrade -> parts($x, @r)
+ if defined($upgrade) && !$x -> isa($class);
+
+ ($x->mantissa(@r), $x->exponent(@r));
}
+# Parts used for scientific notation with significand/mantissa and exponent as
+# integers. E.g., "12345.6789" is returned as "123456789" (mantissa) and "-4"
+# (exponent).
+
sub sparts {
- my $self = shift;
- my $class = ref $self;
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
- croak("sparts() is an instance method, not a class method")
- unless $class;
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
# Not-a-number.
- if ($self -> is_nan()) {
- my $mant = $self -> copy(); # mantissa
+ if ($x -> is_nan()) {
+ my $mant = $class -> bnan(@r); # mantissa
return $mant unless wantarray; # scalar context
- my $expo = $class -> bnan(); # exponent
+ my $expo = $class -> bnan(@r); # exponent
return ($mant, $expo); # list context
}
# Infinity.
- if ($self -> is_inf()) {
- my $mant = $self -> copy(); # mantissa
- return $mant unless wantarray; # scalar context
- my $expo = $class -> binf('+'); # exponent
- return ($mant, $expo); # list context
+ if ($x -> is_inf()) {
+ my $mant = $class -> binf($x->{sign}, @r); # mantissa
+ return $mant unless wantarray; # scalar context
+ my $expo = $class -> binf('+', @r); # exponent
+ return ($mant, $expo); # list context
}
+ # Upgrade?
+
+ return $upgrade -> sparts($x, @r)
+ if defined($upgrade) && !$x -> isa($class);
+
# Finite number.
- my $mant = $self -> copy();
+ my $mant = $x -> copy();
my $nzeros = $LIB -> _zeros($mant -> {value});
- $mant -> brsft($nzeros, 10) if $nzeros != 0;
+ $mant -> {value}
+ = $LIB -> _rsft($mant -> {value}, $LIB -> _new($nzeros), 10)
+ if $nzeros != 0;
return $mant unless wantarray;
- my $expo = $class -> new($nzeros);
+ my $expo = $class -> new($nzeros, @r);
return ($mant, $expo);
}
+# Parts used for normalized notation with significand/mantissa as either 0 or a
+# number in the semi-open interval [1,10). E.g., "12345.6789" is returned as
+# "1.23456789" and "4".
+
sub nparts {
- my $self = shift;
- my $class = ref $self;
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
- croak("nparts() is an instance method, not a class method")
- unless $class;
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
- # Not-a-number.
+ # Not-a-Number and Infinity.
- if ($self -> is_nan()) {
- my $mant = $self -> copy(); # mantissa
- return $mant unless wantarray; # scalar context
- my $expo = $class -> bnan(); # exponent
- return ($mant, $expo); # list context
- }
+ return $x -> sparts(@r) if $x -> is_nan() || $x -> is_inf();
- # Infinity.
+ # Upgrade?
- if ($self -> is_inf()) {
- my $mant = $self -> copy(); # mantissa
- return $mant unless wantarray; # scalar context
- my $expo = $class -> binf('+'); # exponent
- return ($mant, $expo); # list context
- }
+ return $upgrade -> nparts($x, @r)
+ if defined($upgrade) && !$x -> isa($class);
# Finite number.
- my ($mant, $expo) = $self -> sparts();
-
+ my ($mant, $expo) = $x -> sparts(@r);
if ($mant -> bcmp(0)) {
my ($ndigtot, $ndigfrac) = $mant -> length();
my $expo10adj = $ndigtot - $ndigfrac - 1;
- if ($expo10adj != 0) {
- return $upgrade -> new($self) -> nparts() if $upgrade;
- $mant -> bnan();
+ if ($expo10adj > 0) { # if mantissa is not an integer
+ return $upgrade -> nparts($x, @r) if defined $upgrade;
+ $mant = $mant -> bnan(@r);
return $mant unless wantarray;
- $expo -> badd($expo10adj);
+ $expo = $expo -> badd($expo10adj, @r);
return ($mant, $expo);
}
}
@@ -3769,85 +4110,149 @@ sub nparts {
return ($mant, $expo);
}
+# Parts used for engineering notation with significand/mantissa as either 0 or a
+# number in the semi-open interval [1,1000) and the exponent is a multiple of 3.
+# E.g., "12345.6789" is returned as "12.3456789" and "3".
+
sub eparts {
- my $self = shift;
- my $class = ref $self;
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
- croak("eparts() is an instance method, not a class method")
- unless $class;
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
# Not-a-number and Infinity.
- return $self -> sparts() if $self -> is_nan() || $self -> is_inf();
+ return $x -> sparts(@r) if $x -> is_nan() || $x -> is_inf();
+
+ # Upgrade?
+
+ return $upgrade -> eparts($x, @r)
+ if defined($upgrade) && !$x -> isa($class);
# Finite number.
- my ($mant, $expo) = $self -> sparts();
+ my ($mant, $expo) = $x -> sparts(@r);
if ($mant -> bcmp(0)) {
my $ndigmant = $mant -> length();
- $expo -> badd($ndigmant);
+ $expo = $expo -> badd($ndigmant, @r);
# $c is the number of digits that will be in the integer part of the
# final mantissa.
my $c = $expo -> copy() -> bdec() -> bmod(3) -> binc();
- $expo -> bsub($c);
+ $expo = $expo -> bsub($c);
if ($ndigmant > $c) {
- return $upgrade -> new($self) -> eparts() if $upgrade;
- $mant -> bnan();
+ return $upgrade -> eparts($x, @r) if defined $upgrade;
+ $mant = $mant -> bnan(@r);
return $mant unless wantarray;
return ($mant, $expo);
}
- $mant -> blsft($c - $ndigmant, 10);
+ $mant = $mant -> blsft($c - $ndigmant, 10, @r);
}
return $mant unless wantarray;
return ($mant, $expo);
}
+# Parts used for decimal notation, e.g., "12345.6789" is returned as "12345"
+# (integer part) and "0.6789" (fraction part).
+
sub dparts {
- my $self = shift;
- my $class = ref $self;
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+ # Not-a-number.
+
+ if ($x -> is_nan()) {
+ my $int = $class -> bnan(@r);
+ return $int unless wantarray;
+ my $frc = $class -> bzero(@r); # or NaN?
+ return ($int, $frc);
+ }
+
+ # Infinity.
+
+ if ($x -> is_inf()) {
+ my $int = $class -> binf($x->{sign}, @r);
+ return $int unless wantarray;
+ my $frc = $class -> bzero(@r);
+ return ($int, $frc);
+ }
+
+ # Upgrade?
+
+ return $upgrade -> dparts($x, @r)
+ if defined($upgrade) && !$x -> isa($class);
- croak("dparts() is an instance method, not a class method")
- unless $class;
+ # Finite number.
- my $int = $self -> copy();
+ my $int = $x -> copy() -> round(@r);
return $int unless wantarray;
- my $frc = $class -> bzero();
+ my $frc = $class -> bzero(@r);
return ($int, $frc);
}
+# Fractional parts with the numerator and denominator as integers. E.g.,
+# "123.4375" is returned as "1975" and "16".
+
sub fparts {
- my $x = shift;
- my $class = ref $x;
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+ # NaN => NaN/NaN
+
+ if ($x -> is_nan()) {
+ return $class -> bnan(@r) unless wantarray;
+ return $class -> bnan(@r), $class -> bnan(@r);
+ }
+
+ # ±Inf => ±Inf/1
+
+ if ($x -> is_inf()) {
+ my $numer = $class -> binf($x->{sign}, @r);
+ return $numer unless wantarray;
+ my $denom = $class -> bone(@r);
+ return $numer, $denom;
+ }
+
+ # Upgrade?
- croak("fparts() is an instance method") unless $class;
+ return $upgrade -> fparts($x, @r)
+ if defined($upgrade) && !$x -> isa($class);
- return ($x -> copy(),
- $x -> is_nan() ? $class -> bnan() : $class -> bone());
+ # N => N/1
+
+ my $numer = $x -> copy() -> round(@r);
+ return $numer unless wantarray;
+ my $denom = $class -> bone(@r);
+ return $numer, $denom;
}
sub numerator {
- my $x = shift;
- my $class = ref $x;
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
- croak("numerator() is an instance method") unless $class;
+ return $upgrade -> numerator($x, @r)
+ if defined($upgrade) && !$x -> isa($class);
- return $x -> copy();
+ return $x -> copy() -> round(@r);
}
sub denominator {
- my $x = shift;
- my $class = ref $x;
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
- croak("denominator() is an instance method") unless $class;
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
- return $x -> is_nan() ? $class -> bnan() : $class -> bone();
+ return $upgrade -> denominator($x, @r)
+ if defined($upgrade) && !$x -> isa($class);
+
+ return $x -> is_nan() ? $class -> bnan(@r) : $class -> bone(@r);
}
###############################################################################
@@ -3855,12 +4260,24 @@ sub denominator {
###############################################################################
sub bstr {
- my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+ # Inf and NaN
if ($x->{sign} ne '+' && $x->{sign} ne '-') {
return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
return 'inf'; # +inf
}
+
+ # Upgrade?
+
+ return $upgrade -> bstr($x, @r)
+ if defined($upgrade) && !$x -> isa($class);
+
+ # Finite number
+
my $str = $LIB->_str($x->{value});
return $x->{sign} eq '-' ? "-$str" : $str;
}
@@ -3869,125 +4286,223 @@ sub bstr {
# written as "1.2345e+4".
sub bsstr {
- my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_);
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+ # Inf and NaN
if ($x->{sign} ne '+' && $x->{sign} ne '-') {
return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
return 'inf'; # +inf
}
- my ($m, $e) = $x -> parts();
- my $str = $LIB->_str($m->{value}) . 'e+' . $LIB->_str($e->{value});
- return $x->{sign} eq '-' ? "-$str" : $str;
+
+ # Upgrade?
+
+ return $upgrade -> bsstr($x, @r)
+ if defined($upgrade) && !$x -> isa($class);
+
+ # Finite number
+
+ my $expo = $LIB -> _zeros($x->{value});
+ my $mant = $LIB -> _str($x->{value});
+ $mant = substr($mant, 0, -$expo) if $expo; # strip trailing zeros
+
+ ($x->{sign} eq '-' ? '-' : '') . $mant . 'e+' . $expo;
}
-# Normalized notation, e.g., "12345" is written as "12345e+0".
+# Normalized notation, e.g., "12345" is written as "1.2345e+4".
sub bnstr {
- my $x = shift;
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+ # Inf and NaN
if ($x->{sign} ne '+' && $x->{sign} ne '-') {
return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
return 'inf'; # +inf
}
- return $x -> bstr() if $x -> is_nan() || $x -> is_inf();
+ # Upgrade?
- my ($mant, $expo) = $x -> parts();
+ return $upgrade -> bnstr($x, @r)
+ if defined($upgrade) && !$x -> isa($class);
- # The "fraction posision" is the position (offset) for the decimal point
- # relative to the end of the digit string.
+ # Finite number
- my $fracpos = $mant -> length() - 1;
- if ($fracpos == 0) {
- my $str = $LIB->_str($mant->{value}) . "e+" . $LIB->_str($expo->{value});
- return $x->{sign} eq '-' ? "-$str" : $str;
- }
+ my $expo = $LIB -> _zeros($x->{value});
+ my $mant = $LIB -> _str($x->{value});
+ $mant = substr($mant, 0, -$expo) if $expo; # strip trailing zeros
- $expo += $fracpos;
- my $mantstr = $LIB->_str($mant -> {value});
- substr($mantstr, -$fracpos, 0) = '.';
+ my $mantlen = CORE::length($mant);
+ if ($mantlen > 1) {
+ $expo += $mantlen - 1; # adjust exponent
+ substr $mant, 1, 0, "."; # insert decimal point
+ }
- my $str = $mantstr . 'e+' . $LIB->_str($expo -> {value});
- return $x->{sign} eq '-' ? "-$str" : $str;
+ ($x->{sign} eq '-' ? '-' : '') . $mant . 'e+' . $expo;
}
# Engineering notation, e.g., "12345" is written as "12.345e+3".
sub bestr {
- my $x = shift;
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+ # Inf and NaN
if ($x->{sign} ne '+' && $x->{sign} ne '-') {
return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
return 'inf'; # +inf
}
- my ($mant, $expo) = $x -> parts();
+ # Upgrade?
- my $sign = $mant -> sign();
- $mant -> babs();
+ return $upgrade -> bestr($x, @r)
+ if defined($upgrade) && !$x -> isa($class);
- my $mantstr = $LIB->_str($mant -> {value});
- my $mantlen = CORE::length($mantstr);
+ # Finite number
- my $dotidx = 1;
- $expo += $mantlen - 1;
+ my $expo = $LIB -> _zeros($x->{value}); # number of trailing zeros
+ my $mant = $LIB -> _str($x->{value}); # mantissa as a string
+ $mant = substr($mant, 0, -$expo) if $expo; # strip trailing zeros
+ my $mantlen = CORE::length($mant); # length of mantissa
+ $expo += $mantlen;
- my $c = $expo -> copy() -> bmod(3);
- $expo -= $c;
- $dotidx += $c;
+ my $dotpos = ($expo - 1) % 3 + 1; # offset of decimal point
+ $expo -= $dotpos;
- if ($mantlen < $dotidx) {
- $mantstr .= "0" x ($dotidx - $mantlen);
- } elsif ($mantlen > $dotidx) {
- substr($mantstr, $dotidx, 0) = ".";
+ if ($dotpos < $mantlen) {
+ substr $mant, $dotpos, 0, "."; # insert decimal point
+ } elsif ($dotpos > $mantlen) {
+ $mant .= "0" x ($dotpos - $mantlen); # append zeros
}
- my $str = $mantstr . 'e+' . $LIB->_str($expo -> {value});
- return $sign eq "-" ? "-$str" : $str;
+ ($x->{sign} eq '-' ? '-' : '') . $mant . 'e+' . $expo;
}
-# Decimal notation, e.g., "12345".
+# Decimal notation, e.g., "12345" (no exponent).
sub bdstr {
- my $x = shift;
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+ # Inf and NaN
if ($x->{sign} ne '+' && $x->{sign} ne '-') {
- return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
- return 'inf'; # +inf
+ return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
+ return 'inf'; # +inf
}
- my $str = $LIB->_str($x->{value});
- return $x->{sign} eq '-' ? "-$str" : $str;
+ # Upgrade?
+
+ return $upgrade -> bdstr($x, @r)
+ if defined($upgrade) && !$x -> isa($class);
+
+ # Finite number
+
+ ($x->{sign} eq '-' ? '-' : '') . $LIB->_str($x->{value});
+}
+
+# Fraction notation, e.g., "123.4375" is written as "1975/16", but "123" is
+# written as "123", not "123/1".
+
+sub bfstr {
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+ # Inf and NaN
+
+ if ($x->{sign} ne '+' && $x->{sign} ne '-') {
+ return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
+ return 'inf'; # +inf
+ }
+
+ # Upgrade?
+
+ return $upgrade -> bfstr($x, @r)
+ if defined($upgrade) && !$x -> isa($class);
+
+ # Finite number
+
+ ($x->{sign} eq '-' ? '-' : '') . $LIB->_str($x->{value});
}
sub to_hex {
- # return as hex string, with prefixed 0x
- my $x = shift;
- $x = __PACKAGE__->new($x) if !ref($x);
+ # return as hex string with no prefix
- return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+ # Inf and NaN
+
+ if ($x->{sign} ne '+' && $x->{sign} ne '-') {
+ return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
+ return 'inf'; # +inf
+ }
+
+ # Upgrade?
+
+ return $upgrade -> to_hex($x, @r)
+ if defined($upgrade) && !$x -> isa($class);
+
+ # Finite number
my $hex = $LIB->_to_hex($x->{value});
return $x->{sign} eq '-' ? "-$hex" : $hex;
}
sub to_oct {
- # return as octal string, with prefixed 0
- my $x = shift;
- $x = __PACKAGE__->new($x) if !ref($x);
+ # return as octal string with no prefix
- return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+ # Inf and NaN
+
+ if ($x->{sign} ne '+' && $x->{sign} ne '-') {
+ return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
+ return 'inf'; # +inf
+ }
+
+ # Upgrade?
+
+ return $upgrade -> to_oct($x, @r)
+ if defined($upgrade) && !$x -> isa($class);
+
+ # Finite number
my $oct = $LIB->_to_oct($x->{value});
return $x->{sign} eq '-' ? "-$oct" : $oct;
}
sub to_bin {
- # return as binary string, with prefixed 0b
- my $x = shift;
- $x = __PACKAGE__->new($x) if !ref($x);
+ # return as binary string with no prefix
- return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
+
+ # Inf and NaN
+
+ if ($x->{sign} ne '+' && $x->{sign} ne '-') {
+ return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
+ return 'inf'; # +inf
+ }
+
+ # Upgrade?
+
+ return $upgrade -> to_bin($x, @r)
+ if defined($upgrade) && !$x -> isa($class);
+
+ # Finite number
my $bin = $LIB->_to_bin($x->{value});
return $x->{sign} eq '-' ? "-$bin" : $bin;
@@ -3995,12 +4510,17 @@ sub to_bin {
sub to_bytes {
# return a byte string
- my $x = shift;
- $x = __PACKAGE__->new($x) if !ref($x);
+
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
croak("to_bytes() requires a finite, non-negative integer")
if $x -> is_neg() || ! $x -> is_int();
+ return $upgrade -> to_bytes($x, @r)
+ if defined($upgrade) && !$x -> isa($class);
+
croak("to_bytes() requires a newer version of the $LIB library.")
unless $LIB->can('_to_bytes');
@@ -4009,22 +4529,23 @@ sub to_bytes {
sub to_base {
# return a base anything string
- my $x = shift;
- $x = __PACKAGE__->new($x) if !ref($x);
+
+ # $cs is the collation sequence
+ my ($class, $x, $base, $cs, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (ref($_[0]), @_) : objectify(2, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
croak("the value to convert must be a finite, non-negative integer")
if $x -> is_neg() || !$x -> is_int();
- my $base = shift;
- $base = __PACKAGE__->new($base) unless ref($base);
-
croak("the base must be a finite integer >= 2")
if $base < 2 || ! $base -> is_int();
# If no collating sequence is given, pass some of the conversions to
# methods optimized for those cases.
- if (! @_) {
+ unless (defined $cs) {
return $x -> to_bin() if $base == 2;
return $x -> to_oct() if $base == 8;
return uc $x -> to_hex() if $base == 16;
@@ -4034,26 +4555,35 @@ sub to_base {
croak("to_base() requires a newer version of the $LIB library.")
unless $LIB->can('_to_base');
- return $LIB->_to_base($x->{value}, $base -> {value}, @_ ? shift() : ());
+ return $upgrade -> to_base($x, $base, $cs, @r)
+ if defined($upgrade) && (!$x -> isa($class) || !$base -> isa($class));
+
+ return $LIB->_to_base($x->{value}, $base -> {value},
+ defined($cs) ? $cs : ());
}
sub to_base_num {
- my $x = shift;
- my $class = ref $x;
+ # return a base anything array ref, e.g.,
+ # Math::BigInt -> new(255) -> to_base_num(10) returns [2, 5, 5];
+
+ # $cs is the collation sequence
+ my ($class, $x, $base, @r) = ref($_[0]) && ref($_[0]) eq ref($_[1])
+ ? (ref($_[0]), @_) : objectify(2, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
- # return a base anything string
croak("the value to convert must be a finite non-negative integer")
if $x -> is_neg() || !$x -> is_int();
- my $base = shift;
- $base = $class -> new($base) unless ref $base;
-
croak("the base must be a finite integer >= 2")
if $base < 2 || ! $base -> is_int();
croak("to_base() requires a newer version of the $LIB library.")
unless $LIB->can('_to_base');
+ return $upgrade -> to_base_num($x, $base, @r)
+ if defined($upgrade) && (!$x -> isa($class) || !$base -> isa($class));
+
# Get a reference to an array of library thingies, and replace each element
# with a Math::BigInt object using that thingy.
@@ -4070,33 +4600,48 @@ sub to_base_num {
sub as_hex {
# return as hex string, with prefixed 0x
- my $x = shift;
- $x = __PACKAGE__->new($x) if !ref($x);
+
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc
+ return $upgrade -> as_hex($x, @r)
+ if defined($upgrade) && !$x -> isa($class);
+
my $hex = $LIB->_as_hex($x->{value});
return $x->{sign} eq '-' ? "-$hex" : $hex;
}
sub as_oct {
# return as octal string, with prefixed 0
- my $x = shift;
- $x = __PACKAGE__->new($x) if !ref($x);
+
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc
+ return $upgrade -> as_oct($x, @r)
+ if defined($upgrade) && !$x -> isa($class);
+
my $oct = $LIB->_as_oct($x->{value});
return $x->{sign} eq '-' ? "-$oct" : $oct;
}
sub as_bin {
# return as binary string, with prefixed 0b
- my $x = shift;
- $x = __PACKAGE__->new($x) if !ref($x);
+
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc
+ return $upgrade -> as_bin($x, @r)
+ if defined($upgrade) && !$x -> isa($class);
+
my $bin = $LIB->_as_bin($x->{value});
return $x->{sign} eq '-' ? "-$bin" : $bin;
}
@@ -4109,8 +4654,9 @@ sub as_bin {
sub numify {
# Make a Perl scalar number from a Math::BigInt object.
- my $x = shift;
- $x = __PACKAGE__->new($x) unless ref $x;
+ my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_);
+
+ carp "Rounding is not supported for ", (caller(0))[3], "()" if @r;
if ($x -> is_nan()) {
require Math::Complex;
@@ -4124,6 +4670,9 @@ sub numify {
return $x -> is_negative() ? -$inf : $inf;
}
+ return $upgrade -> numify($x, @r)
+ if defined($upgrade) && !$x -> isa($class);
+
my $num = 0 + $LIB->_num($x->{value});
return $x->{sign} eq '-' ? -$num : $num;
}
@@ -4481,116 +5030,6 @@ sub import {
# import done
}
-sub _split {
- # input: num_str; output: undef for invalid or
- # (\$mantissa_sign, \$mantissa_value, \$mantissa_fraction,
- # \$exp_sign, \$exp_value)
- # Internal, take apart a string and return the pieces.
- # Strip leading/trailing whitespace, leading zeros, underscore and reject
- # invalid input.
- my $x = shift;
-
- # strip white space at front, also extraneous leading zeros
- $x =~ s/^\s*([-]?)0*([0-9])/$1$2/g; # will not strip ' .2'
- $x =~ s/^\s+//; # but this will
- $x =~ s/\s+$//g; # strip white space at end
-
- # shortcut, if nothing to split, return early
- if ($x =~ /^[+-]?[0-9]+\z/) {
- $x =~ s/^([+-])0*([0-9])/$2/;
- my $sign = $1 || '+';
- return (\$sign, \$x, \'', \'', \0);
- }
-
- # invalid starting char?
- return if $x !~ /^[+-]?(\.?[0-9]|0b[0-1]|0x[0-9a-fA-F])/;
-
- return Math::BigInt->from_hex($x) if $x =~ /^[+-]?0x/; # hex string
- return Math::BigInt->from_bin($x) if $x =~ /^[+-]?0b/; # binary string
-
- # strip underscores between digits
- $x =~ s/([0-9])_([0-9])/$1$2/g;
- $x =~ s/([0-9])_([0-9])/$1$2/g; # do twice for 1_2_3
-
- # some possible inputs:
- # 2.1234 # 0.12 # 1 # 1E1 # 2.134E1 # 434E-10 # 1.02009E-2
- # .2 # 1_2_3.4_5_6 # 1.4E1_2_3 # 1e3 # +.2 # 0e999
-
- my ($m, $e, $last) = split /[Ee]/, $x;
- return if defined $last; # last defined => 1e2E3 or others
- $e = '0' if !defined $e || $e eq "";
-
- # sign, value for exponent, mantint, mantfrac
- my ($es, $ev, $mis, $miv, $mfv);
- # valid exponent?
- if ($e =~ /^([+-]?)0*([0-9]+)$/) # strip leading zeros
- {
- $es = $1;
- $ev = $2;
- # valid mantissa?
- return if $m eq '.' || $m eq '';
- my ($mi, $mf, $lastf) = split /\./, $m;
- return if defined $lastf; # lastf defined => 1.2.3 or others
- $mi = '0' if !defined $mi;
- $mi .= '0' if $mi =~ /^[\-\+]?$/;
- $mf = '0' if !defined $mf || $mf eq '';
- if ($mi =~ /^([+-]?)0*([0-9]+)$/) # strip leading zeros
- {
- $mis = $1 || '+';
- $miv = $2;
- return unless ($mf =~ /^([0-9]*?)0*$/); # strip trailing zeros
- $mfv = $1;
- # handle the 0e999 case here
- $ev = 0 if $miv eq '0' && $mfv eq '';
- return (\$mis, \$miv, \$mfv, \$es, \$ev);
- }
- }
- return; # NaN, not a number
-}
-
-sub _e_add {
- # Internal helper sub to take two positive integers and their signs and
- # then add them. Input ($LIB, $LIB, ('+'|'-'), ('+'|'-')), output
- # ($LIB, ('+'|'-')).
-
- my ($x, $y, $xs, $ys) = @_;
-
- # if the signs are equal we can add them (-5 + -3 => -(5 + 3) => -8)
- if ($xs eq $ys) {
- $x = $LIB->_add($x, $y); # +a + +b or -a + -b
- } else {
- my $a = $LIB->_acmp($x, $y);
- if ($a == 0) {
- # This does NOT modify $x in-place. TODO: Fix this?
- $x = $LIB->_zero(); # result is 0
- $xs = '+';
- return ($x, $xs);
- }
- if ($a > 0) {
- $x = $LIB->_sub($x, $y); # abs sub
- } else { # a < 0
- $x = $LIB->_sub ($y, $x, 1); # abs sub
- $xs = $ys;
- }
- }
-
- $xs = '+' if $xs eq '-' && $LIB->_is_zero($x); # no "-0"
-
- return ($x, $xs);
-}
-
-sub _e_sub {
- # Internal helper sub to take two positive integers and their signs and
- # then subtract them. Input ($LIB, $LIB, ('+'|'-'), ('+'|'-')),
- # output ($LIB, ('+'|'-'))
- my ($x, $y, $xs, $ys) = @_;
-
- # flip sign
- $ys = $ys eq '+' ? '-' : '+'; # swap sign of second operand ...
- _e_add($x, $y, $xs, $ys); # ... and let _e_add() do the job
- #$LIB -> _sadd($x, $xs, $y, $ys); # ... and let $LIB -> _sadd() do the job
-}
-
sub _trailing_zeros {
# return the amount of trailing zeros in $x (as scalar)
my $x = shift;
@@ -4643,7 +5082,8 @@ sub _find_round_parameters {
if (!defined $a) {
foreach ($self, @args) {
# take the defined one, or if both defined, the one that is smaller
- $a = $_->{_a} if (defined $_->{_a}) && (!defined $a || $_->{_a} < $a);
+ $a = $_->{_a}
+ if (defined $_->{_a}) && (!defined $a || $_->{_a} < $a);
}
}
if (!defined $p) {
@@ -4651,7 +5091,8 @@ sub _find_round_parameters {
foreach ($self, @args) {
# take the defined one, or if both defined, the one that is bigger
# -2 > -3, and 3 > 2
- $p = $_->{_p} if (defined $_->{_p}) && (!defined $p || $_->{_p} > $p);
+ $p = $_->{_p}
+ if (defined $_->{_p}) && (!defined $p || $_->{_p} > $p);
}
}
@@ -4679,13 +5120,29 @@ sub _find_round_parameters {
($self, $a, $p, $r);
}
+# Return true if the input is numeric and false if it is a string.
+
+sub _is_numeric {
+ shift; # class name
+ my $value = shift;
+ no warnings 'numeric';
+ # detect numbers
+ # string & "" -> ""
+ # number & "" -> 0 (with warning)
+ # nan and inf can detect as numbers, so check with * 0
+ return unless CORE::length((my $dummy = "") & $value);
+ return unless 0 + $value eq $value;
+ return 1 if $value * 0 == 0;
+ return -1; # Inf/NaN
+}
+
# Trims the sign of the significand, the (absolute value of the) significand,
# the sign of the exponent, and the (absolute value of the) exponent. The
# returned values have no underscores ("_") or unnecessary leading or trailing
# zeros.
sub _trim_split_parts {
- shift;
+ shift; # class name
my $sig_sgn = shift() || '+';
my $sig_str = shift() || '0';
@@ -4703,6 +5160,7 @@ sub _trim_split_parts {
$exp_str =~ tr/_//d; # "01_234" -> "01234"
$exp_str =~ s/^0+//; # "01234" -> "1234"
$exp_str = '0' unless CORE::length($exp_str);
+ $exp_sgn = '+' if $exp_str eq '0'; # "+3e-0" -> "+3e+0"
return $sig_sgn, $sig_str, $exp_sgn, $exp_str;
}
@@ -4722,7 +5180,7 @@ sub _trim_split_parts {
#
# "10.01e+01"
-sub _dec_str_to_str_parts {
+sub _dec_str_to_dec_str_parts {
my $class = shift;
my $str = shift;
@@ -4785,7 +5243,7 @@ sub _dec_str_to_str_parts {
# "x_1_0"
# "_1_0"
-sub _hex_str_to_str_parts {
+sub _hex_str_to_hex_str_parts {
my $class = shift;
my $str = shift;
@@ -4839,7 +5297,7 @@ sub _hex_str_to_str_parts {
# the sign of the exponent, and the absolute value of the exponent. The
# significand is in base 8, and the exponent is in base 2.
-sub _oct_str_to_str_parts {
+sub _oct_str_to_oct_str_parts {
my $class = shift;
my $str = shift;
@@ -4893,7 +5351,7 @@ sub _oct_str_to_str_parts {
# the sign of the exponent, and the absolute value of the exponent. The
# significand is in base 2, and the exponent is in base 2.
-sub _bin_str_to_str_parts {
+sub _bin_str_to_bin_str_parts {
my $class = shift;
my $str = shift;
@@ -4947,8 +5405,8 @@ sub _bin_str_to_str_parts {
# libray thingy, the sign of the exponent, and the absolute value of the
# exponent as a library thingy.
-sub _dec_parts_to_lib_parts {
- shift;
+sub _dec_str_parts_to_flt_lib_parts {
+ shift; # class name
my ($sig_sgn, $sig_str, $exp_sgn, $exp_str) = @_;
@@ -4979,8 +5437,7 @@ sub _dec_parts_to_lib_parts {
$delta = $LIB -> _sub($delta, $LIB -> _new($idx));
# exponent - delta
- ($exp_lib, $exp_sgn) = _e_sub($exp_lib, $delta, $exp_sgn, '+');
- #($exp_lib, $exp_sgn) = $LIB -> _ssub($exp_lib, $exp_sgn, $delta, '+');
+ ($exp_lib, $exp_sgn) = $LIB -> _ssub($exp_lib, $exp_sgn, $delta, '+');
$sig_str =~ s/^0+//;
}
@@ -5017,8 +5474,8 @@ sub _dec_parts_to_lib_parts {
# libray thingy, the sign of the exponent, and the absolute value of the
# exponent as a library thingy.
-sub _bin_parts_to_lib_parts {
- shift;
+sub _bin_str_parts_to_flt_lib_parts {
+ shift; # class name
my ($sig_sgn, $sig_str, $exp_sgn, $exp_str, $bpc) = @_;
my $bpc_lib = $LIB -> _new($bpc);
@@ -5052,8 +5509,7 @@ sub _bin_parts_to_lib_parts {
$delta = $LIB -> _mul($delta, $bpc_lib) if $bpc != 1;
# exponent - delta
- ($exp_lib, $exp_sgn) = _e_sub($exp_lib, $delta, $exp_sgn, '+');
- #($exp_lib, $exp_sgn) = $LIB -> _ssub($exp_lib, $exp_sgn, $delta, '+');
+ ($exp_lib, $exp_sgn) = $LIB -> _ssub($exp_lib, $exp_sgn, $delta, '+');
$sig_str =~ s/^0+//;
}
@@ -5135,11 +5591,11 @@ sub _bin_parts_to_lib_parts {
# as a libray thingy, the sign of the exponent, and the absolute value of the
# exponent as a library thingy.
-sub _hex_str_to_lib_parts {
+sub _hex_str_to_flt_lib_parts {
my $class = shift;
my $str = shift;
- if (my @parts = $class -> _hex_str_to_str_parts($str)) {
- return $class -> _bin_parts_to_lib_parts(@parts, 4); # 4 bits pr. chr
+ if (my @parts = $class -> _hex_str_to_hex_str_parts($str)) {
+ return $class -> _bin_str_parts_to_flt_lib_parts(@parts, 4); # 4 bits pr. chr
}
return;
}
@@ -5149,11 +5605,11 @@ sub _hex_str_to_lib_parts {
# libray thingy, the sign of the exponent, and the absolute value of the
# exponent as a library thingy.
-sub _oct_str_to_lib_parts {
+sub _oct_str_to_flt_lib_parts {
my $class = shift;
my $str = shift;
- if (my @parts = $class -> _oct_str_to_str_parts($str)) {
- return $class -> _bin_parts_to_lib_parts(@parts, 3); # 3 bits pr. chr
+ if (my @parts = $class -> _oct_str_to_oct_str_parts($str)) {
+ return $class -> _bin_str_parts_to_flt_lib_parts(@parts, 3); # 3 bits pr. chr
}
return;
}
@@ -5163,11 +5619,11 @@ sub _oct_str_to_lib_parts {
# libray thingy, the sign of the exponent, and the absolute value of the
# exponent as a library thingy.
-sub _bin_str_to_lib_parts {
+sub _bin_str_to_flt_lib_parts {
my $class = shift;
my $str = shift;
- if (my @parts = $class -> _bin_str_to_str_parts($str)) {
- return $class -> _bin_parts_to_lib_parts(@parts, 1); # 1 bit pr. chr
+ if (my @parts = $class -> _bin_str_to_bin_str_parts($str)) {
+ return $class -> _bin_str_parts_to_flt_lib_parts(@parts, 1); # 1 bit pr. chr
}
return;
}
@@ -5176,11 +5632,11 @@ sub _bin_str_to_lib_parts {
# the significand as library thingy, the sign of the exponent, and the absolute
# value of the exponent as a a library thingy.
-sub _dec_str_to_lib_parts {
+sub _dec_str_to_flt_lib_parts {
my $class = shift;
my $str = shift;
- if (my @parts = $class -> _dec_str_to_str_parts($str)) {
- return $class -> _dec_parts_to_lib_parts(@parts);
+ if (my @parts = $class -> _dec_str_to_dec_str_parts($str)) {
+ return $class -> _dec_str_parts_to_flt_lib_parts(@parts);
}
return;
}
@@ -5190,8 +5646,8 @@ sub _dec_str_to_lib_parts {
sub hex_str_to_dec_flt_str {
my $class = shift;
my $str = shift;
- if (my @parts = $class -> _hex_str_to_lib_parts($str)) {
- return $class -> _lib_parts_to_flt_str(@parts);
+ if (my @parts = $class -> _hex_str_to_flt_lib_parts($str)) {
+ return $class -> _flt_lib_parts_to_flt_str(@parts);
}
return;
}
@@ -5201,8 +5657,8 @@ sub hex_str_to_dec_flt_str {
sub oct_str_to_dec_flt_str {
my $class = shift;
my $str = shift;
- if (my @parts = $class -> _oct_str_to_lib_parts($str)) {
- return $class -> _lib_parts_to_flt_str(@parts);
+ if (my @parts = $class -> _oct_str_to_flt_lib_parts($str)) {
+ return $class -> _flt_lib_parts_to_flt_str(@parts);
}
return;
}
@@ -5212,8 +5668,8 @@ sub oct_str_to_dec_flt_str {
sub bin_str_to_dec_flt_str {
my $class = shift;
my $str = shift;
- if (my @parts = $class -> _bin_str_to_lib_parts($str)) {
- return $class -> _lib_parts_to_flt_str(@parts);
+ if (my @parts = $class -> _bin_str_to_flt_lib_parts($str)) {
+ return $class -> _flt_lib_parts_to_flt_str(@parts);
}
return;
}
@@ -5223,8 +5679,8 @@ sub bin_str_to_dec_flt_str {
sub dec_str_to_dec_flt_str {
my $class = shift;
my $str = shift;
- if (my @parts = $class -> _dec_str_to_lib_parts($str)) {
- return $class -> _lib_parts_to_flt_str(@parts);
+ if (my @parts = $class -> _dec_str_to_flt_lib_parts($str)) {
+ return $class -> _flt_lib_parts_to_flt_str(@parts);
}
return;
}
@@ -5234,8 +5690,8 @@ sub dec_str_to_dec_flt_str {
sub hex_str_to_dec_str {
my $class = shift;
my $str = shift;
- if (my @parts = $class -> _dec_str_to_lib_parts($str)) {
- return $class -> _lib_parts_to_dec_str(@parts);
+ if (my @parts = $class -> _dec_str_to_flt_lib_parts($str)) {
+ return $class -> _flt_lib_parts_to_dec_str(@parts);
}
return;
}
@@ -5245,8 +5701,8 @@ sub hex_str_to_dec_str {
sub oct_str_to_dec_str {
my $class = shift;
my $str = shift;
- if (my @parts = $class -> _oct_str_to_lib_parts($str)) {
- return $class -> _lib_parts_to_dec_str(@parts);
+ if (my @parts = $class -> _oct_str_to_flt_lib_parts($str)) {
+ return $class -> _flt_lib_parts_to_dec_str(@parts);
}
return;
}
@@ -5256,8 +5712,8 @@ sub oct_str_to_dec_str {
sub bin_str_to_dec_str {
my $class = shift;
my $str = shift;
- if (my @parts = $class -> _bin_str_to_lib_parts($str)) {
- return $class -> _lib_parts_to_dec_str(@parts);
+ if (my @parts = $class -> _bin_str_to_flt_lib_parts($str)) {
+ return $class -> _flt_lib_parts_to_dec_str(@parts);
}
return;
}
@@ -5267,20 +5723,20 @@ sub bin_str_to_dec_str {
sub dec_str_to_dec_str {
my $class = shift;
my $str = shift;
- if (my @parts = $class -> _dec_str_to_lib_parts($str)) {
- return $class -> _lib_parts_to_dec_str(@parts);
+ if (my @parts = $class -> _dec_str_to_flt_lib_parts($str)) {
+ return $class -> _flt_lib_parts_to_dec_str(@parts);
}
return;
}
-sub _lib_parts_to_flt_str {
+sub _flt_lib_parts_to_flt_str {
my $class = shift;
my @parts = @_;
return $parts[0] . $LIB -> _str($parts[1])
. 'e' . $parts[2] . $LIB -> _str($parts[3]);
}
-sub _lib_parts_to_dec_str {
+sub _flt_lib_parts_to_dec_str {
my $class = shift;
my @parts = @_;
@@ -5308,6 +5764,55 @@ sub _lib_parts_to_dec_str {
}
}
+# Takes four arguments, the sign of the significand, the absolute value of the
+# significand as a libray thingy, the sign of the exponent, and the absolute
+# value of the exponent as a library thingy, and returns three parts: the sign
+# of the rational number, the absolute value of the numerator as a libray
+# thingy, and the absolute value of the denominator as a library thingy.
+#
+# For example, to convert data representing the value "+12e-2", then
+#
+# $sm = "+";
+# $m = $LIB -> _new("12");
+# $se = "-";
+# $e = $LIB -> _new("2");
+# ($sr, $n, $d) = $class -> _flt_lib_parts_to_rat_lib_parts($sm, $m, $se, $e);
+#
+# returns data representing the same value written as the fraction "+3/25"
+#
+# $sr = "+"
+# $n = $LIB -> _new("3");
+# $d = $LIB -> _new("12");
+
+sub _flt_lib_parts_to_rat_lib_parts {
+ my $self = shift;
+ my ($msgn, $mabs, $esgn, $eabs) = @_;
+
+ if ($esgn eq '-') { # "12e-2" -> "12/100" -> "3/25"
+ my $num_lib = $LIB -> _copy($mabs);
+ my $den_lib = $LIB -> _1ex($LIB -> _num($eabs));
+ my $gcd_lib = $LIB -> _gcd($LIB -> _copy($num_lib), $den_lib);
+ $num_lib = $LIB -> _div($LIB -> _copy($num_lib), $gcd_lib);
+ $den_lib = $LIB -> _div($den_lib, $gcd_lib);
+ return $msgn, $num_lib, $den_lib;
+ }
+
+ elsif (!$LIB -> _is_zero($eabs)) { # "12e+2" -> "1200" -> "1200/1"
+ return $msgn, $LIB -> _lsft($LIB -> _copy($mabs), $eabs, 10),
+ $LIB -> _one();
+ }
+
+ else { # "12e+0" -> "12" -> "12/1"
+ return $msgn, $mabs, $LIB -> _one();
+ }
+}
+
+# Add the function _register_callback() to Math::BigInt. It is provided for
+# backwards compabibility so that old version of Math::BigRat etc. don't
+# complain about missing it.
+
+sub _register_callback { }
+
###############################################################################
# this method returns 0 if the object can be modified, or 1 if not.
# We use a fast constant sub() here, to avoid costly calls. Subclasses
@@ -5343,10 +5848,6 @@ Math::BigInt - arbitrary size integer ma
# to die if Math::BigInt::GMP cannot be found, use
# use Math::BigInt only => 'GMP';
- my $str = '1234567890';
- my @values = (64, 74, 18);
- my $n = 1; my $sign = '-';
-
# Configuration methods (may be used as class methods and instance methods)
Math::BigInt->accuracy(); # get class accuracy
@@ -5378,8 +5879,10 @@ Math::BigInt - arbitrary size integer ma
$x = Math::BigInt->bnan(); # create a Not-A-Number
$x = Math::BigInt->bpi(); # returns pi
- $y = $x->copy(); # make a copy (unlike $y = $x)
- $y = $x->as_int(); # return as a Math::BigInt
+ $y = $x->copy(); # make a copy (unlike $y = $x)
+ $y = $x->as_int(); # return as a Math::BigInt
+ $y = $x->as_float(); # return as a Math::BigFloat
+ $y = $x->as_rat(); # return as a Math::BigRat
# Boolean methods (these don't modify the invocand)
@@ -5505,7 +6008,7 @@ Math::BigInt - arbitrary size integer ma
$x->bsstr(); # string in scientific notation with integers
$x->bnstr(); # string in normalized notation
$x->bestr(); # string in engineering notation
- $x->bdstr(); # string in decimal notation
+ $x->bfstr(); # string in fractional notation
$x->to_hex(); # as signed hexadecimal string
$x->to_bin(); # as signed binary string
@@ -6008,6 +6511,14 @@ v1.22, while C<as_int()> was introduced
In Math::BigInt, C<as_int()> has the same effect as C<copy()>.
+=item as_float()
+
+Return the argument as a Math::BigFloat object.
+
+=item as_rat()
+
+Return the argument as a Math::BigRat object.
+
=back
=head2 Boolean methods
@@ -6895,6 +7406,17 @@ corresponds to the output from C<dparts(
12000 is returned as "12000"
10000 is returned as "10000"
+=item bfstr()
+
+Returns a string representing the number using fractional notation. The output
+corresponds to the output from C<fparts()>.
+
+ 12.345 is returned as "2469/200"
+ 123.45 is returned as "2469/20"
+ 1234.5 is returned as "2469/2"
+ 12345 is returned as "12345"
+ 123450 is returned as "123450"
+
=item to_hex()
$x->to_hex();
@@ -6918,8 +7440,8 @@ Returns an octal string representation o
$x = Math::BigInt->new("1667327589");
$s = $x->to_bytes(); # $s = "cafe"
-Returns a byte string representation of the number using big endian byte
-order. The invocand must be a non-negative, finite integer. See also from_bytes().
+Returns a byte string representation of the number using big endian byte order.
+The invocand must be a non-negative, finite integer. See also from_bytes().
=item to_base()
@@ -7863,11 +8385,12 @@ strings:
use Test::More tests => 3;
use Math::BigInt;
- $x = Math::BigInt->new('1e56'); $y = 1e56;
+ $x = Math::BigInt->new('1e56');
+ $y = 1e56;
is($x,$y); # fails
- is($x->bsstr(),$y); # okay
+ is($x->bsstr(), $y); # okay
$y = Math::BigInt->new($y);
- is($x,$y); # okay
+ is($x, $y); # okay
Alternatively, simply use C<< <=> >> for comparisons, this always gets it
right. There is not yet a way to get a number automatically represented as a
Index: gnu/usr.bin/perl/cpan/Math-BigInt/lib/Math/BigInt/Calc.pm
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Math-BigInt/lib/Math/BigInt/Calc.pm,v
diff -u -p -a -u -p -r1.7 Calc.pm
--- gnu/usr.bin/perl/cpan/Math-BigInt/lib/Math/BigInt/Calc.pm 15 Feb 2023 01:36:19 -0000 1.7
+++ gnu/usr.bin/perl/cpan/Math-BigInt/lib/Math/BigInt/Calc.pm 21 Feb 2024 15:47:01 -0000
@@ -7,7 +7,7 @@ use warnings;
use Carp qw< carp croak >;
use Math::BigInt::Lib;
-our $VERSION = '1.999830';
+our $VERSION = '1.999837';
$VERSION =~ tr/_//d;
our @ISA = ('Math::BigInt::Lib');
@@ -2248,6 +2248,7 @@ sub _from_bin {
# special modulus functions
sub _modinv {
+
# modular multiplicative inverse
my ($c, $x, $y) = @_;
Index: gnu/usr.bin/perl/cpan/Math-BigInt/lib/Math/BigInt/Lib.pm
===================================================================
RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Math-BigInt/lib/Math/BigInt/Lib.pm,v
diff -u -p -a -u -p -r1.1.1.4 Lib.pm
--- gnu/usr.bin/perl/cpan/Math-BigInt/lib/Math/BigInt/Lib.pm 15 Feb 2023 01:32:41 -0000 1.1.1.4
+++ gnu/usr.bin/perl/cpan/Math-BigInt/lib/Math/BigInt/Lib.pm 21 Feb 2024 15:47:01 -0000
@@ -4,7 +4,7 @@ use 5.006001;
use strict;
use warnings;
-our $VERSION = '1.999830';
+our $VERSION = '1.999837';
$VERSION =~ tr/_//d;
use Carp;
@@ -1771,7 +1771,7 @@ sub _modinv {
# modulo zero
if ($class -> _is_zero($y)) {
- return (undef, undef);
+ return;
}
# modulo one
@@ -1801,7 +1801,7 @@ sub _modinv {
}
# if the gcd is not 1, there exists no modular multiplicative inverse
- return (undef, undef) unless $class -> _is_one($a);
+ return unless $class -> _is_one($a);
($v, $sign == 1 ? '+' : '-');
}
Index: gnu/usr.bin/perl/cpan/Math-BigInt/t/_bin_parts_to_lib_parts.t
===================================================================
RCS file: gnu/usr.bin/perl/cpan/Math-BigInt/t/_bin_parts_to_lib_parts.t
diff -N gnu/usr.bin/perl/cpan/Math-BigInt/t/_bin_parts_to_lib_parts.t
--- gnu/usr.bin/perl/cpan/Math-BigInt/t/_bin_parts_to_lib_parts.t 15 Feb 2023 01:32:40 -0000 1.1.1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,88 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 36;
-
-use Math::BigInt;
-
-my $LIB = Math::BigInt -> config('lib');
-
-sub try {
- my ($in0, $in1, $in2, $in3, $in4, $out0, $out1, $out2, $out3) = @_;
-
- my @out;
- my $test = q|@out = Math::BigInt -> _bin_parts_to_lib_parts|
- . qq|("$in0", "$in1", "$in2", "$in3", $in4)|;
-
- eval $test;
- die $@ if $@; # this should never happen
-
- subtest $test => sub {
- plan tests => 5;
-
- is(scalar(@out), 4, 'number of output arguments');
- is($out[0], $out0, 'sign of the significand');
- is($LIB -> _str($out[1]), $out1, 'absolute value of the significand');
- is($out[2], $out2, 'sign of the exponent');
- is($LIB -> _str($out[3]), $out3, 'absolute value of the exponent');
- };
-}
-
-note("binary");
-
-try qw< + 0 + 0 >, 1, qw< + 0 + 0 >;
-try qw< + 00.000 - 0000 >, 1, qw< + 0 + 0 >;
-
-try qw< + 1010 + 0 >, 1, qw< + 1 + 1 >;
-try qw< + 1111 + 0 >, 1, qw< + 15 + 0 >;
-try qw< + 0.1 + 0 >, 1, qw< + 5 - 1 >;
-
-try qw< + 10 - 8 >, 1, qw< + 78125 - 7 >;
-try qw< + 10 + 8 >, 1, qw< + 512 + 0 >;
-
-try qw< + 11000000001100 - 0 >, 1, qw< + 123 + 2 >;
-try qw< + 1100000000110000 - 2 >, 1, qw< + 123 + 2 >;
-
-try qw< + .00110011 + 5 >, 1, qw< + 6375 - 3 >;
-
-try qw< - 1100.0011 + 2 >, 1, qw< - 4875 - 2 >;
-
-note("octal");
-
-try qw< + 0 + 0 >, 3, qw< + 0 + 0 >;
-try qw< + 00.000 - 0000 >, 3, qw< + 0 + 0 >;
-try qw< + 12 + 0 >, 3, qw< + 1 + 1 >;
-try qw< + 17 + 0 >, 3, qw< + 15 + 0 >;
-try qw< + 0.4 + 0 >, 3, qw< + 5 - 1 >;
-try qw< + 2 - 8 >, 3, qw< + 78125 - 7 >;
-try qw< + 2 + 8 >, 3, qw< + 512 + 0 >;
-try qw< + 30014 - 0 >, 3, qw< + 123 + 2 >;
-try qw< + 14006 + 1 >, 3, qw< + 123 + 2 >;
-try qw< + 12300 + 0 >, 3, qw< + 5312 + 0 >;
-
-note("hexadecimal");
-
-try qw< + 0 + 0 >, 4, qw< + 0 + 0 >;
-try qw< + 00.000 - 0000 >, 4, qw< + 0 + 0 >;
-
-try qw< + a + 0 >, 4, qw< + 1 + 1 >;
-try qw< + f + 0 >, 4, qw< + 15 + 0 >;
-try qw< + 0.8 + 0 >, 4, qw< + 5 - 1 >;
-
-try qw< + 2 - 8 >, 4, qw< + 78125 - 7 >;
-try qw< + 2 + 8 >, 4, qw< + 512 + 0 >;
-
-try qw< + 300c - 0 >, 4, qw< + 123 + 2 >;
-try qw< + 1.806 + 13 >, 4, qw< + 123 + 2 >;
-try qw< + c030 - 2 >, 4, qw< + 123 + 2 >;
-
-try qw< + 0.0625 + 16 >, 4, qw< + 1573 + 0 >;
-
-try qw< + .0123 + 0 >, 4, qw< + 44403076171875 - 16 >;
-try qw< + 12300 + 0 >, 4, qw< + 74496 + 0 >;
-
-try qw< + .00120034 + 5 >, 4, qw< + 87894499301910400390625 - 25 >;
-
-try qw< - 1200.0034 + 2 >, 4, qw< - 18432003173828125 - 12 >;
Index: gnu/usr.bin/perl/cpan/Math-BigInt/t/_bin_str_to_str_parts.t
===================================================================
RCS file: gnu/usr.bin/perl/cpan/Math-BigInt/t/_bin_str_to_str_parts.t
diff -N gnu/usr.bin/perl/cpan/Math-BigInt/t/_bin_str_to_str_parts.t
--- gnu/usr.bin/perl/cpan/Math-BigInt/t/_bin_str_to_str_parts.t 15 Feb 2023 01:32:40 -0000 1.1.1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,58 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 18;
-
-use Math::BigInt;
-
-while (<DATA>) {
- s/#.*$//; # remove comments
- s/\s+$//; # remove trailing whitespace
- next unless length; # skip empty lines
-
- my ($in0, $out0, $out1, $out2, $out3) = split /:/;
- my ($ss, $sa, $es, $ea);
-
- my $test = q|($ss, $sa, $es, $ea) = |
- . qq|Math::BigInt -> _bin_str_to_str_parts("$in0")|;
-
- eval $test;
- die $@ if $@; # this should never happen
-
- subtest $test => sub {
- plan tests => 4;
- is($ss, $out0, 'sign of the significand');
- is($sa, $out1, 'absolute value of the significand');
- is($es, $out2, 'sign of the exponent');
- is($ea, $out3, 'absolute value of the exponent');
- };
-}
-
-__DATA__
-
-0:+:0:+:0
-0p-0:+:0:+:0
-0p-7:+:0:+:0
-0p+7:+:0:+:0
-
-0.0110:+:.011:+:0
-0110.0:+:110:+:0
-0110.0110:+:110.011:+:0
-
-0b1.p0:+:1:+:0
-
-00.0011001100P0056007800:+:.00110011:+:56007800
-
-+1__1__.__1__1__p+5__6__:+:11.11:+:56
-+1__1__.__1__1__p-5__6__:+:11.11:-:56
--1__1__.__1__1__p+5__6__:-:11.11:+:56
--1__1__.__1__1__p-5__6__:-:11.11:-:56
-
-1__1__.__1__1__p5__6__:+:11.11:+:56
-1__1__.__1__1__p-5__6__:+:11.11:-:56
--1__1__.__1__1__p5__6__:-:11.11:+:56
-
--0b__1__1__.__1__1__p-1__1__:-:11.11:-:11
--0B__1__1__.__1__1__P-1__1__:-:11.11:-:11
Index: gnu/usr.bin/perl/cpan/Math-BigInt/t/_dec_parts_to_lib_parts.t
===================================================================
RCS file: gnu/usr.bin/perl/cpan/Math-BigInt/t/_dec_parts_to_lib_parts.t
diff -N gnu/usr.bin/perl/cpan/Math-BigInt/t/_dec_parts_to_lib_parts.t
--- gnu/usr.bin/perl/cpan/Math-BigInt/t/_dec_parts_to_lib_parts.t 15 Feb 2023 01:32:40 -0000 1.1.1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,69 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 30;
-
-use Math::BigInt;
-
-my $LIB = Math::BigInt -> config('lib');
-
-sub try {
- my ($in0, $in1, $in2, $in3, $out0, $out1, $out2, $out3) = @_;
-
- my @out;
- my $test = q|@out = Math::BigInt -> _dec_parts_to_lib_parts|
- . qq|("$in0", "$in1", "$in2", "$in3")|;
-
- eval $test;
- die $@ if $@; # this should never happen
-
- subtest $test => sub {
- plan tests => 5;
-
- is(scalar(@out), 4, 'number of output arguments');
- is($out[0], $out0, 'sign of the significand');
- is($LIB -> _str($out[1]), $out1, 'absolute value of the significand');
- is($out[2], $out2, 'sign of the exponent');
- is($LIB -> _str($out[3]), $out3, 'absolute value of the exponent');
- };
-}
-
-try qw< + 0 + 0 >, qw< + 0 + 0 >;
-try qw< + 00.000 - 0000 >, qw< + 0 + 0 >;
-
-try qw< + 0.01230 + 5 >, qw< + 123 + 1 >;
-try qw< + 0.1230 + 5 >, qw< + 123 + 2 >;
-try qw< + 1.230 + 5 >, qw< + 123 + 3 >;
-try qw< + 12.30 + 5 >, qw< + 123 + 4 >;
-try qw< + 123.0 + 5 >, qw< + 123 + 5 >;
-try qw< + 1230.0 + 5 >, qw< + 123 + 6 >;
-
-try qw< + 0.01230 + 2 >, qw< + 123 - 2 >;
-try qw< + 0.1230 + 2 >, qw< + 123 - 1 >;
-try qw< + 1.230 + 2 >, qw< + 123 + 0 >;
-try qw< + 12.30 + 2 >, qw< + 123 + 1 >;
-try qw< + 123.0 + 2 >, qw< + 123 + 2 >;
-try qw< + 1230.0 + 2 >, qw< + 123 + 3 >;
-
-try qw< + 0.01230 - 2 >, qw< + 123 - 6 >;
-try qw< + 0.1230 - 2 >, qw< + 123 - 5 >;
-try qw< + 1.230 - 2 >, qw< + 123 - 4 >;
-try qw< + 12.30 - 2 >, qw< + 123 - 3 >;
-try qw< + 123.0 - 2 >, qw< + 123 - 2 >;
-try qw< + 1230.0 - 2 >, qw< + 123 - 1 >;
-
-try qw< + 0.01230 - 4 >, qw< + 123 - 8 >;
-try qw< + 0.1230 - 4 >, qw< + 123 - 7 >;
-try qw< + 1.230 - 4 >, qw< + 123 - 6 >;
-try qw< + 12.30 - 4 >, qw< + 123 - 5 >;
-try qw< + 123.0 - 4 >, qw< + 123 - 4 >;
-try qw< + 1230.0 - 4 >, qw< + 123 - 3 >;
-
-try qw< + .0123 + 0 >, qw< + 123 - 4 >;
-try qw< + 12300 + 0 >, qw< + 123 + 2 >;
-
-try qw< + .00120034 + 5 >, qw< + 120034 - 3 >;
-
-try qw< - 1200.0034 + 2 >, qw< - 12000034 - 2 >;
Index: gnu/usr.bin/perl/cpan/Math-BigInt/t/_dec_str_to_str_parts.t
===================================================================
RCS file: gnu/usr.bin/perl/cpan/Math-BigInt/t/_dec_str_to_str_parts.t
diff -N gnu/usr.bin/perl/cpan/Math-BigInt/t/_dec_str_to_str_parts.t
--- gnu/usr.bin/perl/cpan/Math-BigInt/t/_dec_str_to_str_parts.t 15 Feb 2023 01:32:40 -0000 1.1.1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,57 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 16;
-
-use Math::BigInt;
-
-while (<DATA>) {
- s/#.*$//; # remove comments
- s/\s+$//; # remove trailing whitespace
- next unless length; # skip empty lines
-
- my ($in0, $out0, $out1, $out2, $out3) = split /:/;
- my ($ss, $sa, $es, $ea);
-
- my $test = q|($ss, $sa, $es, $ea) = |
- . qq|Math::BigInt -> _dec_str_to_str_parts("$in0")|;
-
- eval $test;
- die $@ if $@; # this should never happen
-
-
-
- subtest $test => sub {
- plan tests => 4;
- is($ss, $out0, 'sign of the significand');
- is($sa, $out1, 'absolute value of the significand');
- is($es, $out2, 'sign of the exponent');
- is($ea, $out3, 'absolute value of the exponent');
- };
-}
-
-__DATA__
-
-0:+:0:+:0
-0e-0:+:0:+:0
-0e-7:+:0:+:0
-0e+7:+:0:+:0
-
-0.0120:+:.012:+:0
-0120.0:+:120:+:0
-0120.0340:+:120.034:+:0
-
-1.e0:+:1:+:0
-
-00.0012003400E0056007800:+:.00120034:+:56007800
-
-+1__2__.__3__4__e+5__6__:+:12.34:+:56
-+1__2__.__3__4__e-5__6__:+:12.34:-:56
--1__2__.__3__4__e+5__6__:-:12.34:+:56
--1__2__.__3__4__e-5__6__:-:12.34:-:56
-
-1__2__.__3__4__e5__6__:+:12.34:+:56
-1__2__.__3__4__e-5__6__:+:12.34:-:56
--1__2__.__3__4__e5__6__:-:12.34:+:56
Index: gnu/usr.bin/perl/cpan/Math-BigInt/t/_e_math.t
===================================================================
RCS file: gnu/usr.bin/perl/cpan/Math-BigInt/t/_e_math.t
diff -N gnu/usr.bin/perl/cpan/Math-BigInt/t/_e_math.t
--- gnu/usr.bin/perl/cpan/Math-BigInt/t/_e_math.t 15 Feb 2023 01:36:19 -0000 1.4
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,116 +0,0 @@
-# -*- mode: perl; -*-
-
-# test the helper math routines in Math::BigFloat
-
-use strict;
-use warnings;
-
-use Test::More tests => 26;
-
-use Math::BigFloat lib => 'Calc';
-
-#############################################################################
-# add
-
-{
- my $a = Math::BigInt::Calc->_new("123");
- my $b = Math::BigInt::Calc->_new("321");
-
- test_add(123, 321, '+', '+');
- test_add(123, 321, '+', '-');
- test_add(123, 321, '-', '+');
-
- test_add(321, 123, '-', '+');
- test_add(321, 123, '+', '-');
-
- test_add(10, 1, '+', '-');
- test_add(10, 1, '-', '+');
- test_add( 1, 10, '-', '+');
-
- SKIP: {
- skip q|$x -> _zero() does not (yet?) modify the first argument|, 2;
-
- test_add(123, 123, '-', '+');
- test_add(123, 123, '+', '-');
- }
-
- test_add(123, 123, '+', '+');
- test_add(123, 123, '-', '-');
-
- test_add(0, 0, '-', '+');
- test_add(0, 0, '+', '-');
- test_add(0, 0, '+', '+');
- test_add(0, 0, '-', '-'); # gives "-0"! TODO: fix this!
-}
-
-#############################################################################
-# sub
-
-{
- my $a = Math::BigInt::Calc->_new("123");
- my $b = Math::BigInt::Calc->_new("321");
-
- test_sub(123, 321, '+', '-');
- test_sub(123, 321, '-', '+');
-
- test_sub(123, 123, '-', '+');
- test_sub(123, 123, '+', '-');
-
- SKIP: {
- skip q|$x -> _zero() does not (yet?) modify the first argument|, 2;
-
- test_sub(123, 123, '+', '+');
- test_sub(123, 123, '-', '-');
- }
-
- test_sub(0, 0, '-', '+'); # gives "-0"! TODO: fix this!
- test_sub(0, 0, '+', '-');
- test_sub(0, 0, '+', '+');
- test_sub(0, 0, '-', '-');
-}
-
-###############################################################################
-
-sub test_add {
- my ($a, $b, $as, $bs) = @_;
-
- my $aa = Math::BigInt::Calc -> _new($a);
- my $bb = Math::BigInt::Calc -> _new($b);
- my ($x, $xs) = Math::BigFloat::_e_add($aa, $bb, "$as", "$bs");
- my $got = $xs . Math::BigInt::Calc->_str($x);
-
- my $expected = sprintf("%+d", "$as$a" + "$bs$b");
-
- subtest qq|Math::BigFloat::_e_add($a, $b, "$as", "$bs");|
- => sub {
- plan tests => 2;
-
- is($got, $expected, 'output has the correct value');
- is(Math::BigInt::Calc->_str($x),
- Math::BigInt::Calc->_str($aa),
- 'first operand to _e_add() is modified'
- );
- };
-}
-
-sub test_sub {
- my ($a, $b, $as, $bs) = @_;
-
- my $aa = Math::BigInt::Calc -> _new($a);
- my $bb = Math::BigInt::Calc -> _new($b);
- my ($x, $xs) = Math::BigFloat::_e_sub($aa, $bb, "$as", "$bs");
- my $got = $xs . Math::BigInt::Calc->_str($x);
-
- my $expected = sprintf("%+d", "$as$a" - "$bs$b");
-
- subtest qq|Math::BigFloat::_e_sub($a, $b, "$as", "$bs");|
- => sub {
- plan tests => 2;
-
- is($got, $expected, 'output has the correct value');
- is(Math::BigInt::Calc->_str($x),
- Math::BigInt::Calc->_str($aa),
- 'first operand to _e_sub() is modified'
- );
- };
-}
Index: gnu/usr.bin/perl/cpan/Math-BigInt/t/_hex_str_to_str_parts.t
===================================================================
RCS file: gnu/usr.bin/perl/cpan/Math-BigInt/t/_hex_str_to_str_parts.t
diff -N gnu/usr.bin/perl/cpan/Math-BigInt/t/_hex_str_to_str_parts.t
--- gnu/usr.bin/perl/cpan/Math-BigInt/t/_hex_str_to_str_parts.t 15 Feb 2023 01:32:40 -0000 1.1.1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,58 +0,0 @@
-# -*- mode: perl; -*-
-
-use strict;
-use warnings;
-
-use Test::More tests => 18;
-
-use Math::BigInt;
-
-while (<DATA>) {
- s/#.*$//; # remove comments
- s/\s+$//; # remove trailing whitespace
- next unless length; # skip empty lines
-
- my ($in0, $out0, $out1, $out2, $out3) = split /:/;
- my ($ss, $sa, $es, $ea);
-
- my $test = q|($ss, $sa, $es, $ea) = |
- . qq|Math::BigInt -> _hex_str_to_str_parts("$in0")|;
-
- eval $test;
- die $@ if $@; # this should never happen
-
- subtest $test => sub {
- plan tests =>