dwww Home | Manual pages | Find package

PERLAPI(1)              Perl Programmers Reference Guide             PERLAPI(1)

NAME
       perlapi - autogenerated documentation for the perl public API

DESCRIPTION
       This file contains most of the documentation of the perl public API, as
       generated by embed.pl.  Specifically, it is a listing of functions,
       macros, flags, and variables that may be used by extension writers.
       Besides perlintern and config.h, some items are listed here as being
       actually documented in another pod.

       At the end is a list of functions which have yet to be documented.
       Patches welcome!  The interfaces of these are subject to change without
       notice.

       Some of the functions documented here are consolidated so that a single
       entry serves for multiple functions which all do basically the same
       thing, but have some slight differences.  For example, one form might
       process magic, while another doesn't.  The name of each variation is
       listed at the top of the single entry.  But if all have the same
       signature (arguments and return type) except for their names, only the
       usage for the base form is shown.  If any one of the forms has a
       different signature (such as returning "const" or not) every function's
       signature is explicitly displayed.

       Anything not listed here or in the other mentioned pods is not part of
       the public API, and should not be used by extension writers at all.  For
       these reasons, blindly using functions listed in proto.h is to be
       avoided when writing extensions.

       In Perl, unlike C, a string of characters may generally contain embedded
       "NUL" characters.  Sometimes in the documentation a Perl string is
       referred to as a "buffer" to distinguish it from a C string, but
       sometimes they are both just referred to as strings.

       Note that all Perl API global variables must be referenced with the
       "PL_" prefix.  Again, those not listed here are not to be used by
       extension writers, 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.

       Perl was originally written to handle US-ASCII only (that is characters
       whose ordinal numbers are in the range 0 - 127).  And documentation and
       comments may still use the term ASCII, when sometimes in fact the entire
       range from 0 - 255 is meant.

       The non-ASCII characters below 256 can have various meanings, depending
       on various things.  (See, most notably, perllocale.)  But usually the
       whole range can be referred to as ISO-8859-1.  Often, the term "Latin-1"
       (or "Latin1") is used as an equivalent for ISO-8859-1.  But some people
       treat "Latin1" as referring just to the characters in the range 128
       through 255, or sometimes from 160 through 255.  This documentation uses
       "Latin1" and "Latin-1" to refer to all 256 characters.

       Note that Perl can be compiled and run under either ASCII or EBCDIC (See
       perlebcdic).  Most of the documentation (and even comments in the code)
       ignore the EBCDIC possibility.  For almost all purposes the differences
       are transparent.  As an example, under EBCDIC, instead of UTF-8, UTF-
       EBCDIC is used to encode Unicode strings, and so whenever this
       documentation refers to "utf8" (and variants of that name, including in
       function names), it also (essentially transparently) means "UTF-EBCDIC".
       But the ordinals of characters differ between ASCII, EBCDIC, and the
       UTF- encodings, and a string encoded in UTF-EBCDIC may occupy a
       different number of bytes than in UTF-8.

       The organization of this document is tentative and subject to change.
       Suggestions and patches welcome perl5-porters@perl.org
       <mailto:perl5-porters@perl.org>.

       The sections in this document currently are

       "AV Handling"
       "Callback Functions"
       "Casting"
       "Character case changing"
       "Character classification"
       "Compiler and Preprocessor information"
       "Compiler directives"
       "Compile-time scope hooks"
       "Concurrency"
       "COPs and Hint Hashes"
       "Custom Operators"
       "CV Handling"
       "Debugging"
       "Display functions"
       "Embedding, Threads, and Interpreter Cloning"
       "Errno"
       "Exception Handling (simple) Macros"
       "Filesystem configuration values"
       "Floating point"
       "General Configuration"
       "Global Variables"
       "GV Handling and Stashes"
       "Hook manipulation"
       "HV Handling"
       "Input/Output"
       "Integer"
       "I/O Formats"
       "Lexer interface"
       "Locales"
       "Magic"
       "Memory Management"
       "MRO"
       "Multicall Functions"
       "Numeric Functions"
       "Optrees"
       "Pack and Unpack"
       "Pad Data Structures"
       "Password and Group access"
       "Paths to system commands"
       "Prototype information"
       "Reference-counted stack manipulation"
       "REGEXP Functions"
       "Reports and Formats"
       "Signals"
       "Site configuration"
       "Sockets configuration values"
       "Source Filters"
       "Stack Manipulation Macros"
       "String Handling"
       "SV Flags"
       "SV Handling"
       "Tainting"
       "Time"
       "Typedef names"
       "Unicode Support"
       "Utility Functions"
       "Versioning"
       "Warning and Dieing"
       "XS"
       "Undocumented elements"

       The listing below is alphabetical, case insensitive.

AV Handling
       "AV"
           Described in perlguts.

       "AvALLOC"
           Described in perlguts.

              AvALLOC(AV* av)

       "AvARRAY"
           Returns a pointer to the AV's internal SV* array.

           This  is  useful  for doing pointer arithmetic on the array.  If all
           you need is to look up an array element, then prefer "av_fetch".

            SV**  AvARRAY(AV* av)

       "av_clear"
           Frees all the elements of  an  array,  leaving  it  empty.   The  XS
           equivalent of "@array = ()".  See also "av_undef".

           Note  that  it  is  possible that the actions of a destructor called
           directly or indirectly by freeing an  element  of  the  array  could
           cause the reference count of the array itself to be reduced (e.g. by
           deleting  an entry in the symbol table). So it is a possibility that
           the AV could have been freed (or even reallocated)  on  return  from
           the call unless you hold a reference to it.

            void  av_clear(AV *av)

       "av_count"
           Returns  the number of elements in the array "av".  This is the true
           length of the array, including any undefined elements.  It is always
           the same as "av_top_index(av) + 1".

            Size_t  av_count(AV *av)

       "av_create_and_push"
           Push an SV onto  the  end  of  the  array,  creating  the  array  if
           necessary.   A  small  internal helper function to remove a commonly
           duplicated idiom.

           NOTE:   "av_create_and_push"   must   be   explicitly   called    as
           "Perl_av_create_and_push" with an "aTHX_" parameter.

            void  Perl_av_create_and_push(pTHX_ AV ** const avp,
                                          SV * const val)

       "av_create_and_unshift_one"
           Unshifts  an  SV onto the beginning of the array, creating the array
           if necessary.  A small internal helper function to remove a commonly
           duplicated idiom.

           NOTE:  "av_create_and_unshift_one"  must  be  explicitly  called  as
           "Perl_av_create_and_unshift_one" with an "aTHX_" parameter.

            SV **  Perl_av_create_and_unshift_one(pTHX_ AV ** const avp,
                                                  SV * const val)

       "av_delete"
           Deletes  the  element  indexed  by  "key"  from the array, makes the
           element mortal, and returns it.  If "flags" equals "G_DISCARD",  the
           element  is  freed  and  NULL  is returned. NULL is also returned if
           "key" is out of range.

           Perl  equivalent:   "splice(@myarray, $key, 1, undef)"   (with   the
           "splice" in void context if "G_DISCARD" is present).

            SV *  av_delete(AV *av, SSize_t key, I32 flags)

       "av_exists"
           Returns true if the element indexed by "key" has been initialized.

           This relies on the fact that uninitialized array elements are set to
           "NULL".

           Perl equivalent: exists($myarray[$key]).

            bool  av_exists(AV *av, SSize_t key)

       "av_extend"
           Pre-extend  an  array  so  that  it  is capable of storing values at
           indexes "0..key". Thus "av_extend(av,99)" guarantees that the  array
           can  store  100  elements,  i.e.  that "av_store(av, 0, sv)" through
           "av_store(av, 99, sv)" on  a  plain  array  will  work  without  any
           further memory allocation.

           If  the av argument is a tied array then will call the "EXTEND" tied
           array method with an argument of "(key+1)".

            void  av_extend(AV *av, SSize_t key)

       "av_fetch"
           Returns the SV at the specified index in the array.   The  "key"  is
           the  index.   If "lval" is true, you are guaranteed to get a real SV
           back (in case it wasn't real before), which  you  can  then  modify.
           Check that the return value is non-NULL before dereferencing it to a
           "SV*".

           See  "Understanding the Magic of Tied Hashes and Arrays" in perlguts
           for more information on how to use this function on tied arrays.

           The rough perl equivalent is $myarray[$key].

            SV **  av_fetch(AV *av, SSize_t key, I32 lval)

       "AvFILL"
           Same as "av_top_index" or "av_tindex".

            SSize_t  AvFILL(AV* av)

       "av_fill"
           Set the highest index in the array to the given  number,  equivalent
           to Perl's "$#array = $fill;".

           The  number  of  elements  in  the  array  will  be "fill + 1" after
           av_fill() returns.  If the array was previously  shorter,  then  the
           additional  elements  appended  are  set  to NULL.  If the array was
           longer, then the excess elements are  freed.   "av_fill(av, -1)"  is
           the same as av_clear(av).

            void  av_fill(AV *av, SSize_t fill)

       "av_len"
           Same as "av_top_index".  Note that, unlike what the name implies, it
           returns  the  maximum  index in the array.  This is unlike "sv_len",
           which returns what you would expect.

           To get the true  number  of  elements  in  the  array,  instead  use
           "av_count".

            SSize_t  av_len(AV *av)

       "av_make"
           Creates  a  new  AV  and  populates  it  with a list (**strp, length
           "size") of SVs.  A copy is made of each SV, so their  refcounts  are
           not changed.  The new AV will have a reference count of 1.

           Perl    equivalent:    "my   @new_array   =   ($scalar1,   $scalar2,
           $scalar3...);"

            AV *  av_make(SSize_t size, SV **strp)

       "av_pop"
           Removes one SV from the end of the array, reducing its size  by  one
           and  returning  the SV (transferring control of one reference count)
           to the caller.  Returns &PL_sv_undef if the array is empty.

           Perl equivalent: "pop(@myarray);"

            SV *  av_pop(AV *av)

       "av_push"
           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: "push @myarray, $val;".

            void  av_push(AV *av, SV *val)

       "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
           "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: "push @myarray, $val;".

            void  av_push_simple(AV *av, SV *val)

       "av_shift"
           Removes one SV from the start of the array, reducing its size by one
           and  returning  the SV (transferring control of one reference count)
           to the caller.  Returns &PL_sv_undef if the array is empty.

           Perl equivalent: "shift(@myarray);"

            SV *  av_shift(AV *av)

       "av_store"
           Stores an SV in an array.  The array index is  specified  as  "key".
           The  return  value  will be "NULL" if the operation failed or if the
           value did not need to be actually stored within the array (as in the
           case of tied arrays).  Otherwise, it can be dereferenced to get  the
           "SV*" that was stored there (= "val")).

           Note  that  the  caller is responsible for suitably incrementing the
           reference count of "val" before the call, and decrementing it if the
           function returned "NULL".

           Approximate Perl equivalent: "splice(@myarray, $key, 1, $val)".

           See "Understanding the Magic of Tied Hashes and Arrays" in  perlguts
           for more information on how to use this function on tied arrays.

            SV **  av_store(AV *av, SSize_t key, SV *val)

       "av_tindex"
       "av_top_index"
           These  behave identically.  If the array "av" is empty, these return
           -1; otherwise they return the maximum value of the  indices  of  all
           the array elements which are currently defined in "av".

           They process 'get' magic.

           The Perl equivalent for these is $#av.

           Use "av_count" to get the number of elements in an array.

            SSize_t  av_tindex(AV *av)

       "av_undef"
           Undefines the array. The XS equivalent of undef(@array).

           As  well as freeing all the elements of the array (like av_clear()),
           this also frees the memory used by the  av  to  store  its  list  of
           scalars.

           See  "av_clear" for a note about the array possibly being invalid on
           return.

            void  av_undef(AV *av)

       "av_unshift"
           Unshift the given number of "undef" values onto the beginning of the
           array.   The  array  will  grow  automatically  to  accommodate  the
           addition.

           Perl equivalent: "unshift @myarray, ((undef) x $num);"

            void  av_unshift(AV *av, SSize_t num)

       "get_av"
           Returns  the  AV  of the specified Perl global or package array with
           the given name (so it won't work on lexical variables).  "flags" are
           passed to "gv_fetchpv".  If "GV_ADD" is set and  the  Perl  variable
           does  not  exist  then  it  will  be  created.   If  "flags" is zero
           (ignoring "SVf_UTF8") and the variable does not exist then "NULL" is
           returned.

           Perl equivalent: "@{"$name"}".

           NOTE: the perl_get_av() form is deprecated.

            AV *  get_av(const char *name, I32 flags)

       "newAV"
       "newAV_mortal"
       "newAV_alloc_x"
       "newAV_alloc_xz"
           These all create a new AV, setting the reference count to 1.  If you
           also know the initial elements of the array with, see ""av_make"".

           As background, an array consists of three things:

           1.  A data structure containing information about  the  array  as  a
               whole, such as its size and reference count.

           2.  A  C  language  array  of  pointers  to the individual elements.
               These are treated as pointers to SVs, so all must be castable to
               SV*.

           3.  The  individual  elements  themselves.   These  could  be,   for
               instance, SVs and/or AVs and/or HVs, etc.

           An  empty  array  need  only  have the first data structure, and all
           these functions create that.  They differ in what else they  do,  as
           follows:

           "newAV" form
               This   does   nothing   beyond  creating  the  whole-array  data
               structure.  The Perl equivalent is approximately "my @array;"

               This is useful when the minimum size of the array could be  zero
               (perhaps  there  are  likely  code paths that will entirely skip
               using it).

               If the array does get used, the  pointers  data  structure  will
               need  to be allocated at that time.  This will end up being done
               by "av_extend">, either explicitly:

                   av_extend(av, len);

               or implicitly when the first element is stored:

                   (void)av_store(av, 0, sv);

               Unused array elements are typically initialized by "av_extend".

           "newAV_mortal" form
               This also creates  the  whole-array  data  structure,  but  also
               mortalises  it.  (That is to say, a reference to the AV is added
               to the "temps" stack.)

           "newAV_alloc_x" form
               This effectively does a  "newAV"  followed  by  also  allocating
               (uninitialized) space for the pointers array.  This is used when
               you know ahead of time the likely minimum size of the array.  It
               is more efficient to do this than doing a plain "newAV" followed
               by an "av_extend".

               Of  course  the  array  can  be  extended later should it become
               necessary.

               "size" must be at least 1.

           "newAV_alloc_xz" form
               This is "newAV_alloc_x", but initializes each pointer in  it  to
               NULL.   This gives added safety to guard against them being read
               before being set.

               "size" must be at least 1.

           The following examples all result in an  array  that  can  fit  four
           elements (indexes 0 .. 3):

               AV *av = newAV();
               av_extend(av, 3);

               AV *av = newAV_alloc_x(4);

               AV *av = newAV_alloc_xz(4);

           In  contrast,  the following examples allocate an array that is only
           guaranteed to fit one element without extending:

               AV *av = newAV_alloc_x(1);
               AV *av = newAV_alloc_xz(1);

            AV *  newAV         ()
            AV *  newAV_mortal  ()
            AV *  newAV_alloc_x (SSize_t size)
            AV *  newAV_alloc_xz(SSize_t size)

       "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: "my @new_array = @existing_array;"

            AV *  newAVav(AV *oav)

       "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: "my @new_array = %existing_hash;"

            AV *  newAVhv(HV *ohv)

       "Nullav"
           "DEPRECATED!"   It  is  planned  to  remove  "Nullav"  from a future
           release of Perl.  Do not  use  it  for  new  code;  remove  it  from
           existing code.

           Null AV pointer.

           (deprecated - use "(AV *)NULL" instead)

Callback Functions
       "call_argv"
           Performs  a  callback to the specified named and package-scoped Perl
           subroutine with "argv" (a "NULL"-terminated  array  of  strings)  as
           arguments.  See perlcall.

           Approximate Perl equivalent: "&{"$sub_name"}(@$argv)".

           NOTE: the perl_call_argv() form is deprecated.

            SSize_t  call_argv(const char *sub_name, I32 flags, char **argv)

       "call_method"
           Performs  a  callback  to  the  specified  Perl method.  The blessed
           object must be on the stack.  See perlcall.

           NOTE: the perl_call_method() form is deprecated.

            SSize_t  call_method(const char *methname, I32 flags)

       "call_pv"
           Performs a callback to the specified Perl sub.  See perlcall.

           NOTE: the perl_call_pv() form is deprecated.

            SSize_t  call_pv(const char *sub_name, I32 flags)

       "call_sv"
           Performs a callback to the Perl sub specified by the SV.

           If neither the "G_METHOD" nor "G_METHOD_NAMED" flag is supplied, the
           SV may be any of a CV, a GV, a reference to a CV, a reference  to  a
           GV or SvPV(sv) will be used as the name of the sub to call.

           If  the  "G_METHOD" flag is supplied, the SV may be a reference to a
           CV or SvPV(sv) will be used as the name of the method to call.

           If the "G_METHOD_NAMED" flag is supplied, SvPV(sv) will be  used  as
           the name of the method to call.

           Some  other values are treated specially for internal use and should
           not be depended on.

           See perlcall.

           NOTE: the perl_call_sv() form is deprecated.

            SSize_t  call_sv(SV *sv, I32 flags)

       "DESTRUCTORFUNC_NOCONTEXT_t"
           Described in perlguts.

       "DESTRUCTORFUNC_t"
           Described in perlguts.

       "ENTER"
           Opening bracket on a callback.  See "LEAVE" and perlcall.

              ENTER;

       "ENTER_with_name"
           Same as "ENTER", but when debugging is enabled  it  also  associates
           the given literal string with the new scope.

              ENTER_with_name("name");

       "eval_pv"
           Tells  Perl  to "eval" the given string in scalar context and return
           an SV* result.

           NOTE: the perl_eval_pv() form is deprecated.

            SV *  eval_pv(const char *p, I32 croak_on_error)

       "eval_sv"
           Tells Perl to "eval" the string in the SV.   It  supports  the  same
           flags  as  "call_sv",  with  the obvious exception of "G_EVAL".  See
           perlcall.

           The "G_RETHROW" flag can be used  if  you  only  need  eval_sv()  to
           execute code specified by a string, but not catch any errors.

           By default the code is compiled and executed with the default hints,
           such  as  strict and features.  Set "G_USEHINTS" in flags to use the
           current hints from "PL_curcop".

           NOTE: the perl_eval_sv() form is deprecated.

            SSize_t  eval_sv(SV *sv, I32 flags)

       "FREETMPS"
           Closing bracket for temporaries on a callback.  See  "SAVETMPS"  and
           perlcall.

              FREETMPS;

       "G_DISCARD"
           Described in perlcall.

       "G_EVAL"
           Described in perlcall.

       "GIMME"
           "DEPRECATED!"  It is planned to remove "GIMME" from a future release
           of Perl.  Do not use it for new code; remove it from existing code.

           A  backward-compatible  version  of  "GIMME_V" which can only return
           "G_SCALAR" or "G_LIST"; in a void context,  it  returns  "G_SCALAR".
           Deprecated.  Use "GIMME_V" instead.

            U32  GIMME

       "GIMME_V"
           The   XSUB-writer's   equivalent  to  Perl's  "wantarray".   Returns
           "G_VOID", "G_SCALAR" or "G_LIST" for void, scalar or  list  context,
           respectively.  See perlcall for a usage example.

            U32  GIMME_V

       "G_KEEPERR"
           Described in perlcall.

       "G_LIST"
           Described in perlcall.

       "G_NOARGS"
           Described in perlcall.

       "G_SCALAR"
           Described in perlcall.

       "G_VOID"
           Described in perlcall.

       "is_lvalue_sub"
           Returns non-zero if the sub calling this function is being called in
           an lvalue context.  Returns 0 otherwise.

            I32  is_lvalue_sub()

       "LEAVE"
           Closing bracket on a callback.  See "ENTER" and perlcall.

              LEAVE;

       "LEAVE_with_name"
           Same  as "LEAVE", but when debugging is enabled it first checks that
           the scope has the given name. "name" must be a literal string.

              LEAVE_with_name("name");

       "MORTALDESTRUCTOR_SV"
           Described in perlguts.

              MORTALDESTRUCTOR_SV(SV *coderef, SV *args)

       "mortal_destructor_sv"
           This function arranges for either a Perl  code  reference,  or  a  C
           function reference to be called at the end of the current statement.

           The  "coderef" argument determines the type of function that will be
           called. If it is 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 SvIV() which  is  SvIOK()  whose  value  is  a
           pointer  to  a  C  function of type "DESTRUCTORFUNC_t" created using
           PTR2INT().  Either way the "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 mortal_destructor_x() is
           used for the C function case.

           When operating in Perl callback mode the  "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 "args"  SV  will  be
           provided as a single argument to the code reference.

           When  operating  in  a  C callback mode the "args" parameter will be
           passed directly to  the  C  function  as  a  "void  *"  pointer.  No
           additional  processing  of  the argument will be peformed, and it is
           the  callers  responsibility  to  free  the  "args"   parameter   if
           necessary.

           Be aware that there is a signficant difference in timing between the
           end  of  the  current  statement  and  the end of the current pseudo
           block. If you are looking for a mechanism to trigger a  function  at
           the   end   of   the   current  pseudo  block  you  should  look  at
           ""SAVEDESTRUCTOR_X"" in perlapi instead of this function.

            void  mortal_destructor_sv(SV *coderef, SV *args)

       "MORTALSVFUNC_X"
           Described in perlguts.

              MORTALSVFUNC_X(SVFUNC_t f, SV *sv)

       "PL_errgv"
           Described in perlcall.

       "save_aelem"
       "save_aelem_flags"
           These each arrange for the value of the array element  "av[idx]"  to
           be restored at the end of the enclosing pseudo-block.

           In  "save_aelem",  the  SV  at  C**sptr>  will  be replaced by a new
           "undef" scalar.   That  scalar  will  inherit  any  magic  from  the
           original **sptr, and any 'set' magic will be processed.

           In  "save_aelem_flags",  "SAVEf_KEEPOLDELEM"  being  set  in "flags"
           causes the function to forgo all that:   the  scalar  at  **sptr  is
           untouched.   If  "SAVEf_KEEPOLDELEM"  is not set, the SV at C**sptr>
           will be replaced by a new "undef" scalar.  That scalar will  inherit
           any  magic  from  the  original  **sptr.   Any  'set'  magic will be
           processed if and only if "SAVEf_SETMAGIC" is set in in "flags".

            void  save_aelem      (AV *av, SSize_t idx, SV **sptr)
            void  save_aelem_flags(AV *av, SSize_t idx, SV **sptr,
                                   const U32 flags)

       "save_aptr"
           Described in perlguts.

            void  save_aptr(AV **aptr)

       "save_ary"
           Described in perlguts.

            AV *  save_ary(GV *gv)

       "SAVEBOOL"
           Described in perlguts.

              SAVEBOOL(bool i)

       "SAVEDELETE"
           Described in perlguts.

              SAVEDELETE(HV * hv, char * key, I32 length)

       "SAVEDESTRUCTOR"
           Described in perlguts.

              SAVEDESTRUCTOR(DESTRUCTORFUNC_NOCONTEXT_t f, void *p)

       "SAVEDESTRUCTOR_X"
           Described in perlguts.

              SAVEDESTRUCTOR_X(DESTRUCTORFUNC_t f, void *p)

       "SAVEFREEOP"
           Described in perlguts.

              SAVEFREEOP(OP *op)

       "SAVEFREEPV"
           Described in perlguts.

              SAVEFREEPV(char *pv)

       "SAVEFREERCPV"
           Described in perlguts.

              SAVEFREERCPV(char *pv)

       "SAVEFREESV"
           Described in perlguts.

              SAVEFREESV(SV* sv)

       "SAVEGENERICSV"
           Described in perlguts.

              SAVEGENERICSV(char **psv)

       "save_hash"
           Described in perlguts.

            HV *  save_hash(GV *gv)

       "save_helem"
       "save_helem_flags"
           These each arrange for the value of the  hash  element  (in  Perlish
           terms)  "$hv{key}]"  to  be  restored  at  the  end of the enclosing
           pseudo-block.

           In "save_helem", the SV at  C**sptr>  will  be  replaced  by  a  new
           "undef"  scalar.   That  scalar  will  inherit  any  magic  from the
           original **sptr, and any 'set' magic will be processed.

           In "save_helem_flags",  "SAVEf_KEEPOLDELEM"  being  set  in  "flags"
           causes  the  function  to  forgo  all that:  the scalar at **sptr is
           untouched.  If "SAVEf_KEEPOLDELEM" is not set, the  SV  at  C**sptr>
           will  be replaced by a new "undef" scalar.  That scalar will inherit
           any magic from  the  original  **sptr.   Any  'set'  magic  will  be
           processed if and only if "SAVEf_SETMAGIC" is set in in "flags".

            void  save_helem      (HV *hv, SV *key, SV **sptr)
            void  save_helem_flags(HV *hv, SV *key, SV **sptr,
                                   const U32 flags)

       "save_hptr"
           Described in perlguts.

            void  save_hptr(HV **hptr)

       "SAVEINT"
           Described in perlguts.

              SAVEINT(int i)

       "save_item"
           Described in perlguts.

            void  save_item(SV *item)

       "SAVEIV"
           Described in perlguts.

              SAVEIV(IV i)

       "SAVEI8"
           Described in perlguts.

              SAVEI8(I8 i)

       "SAVEI16"
           Described in perlguts.

              SAVEI16(I16 i)

       "SAVEI32"
           Described in perlguts.

              SAVEI32(I32 i)

       "SAVELONG"
           Described in perlguts.

              SAVELONG(long i)

       "SAVEMORTALIZESV"
           Described in perlguts.

              SAVEMORTALIZESV(SV* sv)

       "SAVEPPTR"
           Described in perlguts.

              SAVEPPTR(char * p)

       "SAVERCPV"
           Described in perlguts.

              SAVERCPV(char *pv)

       "save_scalar"
           Described in perlguts.

            SV *  save_scalar(GV *gv)

       "SAVESPTR"
           Described in perlguts.

              SAVESPTR(SV * s)

       "SAVESTACK_POS"
           Described in perlguts.

              SAVESTACK_POS()

       "SAVESTRLEN"
           Described in perlguts.

              SAVESTRLEN(STRLEN i)

       "save_svref"
           Described in perlguts.

            SV *  save_svref(SV **sptr)

       "SAVETMPS"
           Opening  bracket  for temporaries on a callback.  See "FREETMPS" and
           perlcall.

              SAVETMPS;

Casting
       "Atof"
           This is a synonym for ""my_atof"".

            NV  Atof(NN const char * const s)

       "cBOOL"
           Cast-to-bool.   When  Perl  was  able  to  be  compiled  on  pre-C99
           compilers, a "(bool)" cast didn't necessarily do the right thing, so
           this macro was created (and made somewhat complicated to work around
           bugs  in  old  compilers).   Now, many years later, and C99 is used,
           this is no longer required, but is kept for backwards compatibility.

            bool  cBOOL(bool expr)

       "INT2PTR"
           Described in perlguts.

            type  INT2PTR(type, int value)

       "I_V"
           Cast an NV to IV while avoiding undefined C behavior

            IV  I_V(NV what)

       "I_32"
           Cast an NV to I32 while avoiding undefined C behavior

            I32  I_32(NV what)

       "PTR2IV"
           Described in perlguts.

            IV  PTR2IV(void * ptr)

       "PTR2nat"
           Described in perlguts.

            IV  PTR2nat(void *)

       "PTR2NV"
           Described in perlguts.

            NV  PTR2NV(void * ptr)

       "PTR2ul"
           Described in perlguts.

            unsigned long  PTR2ul(void *)

       "PTR2UV"
           Described in perlguts.

            UV  PTR2UV(void * ptr)

       "PTRV"
           Described in perlguts.

       "U_V"
           Cast an NV to UV while avoiding undefined C behavior

            UV  U_V(NV what)

       "U_32"
           Cast an NV to U32 while avoiding undefined C behavior

            U32  U_32(NV what)

Character case changing
       Perl uses "full" Unicode case mappings.  This means  that  converting  a
       single  character  to another case may result in a sequence of more than
       one character.  For example, the uppercase of "ß"  (LATIN  SMALL  LETTER
       SHARP  S)  is  the  two  character  sequence  "SS".   This presents some
       complications   The lowercase of all characters in the range 0..255 is a
       single character, and thus "toLOWER_L1" is furnished.  But, "toUPPER_L1"
       can't exist, as it couldn't return a valid result for all legal  inputs.
       Instead  "toUPPER_uvchr" has an API that does allow every possible legal
       result to be returned.)  Likewise no other function that is crippled  by
       not  being  able  to  give  the  correct  results  for the full range of
       possible inputs has been implemented here.

       "toFOLD"
       "toFOLD_A"
       "toFOLD_utf8"
       "toFOLD_utf8_safe"
       "toFOLD_uvchr"
           These all return the foldcase of  a  character.   "foldcase"  is  an
           internal  case  for  "/i"  pattern  matching.  If  the  foldcase  of
           character A and the foldcase of character B are the same, they match
           caselessly; otherwise they don't.

           The differences in the forms are what domain they  operate  on,  and
           whether  the  input is specified as a code point (those forms with a
           "cp" parameter) or as a UTF-8 string (the others).   In  the  latter
           case,  the code point to use is the first one in the buffer of UTF-8
           encoded code points, delineated by the arguments "p .. e - 1".

           "toFOLD" and "toFOLD_A" are synonyms of each other.  They return the
           foldcase of any ASCII-range code point.  In this range, the foldcase
           is identical to  the  lowercase.   All  other  inputs  are  returned
           unchanged.   Since  these  are  macros,  the  input  type may be any
           integral one, and the output will occupy the same number of bits  as
           the input.

           There  is no "toFOLD_L1" nor "toFOLD_LATIN1" as the foldcase of some
           code points in the 0..255 range is above that range or  consists  of
           multiple characters.  Instead use "toFOLD_uvchr".

           "toFOLD_uvchr"  returns the foldcase of any Unicode code point.  The
           return value is identical to  that  of  "toFOLD_A"  for  input  code
           points  in  the  ASCII  range.  The foldcase of the vast majority of
           Unicode code points is the same  as  the  code  point  itself.   For
           these,  and  for  code  points above the legal Unicode maximum, this
           returns the input code point unchanged.  It additionally stores  the
           UTF-8 of the result into the buffer beginning at "s", and its length
           in  bytes into *lenp.  The caller must have made "s" large enough to
           contain at least  "UTF8_MAXBYTES_CASE+1"  bytes  to  avoid  possible
           overflow.

           NOTE:  the foldcase of a code point may be more than one code point.
           The return value of this function is only the first of  these.   The
           entire  foldcase  is returned in "s".  To determine if the result is
           more than a single code point, you can do something like this:

            uc = toFOLD_uvchr(cp, s, &len);
            if (len > UTF8SKIP(s)) { is multiple code points }
            else { is a single code point }

           "toFOLD_utf8" and "toFOLD_utf8_safe" are  synonyms  of  each  other.
           The  only  difference  between  these and "toFOLD_uvchr" is that the
           source for these is encoded in UTF-8, instead of being a code point.
           It is passed as a buffer starting at "p", with "e" pointing  to  one
           byte beyond its end.  The "p" buffer may certainly contain more than
           one  code  point;  but  only  the  first one (up through "e - 1") is
           examined.  If the UTF-8 for the input character is malformed in some
           way,  the  program  may  croak,  or  the  function  may  return  the
           REPLACEMENT  CHARACTER, at the discretion of the implementation, and
           subject to change in future releases.

            UV  toFOLD          (UV cp)
            UV  toFOLD_A        (UV cp)
            UV  toFOLD_utf8     (U8* p, U8* e, U8* s, STRLEN* lenp)
            UV  toFOLD_utf8_safe(U8* p, U8* e, U8* s, STRLEN* lenp)
            UV  toFOLD_uvchr    (UV cp, U8* s, STRLEN* lenp)

       "toLOWER"
       "toLOWER_A"
       "toLOWER_LATIN1"
       "toLOWER_LC"
       "toLOWER_L1"
       "toLOWER_utf8"
       "toLOWER_utf8_safe"
       "toLOWER_uvchr"
           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 forms with a "cp" parameter) or as a UTF-8 string
           (the others).  In the latter case, the code  point  to  use  is  the
           first  one in the buffer of UTF-8 encoded code points, delineated by
           the arguments "p .. e - 1".

           "toLOWER" and "toLOWER_A" are synonyms of each other.   They  return
           the  lowercase  of  any uppercase ASCII-range code point.  All other
           inputs are returned unchanged.  Since these are  macros,  the  input
           type  may  be  any integral one, and the output will occupy the same
           number of bits as the input.

           "toLOWER_L1" and "toLOWER_LATIN1" are synonyms of each other.   They
           behave   identically   as  "toLOWER"  for  ASCII-range  input.   But
           additionally will return the lowercase of any uppercase  code  point
           in  the  entire  0..255  range,  assuming a Latin-1 encoding (or the
           EBCDIC equivalent on such platforms).

           "toLOWER_LC" returns the lowercase of the input code point according
           to the rules of the current POSIX locale.  Input code points outside
           the range 0..255 are returned unchanged.

           "toLOWER_uvchr" returns the lowercase of  any  Unicode  code  point.
           The return value is identical to that of "toLOWER_L1" for input code
           points  in  the 0..255 range.  The lowercase of the vast majority of
           Unicode code points is the same  as  the  code  point  itself.   For
           these,  and  for  code  points above the legal Unicode maximum, this
           returns the input code point unchanged.  It additionally stores  the
           UTF-8 of the result into the buffer beginning at "s", and its length
           in  bytes into *lenp.  The caller must have made "s" large enough to
           contain at least  "UTF8_MAXBYTES_CASE+1"  bytes  to  avoid  possible
           overflow.

           NOTE: the lowercase of a code point may be more than one code point.
           The  return  value of this function is only the first of these.  The
           entire lowercase is returned in "s".  To determine if the result  is
           more than a single code point, you can do something like this:

            uc = toLOWER_uvchr(cp, s, &len);
            if (len > UTF8SKIP(s)) { is multiple code points }
            else { is a single code point }

           "toLOWER_utf8"  and  "toLOWER_utf8_safe" are synonyms of each other.
           The only difference between these and "toLOWER_uvchr"  is  that  the
           source for these is encoded in UTF-8, instead of being a code point.
           It  is  passed as a buffer starting at "p", with "e" pointing to one
           byte beyond its end.  The "p" buffer may certainly contain more than
           one code point; but only the  first  one  (up  through  "e - 1")  is
           examined.  If the UTF-8 for the input character is malformed in some
           way,  the  program  may  croak,  or  the  function  may  return  the
           REPLACEMENT CHARACTER, at the discretion of the implementation,  and
           subject to change in future releases.

            UV  toLOWER          (UV cp)
            UV  toLOWER_A        (UV cp)
            UV  toLOWER_LATIN1   (UV cp)
            UV  toLOWER_LC       (UV cp)
            UV  toLOWER_L1       (UV cp)
            UV  toLOWER_utf8     (U8* p, U8* e, U8* s, STRLEN* lenp)
            UV  toLOWER_utf8_safe(U8* p, U8* e, U8* s, STRLEN* lenp)
            UV  toLOWER_uvchr    (UV cp, U8* s, STRLEN* lenp)

       "toTITLE"
       "toTITLE_A"
       "toTITLE_utf8"
       "toTITLE_utf8_safe"
       "toTITLE_uvchr"
           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 forms with a "cp" parameter) or as a UTF-8  string
           (the  others).   In  the  latter  case, the code point to use is the
           first one in the buffer of UTF-8 encoded code points, delineated  by
           the arguments "p .. e - 1".

           "toTITLE"  and  "toTITLE_A" are synonyms of each other.  They return
           the titlecase of any lowercase  ASCII-range  code  point.   In  this
           range,  the  titlecase  is  identical  to  the uppercase.  All other
           inputs are returned unchanged.  Since these are  macros,  the  input
           type  may  be  any integral one, and the output will occupy the same
           number of bits as the input.

           There is no "toTITLE_L1" nor "toTITLE_LATIN1" as  the  titlecase  of
           some code points in the 0..255 range is above that range or consists
           of multiple characters.  Instead use "toTITLE_uvchr".

           "toTITLE_uvchr"  returns  the  titlecase  of any Unicode code point.
           The return value is identical to that of "toTITLE_A" for input  code
           points  in  the  ASCII range.  The titlecase of the vast majority of
           Unicode code points is the same  as  the  code  point  itself.   For
           these,  and  for  code  points above the legal Unicode maximum, this
           returns the input code point unchanged.  It additionally stores  the
           UTF-8 of the result into the buffer beginning at "s", and its length
           in  bytes into *lenp.  The caller must have made "s" large enough to
           contain at least  "UTF8_MAXBYTES_CASE+1"  bytes  to  avoid  possible
           overflow.

           NOTE: the titlecase of a code point may be more than one code point.
           The  return  value of this function is only the first of these.  The
           entire titlecase is returned in "s".  To determine if the result  is
           more than a single code point, you can do something like this:

            uc = toTITLE_uvchr(cp, s, &len);
            if (len > UTF8SKIP(s)) { is multiple code points }
            else { is a single code point }

           "toTITLE_utf8"  and  "toTITLE_utf8_safe" are synonyms of each other.
           The only difference between these and "toTITLE_uvchr"  is  that  the
           source for these is encoded in UTF-8, instead of being a code point.
           It  is  passed as a buffer starting at "p", with "e" pointing to one
           byte beyond its end.  The "p" buffer may certainly contain more than
           one code point; but only the  first  one  (up  through  "e - 1")  is
           examined.  If the UTF-8 for the input character is malformed in some
           way,  the  program  may  croak,  or  the  function  may  return  the
           REPLACEMENT CHARACTER, at the discretion of the implementation,  and
           subject to change in future releases.

            UV  toTITLE          (UV cp)
            UV  toTITLE_A        (UV cp)
            UV  toTITLE_utf8     (U8* p, U8* e, U8* s, STRLEN* lenp)
            UV  toTITLE_utf8_safe(U8* p, U8* e, U8* s, STRLEN* lenp)
            UV  toTITLE_uvchr    (UV cp, U8* s, STRLEN* lenp)

       "toUPPER"
       "toUPPER_A"
       "toUPPER_utf8"
       "toUPPER_utf8_safe"
       "toUPPER_uvchr"
           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 forms with a "cp" parameter) or as a UTF-8  string
           (the  others).   In  the  latter  case, the code point to use is the
           first one in the buffer of UTF-8 encoded code points, delineated  by
           the arguments "p .. e - 1".

           "toUPPER"  and  "toUPPER_A" are synonyms of each other.  They return
           the uppercase of any lowercase ASCII-range code  point.   All  other
           inputs  are  returned  unchanged.  Since these are macros, the input
           type may be any integral one, and the output will  occupy  the  same
           number of bits as the input.

           There  is  no  "toUPPER_L1" nor "toUPPER_LATIN1" as the uppercase of
           some code points in the 0..255 range is above that range or consists
           of multiple characters.  Instead use "toUPPER_uvchr".

           "toUPPER_uvchr" returns the uppercase of  any  Unicode  code  point.
           The  return value is identical to that of "toUPPER_A" for input code
           points in the ASCII range.  The uppercase of the  vast  majority  of
           Unicode  code  points  is  the  same  as the code point itself.  For
           these, and for code points above the  legal  Unicode  maximum,  this
           returns  the input code point unchanged.  It additionally stores the
           UTF-8 of the result into the buffer beginning at "s", and its length
           in bytes into *lenp.  The caller must have made "s" large enough  to
           contain  at  least  "UTF8_MAXBYTES_CASE+1"  bytes  to avoid possible
           overflow.

           NOTE: the uppercase of a code point may be more than one code point.
           The return value of this function is only the first of  these.   The
           entire  uppercase is returned in "s".  To determine if the result is
           more than a single code point, you can do something like this:

            uc = toUPPER_uvchr(cp, s, &len);
            if (len > UTF8SKIP(s)) { is multiple code points }
            else { is a single code point }

           "toUPPER_utf8" and "toUPPER_utf8_safe" are synonyms of  each  other.
           The  only  difference  between these and "toUPPER_uvchr" is that the
           source for these is encoded in UTF-8, instead of being a code point.
           It is passed as a buffer starting at "p", with "e" pointing  to  one
           byte beyond its end.  The "p" buffer may certainly contain more than
           one  code  point;  but  only  the  first one (up through "e - 1") is
           examined.  If the UTF-8 for the input character is malformed in some
           way,  the  program  may  croak,  or  the  function  may  return  the
           REPLACEMENT  CHARACTER, at the discretion of the implementation, and
           subject to change in future releases.

            UV  toUPPER          (UV cp)
            UV  toUPPER_A        (UV cp)
            UV  toUPPER_utf8     (U8* p, U8* e, U8* s, STRLEN* lenp)
            UV  toUPPER_utf8_safe(U8* p, U8* e, U8* s, STRLEN* lenp)
            UV  toUPPER_uvchr    (UV cp, U8* s, STRLEN* lenp)

Character classification
       This section is about functions (really macros) that classify characters
       into types, such as punctuation versus alphabetic, etc.  Most  of  these
       are  analogous  to  regular  expression  character classes.  (See "POSIX
       Character Classes" in perlrecharclass.)  There are several variants  for
       each  class.   (Not  all macros have all variants; each item below lists
       the ones valid for it.)  None are affected by "use bytes", and only  the
       ones with "LC" in the name are affected by the current locale.

       The  base function, e.g., isALPHA(), takes any signed or unsigned value,
       treating it as a code point, and returns a boolean as to whether or  not
       the   character  represented  by  it  is  (or  on  non-ASCII  platforms,
       corresponds to) an ASCII character in the named class based on platform,
       Unicode, and Perl rules.  If the input is a number that doesn't  fit  in
       an octet, FALSE is returned.

       Variant  "isFOO_A" (e.g., isALPHA_A()) is identical to the base function
       with no suffix "_A".  This variant is used to emphasize by its name that
       only ASCII-range characters can return TRUE.

       Variant "isFOO_L1" imposes the Latin-1 (or EBCDIC equivalent)  character
       set  onto  the  platform.   That  is, the code points that are ASCII are
       unaffected, since ASCII is a subset of Latin-1.  But the non-ASCII  code
       points  are  treated  as  if  they are Latin-1 characters.  For example,
       isWORDCHAR_L1() will return true when called with the code  point  0xDF,
       which is a word character in both ASCII and EBCDIC (though it represents
       different  characters  in  each).  If the input is a number that doesn't
       fit in an octet,  FALSE  is  returned.   (Perl's  documentation  uses  a
       colloquial definition of Latin-1, to include all code points below 256.)

       Variant "isFOO_uvchr" is exactly like the "isFOO_L1" variant, for inputs
       below  256,  but if the code point is larger than 255, Unicode rules are
       used to determine if  it  is  in  the  character  class.   For  example,
       isWORDCHAR_uvchr(0x100)  returns  TRUE,  since  0x100  is  LATIN CAPITAL
       LETTER A WITH MACRON in Unicode, and is a word character.

       Variants "isFOO_utf8" and "isFOO_utf8_safe" are like "isFOO_uvchr",  but
       are  used  for UTF-8 encoded strings.  The two forms are different names
       for the same thing.  Each call to one  of  these  classifies  the  first
       character  of  the  string  starting at "p".  The second parameter, "e",
       points to anywhere in the string beyond the first character, up  to  one
       byte  past  the  end  of  the entire string.  Although both variants are
       identical, the suffix "_safe" in one name emphasizes that  it  will  not
       attempt  to read beyond "e - 1", provided that the constraint "s < e" is
       true (this is asserted for in "-DDEBUGGING" builds).  If the  UTF-8  for
       the  input character is malformed in some way, the program may croak, or
       the function may return FALSE, at the discretion of the  implementation,
       and subject to change in future releases.

       Variant  "isFOO_LC"  is  like the "isFOO_A" and "isFOO_L1" variants, but
       the result is based on the current locale, which is  what  "LC"  in  the
       name  stands  for.   If  Perl can determine that the current locale is a
       UTF-8 locale, it uses the published Unicode rules;  otherwise,  it  uses
       the  C  library  function  that  gives  the  named  classification.  For
       example, isDIGIT_LC() when not in a UTF-8 locale returns the  result  of
       calling isdigit().  FALSE is always returned if the input won't fit into
       an octet.  On some platforms where the C library function is known to be
       defective, Perl changes its result to follow the POSIX standard's rules.

       Variant  "isFOO_LC_uvchr"  acts  exactly like "isFOO_LC" for inputs less
       than 256, but for larger ones it returns the Unicode  classification  of
       the code point.

       Variants    "isFOO_LC_utf8"    and    "isFOO_LC_utf8_safe"    are   like
       "isFOO_LC_uvchr", but are used for UTF-8 encoded strings.  The two forms
       are different names for the same thing.   Each  call  to  one  of  these
       classifies  the  first  character  of  the  string starting at "p".  The
       second parameter, "e", points to anywhere in the string beyond the first
       character, up to one byte past the end of the entire  string.   Although
       both  variants  are identical, the suffix "_safe" in one name emphasizes
       that it will not attempt to  read  beyond  "e - 1",  provided  that  the
       constraint  "s < e"  is  true  (this  is  asserted  for in "-DDEBUGGING"
       builds).  If the UTF-8 for the input character is malformed in some way,
       the program may  croak,  or  the  function  may  return  FALSE,  at  the
       discretion  of  the  implementation,  and  subject  to  change in future
       releases.

       "isALNUM"
       "isALNUM_A"
       "isALNUM_LC"
       "isALNUM_LC_uvchr"
           These are each a synonym for their respectively named ""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 ""isALPHANUMERIC"" variant.

            bool  isALNUM(UV ch)

       "isALNUMC"
       "isALNUMC_A"
       "isALNUMC_LC"
       "isALNUMC_LC_uvchr"
       "isALNUMC_L1"
           These   are   discouraged,   backward   compatibility   macros   for
           ""isALPHANUMERIC"".  That is,  each  returns  a  boolean  indicating
           whether  the  specified character is one of "[A-Za-z0-9]", analogous
           to "m/[[:alnum:]]/".

           The "C" suffix  in  the  names  was  meant  to  indicate  that  they
           correspond to the C language isalnum(3).

            bool  isALNUMC(UV ch)

       "isALPHA"
       "isALPHA_A"
       "isALPHA_LC"
       "isALPHA_LC_utf8_safe"
       "isALPHA_LC_uvchr"
       "isALPHA_L1"
       "isALPHA_utf8"
       "isALPHA_utf8_safe"
       "isALPHA_uvchr"
           Returns  a  boolean indicating whether the specified input is one of
           "[A-Za-z]", analogous to "m/[[:alpha:]]/".   See  the  top  of  this
           section for an explanation of the variants.

            bool  isALPHA             (UV ch)
            bool  isALPHA_A           (UV ch)
            bool  isALPHA_LC          (UV ch)
            bool  isALPHA_LC_utf8_safe(U8 * s, U8 *end)
            bool  isALPHA_LC_uvchr    (UV ch)
            bool  isALPHA_L1          (UV ch)
            bool  isALPHA_utf8        (U8 * s, U8 * end)
            bool  isALPHA_utf8_safe   (U8 * s, U8 * end)
            bool  isALPHA_uvchr       (UV ch)

       "isALPHANUMERIC"
       "isALPHANUMERIC_A"
       "isALPHANUMERIC_LC"
       "isALPHANUMERIC_LC_utf8_safe"
       "isALPHANUMERIC_LC_uvchr"
       "isALPHANUMERIC_L1"
       "isALPHANUMERIC_utf8"
       "isALPHANUMERIC_utf8_safe"
       "isALPHANUMERIC_uvchr"
           Returns  a boolean indicating whether the specified character is one
           of "[A-Za-z0-9]", analogous to "m/[[:alnum:]]/".   See  the  top  of
           this section for an explanation of the variants.

            bool  isALPHANUMERIC             (UV ch)
            bool  isALPHANUMERIC_A           (UV ch)
            bool  isALPHANUMERIC_LC          (UV ch)
            bool  isALPHANUMERIC_LC_utf8_safe(U8 * s, U8 *end)
            bool  isALPHANUMERIC_LC_uvchr    (UV ch)
            bool  isALPHANUMERIC_L1          (UV ch)
            bool  isALPHANUMERIC_utf8        (U8 * s, U8 * end)
            bool  isALPHANUMERIC_utf8_safe   (U8 * s, U8 * end)
            bool  isALPHANUMERIC_uvchr       (UV ch)

       "isASCII"
       "isASCII_A"
       "isASCII_LC"
       "isASCII_LC_utf8_safe"
       "isASCII_LC_uvchr"
       "isASCII_L1"
       "isASCII_utf8"
       "isASCII_utf8_safe"
       "isASCII_uvchr"
           Returns  a boolean indicating whether the specified character is one
           of the 128 characters in  the  ASCII  character  set,  analogous  to
           "m/[[:ascii:]]/".   On non-ASCII platforms, it returns TRUE iff this
           character corresponds to an ASCII character.   Variants  isASCII_A()
           and  isASCII_L1()  are  identical to isASCII().  See the top of this
           section for an explanation of the  variants.   Note,  however,  that
           some  platforms  do  not  have  the C library routine isascii().  In
           these cases, the variants whose names contain "LC" are the  same  as
           the corresponding ones without.

           Also  note,  that  because  all ASCII characters are UTF-8 invariant
           (meaning they have the exact same representation  (always  a  single
           byte)  whether  encoded  in  UTF-8  or not), "isASCII" will give the
           correct results when called with any byte in any string  encoded  or
           not  in UTF-8.  And similarly "isASCII_utf8" and "isASCII_utf8_safe"
           will work properly on any string encoded or not in UTF-8.

            bool  isASCII             (UV ch)
            bool  isASCII_A           (UV ch)
            bool  isASCII_LC          (UV ch)
            bool  isASCII_LC_utf8_safe(U8 * s, U8 *end)
            bool  isASCII_LC_uvchr    (UV ch)
            bool  isASCII_L1          (UV ch)
            bool  isASCII_utf8        (U8 * s, U8 * end)
            bool  isASCII_utf8_safe   (U8 * s, U8 * end)
            bool  isASCII_uvchr       (UV ch)

       "isBLANK"
       "isBLANK_A"
       "isBLANK_LC"
       "isBLANK_LC_utf8_safe"
       "isBLANK_LC_uvchr"
       "isBLANK_L1"
       "isBLANK_utf8"
       "isBLANK_utf8_safe"
       "isBLANK_uvchr"
           Returns a boolean indicating whether the specified  character  is  a
           character  considered  to be a blank, analogous to "m/[[:blank:]]/".
           See the top of this section for  an  explanation  of  the  variants.
           Note, however, that some platforms do not have the C library routine
           isblank().   In  these  cases, the variants whose names contain "LC"
           are the same as the corresponding ones without.

            bool  isBLANK             (UV ch)
            bool  isBLANK_A           (UV ch)
            bool  isBLANK_LC          (UV ch)
            bool  isBLANK_LC_utf8_safe(U8 * s, U8 *end)
            bool  isBLANK_LC_uvchr    (UV ch)
            bool  isBLANK_L1          (UV ch)
            bool  isBLANK_utf8        (U8 * s, U8 * end)
            bool  isBLANK_utf8_safe   (U8 * s, U8 * end)
            bool  isBLANK_uvchr       (UV ch)

       "isCNTRL"
       "isCNTRL_A"
       "isCNTRL_LC"
       "isCNTRL_LC_utf8_safe"
       "isCNTRL_LC_uvchr"
       "isCNTRL_L1"
       "isCNTRL_utf8"
       "isCNTRL_utf8_safe"
       "isCNTRL_uvchr"
           Returns a boolean indicating whether the specified  character  is  a
           control  character,  analogous  to "m/[[:cntrl:]]/".  See the top of
           this  section  for  an  explanation  of  the  variants.   On  EBCDIC
           platforms, you almost always want to use the "isCNTRL_L1" variant.

            bool  isCNTRL             (UV ch)
            bool  isCNTRL_A           (UV ch)
            bool  isCNTRL_LC          (UV ch)
            bool  isCNTRL_LC_utf8_safe(U8 * s, U8 *end)
            bool  isCNTRL_LC_uvchr    (UV ch)
            bool  isCNTRL_L1          (UV ch)
            bool  isCNTRL_utf8        (U8 * s, U8 * end)
            bool  isCNTRL_utf8_safe   (U8 * s, U8 * end)
            bool  isCNTRL_uvchr       (UV ch)

       "isDIGIT"
       "isDIGIT_A"
       "isDIGIT_LC"
       "isDIGIT_LC_utf8_safe"
       "isDIGIT_LC_uvchr"
       "isDIGIT_L1"
       "isDIGIT_utf8"
       "isDIGIT_utf8_safe"
       "isDIGIT_uvchr"
           Returns  a  boolean  indicating whether the specified character is a
           digit, analogous  to  "m/[[:digit:]]/".   Variants  "isDIGIT_A"  and
           "isDIGIT_L1"  are  identical  to  "isDIGIT".   See  the  top of this
           section for an explanation of the variants.

            bool  isDIGIT             (UV ch)
            bool  isDIGIT_A           (UV ch)
            bool  isDIGIT_LC          (UV ch)
            bool  isDIGIT_LC_utf8_safe(U8 * s, U8 *end)
            bool  isDIGIT_LC_uvchr    (UV ch)
            bool  isDIGIT_L1          (UV ch)
            bool  isDIGIT_utf8        (U8 * s, U8 * end)
            bool  isDIGIT_utf8_safe   (U8 * s, U8 * end)
            bool  isDIGIT_uvchr       (UV ch)

       "isGRAPH"
       "isGRAPH_A"
       "isGRAPH_LC"
       "isGRAPH_LC_utf8_safe"
       "isGRAPH_LC_uvchr"
       "isGRAPH_L1"
       "isGRAPH_utf8"
       "isGRAPH_utf8_safe"
       "isGRAPH_uvchr"
           Returns a boolean indicating whether the specified  character  is  a
           graphic  character,  analogous  to "m/[[:graph:]]/".  See the top of
           this section for an explanation of the variants.

            bool  isGRAPH             (UV ch)
            bool  isGRAPH_A           (UV ch)
            bool  isGRAPH_LC          (UV ch)
            bool  isGRAPH_LC_utf8_safe(U8 * s, U8 *end)
            bool  isGRAPH_LC_uvchr    (UV ch)
            bool  isGRAPH_L1          (UV ch)
            bool  isGRAPH_utf8        (U8 * s, U8 * end)
            bool  isGRAPH_utf8_safe   (U8 * s, U8 * end)
            bool  isGRAPH_uvchr       (UV ch)

       "isIDCONT"
       "isIDCONT_A"
       "isIDCONT_LC"
       "isIDCONT_LC_utf8_safe"
       "isIDCONT_LC_uvchr"
       "isIDCONT_L1"
       "isIDCONT_utf8"
       "isIDCONT_utf8_safe"
       "isIDCONT_uvchr"
           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
           "XID_Continue".   The  difference  is that this returns true only if
           the input character also matches "isWORDCHAR".  See the top of  this
           section for an explanation of the variants.

            bool  isIDCONT             (UV ch)
            bool  isIDCONT_A           (UV ch)
            bool  isIDCONT_LC          (UV ch)
            bool  isIDCONT_LC_utf8_safe(U8 * s, U8 *end)
            bool  isIDCONT_LC_uvchr    (UV ch)
            bool  isIDCONT_L1          (UV ch)
            bool  isIDCONT_utf8        (U8 * s, U8 * end)
            bool  isIDCONT_utf8_safe   (U8 * s, U8 * end)
            bool  isIDCONT_uvchr       (UV ch)

       "isIDFIRST"
       "isIDFIRST_A"
       "isIDFIRST_LC"
       "isIDFIRST_LC_utf8_safe"
       "isIDFIRST_LC_uvchr"
       "isIDFIRST_L1"
       "isIDFIRST_utf8"
       "isIDFIRST_utf8_safe"
       "isIDFIRST_uvchr"
           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 "XID_Start".
           The difference is that this returns true only if the input character
           also matches "isWORDCHAR".  See the  top  of  this  section  for  an
           explanation of the variants.

            bool  isIDFIRST             (UV ch)
            bool  isIDFIRST_A           (UV ch)
            bool  isIDFIRST_LC          (UV ch)
            bool  isIDFIRST_LC_utf8_safe(U8 * s, U8 *end)
            bool  isIDFIRST_LC_uvchr    (UV ch)
            bool  isIDFIRST_L1          (UV ch)
            bool  isIDFIRST_utf8        (U8 * s, U8 * end)
            bool  isIDFIRST_utf8_safe   (U8 * s, U8 * end)
            bool  isIDFIRST_uvchr       (UV ch)

       "isLOWER"
       "isLOWER_A"
       "isLOWER_LC"
       "isLOWER_LC_utf8_safe"
       "isLOWER_LC_uvchr"
       "isLOWER_L1"
       "isLOWER_utf8"
       "isLOWER_utf8_safe"
       "isLOWER_uvchr"
           Returns  a  boolean  indicating whether the specified character is a
           lowercase character, analogous to "m/[[:lower:]]/".  See the top  of
           this section for an explanation of the variants

            bool  isLOWER             (UV ch)
            bool  isLOWER_A           (UV ch)
            bool  isLOWER_LC          (UV ch)
            bool  isLOWER_LC_utf8_safe(U8 * s, U8 *end)
            bool  isLOWER_LC_uvchr    (UV ch)
            bool  isLOWER_L1          (UV ch)
            bool  isLOWER_utf8        (U8 * s, U8 * end)
            bool  isLOWER_utf8_safe   (U8 * s, U8 * end)
            bool  isLOWER_uvchr       (UV ch)

       "isOCTAL"
       "isOCTAL_A"
       "isOCTAL_L1"
           Returns  a  boolean indicating whether the specified character is an
           octal digit, [0-7].  The  only  two  variants  are  "isOCTAL_A"  and
           "isOCTAL_L1"; each is identical to "isOCTAL".

            bool  isOCTAL(UV ch)

       "isPRINT"
       "isPRINT_A"
       "isPRINT_LC"
       "isPRINT_LC_utf8_safe"
       "isPRINT_LC_uvchr"
       "isPRINT_L1"
       "isPRINT_utf8"
       "isPRINT_utf8_safe"
       "isPRINT_uvchr"
           Returns  a  boolean  indicating whether the specified character is a
           printable character, analogous to "m/[[:print:]]/".  See the top  of
           this section for an explanation of the variants.

            bool  isPRINT             (UV ch)
            bool  isPRINT_A           (UV ch)
            bool  isPRINT_LC          (UV ch)
            bool  isPRINT_LC_utf8_safe(U8 * s, U8 *end)
            bool  isPRINT_LC_uvchr    (UV ch)
            bool  isPRINT_L1          (UV ch)
            bool  isPRINT_utf8        (U8 * s, U8 * end)
            bool  isPRINT_utf8_safe   (U8 * s, U8 * end)
            bool  isPRINT_uvchr       (UV ch)

       "isPSXSPC"
       "isPSXSPC_A"
       "isPSXSPC_LC"
       "isPSXSPC_LC_utf8_safe"
       "isPSXSPC_LC_uvchr"
       "isPSXSPC_L1"
       "isPSXSPC_utf8"
       "isPSXSPC_utf8_safe"
       "isPSXSPC_uvchr"
           (short  for  Posix Space) Starting in 5.18, this is identical in all
           its forms to the corresponding isSPACE() macros.  The  locale  forms
           of  this  macro are identical to their corresponding isSPACE() forms
           in all Perl releases.  In releases prior  to  5.18,  the  non-locale
           forms  differ  from their isSPACE() forms only in that the isSPACE()
           forms don't match a Vertical  Tab,  and  the  isPSXSPC()  forms  do.
           Otherwise  they are identical.  Thus this macro is analogous to what
           "m/[[:space:]]/" matches in a regular expression.  See  the  top  of
           this section for an explanation of the variants.

            bool  isPSXSPC             (UV ch)
            bool  isPSXSPC_A           (UV ch)
            bool  isPSXSPC_LC          (UV ch)
            bool  isPSXSPC_LC_utf8_safe(U8 * s, U8 *end)
            bool  isPSXSPC_LC_uvchr    (UV ch)
            bool  isPSXSPC_L1          (UV ch)
            bool  isPSXSPC_utf8        (U8 * s, U8 * end)
            bool  isPSXSPC_utf8_safe   (U8 * s, U8 * end)
            bool  isPSXSPC_uvchr       (UV ch)

       "isPUNCT"
       "isPUNCT_A"
       "isPUNCT_LC"
       "isPUNCT_LC_utf8_safe"
       "isPUNCT_LC_uvchr"
       "isPUNCT_L1"
       "isPUNCT_utf8"
       "isPUNCT_utf8_safe"
       "isPUNCT_uvchr"
           Returns  a  boolean  indicating whether the specified character is a
           punctuation character, analogous to "m/[[:punct:]]/".  Note that the
           definition of what is punctuation isn't as  straightforward  as  one
           might  desire.  See "POSIX Character Classes" in perlrecharclass for
           details.  See the top of this section  for  an  explanation  of  the
           variants.

            bool  isPUNCT             (UV ch)
            bool  isPUNCT_A           (UV ch)
            bool  isPUNCT_LC          (UV ch)
            bool  isPUNCT_LC_utf8_safe(U8 * s, U8 *end)
            bool  isPUNCT_LC_uvchr    (UV ch)
            bool  isPUNCT_L1          (UV ch)
            bool  isPUNCT_utf8        (U8 * s, U8 * end)
            bool  isPUNCT_utf8_safe   (U8 * s, U8 * end)
            bool  isPUNCT_uvchr       (UV ch)

       "isSPACE"
       "isSPACE_A"
       "isSPACE_LC"
       "isSPACE_LC_utf8_safe"
       "isSPACE_LC_uvchr"
       "isSPACE_L1"
       "isSPACE_utf8"
       "isSPACE_utf8_safe"
       "isSPACE_uvchr"
           Returns  a  boolean  indicating whether the specified character is a
           whitespace character.  This is analogous to what "m/\s/" matches  in
           a  regular expression.  Starting in Perl 5.18 this also matches what
           "m/[[:space:]]/" does.  Prior to 5.18, only the locale forms of this
           macro (the ones with "LC" in their  names)  matched  precisely  what
           "m/[[:space:]]/"  does.   In those releases, the only difference, in
           the non-locale variants, was that isSPACE() did not match a vertical
           tab.  (See "isPSXSPC" for a macro that matches a vertical tab in all
           releases.)  See the top of this section for an  explanation  of  the
           variants.

            bool  isSPACE             (UV ch)
            bool  isSPACE_A           (UV ch)
            bool  isSPACE_LC          (UV ch)
            bool  isSPACE_LC_utf8_safe(U8 * s, U8 *end)
            bool  isSPACE_LC_uvchr    (UV ch)
            bool  isSPACE_L1          (UV ch)
            bool  isSPACE_utf8        (U8 * s, U8 * end)
            bool  isSPACE_utf8_safe   (U8 * s, U8 * end)
            bool  isSPACE_uvchr       (UV ch)

       "isUPPER"
       "isUPPER_A"
       "isUPPER_LC"
       "isUPPER_LC_utf8_safe"
       "isUPPER_LC_uvchr"
       "isUPPER_L1"
       "isUPPER_utf8"
       "isUPPER_utf8_safe"
       "isUPPER_uvchr"
           Returns  a  boolean indicating whether the specified character is an
           uppercase character, analogous to "m/[[:upper:]]/".  See the top  of
           this section for an explanation of the variants.

            bool  isUPPER             (UV ch)
            bool  isUPPER_A           (UV ch)
            bool  isUPPER_LC          (UV ch)
            bool  isUPPER_LC_utf8_safe(U8 * s, U8 *end)
            bool  isUPPER_LC_uvchr    (UV ch)
            bool  isUPPER_L1          (UV ch)
            bool  isUPPER_utf8        (U8 * s, U8 * end)
            bool  isUPPER_utf8_safe   (U8 * s, U8 * end)
            bool  isUPPER_uvchr       (UV ch)

       "isWORDCHAR"
       "isWORDCHAR_A"
       "isWORDCHAR_LC"
       "isWORDCHAR_LC_utf8_safe"
       "isWORDCHAR_LC_uvchr"
       "isWORDCHAR_L1"
       "isWORDCHAR_utf8"
       "isWORDCHAR_utf8_safe"
       "isWORDCHAR_uvchr"
           Returns  a  boolean  indicating whether the specified character is a
           character that is a word character, analogous to  what  "m/\w/"  and
           "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).

           See the top of this section for an explanation of the variants.

           "isWORDCHAR_A",         "isWORDCHAR_L1",         "isWORDCHAR_uvchr",
           "isWORDCHAR_LC",  "isWORDCHAR_LC_uvchr",  "isWORDCHAR_LC_utf8",  and
           "isWORDCHAR_LC_utf8_safe"  are  also   as   described   there,   but
           additionally include the platform's native underscore.

            bool  isWORDCHAR             (UV ch)
            bool  isWORDCHAR_A           (UV ch)
            bool  isWORDCHAR_LC          (UV ch)
            bool  isWORDCHAR_LC_utf8_safe(U8 * s, U8 *end)
            bool  isWORDCHAR_LC_uvchr    (UV ch)
            bool  isWORDCHAR_L1          (UV ch)
            bool  isWORDCHAR_utf8        (U8 * s, U8 * end)
            bool  isWORDCHAR_utf8_safe   (U8 * s, U8 * end)
            bool  isWORDCHAR_uvchr       (UV ch)

       "isXDIGIT"
       "isXDIGIT_A"
       "isXDIGIT_LC"
       "isXDIGIT_LC_utf8_safe"
       "isXDIGIT_LC_uvchr"
       "isXDIGIT_L1"
       "isXDIGIT_utf8"
       "isXDIGIT_utf8_safe"
       "isXDIGIT_uvchr"
           Returns  a  boolean  indicating whether the specified character is a
           hexadecimal digit.  In the  ASCII  range  these  are  "[0-9A-Fa-f]".
           Variants isXDIGIT_A() and isXDIGIT_L1() are identical to isXDIGIT().
           See the top of this section for an explanation of the variants.

            bool  isXDIGIT             (UV ch)
            bool  isXDIGIT_A           (UV ch)
            bool  isXDIGIT_LC          (UV ch)
            bool  isXDIGIT_LC_utf8_safe(U8 * s, U8 *end)
            bool  isXDIGIT_LC_uvchr    (UV ch)
            bool  isXDIGIT_L1          (UV ch)
            bool  isXDIGIT_utf8        (U8 * s, U8 * end)
            bool  isXDIGIT_utf8_safe   (U8 * s, U8 * end)
            bool  isXDIGIT_uvchr       (UV ch)

Compiler and Preprocessor information
       "CPPLAST"
           This  symbol  is intended to be used along with "CPPRUN" in the same
           manner symbol "CPPMINUS" is used with "CPPSTDIN". It contains either
           "-" or "".

       "CPPMINUS"
           This symbol contains the second part of the string which will invoke
           the C preprocessor on the standard input  and  produce  to  standard
           output.   This  symbol will have the value "-" if "CPPSTDIN" needs a
           minus to specify standard input, otherwise the value is "".

       "CPPRUN"
           This symbol contains the string which will invoke a  C  preprocessor
           on  the  standard  input and produce to standard output. It needs to
           end with "CPPLAST", after all other  preprocessor  flags  have  been
           specified.  The main difference with "CPPSTDIN" is that this program
           will never be a pointer to a shell wrapper, i.e. it will be empty if
           no  preprocessor is available directly to the user. Note that it may
           well be different from  the  preprocessor  used  to  compile  the  C
           program.

       "CPPSTDIN"
           This  symbol contains the first part of the string which will invoke
           the C preprocessor on the standard input  and  produce  to  standard
           output.   Typical  value  of  "cc -E" or "/lib/cpp", but it can also
           call a wrapper. See "CPPRUN".

       "HASATTRIBUTE_ALWAYS_INLINE"
           Can we handle "GCC" attribute for functions that  should  always  be
           inlined.

       "HASATTRIBUTE_DEPRECATED"
           Can we handle "GCC" attribute for marking deprecated "APIs"

       "HASATTRIBUTE_FORMAT"
           Can we handle "GCC" attribute for checking printf-style formats

       "HASATTRIBUTE_NONNULL"
           Can we handle "GCC" attribute for nonnull function parms.

       "HASATTRIBUTE_NORETURN"
           Can we handle "GCC" attribute for functions that do not return

       "HASATTRIBUTE_PURE"
           Can we handle "GCC" attribute for pure functions

       "HASATTRIBUTE_UNUSED"
           Can we handle "GCC" attribute for unused variables and arguments

       "HASATTRIBUTE_VISIBILITY"
           Can  we  handle  "GCC"  attribute  for  functions that should have a
           different visibility.

       "HASATTRIBUTE_WARN_UNUSED_RESULT"
           Can we handle "GCC" attribute for warning on unused results

       "HAS_BUILTIN_ADD_OVERFLOW"
           This symbol,  if  defined,  indicates  that  the  compiler  supports
           "__builtin_add_overflow" for adding integers with overflow checks.

       "HAS_BUILTIN_CHOOSE_EXPR"
           Can   we   handle   "GCC"   builtin  for  compile-time  ternary-like
           expressions

       "HAS_BUILTIN_EXPECT"
           Can we handle "GCC" builtin for telling that certain values are more
           likely

       "HAS_BUILTIN_MUL_OVERFLOW"
           This symbol,  if  defined,  indicates  that  the  compiler  supports
           "__builtin_mul_overflow"  for  multiplying  integers  with  overflow
           checks.

       "HAS_BUILTIN_SUB_OVERFLOW"
           This symbol,  if  defined,  indicates  that  the  compiler  supports
           "__builtin_sub_overflow"  for  subtracting  integers  with  overflow
           checks.

       "HAS_C99_VARIADIC_MACROS"
           If defined, the compiler supports C99 variadic macros.

       "HAS_STATIC_INLINE"
           This symbol, if defined, indicates  that  the  C  compiler  supports
           C99-style static inline.  That is, the function can't be called from
           another translation unit.

       "MEM_ALIGNBYTES"
           This symbol contains the number of bytes required to align a double,
           or  a  long double when applicable. Usual values are 2, 4 and 8. The
           default is eight, for  safety.   For  cross-compiling  or  multiarch
           support, Configure will set a minimum of 8.

       "PERL_STATIC_INLINE"
           This  symbol  gives  the  best-guess  incantation  to use for static
           inline functions.  If "HAS_STATIC_INLINE" is defined, this will give
           C99-style inline.  If "HAS_STATIC_INLINE" is not defined, this  will
           give  a plain 'static'.  It will always be defined to something that
           gives static linkage.  Possibilities include

            static inline       (c99)
            static __inline__   (gcc -ansi)
            static __inline     (MSVC)
            static _inline      (older MSVC)
            static              (c89 compilers)

       "PERL_THREAD_LOCAL"
           This symbol, if defined, gives a linkage specification  for  thread-
           local  storage.  For  example,  for  a  C11  compiler  this  will be
           "_Thread_local".  Beware, some compilers  are  sensitive  to  the  C
           language  standard  they  are  told  to  parse.  For  example, suncc
           defaults to C11, so our probe will report that  "_Thread_local"  can
           be  used.  However,  if  the -std=c99 is later added to the compiler
           flags, then "_Thread_local" will become a syntax error. Hence it  is
           important for these flags to be consistent between probing and use.

       "U32_ALIGNMENT_REQUIRED"
           This  symbol,  if  defined, indicates that you must access character
           data through U32-aligned pointers.

Compiler directives
       "__ASSERT_"
           This is a helper macro to avoid  preprocessor  issues,  replaced  by
           nothing unless under DEBUGGING, where it expands to an assert of its
           argument,  followed  by  a  comma (hence the comma operator).  If we
           just used a straight assert(), we would get  a  comma  with  nothing
           before it when not DEBUGGING.

              __ASSERT_(bool expr)

       "ASSUME"
           "ASSUME"  is like assert(), but it has a benefit in a release build.
           It is a hint to a compiler about a statement of fact in  a  function
           call  free  expression, which allows the compiler to generate better
           machine code.   In  a  debug  build,  ASSUME(x)  is  a  synonym  for
           assert(x). ASSUME(0) means the control path is unreachable. In a for
           loop,  "ASSUME"  can be used to hint that a loop will run at least X
           times. "ASSUME" is based off MSVC's "__assume"  intrinsic  function,
           see its documents for more details.

              ASSUME(bool expr)

       "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.

              dNOOP;

       "END_EXTERN_C"
           When  not compiling using C++, expands to nothing.  Otherwise ends a
           section of code already begun by a "START_EXTERN_C".

              END_EXTERN_C

       "EXTERN_C"
           When not compiling using C++, expands to nothing.  Otherwise is used
           in a declaration of a function to indicate the function should  have
           external  C  linkage.   This is required for things to work for just
           about all  functions  with  external  linkage  compiled  into  perl.
           Often,  you  can  use  "START_EXTERN_C"  ...  "END_EXTERN_C"  blocks
           surrounding all your code that you need to have this linkage.

           Example usage:

            EXTERN_C int flock(int fd, int op);

       "LIKELY"
           Returns the input unchanged, but at the same time it gives a  branch
           prediction  hint to the compiler that this condition is likely to be
           true.

              LIKELY(bool expr)

       "NOOP"
           Do nothing; typically used as a  placeholder  to  replace  something
           that used to do something.

              NOOP;

       "PERL_UNUSED_ARG"
           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 sometimes.

              PERL_UNUSED_ARG(void x);

       "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.

              PERL_UNUSED_CONTEXT;

       "PERL_UNUSED_DECL"
           Tells the compiler that the parameter in the function prototype just
           before  it  is  not necessarily expected to be used in the function.
           Not that many compilers understand this, so this should only be used
           in cases where "PERL_UNUSED_ARG" can't conveniently be used.

           Example usage:

            Signal_t
            Perl_perly_sighandler(int sig, Siginfo_t *sip PERL_UNUSED_DECL,
                                  void *uap PERL_UNUSED_DECL, bool safe)

       "PERL_UNUSED_RESULT"
           This macro indicates to discard the return  value  of  the  function
           call inside it, e.g.,

            PERL_UNUSED_RESULT(foo(a, b))

           The   main   reason  for  this  is  that  the  combination  of  "gcc
           -Wunused-result"      (part      of      "-Wall")      and       the
           "__attribute__((warn_unused_result))"   cannot   be   silenced  with
           casting to "void".  This causes trouble when the system header files
           use the attribute.

           Use  "PERL_UNUSED_RESULT"  sparingly,  though,  since  usually   the
           warning  is  there for a good reason: you might lose success/failure
           information, or leak resources, or changes in resources.

           But sometimes you just want to ignore the  return  value,  e.g.,  on
           codepaths  soon ending up in abort, or in "best effort" attempts, or
           in situations where there is no good way to handle failures.

           Sometimes "PERL_UNUSED_RESULT" might not be the  most  natural  way:
           another possibility is that you can capture the return value and use
           "PERL_UNUSED_VAR" on that.

              PERL_UNUSED_RESULT(void x)

       "PERL_UNUSED_VAR"
           This  is  used  to suppress compiler warnings that the variable x is
           not  used.   This  situation  can  arise,  for  example,  when  a  C
           preprocessor  conditional  compilation  causes  it be used just some
           times.

              PERL_UNUSED_VAR(void x);

       "START_EXTERN_C"
           When not compiling using C++, expands to nothing.  Otherwise  begins
           a  section  of  code  in  which every function will effectively have
           "EXTERN_C" applied to it, that is to have external C  linkage.   The
           section is ended by a "END_EXTERN_C".

              START_EXTERN_C

       "STATIC"
           Described in perlguts.

       "STMT_END"
       "STMT_START"
           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 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
           "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 "Writing safer macros" in  perlhacktips
           for how to avoid these.

       "UNLIKELY"
           Returns  the input unchanged, but at the same time it gives a branch
           prediction hint to the compiler that this condition is likely to  be
           false.

              UNLIKELY(bool expr)

Compile-time scope hooks
       "BhkDISABLE"
           NOTE:  "BhkDISABLE"  is  experimental  and  may change or be removed
           without notice.

           Temporarily disable an entry in this BHK structure, by clearing  the
           appropriate  flag.  "which" is a preprocessor token indicating which
           entry to disable.

            void  BhkDISABLE(BHK *hk, token which)

       "BhkENABLE"
           NOTE: "BhkENABLE" is experimental  and  may  change  or  be  removed
           without notice.

           Re-enable an entry in this BHK structure, by setting the appropriate
           flag.   "which"  is  a  preprocessor token indicating which entry to
           enable.  This will assert (under -DDEBUGGING) if the  entry  doesn't
           contain a valid pointer.

            void  BhkENABLE(BHK *hk, token which)

       "BhkENTRY_set"
           NOTE:  "BhkENTRY_set"  is  experimental and may change or be removed
           without notice.

           Set an entry in the BHK structure, and set the flags to indicate  it
           is  valid.   "which" is a preprocessing token indicating which entry
           to set.  The type of "ptr" depends on the entry.

            void  BhkENTRY_set(BHK *hk, token which, void *ptr)

       "blockhook_register"
           NOTE: "blockhook_register" is experimental  and  may  change  or  be
           removed without notice.

           Register  a  set  of  hooks to be called when the Perl lexical scope
           changes  at  compile  time.   See  "Compile-time  scope  hooks"   in
           perlguts.

           NOTE:    "blockhook_register"   must   be   explicitly   called   as
           "Perl_blockhook_register" with an "aTHX_" parameter.

            void  Perl_blockhook_register(pTHX_ BHK *hk)

Concurrency
       "aTHX"
           Described in perlguts.

       "aTHX_"
           Described in perlguts.

       "CPERLscope"
           "DEPRECATED!"  It is planned to remove "CPERLscope"  from  a  future
           release  of  Perl.   Do  not  use  it  for  new code; remove it from
           existing code.

           Now a no-op.

            void  CPERLscope(void x)

       "dTHR"
           Described in perlguts.

       "dTHX"
           Described in perlguts.

       "dTHXa"
           On threaded perls, set  "pTHX"  to  "a";  on  unthreaded  perls,  do
           nothing

       "dTHXoa"
           Now a synonym for "dTHXa".

       "dVAR"
           This is now a synonym for dNOOP: declare nothing

       "GETENV_PRESERVES_OTHER_THREAD"
           This  symbol,  if  defined,  indicates  that  the getenv system call
           doesn't zap the static buffer of getenv()  in  a  different  thread.
           The  typical  getenv()  implementation  will return a pointer to the
           proper position in **environ.  But some may instead copy them  to  a
           static  buffer  in  getenv().   If there is a per-thread instance of
           that  buffer,  or  the  return   points   to   **environ,   then   a
           many-reader/1-writer mutex will work; otherwise an exclusive locking
           mutex is required to prevent races.

       "HAS_PTHREAD_ATFORK"
           This symbol, if defined, indicates that the "pthread_atfork" routine
           is available to setup fork handlers.

       "HAS_PTHREAD_ATTR_SETSCOPE"
           This  symbol, if defined, indicates that the "pthread_attr_setscope"
           system call is available to set the contention scope attribute of  a
           thread attribute object.

       "HAS_PTHREAD_YIELD"
           This  symbol, if defined, indicates that the "pthread_yield" routine
           is  available  to  yield  the  execution  of  the  current   thread.
           "sched_yield" is preferable to "pthread_yield".

       "HAS_SCHED_YIELD"
           This symbol, if defined, indicates that the "sched_yield" routine is
           available   to   yield   the   execution   of  the  current  thread.
           "sched_yield" is preferable to "pthread_yield".

       "I_MACH_CTHREADS"
           This symbol, if defined, indicates to the C program that  it  should
           include mach/cthreads.h.

            #ifdef I_MACH_CTHREADS
                #include <mach_cthreads.h>
            #endif

       "I_PTHREAD"
           This  symbol,  if defined, indicates to the C program that it should
           include pthread.h.

            #ifdef I_PTHREAD
                #include <pthread.h>
            #endif

       "MULTIPLICITY"
           This symbol, if defined, indicates that Perl should be built to  use
           multiplicity.

       "OLD_PTHREAD_CREATE_JOINABLE"
           This symbol, if defined, indicates how to create pthread in joinable
           (aka  undetached)  state.   "NOTE": not defined if pthread.h already
           has  defined  "PTHREAD_CREATE_JOINABLE"  (the  new  version  of  the
           constant).  If defined, known values are "PTHREAD_CREATE_UNDETACHED"
           and "__UNDETACHED".

       "OLD_PTHREADS_API"
           This  symbol, if defined, indicates that Perl should be built to use
           the old draft "POSIX" threads "API".

       "PERL_IMPLICIT_CONTEXT"
           Described in perlguts.

       "PERL_NO_GET_CONTEXT"
           Described in perlguts.

       "pTHX"
           Described in perlguts.

       "pTHX_"
           Described in perlguts.

       "SCHED_YIELD"
           This symbol defines the way to yield the execution  of  the  current
           thread.    Known   ways   are  "sched_yield",  "pthread_yield",  and
           "pthread_yield" with "NULL".

COPs and Hint Hashes
       "cop_fetch_label"
           NOTE: "cop_fetch_label" is experimental and may change or be removed
           without notice.

           Returns the label attached to a cop, and stores its length in  bytes
           into  *len.  Upon return, *flags will be set to either "SVf_UTF8" or
           0.

           Alternatively, use the macro "CopLABEL_len_flags"; or if  you  don't
           need to know if the label is UTF-8 or not, the macro "CopLABEL_len";
           or if you additionally don't need to know the length, "CopLABEL".

            const char *  cop_fetch_label(COP * const cop, STRLEN *len,
                                          U32 *flags)

       "CopFILE"
           Returns the name of the file associated with the "COP" "c"

            const char *  CopFILE(const COP * c)

       "CopFILEAV"
           Returns  the  AV  associated  with  the  "COP"  "c",  creating it if
           necessary.

            AV *  CopFILEAV(const COP * c)

       "CopFILEAVn"
           Returns the AV associated with the "COP" "c", returning NULL  if  it
           doesn't already exist.

            AV *  CopFILEAVn(const COP * c)

       "CopFILE_copy"
           Efficiently  copies the cop file name from one COP to another. Wraps
           the required logic to do a refcounted copy under threads or not.

            void  CopFILE_copy(COP * dst, COP * src)

       "CopFILE_free"
           Frees the file data in a cop. Under the hood this is  a  refcounting
           operation.

            void  CopFILE_free(COP * c)

       "CopFILEGV"
           Returns the GV associated with the "COP" "c"

            GV *  CopFILEGV(const COP * c)

       "CopFILEGV_set"
           Available only on unthreaded perls.  Makes "pv" the name of the file
           associated with the "COP" "c"

            void  CopFILEGV_set(COP *c, GV *gv)

       "CopFILE_LEN"
           Returns the length of the file associated with the "COP" "c"

            const char *  CopFILE_LEN(const COP * c)

       "CopFILE_set"
           Makes "pv" the name of the file associated with the "COP" "c"

            void  CopFILE_set(COP * c, const char * pv)

       "CopFILE_setn"
           Makes "pv" the name of the file associated with the "COP" "c"

            void  CopFILE_setn(COP * c, const char * pv, STRLEN len)

       "CopFILESV"
           Returns the SV associated with the "COP" "c"

            SV *  CopFILESV(const COP * c)

       "cophh_copy"
           NOTE:  "cophh_copy"  is  experimental  and  may change or be removed
           without notice.

           Make and return a complete copy of the cop hints hash "cophh".

            COPHH *  cophh_copy(COPHH *cophh)

       "cophh_delete_pv"
       "cophh_delete_pvn"
       "cophh_delete_pvs"
       "cophh_delete_sv"
           NOTE: all these forms are experimental and may change or be  removed
           without notice.

           These  delete a key and its associated value from the cop hints hash
           "cophh", and return the modified hash.  The returned hash pointer is
           in general not the same as the hash pointer that was passed in.  The
           input hash is consumed by the function, and the pointer to  it  must
           not be subsequently used.  Use "cophh_copy" if you need both hashes.

           The forms differ in how the key is specified.  In all forms, the key
           is  pointed  to  by  "key".   In the plain "pv" form, the key is a C
           language NUL-terminated string.  In the "pvs" form, the key is  a  C
           language   string   literal.   In  the  "pvn"  form,  an  additional
           parameter, "keylen", specifies  the  length  of  the  string,  which
           hence,  may contain embedded-NUL characters.  In the "sv" form, *key
           is an SV, and  the  key  is  the  PV  extracted  from  that.   using
           "SvPV_const".

           "hash"  is  a  precomputed hash of the key string, or zero if it has
           not been precomputed.  This parameter  is  omitted  from  the  "pvs"
           form, as it is computed automatically at compile time.

           The   only  flag  currently  used  from  the  "flags"  parameter  is
           "COPHH_KEY_UTF8".  It is illegal to set this in the "sv"  form.   In
           the "pv*" forms, it specifies whether the key octets are interpreted
           as  UTF-8  (if  set) or as Latin-1 (if cleared).  The "sv" form uses
           the underlying SV to determine the UTF-8ness of the octets.

            COPHH *  cophh_delete_pv (COPHH *cophh, const char *key, U32 hash,
                                      U32 flags)
            COPHH *  cophh_delete_pvn(COPHH *cophh, const char *key,
                                      STRLEN keylen, U32 hash, U32 flags)
            COPHH *  cophh_delete_pvs(COPHH *cophh, "key", U32 flags)
            COPHH *  cophh_delete_sv (COPHH *cophh, SV *key, U32 hash,
                                      U32 flags)

       "cophh_exists_pvn"
           NOTE: "cophh_exists_pvn"  is  experimental  and  may  change  or  be
           removed without notice.

           These look up the hint entry in the cop "cop" with the key specified
           by "key" (and "keylen" in the "pvn" form), returning true if a value
           exists, and false otherwise.

           The  forms  differ  in  how the key is specified.  In the plain "pv"
           form, the key is a C language NUL-terminated string.  In  the  "pvs"
           form, the key is a C language string literal.  In the "pvn" form, an
           additional  parameter, "keylen", specifies the length of the string,
           which hence, may contain embedded-NUL characters.  In the "sv" form,
           *key is an SV, and the key is the PV  extracted  from  that.   using
           "SvPV_const".

           "hash"  is  a  precomputed hash of the key string, or zero if it has
           not been precomputed.  This parameter  is  omitted  from  the  "pvs"
           form, as it is computed automatically at compile time.

           The   only  flag  currently  used  from  the  "flags"  parameter  is
           "COPHH_KEY_UTF8".  It is illegal to set this in the "sv"  form.   In
           the "pv*" forms, it specifies whether the key octets are interpreted
           as  UTF-8  (if  set) or as Latin-1 (if cleared).  The "sv" form uses
           the underlying SV to determine the UTF-8ness of the octets.

            bool  cophh_exists_pvn(const COPHH *cophh, const char *key,
                                   STRLEN keylen, U32 hash, U32 flags)

       "cophh_fetch_pv"
       "cophh_fetch_pvn"
       "cophh_fetch_pvs"
       "cophh_fetch_sv"
           NOTE: all these forms are experimental and may change or be  removed
           without notice.

           These  look  up the entry in the cop hints hash "cophh" with the key
           specified by "key" (and "keylen" in the "pvn" form), returning  that
           value  as a mortal scalar copy, or &PL_sv_placeholder if there is no
           value associated with the key.

           The forms differ in how the key is specified.   In  the  plain  "pv"
           form,  the  key is a C language NUL-terminated string.  In the "pvs"
           form, the key is a C language string literal.  In the "pvn" form, an
           additional parameter, "keylen", specifies the length of the  string,
           which hence, may contain embedded-NUL characters.  In the "sv" form,
           *key  is  an  SV,  and the key is the PV extracted from that.  using
           "SvPV_const".

           "hash" is a precomputed hash of the key string, or zero  if  it  has
           not  been  precomputed.   This  parameter  is omitted from the "pvs"
           form, as it is computed automatically at compile time.

           The  only  flag  currently  used  from  the  "flags"  parameter   is
           "COPHH_KEY_UTF8".   It  is illegal to set this in the "sv" form.  In
           the "pv*" forms, it specifies whether the key octets are interpreted
           as UTF-8 (if set) or as Latin-1 (if cleared).  The  "sv"  form  uses
           the underlying SV to determine the UTF-8ness of the octets.

            SV *  cophh_fetch_pv (const COPHH *cophh, const char *key,
                                  U32 hash, U32 flags)
            SV *  cophh_fetch_pvn(const COPHH *cophh, const char *key,
                                  STRLEN keylen, U32 hash, U32 flags)
            SV *  cophh_fetch_pvs(const COPHH *cophh, "key", U32 flags)
            SV *  cophh_fetch_sv (const COPHH *cophh, SV *key, U32 hash,
                                  U32 flags)

       "cophh_free"
           NOTE:  "cophh_free"  is  experimental  and  may change or be removed
           without notice.

           Discard the cop hints hash "cophh", freeing all resources associated
           with it.

            void  cophh_free(COPHH *cophh)

       "cophh_2hv"
           NOTE: "cophh_2hv" is experimental  and  may  change  or  be  removed
           without notice.

           Generates and returns a standard Perl hash representing the full set
           of  key/value  pairs  in  the  cop  hints  hash "cophh".  "flags" is
           currently unused and must be zero.

            HV *  cophh_2hv(const COPHH *cophh, U32 flags)

       "cophh_new_empty"
           NOTE: "cophh_new_empty" is experimental and may change or be removed
           without notice.

           Generate and return a fresh cop hints hash containing no entries.

            COPHH *  cophh_new_empty()

       "cophh_store_pv"
       "cophh_store_pvn"
       "cophh_store_pvs"
       "cophh_store_sv"
           NOTE: all these forms are experimental and may change or be  removed
           without notice.

           These  store  a  value, associated with a key, in the cop hints hash
           "cophh", and return the modified hash.  The returned hash pointer is
           in general not the same as the hash pointer that was passed in.  The
           input hash is consumed by the function, and the pointer to  it  must
           not be subsequently used.  Use "cophh_copy" if you need both hashes.

           "value"  is  the  scalar  value  to  store for this key.  "value" is
           copied by these functions, which thus do not take ownership  of  any
           reference  to  it, and hence later changes to the scalar will not be
           reflected in the value visible in the cop hints hash.  Complex types
           of scalar will not be stored with referential integrity, but will be
           coerced to strings.

           The forms differ in how the key is specified.  In all forms, the key
           is pointed to by "key".  In the plain "pv" form,  the  key  is  a  C
           language  NUL-terminated  string.  In the "pvs" form, the key is a C
           language  string  literal.   In  the  "pvn"  form,   an   additional
           parameter,  "keylen",  specifies  the  length  of  the string, which
           hence, may contain embedded-NUL characters.  In the "sv" form,  *key
           is  an  SV,  and  the  key  is  the  PV  extracted from that.  using
           "SvPV_const".

           "hash" is a precomputed hash of the key string, or zero  if  it  has
           not  been  precomputed.   This  parameter  is omitted from the "pvs"
           form, as it is computed automatically at compile time.

           The  only  flag  currently  used  from  the  "flags"  parameter   is
           "COPHH_KEY_UTF8".   It  is illegal to set this in the "sv" form.  In
           the "pv*" forms, it specifies whether the key octets are interpreted
           as UTF-8 (if set) or as Latin-1 (if cleared).  The  "sv"  form  uses
           the underlying SV to determine the UTF-8ness of the octets.

            COPHH *  cophh_store_pv (COPHH *cophh, const char *key, U32 hash,
                                     SV *value, U32 flags)
            COPHH *  cophh_store_pvn(COPHH *cophh, const char *key,
                                     STRLEN keylen, U32 hash, SV *value,
                                     U32 flags)
            COPHH *  cophh_store_pvs(COPHH *cophh, "key", SV *value,
                                     U32 flags)
            COPHH *  cophh_store_sv (COPHH *cophh, SV *key, U32 hash,
                                     SV *value, U32 flags)

       "cop_hints_exists_pv"
       "cop_hints_exists_pvn"
       "cop_hints_exists_pvs"
       "cop_hints_exists_sv"
           These look up the hint entry in the cop "cop" with the key specified
           by "key" (and "keylen" in the "pvn" form), returning true if a value
           exists, and false otherwise.

           The forms differ in how the key is specified.  In all forms, the key
           is  pointed  to  by  "key".   In the plain "pv" form, the key is a C
           language NUL-terminated string.  In the "pvs" form, the key is  a  C
           language   string   literal.   In  the  "pvn"  form,  an  additional
           parameter, "keylen", specifies  the  length  of  the  string,  which
           hence,  may contain embedded-NUL characters.  In the "sv" form, *key
           is an SV, and  the  key  is  the  PV  extracted  from  that.   using
           "SvPV_const".

           "hash"  is  a  precomputed hash of the key string, or zero if it has
           not been precomputed.  This parameter  is  omitted  from  the  "pvs"
           form, as it is computed automatically at compile time.

           The   only  flag  currently  used  from  the  "flags"  parameter  is
           "COPHH_KEY_UTF8".  It is illegal to set this in the "sv"  form.   In
           the "pv*" forms, it specifies whether the key octets are interpreted
           as  UTF-8  (if  set) or as Latin-1 (if cleared).  The "sv" form uses
           the underlying SV to determine the UTF-8ness of the octets.

            bool  cop_hints_exists_pv (const COP *cop, const char *key,
                                       U32 hash, U32 flags)
            bool  cop_hints_exists_pvn(const COP *cop, const char *key,
                                       STRLEN keylen, U32 hash, U32 flags)
            bool  cop_hints_exists_pvs(const COP *cop, "key", U32 flags)
            bool  cop_hints_exists_sv (const COP *cop, SV *key, U32 hash,
                                       U32 flags)

       "cop_hints_fetch_pv"
       "cop_hints_fetch_pvn"
       "cop_hints_fetch_pvs"
       "cop_hints_fetch_sv"
           These look up the hint entry in the cop "cop" with the key specified
           by "key" (and "keylen" in the "pvn" form), returning that value as a
           mortal scalar copy, or  &PL_sv_placeholder  if  there  is  no  value
           associated with the key.

           The  forms  differ  in  how the key is specified.  In the plain "pv"
           form, the key is a C language NUL-terminated string.  In  the  "pvs"
           form, the key is a C language string literal.  In the "pvn" form, an
           additional  parameter, "keylen", specifies the length of the string,
           which hence, may contain embedded-NUL characters.  In the "sv" form,
           *key is an SV, and the key is the PV  extracted  from  that.   using
           "SvPV_const".

           "hash"  is  a  precomputed hash of the key string, or zero if it has
           not been precomputed.  This parameter  is  omitted  from  the  "pvs"
           form, as it is computed automatically at compile time.

           The   only  flag  currently  used  from  the  "flags"  parameter  is
           "COPHH_KEY_UTF8".  It is illegal to set this in the "sv"  form.   In
           the "pv*" forms, it specifies whether the key octets are interpreted
           as  UTF-8  (if  set) or as Latin-1 (if cleared).  The "sv" form uses
           the underlying SV to determine the UTF-8ness of the octets.

            SV *  cop_hints_fetch_pv (const COP *cop, const char *key,
                                      U32 hash, U32 flags)
            SV *  cop_hints_fetch_pvn(const COP *cop, const char *key,
                                      STRLEN keylen, U32 hash, U32 flags)
            SV *  cop_hints_fetch_pvs(const COP *cop, "key", U32 flags)
            SV *  cop_hints_fetch_sv (const COP *cop, SV *key, U32 hash,
                                      U32 flags)

       "cop_hints_2hv"
           Generates and returns a standard Perl hash representing the full set
           of hint entries in the cop "cop".  "flags" is currently  unused  and
           must be zero.

            HV *  cop_hints_2hv(const COP *cop, U32 flags)

       "CopLABEL"
       "CopLABEL_len"
       "CopLABEL_len_flags"
           These return the label attached to a cop.

           "CopLABEL_len"   and  "CopLABEL_len_flags"  additionally  store  the
           number of bytes comprising the returned label into *len.

           "CopLABEL_len_flags"  additionally  returns  the  UTF-8ness  of  the
           returned label, by setting *flags to 0 or "SVf_UTF8".

            const char *  CopLABEL          (COP *const cop)
            const char *  CopLABEL_len      (COP *const cop, STRLEN *len)
            const char *  CopLABEL_len_flags(COP *const cop, STRLEN *len,
                                             U32 *flags)

       "CopLINE"
           Returns the line number in the source code associated with the "COP"
           "c"

            line_t  CopLINE(const COP * c)

       "CopSTASH"
           Returns the stash associated with "c".

            HV *  CopSTASH(const COP * c)

       "CopSTASH_eq"
           Returns  a boolean as to whether or not "hv" is the stash associated
           with "c".

            bool  CopSTASH_eq(const COP * c, const HV * hv)

       "CopSTASHPV"
           Returns the package name of the stash associated with "c", or "NULL"
           if no associated stash

            char *  CopSTASHPV(const COP * c)

       "CopSTASHPV_set"
           Set the package name of the stash associated with "c", to  the  NUL-
           terminated C string "p", creating the package if necessary.

            void  CopSTASHPV_set(COP * c, const char * pv)

       "CopSTASH_set"
           Set the stash associated with "c" to "hv".

            bool  CopSTASH_set(COP * c, HV * hv)

       "cop_store_label"
           NOTE: "cop_store_label" is experimental and may change or be removed
           without notice.

           Save  a  label  into  a  "cop_hints_hash".  You need to set flags to
           "SVf_UTF8" for a UTF-8 label.  Any other flag is ignored.

            void  cop_store_label(COP * const cop, const char *label,
                                  STRLEN len, U32 flags)

       "PERL_SI"
           Use this typedef to declare  variables  that  are  to  hold  "struct
           stackinfo".

       "PL_curcop"
           The  currently  active  COP  (control  op)  roughly representing the
           current statement in the source.

           On threaded perls, each thread  has  an  independent  copy  of  this
           variable;  each  initialized at creation time with the current value
           of the creating thread's copy.

            COP*  PL_curcop

       "RCPV_LEN"
           Returns the length of a pv created with 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  "pv" was actually allocated with rcpv_new(), it is the callers
           responsibility to ensure that this is the case.

            RCPV *  RCPV_LEN(char *pv)

       "RCPV_REFCNT_dec"
           Decrements the refcount for a "char *"  pointer  which  was  created
           with  a  call to rcpv_new(). Same as calling rcpv_free().  No checks
           are performed to  ensure  that  "pv"  was  actually  allocated  with
           rcpv_new(),  it is the callers responsibility to ensure that this is
           the case.

            RCPV *  RCPV_REFCNT_dec(char *pv)

       "RCPV_REFCNT_inc"
           Increments the refcount for a "char *"  pointer  which  was  created
           with  a  call to rcpv_new(). Same as calling rcpv_copy().  No checks
           are performed to  ensure  that  "pv"  was  actually  allocated  with
           rcpv_new(),  it is the callers responsibility to ensure that this is
           the case.

            RCPV *  RCPV_REFCNT_inc(char *pv)

       "RCPV_REFCOUNT"
           Returns the refcount for a pv created with  rcpv_new().   No  checks
           are  performed  to  ensure  that  "pv"  was  actually allocated with
           rcpv_new(), it is the callers responsibility to ensure that this  is
           the case.

            RCPV *  RCPV_REFCOUNT(char *pv)

       "RCPVx"
           Returns  the RCPV structure (struct rcpv) for a refcounted string pv
           created with rcpv_new().  No checks are  performed  to  ensure  that
           "pv"  was  actually  allocated  with  rcpv_new(),  it is the callers
           responsibility to ensure that this is the case.

            RCPV *  RCPVx(char *pv)

Custom Operators
       "custom_op_register"
           Register a custom op.  See "Custom Operators" in perlguts.

           NOTE:   "custom_op_register"   must   be   explicitly   called    as
           "Perl_custom_op_register" with an "aTHX_" parameter.

            void  Perl_custom_op_register(pTHX_ Perl_ppaddr_t ppaddr,
                                          const XOP *xop)

       "Perl_custom_op_xop"
           Return  the  XOP structure for a given custom op.  This macro should
           be considered internal to "OP_NAME" and the other access macros: use
           them instead.  This macro does call a function.   Prior  to  5.19.6,
           this was implemented as a function.

            const XOP *  Perl_custom_op_xop(pTHX_ const OP *o)

       "XopDISABLE"
           Temporarily disable a member of the XOP, by clearing the appropriate
           flag.

            void  XopDISABLE(XOP *xop, token which)

       "XopENABLE"
           Reenable a member of the XOP which has been disabled.

            void  XopENABLE(XOP *xop, token which)

       "XopENTRY"
           Return  a  member  of  the  XOP  structure.   "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 on "which".
           This macro evaluates its arguments more than once.  If you are using
           "Perl_custom_op_xop" to retrieve a "XOP *" from a "OP  *",  use  the
           more efficient "XopENTRYCUSTOM" instead.

              XopENTRY(XOP *xop, token which)

       "XopENTRYCUSTOM"
           Exactly like "XopENTRY(XopENTRY(Perl_custom_op_xop(aTHX_ o), which)"
           but   more   efficient.   The  "which"  parameter  is  identical  to
           "XopENTRY".

              XopENTRYCUSTOM(const OP *o, token which)

       "XopENTRY_set"
           Set a  member  of  the  XOP  structure.   "which"  is  a  cpp  token
           indicating  which  entry to set.  See "Custom Operators" in perlguts
           for details about the available members and how they are used.  This
           macro evaluates its argument more than once.

            void  XopENTRY_set(XOP *xop, token which, value)

       "XopFLAGS"
           Return the XOP's flags.

            U32  XopFLAGS(XOP *xop)

CV Handling
       This section documents functions  to  manipulate  CVs  which  are  code-
       values, meaning subroutines.  For more information, see perlguts.

       "caller_cx"
           The    XSUB-writer's   equivalent   of   caller().    The   returned
           "PERL_CONTEXT"  structure  can  be  interrogated  to  find  all  the
           information returned to Perl by "caller".  Note that XSUBs don't get
           a  stack  frame, so "caller_cx(0, NULL)" will return information for
           the immediately-surrounding Perl code.

           This function skips over the automatic calls to &DB::sub made on the
           behalf of the debugger.  If the stack  frame  requested  was  a  sub
           called by "DB::sub", the return value will be the frame for the call
           to  "DB::sub",  since  that has the correct line number/etc. for the
           call site.  If dbcxp is non-"NULL", it will be set to a  pointer  to
           the frame for the sub call itself.

            const PERL_CONTEXT *  caller_cx(I32 level,
                                            const PERL_CONTEXT **dbcxp)

       "CvDEPTH"
           Returns the recursion level of the CV "sv".  Hence >= 2 indicates we
           are in a recursive call.

            I32 *  CvDEPTH(const CV * const sv)

       "CvGV"
           Returns  the  GV  associated  with  the  CV  "sv",  reifying  it  if
           necessary.

            GV *  CvGV(CV *sv)

       "CvSTASH"
           Returns the stash of the CV.  A stash  is  the  symbol  table  hash,
           containing  the  package-scoped  variables  in the package where the
           subroutine was defined.  For more information, see perlguts.

           This also has a special use with XS AUTOLOAD subs.  See "Autoloading
           with XSUBs" in perlguts.

            HV*  CvSTASH(CV* cv)

       "find_runcv"
           Locate the CV corresponding to the currently executing sub or  eval.
           If  "db_seqp"  is  non_null, skip CVs that are in the DB package and
           populate *db_seqp with the cop sequence number at the point that the
           DB:: code was entered.  (This allows debuggers to eval in the  scope
           of the breakpoint rather than in the scope of the debugger itself.)

            CV *  find_runcv(U32 *db_seqp)

       "get_cv"
       "get_cvn_flags"
       "get_cvs"
           These  return  the CV of the specified Perl subroutine.  "flags" are
           passed to "gv_fetchpvn_flags".  If "GV_ADD"  is  set  and  the  Perl
           subroutine  does  not  exist then it will be declared (which has the
           same effect as saying "sub name;").  If "GV_ADD" is not set and  the
           subroutine does not exist, then NULL is returned.

           The  forms  differ  only  in how the subroutine is specified..  With
           "get_cvs", the name is  a  literal  C  string,  enclosed  in  double
           quotes.   With  "get_cv", the name is given by the "name" parameter,
           which must be a NUL-terminated C string.  With "get_cvn_flags",  the
           name  is also given by the "name" parameter, but it is a Perl string
           (possibly containing embedded NUL bytes), and its length in bytes is
           contained in the "len" parameter.

           NOTE: the perl_get_cv() form is deprecated.

           NOTE: the perl_get_cvn_flags() form is deprecated.

           NOTE: the perl_get_cvs() form is deprecated.

            CV *  get_cv       (const char *name, I32 flags)
            CV *  get_cvn_flags(const char *name, STRLEN len, I32 flags)
            CV *  get_cvs      ("string", I32 flags)

       "Nullcv"
           "DEPRECATED!"  It is  planned  to  remove  "Nullcv"  from  a  future
           release  of  Perl.   Do  not  use  it  for  new code; remove it from
           existing code.

           Null CV pointer.

           (deprecated - use "(CV *)NULL" instead)

Debugging
       "av_dump"
           Dumps the contents of an AV to the "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.

            void  av_dump(AV *av)

       "deb"
       "deb_nocontext"
           When perl is compiled with "-DDEBUGGING", this prints to STDERR  the
           information given by the arguments, prefaced by the name of the file
           containing  the  script causing the call, and the line number within
           that file.

           If the "v" (verbose) debugging option is in effect, the  process  id
           is also printed.

           The  two  forms  differ only in that "deb_nocontext" does not take a
           thread context ("aTHX") parameter, so is used  in  situations  where
           the caller doesn't already have the thread context.

           NOTE:  "deb" must be explicitly called as "Perl_deb" with an "aTHX_"
           parameter.

            void  Perl_deb     (pTHX_ const char *pat, ...)
            void  deb_nocontext(const char *pat, ...)

       "debstack"
           Dump the current stack

            I32  debstack()

       "dump_all"
           Dumps  the  entire  optree  of  the  current  program  starting   at
           "PL_main_root"  to "STDERR".  Also dumps the optrees for all visible
           subroutines in "PL_defstash".

            void  dump_all()

       "dump_c_backtrace"
           Dumps the C backtrace to the given "fp".

           Returns true if a backtrace could be retrieved, false if not.

            bool  dump_c_backtrace(PerlIO *fp, int max_depth, int skip)

       "dump_eval"
           Described in perlguts.

            void  dump_eval()

       "dump_form"
           Dumps the contents of  the  format  contained  in  the  GV  "gv"  to
           "STDERR", or a message that one doesn't exist.

            void  dump_form(const GV *gv)

       "dump_packsubs"
           Dumps the optrees for all visible subroutines in "stash".

            void  dump_packsubs(const HV *stash)

       "dump_sub"
           Described in perlguts.

            void  dump_sub(const GV *gv)

       "get_c_backtrace_dump"
           Returns  a SV containing a dump of "depth" frames of the call stack,
           skipping the "skip"  innermost  ones.   "depth"  of  20  is  usually
           enough.

           The appended output looks like:

            ...
            1   10e004812:0082   Perl_croak   util.c:1716    /usr/bin/perl
            2   10df8d6d2:1d72   perl_parse   perl.c:3975    /usr/bin/perl
            ...

           The  fields  are tab-separated.  The first column is the depth (zero
           being the innermost non-skipped frame).  In the hex:offset, the  hex
           is  where the program counter was in "S_parse_body", and the :offset
           (might be missing) tells how  much  inside  the  "S_parse_body"  the
           program counter was.

           The "util.c:1716" is the source code file and line number.

           The /usr/bin/perl is obvious (hopefully).

           Unknowns  are  "-".  Unknowns can happen unfortunately quite easily:
           if the platform doesn't support retrieving the information;  if  the
           binary  is  missing  the  debug  information;  if  the optimizer has
           transformed the code by for example inlining.

            SV *  get_c_backtrace_dump(int max_depth, int skip)

       "gv_dump"
           Dump the name and, if they differ, the effective name of the GV "gv"
           to "STDERR".

            void  gv_dump(GV *gv)

       "HAS_BACKTRACE"
           This symbol, if defined, indicates that the backtrace()  routine  is
           available  to  get  a  stack  trace.   The execinfo.h header must be
           included to use this routine.

       "hv_dump"
           Dumps the contents of an HV to the "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.

            void  hv_dump(HV *hv)

       "magic_dump"
           Dumps the contents of the MAGIC "mg" to "STDERR".

            void  magic_dump(const MAGIC *mg)

       "op_class"
           Given an op, determine what type of struct it has been allocated as.
           Returns one of the OPclass enums, such as OPclass_LISTOP.

            OPclass  op_class(const OP *o)

       "op_dump"
           Dumps the optree starting at OP "o" to "STDERR".

            void  op_dump(const OP *o)

       "PL_op"
           Described in perlhacktips.

       "PL_runops"
           Described in perlguts.

       "PL_sv_serial"
           Described in perlhacktips.

       "pmop_dump"
           Dump  an  OP  that  is  related  to  Pattern   Matching,   such   as
           "s/foo/bar/"; these require special handling.

            void  pmop_dump(PMOP *pm)

       "sv_dump"
           Dumps the contents of an SV to the "STDERR" filehandle.

           For  an  example  of  its output, see 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 av_dump() or hv_dump().

            void  sv_dump(SV *sv)

       "sv_dump_depth"
           Dumps the contents of an SV to the "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.

            void  sv_dump_depth(SV *sv, I32 depth)

       "vdeb"
           This is like "deb", but "args" are an encapsulated argument list.

            void  vdeb(const char *pat, va_list *args)

Display functions
       "form"
       "form_nocontext"
           These  take a sprintf-style format pattern and conventional (non-SV)
           arguments and return the formatted string.

               (char *) Perl_form(aTHX_ const char* pat, ...)

           They can be used any place a string (char *) is required:

               char * s = form_nocontext("%d.%d", major, minor);

           They  each  return  a  temporary  that   will   be   freed   "soon",
           automatically  by  the system, at the same time that SVs operated on
           by "sv_2mortal" are freed.

           Use the result immediately, or copy to a  stable  place  for  longer
           retention.  This is contrary to the incorrect previous documentation
           of  these  that  claimed  that  the  return  was a single per-thread
           buffer.  That was (and is) actually true only when these are  called
           during global destruction.

           The  two  forms differ only in that "form_nocontext" does not take a
           thread context ("aTHX") parameter, so is used  in  situations  where
           the caller doesn't already have the thread context.

           "vform"  is  the  same  except  the  arguments  are  an encapsulated
           argument list.

           NOTE: "form" must  be  explicitly  called  as  "Perl_form"  with  an
           "aTHX_" parameter.

            char *  Perl_form     (pTHX_ const char *pat, ...)
            char *  form_nocontext(const char *pat, ...)

       "mess"
       "mess_nocontext"
           These  take  a sprintf-style format pattern and argument list, which
           are used to generate a string message.  If the message does not  end
           with a newline, then it will be extended with some indication of the
           current location in the code, as described for "mess_sv".

           Normally, the resulting message is returned in a new mortal SV.  But
           during  global destruction a single SV may be shared between uses of
           this function.

           The two forms differ only in that "mess_nocontext" does not  take  a
           thread  context  ("aTHX")  parameter, so is used in situations where
           the caller doesn't already have the thread context.

           NOTE: "mess" must  be  explicitly  called  as  "Perl_mess"  with  an
           "aTHX_" parameter.

            SV *  Perl_mess     (pTHX_ const char *pat, ...)
            SV *  mess_nocontext(const char *pat, ...)

       "mess_sv"
           Expands  a  message, intended for the user, to include an indication
           of the current location in the code, if the message does not already
           appear to be complete.

           "basemsg" is the initial message or object.  If it is  a  reference,
           it  will  be  used  as-is  and  will be the result of this function.
           Otherwise it is used as a string, and if  it  already  ends  with  a
           newline, it is taken to be complete, and the result of this function
           will  be  the  same  string.   If  the  message  does not end with a
           newline, then a  segment  such  as  "at  foo.pl  line  37"  will  be
           appended, and possibly other clauses indicating the current state of
           execution.  The resulting message will end with a dot and a newline.

           Normally,  the  resulting  message  is  returned in a new mortal SV.
           During global destruction a single SV may be shared between uses  of
           this function.  If "consume" is true, then the function is permitted
           (but  not  required)  to  modify  and  return  "basemsg"  instead of
           allocating a new SV.

            SV *  mess_sv(SV *basemsg, bool consume)

       "pv_display"
           Similar to

             pv_escape(dsv,pv,cur,pvlim,PERL_PV_ESCAPE_QUOTE);

           except that an additional "\0" will be appended to the  string  when
           len > cur and pv[cur] is "\0".

           Note that the final string may be up to 7 chars longer than pvlim.

            char *  pv_display(SV *dsv, const char *pv, STRLEN cur,
                               STRLEN len, STRLEN pvlim)

       "pv_escape"
           Escapes at most the first "count" chars of "pv" and puts the results
           into  "dsv" such that the size of the escaped string will not exceed
           "max" chars and will not contain any  incomplete  escape  sequences.
           The  number  of  bytes  escaped  will  be  returned  in  the "STRLEN
           *escaped" parameter if it is not null.  When the "dsv" parameter  is
           null no escaping actually occurs, but the number of bytes that would
           be escaped were it not null will be calculated.

           If  flags  contains "PERL_PV_ESCAPE_QUOTE" then any double quotes in
           the string will also be escaped.

           Normally the SV  will  be  cleared  before  the  escaped  string  is
           prepared,  but  when  "PERL_PV_ESCAPE_NOCLEAR"  is set this will not
           occur.

           If "PERL_PV_ESCAPE_UNI" is set then the input string is  treated  as
           UTF-8.   If "PERL_PV_ESCAPE_UNI_DETECT" is set then the input string
           is scanned using is_utf8_string() to determine if it is UTF-8.

           If "PERL_PV_ESCAPE_ALL" is set then all input chars will  be  output
           using "\x01F1" style escapes, otherwise if "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 "\n".
           Otherwise,  if "PERL_PV_ESCAPE_NOBACKSLASH" then all chars below 255
           will be treated as printable and will be  output  as  literals.  The
           "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 "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 "\n" or a hex value.

           If  "PERL_PV_ESCAPE_RE"  is  set then the escape char used will be a
           "%" and not a "\\". This  is  because  regexes  very  often  contain
           backslashed  sequences,  whereas  "%"  is  not a particularly common
           character in patterns.

           Returns a pointer to the escaped text as held by "dsv".

            char *  pv_escape(SV *dsv, char const * const str,
                              const STRLEN count, STRLEN max,
                              STRLEN * const escaped, U32 flags)

       "pv_pretty"
           Converts a string into something presentable, handling escaping  via
           pv_escape() and supporting quoting and ellipses.

           If  the  "PERL_PV_PRETTY_QUOTE"  flag is set then the result will be
           double  quoted  with  any  double  quotes  in  the  string  escaped.
           Otherwise  if  the "PERL_PV_PRETTY_LTGT" flag is set then the result
           be wrapped in angle brackets.

           If the "PERL_PV_PRETTY_ELLIPSES" flag is set and not all  characters
           in string were output then an ellipsis "..." will be appended to the
           string.  Note that this happens AFTER it has been quoted.

           If  "start_color"  is  non-null  then  it will be inserted after the
           opening quote (if there is one) but before  the  escaped  text.   If
           "end_color"  is  non-null then it will be inserted after the escaped
           text but before any quotes or ellipses.

           Returns a pointer to the prettified text as held by "dsv".

            char *  pv_pretty(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)

       "vform"
           Like "form" except the arguments are an encapsulated argument list.

            char *  vform(const char *pat, va_list *args)

       "vmess"
           "pat" and "args" are a sprintf-style format pattern and encapsulated
           argument list, respectively.  These are used to  generate  a  string
           message.   If  the message does not end with a newline, then it will
           be extended with some indication of  the  current  location  in  the
           code, as described for "mess_sv".

           Normally,  the  resulting  message  is  returned in a new mortal SV.
           During global destruction a single SV may be shared between uses  of
           this function.

            SV *  vmess(const char *pat, va_list *args)

Embedding, Threads, and Interpreter Cloning
       "call_atexit"
           Add  a function "fn" to the list of functions to be called at global
           destruction.  "ptr" will be passed as an argument to  "fn";  it  can
           point to a "struct" so that you can pass anything you want.

           Note  that  under  threads,  "fn"  may  run multiple times.  This is
           because the list is executed each time the current or any descendent
           thread terminates.

            void  call_atexit(ATEXIT_t fn, void *ptr)

       "cv_clone"
           Clone  a  CV,  making  a  lexical  closure.   "proto"  supplies  the
           prototype  of  the  function:  its  code,  pad  structure, and other
           attributes.  The prototype is  combined  with  a  capture  of  outer
           lexicals  to  which  the  code  refers,  which  are  taken  from the
           currently-executing instance of the immediately surrounding code.

            CV *  cv_clone(CV *proto)

       "cv_name"
           Returns an SV containing the name of the CV, mainly for use in error
           reporting.  The CV may actually be a GV instead, in which  case  the
           returned  SV holds the GV's name.  Anything other than a GV or CV is
           treated as a string already holding the sub  name,  but  this  could
           change in the future.

           An  SV  may be passed as a second argument.  If so, the name will be
           assigned to it and it will be returned.  Otherwise the  returned  SV
           will be a new mortal.

           If  "flags" has the "CV_NAME_NOTQUAL" bit set, then the package name
           will not be included.  If the first argument is neither a CV  nor  a
           GV, this flag is ignored (subject to change).

            SV *  cv_name(CV *cv, SV *sv, U32 flags)

       "cv_undef"
           Clear out all the active components of a CV.  This can happen either
           by  an  explicit  "undef  &foo",  or by the reference count going to
           zero.  In the former case, we keep the "CvOUTSIDE" pointer, so  that
           any  anonymous  children  can  still  follow  the full lexical scope
           chain.

            void  cv_undef(CV *cv)

       "find_rundefsv"
           Returns the global variable $_.

            SV *  find_rundefsv()

       "get_op_descs"
           "DEPRECATED!"  It is planned to remove "get_op_descs" from a  future
           release  of  Perl.   Do  not  use  it  for  new code; remove it from
           existing code.

           Return a pointer to the array of all the descriptions of the various
           OPs Given an opcode from the enum in opcodes.h, "PL_op_desc[opcode]"
           returns a pointer to a C language string giving its description.

            char **  get_op_descs()

       "get_op_names"
           "DEPRECATED!"  It is planned to remove "get_op_names" from a  future
           release  of  Perl.   Do  not  use  it  for  new code; remove it from
           existing code.

           Return a pointer to the array of all the names of  the  various  OPs
           Given  an  opcode  from  the enum in opcodes.h, "PL_op_name[opcode]"
           returns a pointer to a C language string giving its name.

            char **  get_op_names()

       "HAS_SKIP_LOCALE_INIT"
           Described in perlembed.

       "intro_my"
           "Introduce" "my" variables to visible status.  This is called during
           parsing at the end of  each  statement  to  make  lexical  variables
           visible to subsequent statements.

            U32  intro_my()

       "load_module"
       "load_module_nocontext"
           These load the module whose name is pointed to by the string part of
           "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  "use  Foo::Bar
           VERSION".  The  optional  trailing  arguments can be used to specify
           arguments to the module's import() method, similar to "use  Foo::Bar
           VERSION  LIST";  their  precise  handling  depends on the flags. The
           flags  argument   is   a   bitwise-ORed   collection   of   any   of
           "PERL_LOADMOD_DENY",           "PERL_LOADMOD_NOIMPORT",           or
           "PERL_LOADMOD_IMPORT_OPS" (or 0 for no flags).

           If "PERL_LOADMOD_NOIMPORT" is set, the module is loaded as  if  with
           an  empty  import  list,  as  in "use Foo::Bar ()"; this is the only
           circumstance in which the trailing optional arguments may be omitted
           entirely.  Otherwise,  if  "PERL_LOADMOD_IMPORT_OPS"  is  set,   the
           trailing arguments must consist of exactly one "OP*", containing the
           op  tree that produces the relevant import arguments. Otherwise, the
           trailing arguments must all be "SV*" values that  will  be  used  as
           import arguments; and the list must be terminated with "(SV*) NULL".
           If  neither "PERL_LOADMOD_NOIMPORT" nor "PERL_LOADMOD_IMPORT_OPS" is
           set, the trailing  "NULL"  pointer  is  needed  even  if  no  import
           arguments  are desired. The reference count for each specified "SV*"
           argument  is  decremented.  In  addition,  the  "name"  argument  is
           modified.

           If  "PERL_LOADMOD_DENY" is set, the module is loaded as if with "no"
           rather than "use".

           "load_module" and "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 "pTHX".

            void  load_module          (U32 flags, SV *name, SV *ver, ...)
            void  load_module_nocontext(U32 flags, SV *name, SV *ver, ...)

       "my_exit"
           A  wrapper  for the C library exit(3), honoring what "PL_exit_flags"
           in perlapi say to do.

            void  my_exit(U32 status)

       "my_failure_exit"
           Exit the running Perl process with an error.

           On non-VMS platforms, this is essentially equivalent to ""my_exit"",
           using "errno", but forces an en error code of 255 if "errno" is 0.

           On VMS, it takes care to set the appropriate severity  bits  in  the
           exit status.

            void  my_failure_exit()

       "my_strlcat"
           The  C  library  "strlcat" if available, or a Perl implementation of
           it.  This operates on C "NUL"-terminated strings.

           my_strlcat() appends string "src" to the  end  of  "dst".   It  will
           append   at  most  "size - strlen(dst) - 1"  bytes.   It  will  then
           "NUL"-terminate, unless "size" is 0 or the original "dst" string was
           longer than "size" (in practice this should not happen as  it  means
           that  either  "size"  is  incorrect  or  that  "dst" is not a proper
           "NUL"-terminated string).

           Note that "size" is the full size of the destination buffer and  the
           result  is guaranteed to be "NUL"-terminated if there is room.  Note
           that room for the "NUL" should be included in "size".

           The return value is the total length that "dst" would have if "size"
           is sufficiently large.  Thus it is the initial length of "dst"  plus
           the  length  of  "src".   If  "size" is smaller than the return, the
           excess was not appended.

            Size_t  my_strlcat(char *dst, const char *src, Size_t size)

       "my_strlcpy"
           The C library "strlcpy" if available, or a  Perl  implementation  of
           it.  This operates on C "NUL"-terminated strings.

           my_strlcpy()  copies up to "size - 1" bytes from the string "src" to
           "dst", "NUL"-terminating the result if "size" is not 0.

           The return value is the total length "src"  would  be  if  the  copy
           completely  succeeded.   If it is larger than "size", the excess was
           not copied.

            Size_t  my_strlcpy(char *dst, const char *src, Size_t size)

       "newPADNAMELIST"
           NOTE: "newPADNAMELIST" is experimental and may change or be  removed
           without notice.

           Creates  a  new pad name list.  "max" is the highest index for which
           space is allocated.

            PADNAMELIST *  newPADNAMELIST(size_t max)

       "newPADNAMEouter"
           NOTE: "newPADNAMEouter" is experimental and may change or be removed
           without notice.

           Constructs and returns a new pad name.  Only use this  function  for
           names  that  refer  to  outer lexicals.  (See also "newPADNAMEpvn".)
           "outer" is the outer pad name that this one mirrors.   The  returned
           pad name has the "PADNAMEf_OUTER" flag already set.

            PADNAME *  newPADNAMEouter(PADNAME *outer)

       "newPADNAMEpvn"
           NOTE:  "newPADNAMEpvn"  is experimental and may change or be removed
           without notice.

           Constructs and returns a new pad name.  "s" must be a UTF-8  string.
           Do  not  use  this  for pad names that point to outer lexicals.  See
           "newPADNAMEouter".

            PADNAME *  newPADNAMEpvn(const char *s, STRLEN len)

       "nothreadhook"
           Stub that provides thread hook for perl_destruct when there  are  no
           threads.

            int  nothreadhook()

       "pad_add_anon"
           Allocates  a  place in the currently-compiling pad (via "pad_alloc")
           for an anonymous  function  that  is  lexically  scoped  inside  the
           currently-compiling  function.   The  function "func" is linked into
           the pad, and its "CvOUTSIDE" link to the outer scope is weakened  to
           avoid a reference loop.

           One   reference   count   is   stolen,   so   you  may  need  to  do
           SvREFCNT_inc(func).

           "optype" should be an opcode indicating the type of  operation  that
           the  pad  entry  is  to  support.   This  doesn't affect operational
           semantics, but is used for debugging.

            PADOFFSET  pad_add_anon(CV *func, I32 optype)

       "pad_add_name_pv"
           Exactly like "pad_add_name_pvn", but takes a  nul-terminated  string
           instead of a string/length pair.

            PADOFFSET  pad_add_name_pv(const char *name, const U32 flags,
                                       HV *typestash, HV *ourstash)

       "pad_add_name_pvn"
           Allocates a place in the currently-compiling pad for a named lexical
           variable.   Stores  the  name and other metadata in the name part of
           the pad, and makes preparations to  manage  the  variable's  lexical
           scoping.  Returns the offset of the allocated pad slot.

           "namepv"/"namelen"  specify  the variable's name in UTF-8, including
           leading sigil.  If "typestash" is non-null, the name is for a  typed
           lexical,  and  this identifies the type.  If "ourstash" is non-null,
           it's a lexical reference to a package variable, and this  identifies
           the package.  The following 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

            PADOFFSET  pad_add_name_pvn(const char *namepv, STRLEN namelen,
                                        U32 flags, HV *typestash,
                                        HV *ourstash)

       "pad_add_name_sv"
           Exactly  like  "pad_add_name_pvn",  but takes the name string in the
           form of an SV instead of a string/length pair.

            PADOFFSET  pad_add_name_sv(SV *name, U32 flags, HV *typestash,
                                       HV *ourstash)

       "pad_alloc"
           NOTE: "pad_alloc" is experimental  and  may  change  or  be  removed
           without notice.

           Allocates  a  place  in  the  currently-compiling pad, returning the
           offset of the allocated pad slot.  No name is initially attached  to
           the  pad  slot.   "tmptype" is a set of flags indicating the kind of
           pad entry required, which will be  set  in  the  value  SV  for  the
           allocated pad entry:

               SVs_PADMY    named lexical variable ("my", "our", "state")
               SVs_PADTMP   unnamed temporary store
               SVf_READONLY constant shared between recursion levels

           "SVf_READONLY"  has  been  supported  here only since perl 5.20.  To
           work with earlier versions as well,  use  "SVf_READONLY|SVs_PADTMP".
           "SVf_READONLY"  does  not  cause the SV in the pad slot to be marked
           read-only, but simply tells "pad_alloc" that it will be  made  read-
           only (by the caller), or at least should be treated as such.

           "optype"  should  be an opcode indicating the type of operation that
           the pad entry  is  to  support.   This  doesn't  affect  operational
           semantics, but is used for debugging.

            PADOFFSET  pad_alloc(I32 optype, U32 tmptype)

       "pad_findmy_pv"
           Exactly  like  "pad_findmy_pvn",  but  takes a nul-terminated string
           instead of a string/length pair.

            PADOFFSET  pad_findmy_pv(const char *name, U32 flags)

       "pad_findmy_pvn"
           Given the name of a lexical  variable,  find  its  position  in  the
           currently-compiling  pad.  "namepv"/"namelen" specify the variable's
           name, including leading sigil.  "flags"  is  reserved  and  must  be
           zero.  If it is not in the current pad but appears in the pad of any
           lexically  enclosing  scope,  then a pseudo-entry for it is added in
           the current  pad.   Returns  the  offset  in  the  current  pad,  or
           "NOT_IN_PAD" if no such lexical is in scope.

            PADOFFSET  pad_findmy_pvn(const char *namepv, STRLEN namelen,
                                      U32 flags)

       "pad_findmy_sv"
           Exactly like "pad_findmy_pvn", but takes the name string in the form
           of an SV instead of a string/length pair.

            PADOFFSET  pad_findmy_sv(SV *name, U32 flags)

       "padnamelist_fetch"
           NOTE:  "padnamelist_fetch"  is  experimental  and  may  change or be
           removed without notice.

           Fetches the pad name from the given index.

            PADNAME *  padnamelist_fetch(PADNAMELIST *pnl, SSize_t key)

       "padnamelist_store"
           NOTE: "padnamelist_store" is  experimental  and  may  change  or  be
           removed without notice.

           Stores  the pad name (which may be null) at the given index, freeing
           any existing pad name in that slot.

            PADNAME **  padnamelist_store(PADNAMELIST *pnl, SSize_t key,
                                          PADNAME *val)

       "pad_tidy"
           NOTE: "pad_tidy" is  experimental  and  may  change  or  be  removed
           without notice.

           Tidy  up  a  pad  at  the end of compilation of the code to which it
           belongs.  Jobs performed here are: remove most stuff from  the  pads
           of  anonsub  prototypes;  give  it  a  @_; mark temporaries as such.
           "type" indicates the kind of subroutine:

               padtidy_SUB        ordinary subroutine
               padtidy_SUBCLONE   prototype for lexical closure
               padtidy_FORMAT     format

            void  pad_tidy(padtidy_type type)

       "perl_alloc"
           Allocates a new Perl interpreter.  See perlembed.

            PerlInterpreter *  perl_alloc()

       "PERL_ASYNC_CHECK"
           Described in perlinterp.

            void  PERL_ASYNC_CHECK()

       "perl_clone"
           Create and return a new interpreter by cloning the current one.

           "perl_clone" takes these flags as parameters:

           "CLONEf_COPY_STACKS" - is used  to,  well,  copy  the  stacks  also,
           without  it  we  only clone the data and zero the stacks, with it we
           copy the stacks and the new perl interpreter is ready to run at  the
           exact  same  point  as  the previous one.  The pseudo-fork code uses
           "COPY_STACKS" while the threads->create doesn't.

           "CLONEf_KEEP_PTR_TABLE" - "perl_clone" keeps a  ptr_table  with  the
           pointer  of  the  old  variable  as  a key and the new variable as a
           value, this allows it to check if something has been cloned and  not
           clone  it  again,  but  rather  just  use the value and increase the
           refcount.  If "KEEP_PTR_TABLE" is not  set  then  "perl_clone"  will
           kill        the       ptr_table       using       the       function
           "ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;".  A  reason  to
           keep  it  around  is  if  you want to dup some of your own variables
           which are outside the graph that perl scans.

           "CLONEf_CLONE_HOST" - This is a win32 thing, it is ignored on  unix,
           it  tells perl's win32host code (which is c++) to clone itself, this
           is needed on win32 if you want to run two threads at the same  time,
           if you just want to do some stuff in a separate perl interpreter and
           then throw it away and return to the original one, you don't need to
           do anything.

            PerlInterpreter *  perl_clone(PerlInterpreter *proto_perl,
                                          UV flags)

       "perl_construct"
           Initializes a new Perl interpreter.  See perlembed.

            void  perl_construct(PerlInterpreter *my_perl)

       "perl_destruct"
           Shuts down a Perl interpreter.  See perlembed for a tutorial.

           "my_perl"  points  to  the  Perl  interpreter.   It  must  have been
           previously   created   through   the   use   of   "perl_alloc"   and
           "perl_construct".     It   may   have   been   initialised   through
           "perl_parse", and may have been used through  "perl_run"  and  other
           means.  This function should be called for any Perl interpreter that
           has  been  constructed  with  "perl_construct",  even  if subsequent
           operations on it failed, for example if "perl_parse" returned a non-
           zero value.

           If    the    interpreter's    "PL_exit_flags"    word    has     the
           "PERL_EXIT_DESTRUCT_END"  flag  set, then this function will execute
           code in "END" blocks before performing the rest of destruction.   If
           it   is   desired  to  make  any  use  of  the  interpreter  between
           "perl_parse" and "perl_destruct" other than just calling "perl_run",
           then this flag should be set early on.  This matters  if  "perl_run"
           will  not be called, or if anything else will be done in addition to
           calling "perl_run".

           Returns a value be a  suitable  value  to  pass  to  the  C  library
           function "exit" (or to return from "main"), to serve as an exit code
           indicating  the  nature of the way the interpreter terminated.  This
           takes into account any failure of "perl_parse" and  any  early  exit
           from  "perl_run".  The exit code is of the type required by the host
           operating system, so because of differing exit code  conventions  it
           is  not  portable  to  interpret  specific  numeric values as having
           specific meanings.

            int  perl_destruct(PerlInterpreter *my_perl)

       "perl_free"
           Releases a Perl interpreter.  See perlembed.

            void  perl_free(PerlInterpreter *my_perl)

       "PERL_GET_CONTEXT"
           Described in perlguts.

       "PerlInterpreter"
           Described in perlembed.

       "perl_parse"
           Tells a Perl interpreter to parse a Perl script.  This performs most
           of the initialisation of a Perl interpreter.  See  perlembed  for  a
           tutorial.

           "my_perl"  points  to  the  Perl  interpreter  that  is to parse the
           script.  It must have been previously created  through  the  use  of
           "perl_alloc"  and  "perl_construct".   "xsinit" points to a callback
           function that will be called to set up the  ability  for  this  Perl
           interpreter to load XS extensions, or may be null to perform no such
           setup.

           "argc" and "argv" supply a set of command-line arguments to the Perl
           interpreter, as would normally be passed to the "main" function of a
           C  program.   "argv[argc]"  must be null.  These arguments are where
           the script to parse is specified, either by naming a script file  or
           by providing a script in a "-e" option.  If $0 will be written to in
           the  Perl interpreter, then the argument strings must be in writable
           memory, and so mustn't just be string constants.

           "env" specifies a set of environment variables that will be used  by
           this  Perl  interpreter.   If  non-null,  it  must  point to a null-
           terminated  array  of  environment  strings.   If  null,  the   Perl
           interpreter  will  use  the  environment  supplied  by the "environ"
           global variable.

           This function initialises the interpreter, and parses  and  compiles
           the  script  specified by the command-line arguments.  This includes
           executing code in "BEGIN", "UNITCHECK", and "CHECK" blocks.  It does
           not execute "INIT" blocks or the main program.

           Returns an integer of slightly tricky interpretation.   The  correct
           use of the return value is as a truth value indicating whether there
           was  a  failure  in  initialisation.   If  zero  is  returned,  this
           indicates that initialisation was successful,  and  it  is  safe  to
           proceed  to call "perl_run" and make other use of it.  If a non-zero
           value is returned,  this  indicates  some  problem  that  means  the
           interpreter  wants to terminate.  The interpreter should not be just
           abandoned upon such failure; the caller should proceed to  shut  the
           interpreter  down  cleanly  with  "perl_destruct"  and  free it with
           "perl_free".

           For historical reasons, the non-zero return value also  attempts  to
           be  a suitable value to pass to the C library function "exit" (or to
           return from "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.   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
           "perl_destruct".

            int  perl_parse(PerlInterpreter *my_perl, XSINIT_t xsinit,
                            int argc, char **argv, char **env)

       "perl_run"
           Tells a Perl interpreter to run its main program.  See perlembed for
           a tutorial.

           "my_perl"  points  to  the  Perl  interpreter.   It  must  have been
           previously   created   through   the   use   of   "perl_alloc"   and
           "perl_construct",   and   initialised  through  "perl_parse".   This
           function should not be called if "perl_parse"  returned  a  non-zero
           value, indicating a failure in initialisation or compilation.

           This  function executes code in "INIT" blocks, and then executes the
           main program.  The code to be executed is that  established  by  the
           prior  call  to  "perl_parse".  If the interpreter's "PL_exit_flags"
           word does not have the "PERL_EXIT_DESTRUCT_END" flag set, then  this
           function  will  also execute code in "END" blocks.  If it is desired
           to make any further  use  of  the  interpreter  after  calling  this
           function,  then  "END" blocks should be postponed to "perl_destruct"
           time by setting that flag.

           Returns an integer of slightly tricky interpretation.   The  correct
           use  of  the return value is as a truth value indicating whether the
           program terminated non-locally.  If zero is returned, this indicates
           that the program ran to completion, and it is safe to make other use
           of the interpreter (provided that the "PERL_EXIT_DESTRUCT_END"  flag
           was  set as described above).  If a non-zero value is returned, this
           indicates that  the  interpreter  wants  to  terminate  early.   The
           interpreter  should  not be just abandoned because of this desire to
           terminate; the caller should proceed to shut  the  interpreter  down
           cleanly with "perl_destruct" and free it with "perl_free".

           For  historical  reasons, the non-zero return value also attempts to
           be a suitable value to pass to the C library function "exit" (or  to
           return  from "main"), to serve as an exit code indicating the nature
           of the way the program terminated.  However,  this  isn't  portable,
           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
           "perl_destruct".

            int  perl_run(PerlInterpreter *my_perl)

       "PERL_SET_CONTEXT"
           Described in perlguts.

            void  PERL_SET_CONTEXT(PerlInterpreter* i)

       "PERL_SYS_INIT"
       "PERL_SYS_INIT3"
           These  provide  system-specific tune up of the C runtime environment
           necessary to run Perl interpreters.  Only one should be used, and it
           should be called only once, before creating any Perl interpreters.

           They differ in that "PERL_SYS_INIT3" also initializes "env".

            void  PERL_SYS_INIT (int *argc, char*** argv)
            void  PERL_SYS_INIT3(int *argc, char*** argv, char*** env)

       "PERL_SYS_TERM"
           Provides system-specific clean up of the C runtime environment after
           running Perl interpreters.  This should be called only  once,  after
           freeing any remaining Perl interpreters.

            void  PERL_SYS_TERM()

       "PL_exit_flags"
           Contains flags controlling perl's behaviour on exit():

           •   "PERL_EXIT_DESTRUCT_END"

               If  set,  END  blocks  are  executed  when  the  interpreter  is
               destroyed.  This is  normally  set  by  perl  itself  after  the
               interpreter is constructed.

           •   "PERL_EXIT_ABORT"

               Call abort() on exit.  This is used internally by perl itself to
               abort if exit is called while processing exit.

           •   "PERL_EXIT_WARN"

               Warn on exit.

           •   "PERL_EXIT_EXPECTED"

               Set by the "exit" in perlfunc operator.

            U8  PL_exit_flags

       "PL_origalen"
           Described in perlembed.

       "PL_perl_destruct_level"
           This value may be set when embedding for full cleanup.

           Possible values:

           •   0 - none

           •   1 - full

           •   2 or greater - full with checks.

           If  $ENV{PERL_DESTRUCT_LEVEL}  is set to an integer greater than the
           value of "PL_perl_destruct_level" its value is used instead.

           On threaded perls, each thread  has  an  independent  copy  of  this
           variable;  each  initialized at creation time with the current value
           of the creating thread's copy.

            signed char  PL_perl_destruct_level

       "ptr_table_fetch"
           Look for "sv" in the  pointer-mapping  table  "tbl",  returning  its
           value, or NULL if not found.

            void *  ptr_table_fetch(PTR_TBL_t * const tbl,
                                    const void * const sv)

       "ptr_table_free"
           Clear and free a ptr table

            void  ptr_table_free(PTR_TBL_t * const tbl)

       "ptr_table_new"
           Create a new pointer-mapping table

            PTR_TBL_t *  ptr_table_new()

       "ptr_table_split"
           Double the hash bucket size of an existing ptr table

            void  ptr_table_split(PTR_TBL_t * const tbl)

       "ptr_table_store"
           Add  a  new  entry to a pointer-mapping table "tbl".  In hash terms,
           "oldsv" is the key; Cnewsv> is the value.

           The names "old" and "new" are specific to the core's typical use  of
           ptr_tables in thread cloning.

            void  ptr_table_store(PTR_TBL_t * const tbl,
                                  const void * const oldsv,
                                  void * const newsv)

       "require_pv"
           Tells  Perl  to "require" the file named by the string argument.  It
           is analogous to the Perl code "eval "require '$file'"".   It's  even
           implemented that way; consider using load_module instead.

           NOTE: the perl_require_pv() form is deprecated.

            void  require_pv(const char *pv)

       "vload_module"
           Like  "load_module"  but  the arguments are an encapsulated argument
           list.

            void  vload_module(U32 flags, SV *name, SV *ver, va_list *args)

Errno
       "sv_string_from_errnum"
           Generates the message string describing an OS error and  returns  it
           as  an  SV.   "errnum"  must  be  a  value  that "errno" could take,
           identifying the type of error.

           If "tgtsv" is non-null then the string will be written into that  SV
           (overwriting  existing content) and it will be returned.  If "tgtsv"
           is a null pointer then the string will be written into a new  mortal
           SV which will be returned.

           The  message will be taken from whatever locale would be used by $!,
           and will be encoded in the SV in whatever manner would  be  used  by
           $!.   The  details  of  this  process  are subject to future change.
           Currently, the message  is  taken  from  the  C  locale  by  default
           (usually  producing  an  English  message),  and  from the currently
           selected locale when in the scope of the  "use  locale"  pragma.   A
           heuristic  attempt  is  made to decode the message from the locale's
           character encoding, but it will only be decoded as either  UTF-8  or
           ISO-8859-1.   It  is  always  correctly  decoded  in a UTF-8 locale,
           usually in an ISO-8859-1 locale, and never in any other locale.

           The SV is always returned containing an actual string, and  with  no
           other  OK  bits  set.   Unlike  $!,  a  message  is even yielded for
           "errnum" zero  (meaning  success),  and  if  no  useful  message  is
           available then a useless string (currently empty) is returned.

            SV *  sv_string_from_errnum(int errnum, SV *tgtsv)

Exception Handling (simple) Macros
       "dXCPT"
           Set  up  necessary  local  variables  for  exception  handling.  See
           "Exception Handling" in perlguts.

              dXCPT;

       "JMPENV_JUMP"
           Described in perlinterp.

            void  JMPENV_JUMP(int v)

       "JMPENV_PUSH"
           Described in perlinterp.

            void  JMPENV_PUSH(int v)

       "PL_restartop"
           Described in perlinterp.

       "XCPT_CATCH"
           Introduces a catch block.  See "Exception Handling" in perlguts.

       "XCPT_RETHROW"
           Rethrows a previously caught exception.  See "Exception Handling" in
           perlguts.

              XCPT_RETHROW;

       "XCPT_TRY_END"
           Ends a try block.  See "Exception Handling" in perlguts.

       "XCPT_TRY_START"
           Starts a try block.  See "Exception Handling" in perlguts.

Filesystem configuration values
       Also see "List of capability HAS_foo symbols".

       "DIRNAMLEN"
           This symbol, if defined, indicates to the C program that the  length
           of  directory  entry  names  is  provided  by  a  "d_namlen"  field.
           Otherwise you need to do strlen() on the "d_name" field.

       "DOSUID"
           This symbol, if defined, indicates that the C program  should  check
           the  script that it is executing for setuid/setgid bits, and attempt
           to emulate setuid/setgid on systems that  have  disabled  setuid  #!
           scripts  because  the  kernel can't do it securely.  It is up to the
           package designer to make sure that this emulation is done  securely.
           Among  other  things,  it  should  do an fstat on the script it just
           opened to make sure it really is a setuid/setgid script,  it  should
           make sure the arguments passed correspond exactly to the argument on
           the  #!  line,  and it should not trust any subprocesses to which it
           must pass the filename rather than the file descriptor of the script
           to be executed.

       "EOF_NONBLOCK"
           This symbol, if defined, indicates to the C program that a read() on
           a non-blocking file descriptor will return 0 on "EOF", and  not  the
           value held in "RD_NODATA" (-1 usually, in that case!).

       "FCNTL_CAN_LOCK"
           This symbol, if defined, indicates that fcntl() can be used for file
           locking.   Normally  on  Unix  systems  this  is defined.  It may be
           undefined on "VMS".

       "FFLUSH_ALL"
           This symbol, if defined, tells  that  to  flush  all  pending  stdio
           output one must loop through all the stdio file handles stored in an
           array  and  fflush  them.   Note  that  if  "fflushNULL" is defined,
           fflushall will not even be probed for and will be left undefined.

       "FFLUSH_NULL"
           This symbol, if defined, tells that fflush(NULL)  correctly  flushes
           all  pending  stdio  output  without side effects. In particular, on
           some platforms calling fflush(NULL) *still* corrupts "STDIN"  if  it
           is a pipe.

       "FILE_base"
           This  macro  is  used to access the "_base" field (or equivalent) of
           the "FILE" structure pointed to by its  argument.  This  macro  will
           always be defined if "USE_STDIO_BASE" is defined.

            void *  FILE_base(FILE * f)

       "FILE_bufsiz"
           This  macro  is  used  to  determine  the number of bytes in the I/O
           buffer pointed to by "_base" field (or  equivalent)  of  the  "FILE"
           structure pointed to its argument. This macro will always be defined
           if "USE_STDIO_BASE" is defined.

            Size_t  FILE_bufsiz(FILE *f)

       "FILE_cnt"
           This macro is used to access the "_cnt" field (or equivalent) of the
           "FILE"  structure pointed to by its argument. This macro will always
           be defined if "USE_STDIO_PTR" is defined.

            Size_t  FILE_cnt(FILE * f)

       "FILE_ptr"
           This macro is used to access the "_ptr" field (or equivalent) of the
           "FILE" structure pointed to by its argument. This macro will  always
           be defined if "USE_STDIO_PTR" is defined.

            void *  FILE_ptr(FILE * f)

       "FLEXFILENAMES"
           This   symbol,  if  defined,  indicates  that  the  system  supports
           filenames longer than 14 characters.

       "HAS_DIR_DD_FD"
           This  symbol,  if  defined,  indicates  that  the  "DIR"*  dirstream
           structure contains a member variable named "dd_fd".

       "HAS_DUP2"
           This  symbol,  if  defined,  indicates  that  the  "dup2" routine is
           available to duplicate file descriptors.

       "HAS_DUP3"
           This symbol, if  defined,  indicates  that  the  "dup3"  routine  is
           available to duplicate file descriptors.

       "HAS_FAST_STDIO"
           This  symbol,  if  defined,  indicates  that  the  "fast  stdio"  is
           available to manipulate the stdio buffers directly.

       "HAS_FCHDIR"
           This symbol, if defined, indicates  that  the  "fchdir"  routine  is
           available to change directory using a file descriptor.

       "HAS_FCNTL"
           This symbol, if defined, indicates to the C program that the fcntl()
           function exists.

       "HAS_FDCLOSE"
           This  symbol,  if  defined,  indicates that the "fdclose" routine is
           available to free a "FILE" structure without closing the  underlying
           file descriptor.  This function appeared in "FreeBSD" 10.2.

       "HAS_FDOPENDIR"
           This  symbol,  if defined, indicates that the fdopendir() routine is
           available to  open  directories  using  an  opened  file  descriptor
           already referring to that directory.

       "HAS_FPATHCONF"
           This  symbol,  if defined, indicates that pathconf() is available to
           determine file-system related limits and options associated  with  a
           given open file descriptor.

       "HAS_FPOS64_T"
           This symbol will be defined if the C compiler supports "fpos64_t".

       "HAS_FSTATFS"
           This  symbol,  if  defined,  indicates that the "fstatfs" routine is
           available to stat filesystems by file descriptors.

       "HAS_FSTATVFS"
           This symbol, if defined, indicates that the  "fstatvfs"  routine  is
           available to stat filesystems by file descriptors.

       "HAS_GETFSSTAT"
           This  symbol,  if defined, indicates that the "getfsstat" routine is
           available to stat filesystems in bulk.

       "HAS_GETMNT"
           This symbol, if defined, indicates  that  the  "getmnt"  routine  is
           available to get filesystem mount info by filename.

       "HAS_GETMNTENT"
           This  symbol,  if defined, indicates that the "getmntent" routine is
           available to iterate through mounted file systems to get their info.

       "HAS_HASMNTOPT"
           This symbol, if defined, indicates that the "hasmntopt"  routine  is
           available to query the mount options of file systems.

       "HAS_LSEEK_PROTO"
           This  symbol,  if  defined,  indicates  that  the  system provides a
           prototype for the lseek() function.  Otherwise,  it  is  up  to  the
           program to supply one.  A good guess is

            extern off_t lseek(int, off_t, int);

       "HAS_MKDIR"
           This  symbol,  if  defined,  indicates  that  the "mkdir" routine is
           available to create directories.  Otherwise you should  fork  off  a
           new process to exec /bin/mkdir.

       "HAS_OFF64_T"
           This symbol will be defined if the C compiler supports "off64_t".

       "HAS_OPENAT"
           This symbol is defined if the openat() routine is available.

       "HAS_OPEN3"
           This  manifest  constant  lets  the  C  program  know that the three
           argument form of open(2) is available.

       "HAS_POLL"
           This symbol, if  defined,  indicates  that  the  "poll"  routine  is
           available  to "poll" active file descriptors.  Please check "I_POLL"
           and "I_SYS_POLL" to know which header should be included as well.

       "HAS_READDIR"
           This symbol, if defined, indicates that  the  "readdir"  routine  is
           available  to  read  directory  entries.  You  may  have  to include
           dirent.h. See "I_DIRENT".

       "HAS_READDIR64_R"
           This symbol, if defined, indicates that the "readdir64_r" routine is
           available to readdir64 re-entrantly.

       "HAS_REWINDDIR"
           This symbol, if defined, indicates that the "rewinddir"  routine  is
           available. You may have to include dirent.h. See "I_DIRENT".

       "HAS_RMDIR"
           This  symbol,  if  defined,  indicates  that  the "rmdir" routine is
           available to remove directories. Otherwise you should fork off a new
           process to exec /bin/rmdir.

       "HAS_SEEKDIR"
           This symbol, if defined, indicates that  the  "seekdir"  routine  is
           available. You may have to include dirent.h. See "I_DIRENT".

       "HAS_SELECT"
           This  symbol,  if  defined,  indicates  that the "select" routine is
           available to "select" active file descriptors. If the timeout  field
           is used, sys/time.h may need to be included.

       "HAS_SETVBUF"
           This  symbol,  if  defined,  indicates that the "setvbuf" routine is
           available to change buffering on an open stdio stream.  to  a  line-
           buffered mode.

       "HAS_STDIO_STREAM_ARRAY"
           This  symbol,  if  defined, tells that there is an array holding the
           stdio streams.

       "HAS_STRUCT_FS_DATA"
           This symbol, if defined, indicates that the "struct fs_data"  to  do
           statfs() is supported.

       "HAS_STRUCT_STATFS"
           This  symbol,  if  defined, indicates that the "struct statfs" to do
           statfs() is supported.

       "HAS_STRUCT_STATFS_F_FLAGS"
           This symbol, if defined, indicates that  the  "struct  statfs"  does
           have  the  "f_flags"  member  containing  the  mount  flags  of  the
           filesystem containing the file.  This kind  of  "struct  statfs"  is
           coming from sys/mount.h ("BSD" 4.3), not from sys/statfs.h ("SYSV").
           Older "BSDs" (like Ultrix) do not have statfs() and "struct statfs",
           they  have  ustat()  and  getmnt()  with  "struct ustat" and "struct
           fs_data".

       "HAS_TELLDIR"
           This symbol, if defined, indicates that  the  "telldir"  routine  is
           available. You may have to include dirent.h. See "I_DIRENT".

       "HAS_USTAT"
           This  symbol,  if defined, indicates that the "ustat" system call is
           available to query file system statistics by "dev_t".

       "I_FCNTL"
           This manifest constant tells the C program to include fcntl.h.

            #ifdef I_FCNTL
                #include <fcntl.h>
            #endif

       "I_SYS_DIR"
           This symbol, if defined, indicates to the C program that  it  should
           include sys/dir.h.

            #ifdef I_SYS_DIR
                #include <sys_dir.h>
            #endif

       "I_SYS_FILE"
           This  symbol,  if defined, indicates to the C program that it should
           include sys/file.h to get definition of "R_OK" and friends.

            #ifdef I_SYS_FILE
                #include <sys_file.h>
            #endif

       "I_SYS_NDIR"
           This symbol, if defined, indicates to the C program that  it  should
           include sys/ndir.h.

            #ifdef I_SYS_NDIR
                #include <sys_ndir.h>
            #endif

       "I_SYS_STATFS"
           This symbol, if defined, indicates that sys/statfs.h exists.

            #ifdef I_SYS_STATFS
                #include <sys_statfs.h>
            #endif

       "LSEEKSIZE"
           This symbol holds the number of bytes used by the "Off_t".

       "RD_NODATA"
           This  symbol  holds  the  return  code  from  read() when no data is
           present  on  the  non-blocking  file  descriptor.  Be  careful!   If
           "EOF_NONBLOCK" is not defined, then you can't distinguish between no
           data  and "EOF" by issuing a read(). You'll have to find another way
           to tell for sure!

       "READDIR64_R_PROTO"
           This symbol encodes the prototype of "readdir64_r".  It is  zero  if
           "d_readdir64_r"  is  undef,  and  one of the "REENTRANT_PROTO_T_ABC"
           macros of reentr.h if "d_readdir64_r" is defined.

       "STDCHAR"
           This symbol is defined to be the type of char used in  stdio.h.   It
           has the values "unsigned char" or "char".

       "STDIO_CNT_LVALUE"
           This  symbol  is  defined  if the "FILE_cnt" macro can be used as an
           lvalue.

       "STDIO_PTR_LVAL_NOCHANGE_CNT"
           This symbol is defined if using the "FILE_ptr" macro as an lvalue to
           increase the pointer by n leaves File_cnt(fp) unchanged.

       "STDIO_PTR_LVAL_SETS_CNT"
           This symbol is defined if using the "FILE_ptr" macro as an lvalue to
           increase the pointer by n has the  side  effect  of  decreasing  the
           value of File_cnt(fp) by n.

       "STDIO_PTR_LVALUE"
           This  symbol  is  defined  if the "FILE_ptr" macro can be used as an
           lvalue.

       "STDIO_STREAM_ARRAY"
           This symbol tells the name of the array holding the  stdio  streams.
           Usual values include "_iob", "__iob", and "__sF".

       "ST_INO_SIGN"
           This symbol holds the signedness of "struct stat"'s "st_ino".  1 for
           unsigned, -1 for signed.

       "ST_INO_SIZE"
           This  variable  contains  the  size  of  "struct stat"'s "st_ino" in
           bytes.

       "VAL_EAGAIN"
           This symbol holds the errno error code set by read()  when  no  data
           was present on the non-blocking file descriptor.

       "VAL_O_NONBLOCK"
           This symbol is to be used during open() or fcntl(F_SETFL) to turn on
           non-blocking  I/O for the file descriptor. Note that there is no way
           back, i.e. you cannot turn it blocking again this way. If  you  wish
           to  alternatively  switch between blocking and non-blocking, use the
           ioctl(FIOSNBIO) call instead, but  that  is  not  supported  by  all
           devices.

       "VOID_CLOSEDIR"
           This  symbol, if defined, indicates that the closedir() routine does
           not return a value.

Floating point
       Also "List of capability HAS_foo symbols" lists capabilities that  arent
       in  this  section.   For  example  "HAS_ASINH",  for the hyperbolic sine
       function.

       "CASTFLAGS"
           This symbol contains flags that say what difficulties  the  compiler
           has casting odd floating values to unsigned long:

            0 = ok
            1 = couldn't cast < 0
            2 = couldn't cast >= 0x80000000
            4 = couldn't cast in argument expression list

       "CASTNEGFLOAT"
           This  symbol  is defined if the C compiler can cast negative numbers
           to unsigned longs, ints and shorts.

       "DOUBLE_HAS_INF"
           This symbol, if defined, indicates that the double has the infinity.

       "DOUBLE_HAS_NAN"
           This symbol, if defined, indicates that the double  has  the  not-a-
           number.

       "DOUBLE_HAS_NEGATIVE_ZERO"
           This   symbol,  if  defined,  indicates  that  the  double  has  the
           "negative_zero".

       "DOUBLE_HAS_SUBNORMALS"
           This  symbol,  if  defined,  indicates  that  the  double  has   the
           subnormals (denormals).

       "DOUBLEINFBYTES"
           This  symbol,  if  defined, is a comma-separated list of hexadecimal
           bytes for the double precision infinity.

       "DOUBLEKIND"
           "DOUBLEKIND"           will           be           one            of
           "DOUBLE_IS_IEEE_754_32_BIT_LITTLE_ENDIAN"
           "DOUBLE_IS_IEEE_754_32_BIT_BIG_ENDIAN"
           "DOUBLE_IS_IEEE_754_64_BIT_LITTLE_ENDIAN"
           "DOUBLE_IS_IEEE_754_64_BIT_BIG_ENDIAN"
           "DOUBLE_IS_IEEE_754_128_BIT_LITTLE_ENDIAN"
           "DOUBLE_IS_IEEE_754_128_BIT_BIG_ENDIAN"
           "DOUBLE_IS_IEEE_754_64_BIT_MIXED_ENDIAN_LE_BE"
           "DOUBLE_IS_IEEE_754_64_BIT_MIXED_ENDIAN_BE_LE"
           "DOUBLE_IS_VAX_F_FLOAT"                      "DOUBLE_IS_VAX_D_FLOAT"
           "DOUBLE_IS_VAX_G_FLOAT"                "DOUBLE_IS_IBM_SINGLE_32_BIT"
           "DOUBLE_IS_IBM_DOUBLE_64_BIT"         "DOUBLE_IS_CRAY_SINGLE_64_BIT"
           "DOUBLE_IS_UNKNOWN_FORMAT"

       "DOUBLEMANTBITS"
           This symbol, if defined, tells how many mantissa bits there  are  in
           double  precision  floating point format.  Note that this is usually
           "DBL_MANT_DIG" minus one, since with the standard "IEEE" 754 formats
           "DBL_MANT_DIG" includes  the  implicit  bit,  which  doesn't  really
           exist.

       "DOUBLENANBYTES"
           This  symbol,  if  defined, is a comma-separated list of hexadecimal
           bytes (0xHH) for the double precision not-a-number.

       "DOUBLESIZE"
           This  symbol  contains  the  size  of  a  double,  so  that  the   C
           preprocessor can make decisions based on it.

       "DOUBLE_STYLE_CRAY"
           This  symbol,  if  defined,  indicates that the double is the 64-bit
           "CRAY" mainframe format.

       "DOUBLE_STYLE_IBM"
           This symbol, if defined, indicates that the  double  is  the  64-bit
           "IBM" mainframe format.

       "DOUBLE_STYLE_IEEE"
           This  symbol,  if  defined,  indicates that the double is the 64-bit
           "IEEE" 754.

       "DOUBLE_STYLE_VAX"
           This symbol, if defined, indicates that the  double  is  the  64-bit
           "VAX" format D or G.

       "HAS_ATOLF"
           This  symbol,  if  defined,  indicates  that  the "atolf" routine is
           available to convert strings into long doubles.

       "HAS_CLASS"
           This symbol, if defined,  indicates  that  the  "class"  routine  is
           available to classify doubles.  Available for example in "AIX".  The
           returned values are defined in float.h and are:

            FP_PLUS_NORM    Positive normalized, nonzero
            FP_MINUS_NORM   Negative normalized, nonzero
            FP_PLUS_DENORM  Positive denormalized, nonzero
            FP_MINUS_DENORM Negative denormalized, nonzero
            FP_PLUS_ZERO    +0.0
            FP_MINUS_ZERO   -0.0
            FP_PLUS_INF     +INF
            FP_MINUS_INF    -INF
            FP_NANS         Signaling Not a Number (NaNS)
            FP_NANQ         Quiet Not a Number (NaNQ)

       "HAS_FINITE"
           This  symbol,  if  defined,  indicates  that the "finite" routine is
           available to check whether a double is "finite"  (non-infinity  non-
           NaN).

       "HAS_FINITEL"
           This  symbol,  if  defined,  indicates that the "finitel" routine is
           available to check whether a long  double  is  finite  (non-infinity
           non-NaN).

       "HAS_FPCLASS"
           This  symbol,  if  defined,  indicates that the "fpclass" routine is
           available  to  classify   doubles.    Available   for   example   in
           Solaris/"SVR4".   The  returned  values  are defined in ieeefp.h and
           are:

            FP_SNAN         signaling NaN
            FP_QNAN         quiet NaN
            FP_NINF         negative infinity
            FP_PINF         positive infinity
            FP_NDENORM      negative denormalized non-zero
            FP_PDENORM      positive denormalized non-zero
            FP_NZERO        negative zero
            FP_PZERO        positive zero
            FP_NNORM        negative normalized non-zero
            FP_PNORM        positive normalized non-zero

       "HAS_FP_CLASS"
           This symbol, if defined, indicates that the  "fp_class"  routine  is
           available  to  classify  doubles.   Available for example in Digital
           "UNIX".  The returned values are defined in math.h and are:

            FP_SNAN           Signaling NaN (Not-a-Number)
            FP_QNAN           Quiet NaN (Not-a-Number)
            FP_POS_INF        +infinity
            FP_NEG_INF        -infinity
            FP_POS_NORM       Positive normalized
            FP_NEG_NORM       Negative normalized
            FP_POS_DENORM     Positive denormalized
            FP_NEG_DENORM     Negative denormalized
            FP_POS_ZERO       +0.0 (positive zero)
            FP_NEG_ZERO       -0.0 (negative zero)

       "HAS_FPCLASSIFY"
           This symbol, if defined, indicates that the "fpclassify" routine  is
           available to classify doubles.  Available for example in HP-UX.  The
           returned values are defined in math.h and are

            FP_NORMAL     Normalized
            FP_ZERO       Zero
            FP_INFINITE   Infinity
            FP_SUBNORMAL  Denormalized
            FP_NAN        NaN

       "HAS_FP_CLASSIFY"
           This symbol, if defined, indicates that the "fp_classify" routine is
           available to classify doubles. The values are defined in math.h

            FP_NORMAL     Normalized
            FP_ZERO       Zero
            FP_INFINITE   Infinity
            FP_SUBNORMAL  Denormalized
            FP_NAN        NaN

       "HAS_FPCLASSL"
           This  symbol,  if  defined, indicates that the "fpclassl" routine is
           available to  classify  long  doubles.   Available  for  example  in
           "IRIX".  The returned values are defined in ieeefp.h and are:

            FP_SNAN         signaling NaN
            FP_QNAN         quiet NaN
            FP_NINF         negative infinity
            FP_PINF         positive infinity
            FP_NDENORM      negative denormalized non-zero
            FP_PDENORM      positive denormalized non-zero
            FP_NZERO        negative zero
            FP_PZERO        positive zero
            FP_NNORM        negative normalized non-zero
            FP_PNORM        positive normalized non-zero

       "HAS_FP_CLASSL"
           This  symbol,  if defined, indicates that the "fp_classl" routine is
           available to  classify  long  doubles.   Available  for  example  in
           Digital "UNIX".  See for possible values "HAS_FP_CLASS".

       "HAS_FPGETROUND"
           This  symbol, if defined, indicates that the "fpgetround" routine is
           available to get the floating point rounding mode.

       "HAS_FREXPL"
           This symbol, if defined, indicates  that  the  "frexpl"  routine  is
           available  to  break  a  long  double  floating-point  number into a
           normalized fraction and an integral power of 2.

       "HAS_ILOGB"
           This symbol, if defined,  indicates  that  the  "ilogb"  routine  is
           available to get integer exponent of a floating-point value.

       "HAS_ISFINITE"
           This  symbol,  if  defined, indicates that the "isfinite" routine is
           available to check whether a double  is  finite  (non-infinity  non-
           NaN).

       "HAS_ISFINITEL"
           This  symbol,  if defined, indicates that the "isfinitel" routine is
           available to check whether a long double is  finite.   (non-infinity
           non-NaN).

       "HAS_ISINF"
           This  symbol,  if  defined,  indicates  that  the "isinf" routine is
           available to check whether a double is an infinity.

       "HAS_ISINFL"
           This symbol, if defined, indicates  that  the  "isinfl"  routine  is
           available to check whether a long double is an infinity.

       "HAS_ISNAN"
           This  symbol,  if  defined,  indicates  that  the "isnan" routine is
           available to check whether a double is a NaN.

       "HAS_ISNANL"
           This symbol, if defined, indicates  that  the  "isnanl"  routine  is
           available to check whether a long double is a NaN.

       "HAS_ISNORMAL"
           This  symbol,  if  defined, indicates that the "isnormal" routine is
           available to check whether a double is normal (non-zero normalized).

       "HAS_J0L"
           This symbol, if defined, indicates to the C program that  the  j0l()
           function  is available for Bessel functions of the first kind of the
           order zero, for long doubles.

       "HAS_J0"
           This symbol, if defined, indicates to the C program  that  the  j0()
           function  is available for Bessel functions of the first kind of the
           order zero, for doubles.

       "HAS_LDBL_DIG"
           This symbol, if defined, indicates that  this  system's  float.h  or
           limits.h  defines  the  symbol  "LDBL_DIG",  which  is the number of
           significant digits in a long double  precision  number.  Unlike  for
           "DBL_DIG", there's no good guess for "LDBL_DIG" if it is undefined.

       "HAS_LDEXPL"
           This  symbol,  if  defined,  indicates  that the "ldexpl" routine is
           available to  shift  a  long  double  floating-point  number  by  an
           integral power of 2.

       "HAS_LLRINT"
           This  symbol,  if  defined,  indicates  that the "llrint" routine is
           available to  return  the  long  long  value  closest  to  a  double
           (according to the current rounding mode).

       "HAS_LLRINTL"
           This  symbol,  if  defined,  indicates that the "llrintl" routine is
           available to return the long long value closest  to  a  long  double
           (according to the current rounding mode).

       "HAS_LLROUNDL"
           This  symbol,  if  defined, indicates that the "llroundl" routine is
           available to return the nearest long long value away  from  zero  of
           the long double argument value.

       "HAS_LONG_DOUBLE"
           This symbol will be defined if the C compiler supports long doubles.

       "HAS_LRINT"
           This  symbol,  if  defined,  indicates  that  the "lrint" routine is
           available  to  return  the  integral  value  closest  to  a   double
           (according to the current rounding mode).

       "HAS_LRINTL"
           This  symbol,  if  defined,  indicates  that the "lrintl" routine is
           available to return the integral value  closest  to  a  long  double
           (according to the current rounding mode).

       "HAS_LROUNDL"
           This  symbol,  if  defined,  indicates that the "lroundl" routine is
           available to return the nearest integral value away from zero of the
           long double argument value.

       "HAS_MODFL"
           This symbol, if defined,  indicates  that  the  "modfl"  routine  is
           available  to  split a long double x into a fractional part f and an
           integer part i such that |f| < 1.0 and (f + i) = x.

       "HAS_NAN"
           This symbol,  if  defined,  indicates  that  the  "nan"  routine  is
           available to generate NaN.

       "HAS_NEXTTOWARD"
           This  symbol, if defined, indicates that the "nexttoward" routine is
           available to return the next machine representable long double  from
           x in direction y.

       "HAS_REMAINDER"
           This  symbol,  if defined, indicates that the "remainder" routine is
           available to return the floating-point "remainder".

       "HAS_SCALBN"
           This symbol, if defined, indicates  that  the  "scalbn"  routine  is
           available  to  multiply  floating-point  number by integral power of
           radix.

       "HAS_SIGNBIT"
           This symbol, if defined, indicates that  the  "signbit"  routine  is
           available  to  check if the given number has the sign bit set.  This
           should include correct testing of -0.0.  This will only  be  set  if
           the  signbit()  routine  is  safe  to  use  with  the  NV  type used
           internally in perl.  Users should call Perl_signbit(), which will be
           #defined to the system's signbit() function or macro if this  symbol
           is defined.

       "HAS_SQRTL"
           This  symbol,  if  defined,  indicates  that  the "sqrtl" routine is
           available to do long double square roots.

       "HAS_STRTOD_L"
           This symbol, if defined, indicates that the  "strtod_l"  routine  is
           available to convert strings to long doubles.

       "HAS_STRTOLD"
           This  symbol,  if  defined,  indicates that the "strtold" routine is
           available to convert strings to long doubles.

       "HAS_STRTOLD_L"
           This symbol, if defined, indicates that the "strtold_l"  routine  is
           available to convert strings to long doubles.

       "HAS_TRUNC"
           This  symbol,  if  defined,  indicates  that  the "trunc" routine is
           available to round doubles towards zero.

       "HAS_UNORDERED"
           This symbol, if defined, indicates that the "unordered"  routine  is
           available to check whether two doubles are "unordered" (effectively:
           whether either of them is NaN)

       "I_FENV"
           This  symbol,  if defined, indicates to the C program that it should
           include fenv.h to get the floating point environment definitions.

            #ifdef I_FENV
                #include <fenv.h>
            #endif

       "I_QUADMATH"
           This symbol, if defined, indicates that quadmath.h exists and should
           be included.

            #ifdef I_QUADMATH
                #include <quadmath.h>
            #endif

       "LONGDBLINFBYTES"
           This symbol, if defined, is a comma-separated  list  of  hexadecimal
           bytes for the long double precision infinity.

       "LONGDBLMANTBITS"
           This  symbol,  if defined, tells how many mantissa bits there are in
           long double precision floating point format.  Note that this can  be
           "LDBL_MANT_DIG"  minus  one,  since  "LDBL_MANT_DIG" can include the
           "IEEE" 754 implicit bit.  The common x86-style  80-bit  long  double
           does not have an implicit bit.

       "LONGDBLNANBYTES"
           This  symbol,  if  defined, is a comma-separated list of hexadecimal
           bytes (0xHH) for the long double precision not-a-number.

       "LONG_DOUBLEKIND"
           "LONG_DOUBLEKIND"   will   be   one    of    "LONG_DOUBLE_IS_DOUBLE"
           "LONG_DOUBLE_IS_IEEE_754_128_BIT_LITTLE_ENDIAN"
           "LONG_DOUBLE_IS_IEEE_754_128_BIT_BIG_ENDIAN"
           "LONG_DOUBLE_IS_X86_80_BIT_LITTLE_ENDIAN"
           "LONG_DOUBLE_IS_X86_80_BIT_BIG_ENDIAN"
           "LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LE_LE"
           "LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BE_BE"
           "LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LE_BE"
           "LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BE_LE"
           "LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LITTLE_ENDIAN"
           "LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BIG_ENDIAN"
           "LONG_DOUBLE_IS_VAX_H_FLOAT"  "LONG_DOUBLE_IS_UNKNOWN_FORMAT"  It is
           only defined if the system supports long doubles.

       "LONG_DOUBLESIZE"
           This symbol contains the size of  a  long  double,  so  that  the  C
           preprocessor  can make decisions based on it.  It is only defined if
           the system supports long doubles.  Note that  this  is  "sizeof(long
           double)", which may include unused bytes.

       "LONG_DOUBLE_STYLE_IEEE"
           This  symbol,  if  defined, indicates that the long double is any of
           the "IEEE" 754  style  long  doubles:  "LONG_DOUBLE_STYLE_IEEE_STD",
           "LONG_DOUBLE_STYLE_IEEE_EXTENDED",
           "LONG_DOUBLE_STYLE_IEEE_DOUBLEDOUBLE".

       "LONG_DOUBLE_STYLE_IEEE_DOUBLEDOUBLE"
           This  symbol,  if  defined,  indicates  that  the long double is the
           128-bit double-double.

       "LONG_DOUBLE_STYLE_IEEE_EXTENDED"
           This symbol, if defined, indicates  that  the  long  double  is  the
           80-bit  "IEEE"  754.  Note  that despite the 'extended' this is less
           than the 'std', since this is an extension of the double precision.

       "LONG_DOUBLE_STYLE_IEEE_STD"
           This symbol, if defined, indicates  that  the  long  double  is  the
           128-bit "IEEE" 754.

       "LONG_DOUBLE_STYLE_VAX"
           This  symbol,  if  defined,  indicates  that  the long double is the
           128-bit "VAX" format H.

       "NV"
           Described in perlguts.

       "NVMANTBITS"
           This symbol, if defined, tells how many mantissa bits (not including
           implicit bit) there are  in  a  Perl  NV.   This  depends  on  which
           floating point type was chosen.

       "NV_OVERFLOWS_INTEGERS_AT"
           This  symbol gives the largest integer value that NVs can hold. This
           value + 1.0 cannot be stored accurately. It is expressed as constant
           floating point expression to reduce  the  chance  of  decimal/binary
           conversion  issues.  If  it  can  not  be determined, the value 0 is
           given.

       "NV_PRESERVES_UV"
           This symbol, if defined, indicates that a variable of type  "NVTYPE"
           can preserve all the bits of a variable of type "UVTYPE".

       "NV_PRESERVES_UV_BITS"
           This  symbol contains the number of bits a variable of type "NVTYPE"
           can preserve of a variable of type "UVTYPE".

       "NVSIZE"
           This symbol contains the sizeof(NV).  Note that some floating  point
           formats  have  unused  bytes.   The most notable example is the x86*
           80-bit extended precision which comes in byte sizes  of  12  and  16
           (for  32 and 64 bit platforms, respectively), but which only uses 10
           bytes.  Perl compiled with "-Duselongdouble" on x86* is like this.

       "NVTYPE"
           This symbol defines the C type used for Perl's NV.

       "NV_ZERO_IS_ALLBITS_ZERO"
           This symbol, if defined, indicates that a variable of type  "NVTYPE"
           stores 0.0 in memory as all bits zero.

General Configuration
       This  section  contains configuration information not otherwise found in
       the more specialized sections of this document.  At the end is a list of
       "#defines" whose name should be enough to tell you what they do,  and  a
       list  of  #defines which tell you if you need to "#include" files to get
       the corresponding functionality.

       "ASCIIish"
           A preprocessor symbol that is defined iff the  system  is  an  ASCII
           platform; this symbol would not be defined on "EBCDIC" platforms.

            #ifdef  ASCIIish

       "BYTEORDER"
           This  symbol holds the hexadecimal constant defined in byteorder, in
           a UV, i.e. 0x1234 or 0x4321 or 0x12345678, etc...  If  the  compiler
           supports  cross-compiling  or  multiple-architecture  binaries,  use
           compiler-defined macros to determine the byte order.

       "CHARBITS"
           This symbol contains the size of a char, so that the C  preprocessor
           can make decisions based on it.

       "DB_VERSION_MAJOR_CFG"
           This  symbol,  if  defined,  defines  the  major  version  number of
           Berkeley DB found in the db.h header when Perl was configured.

       "DB_VERSION_MINOR_CFG"
           This symbol,  if  defined,  defines  the  minor  version  number  of
           Berkeley  DB found in the db.h header when Perl was configured.  For
           DB version 1 this is always 0.

       "DB_VERSION_PATCH_CFG"
           This symbol,  if  defined,  defines  the  patch  version  number  of
           Berkeley  DB found in the db.h header when Perl was configured.  For
           DB version 1 this is always 0.

       "DEFAULT_INC_EXCLUDES_DOT"
           This symbol, if defined, removes  the  legacy  default  behavior  of
           including '.' at the end of @"INC".

       "DLSYM_NEEDS_UNDERSCORE"
           This  symbol,  if  defined,  indicates  that  we  need to prepend an
           underscore to the symbol name before  calling  dlsym().   This  only
           makes  sense  if you *have* dlsym, which we will presume is the case
           if you're using dl_dlopen.xs.

       "EBCDIC"
           This symbol, if defined, indicates that this  system  uses  "EBCDIC"
           encoding.

       "HAS_CSH"
           This symbol, if defined, indicates that the C-shell exists.

       "HAS_GETHOSTNAME"
           This  symbol,  if  defined, indicates that the C program may use the
           gethostname() routine to derive the host name.  See also "HAS_UNAME"
           and "PHOSTNAME".

       "HAS_GNULIBC"
           This symbol, if defined, indicates to the C program that the "GNU" C
           library is being used.  A better check is to use the "__GLIBC__" and
           "__GLIBC_MINOR__" symbols supplied with glibc.

       "HAS_LGAMMA"
           This symbol, if defined, indicates  that  the  "lgamma"  routine  is
           available  to  do the log gamma function.  See also "HAS_TGAMMA" and
           "HAS_LGAMMA_R".

       "HAS_LGAMMA_R"
           This symbol, if defined, indicates that the  "lgamma_r"  routine  is
           available  to  do  the  log  gamma function without using the global
           signgam variable.

       "HAS_NON_INT_BITFIELDS"
           This symbol, if defined, indicates  that  the  C  compiler  accepts,
           without  error or warning, "struct bitfields" that are declared with
           sizes other  than  plain  'int';  for  example  'unsigned  char'  is
           accepted.

       "HAS_PRCTL_SET_NAME"
           This  symbol,  if  defined,  indicates  that  the  prctl  routine is
           available to set process title and supports "PR_SET_NAME".

       "HAS_PROCSELFEXE"
           This symbol is defined if "PROCSELFEXE_PATH" is  a  symlink  to  the
           absolute pathname of the executing program.

       "HAS_PSEUDOFORK"
           This  symbol,  if  defined,  indicates that an emulation of the fork
           routine is available.

       "HAS_REGCOMP"
           This symbol, if defined, indicates that  the  regcomp()  routine  is
           available  to do some regular pattern matching (usually on "POSIX".2
           conforming systems).

       "HAS_SETPGID"
           This symbol, if defined, indicates  that  the  "setpgid(pid,  gpid)"
           routine is available to set process group ID.

       "HAS_SIGSETJMP"
           This  variable  indicates  to  the  C  program  that the sigsetjmp()
           routine is available to save the  calling  process's  registers  and
           stack  environment  for later use by siglongjmp(), and to optionally
           save the process's signal mask.  See "Sigjmp_buf", "Sigsetjmp",  and
           "Siglongjmp".

       "HAS_STRUCT_CMSGHDR"
           This  symbol,  if  defined,  indicates  that the "struct cmsghdr" is
           supported.

       "HAS_STRUCT_MSGHDR"
           This symbol, if defined,  indicates  that  the  "struct  msghdr"  is
           supported.

       "HAS_TGAMMA"
           This  symbol,  if  defined,  indicates  that the "tgamma" routine is
           available to do the gamma function. See also "HAS_LGAMMA".

       "HAS_UNAME"
           This symbol, if defined, indicates that the C program  may  use  the
           uname() routine to derive the host name.  See also "HAS_GETHOSTNAME"
           and "PHOSTNAME".

       "HAS_UNION_SEMUN"
           This symbol, if defined, indicates that the "union semun" is defined
           by  including  sys/sem.h.   If  not, the user code probably needs to
           define it as:

            union semun {
            int val;
            struct semid_ds *buf;
            unsigned short *array;
            }

       "I_DIRENT"
           This symbol, if defined, indicates to the C program that  it  should
           include  dirent.h. Using this symbol also triggers the definition of
           the "Direntry_t" define which ends up  being  '"struct  dirent"'  or
           '"struct direct"' depending on the availability of dirent.h.

            #ifdef I_DIRENT
                #include <dirent.h>
            #endif

       "I_POLL"
           This  symbol, if defined, indicates that poll.h exists and should be
           included. (see also "HAS_POLL")

            #ifdef I_POLL
                #include <poll.h>
            #endif

       "I_SYS_RESOURCE"
           This symbol, if defined, indicates to the C program that  it  should
           include sys/resource.h.

            #ifdef I_SYS_RESOURCE
                #include <sys_resource.h>
            #endif

       "LIBM_LIB_VERSION"
           This  symbol, if defined, indicates that libm exports "_LIB_VERSION"
           and that math.h defines the enum to manipulate it.

       "NEED_VA_COPY"
           This symbol, if  defined,  indicates  that  the  system  stores  the
           variable  argument list datatype, "va_list", in a format that cannot
           be copied by simple assignment, so that some  other  means  must  be
           used  when  copying  is  required.   As  such  systems vary in their
           provision (or non-provision) of copying mechanisms, handy.h  defines
           a  platform-  independent macro, "Perl_va_copy(src, dst)", to do the
           job.

       "OSNAME"
           This symbol contains the name of the operating system, as determined
           by Configure.  You shouldn't rely  on  it  too  much;  the  specific
           feature tests from Configure are generally more reliable.

       "OSVERS"
           This  symbol  contains  the  version  of  the  operating  system, as
           determined by Configure.  You shouldn't rely on  it  too  much;  the
           specific feature tests from Configure are generally more reliable.

       "PERL_USE_GCC_BRACE_GROUPS"
           This  C  pre-processor  value,  if  defined,  indicates  that  it is
           permissible to use the GCC brace groups extension.  However, use  of
           this  extension  is  DISCOURAGED.   Use  a  "static inline" function
           instead.

           The extension, of the form

            ({ statement ... })

           turns the block consisting of statement ... into an expression  with
           a   value,  unlike  plain  C  language  blocks.   This  can  present
           optimization possibilities, 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 "static inline" function instead.

           Perl can be configured to  not  use  this  feature  by  passing  the
           parameter      "-Accflags=-DPERL_GCC_BRACE_GROUPS_FORBIDDEN"      to
           Configure.

            #ifdef  PERL_USE_GCC_BRACE_GROUPS

       "PHOSTNAME"
           This symbol, if defined,  indicates  the  command  to  feed  to  the
           popen() routine to derive the host name.  See also "HAS_GETHOSTNAME"
           and "HAS_UNAME".  Note that the command uses a fully qualified path,
           so  that  it  is  safe  even  if  used  by a process with super-user
           privileges.

       "PROCSELFEXE_PATH"
           If "HAS_PROCSELFEXE" is defined this symbol is the filename  of  the
           symbolic  link  pointing  to  the absolute pathname of the executing
           program.

       "PTRSIZE"
           This  symbol  contains  the  size  of  a  pointer,  so  that  the  C
           preprocessor   can   make   decisions  based  on  it.   It  will  be
           "sizeof(void *)" if the compiler supports  (void  *);  otherwise  it
           will be "sizeof(char *)".

       "RANDBITS"
           This  symbol  indicates  how  many bits are produced by the function
           used to generate normalized random numbers.  Values include 15,  16,
           31, and 48.

       "SELECT_MIN_BITS"
           This  symbol  holds  the  minimum number of bits operated by select.
           That is, if you do "select(n, ...)", how many bits at least will  be
           cleared  in the masks if some activity is detected.  Usually this is
           either n or 32*ceil(n/32), especially  many  little-endians  do  the
           latter.  This is only useful if you have select(), naturally.

       "SETUID_SCRIPTS_ARE_SECURE_NOW"
           This symbol, if defined, indicates that the bug that prevents setuid
           scripts from being secure is not present in this kernel.

       "ST_DEV_SIGN"
           This symbol holds the signedness of "struct stat"'s "st_dev".  1 for
           unsigned, -1 for signed.

       "ST_DEV_SIZE"
           This  variable  contains  the  size  of  "struct stat"'s "st_dev" in
           bytes.

   List of capability "HAS_foo" symbols
       This is a list of those  symbols  that  dont  appear  elsewhere  in  ths
       document that indicate if the current platform has a certain capability.
       Their  names all begin with "HAS_".  Only those symbols whose capability
       is directly derived from the name are  listed  here.   All  others  have
       their   meaning   expanded   out   elsewhere  in  this  document.   This
       (relatively) compact list is because we think that the  expansion  would
       add  little or no value and take up a lot of space (because there are so
       many).  If you think certain ones should  be  expanded,  send  email  to
       perl5-porters@perl.org <mailto:perl5-porters@perl.org>.

       Each  symbol here will be "#define"d if and only if the platform has the
       capability.  If you need more detail, see  the  corresponding  entry  in
       config.h.   For  convenience,  the  list  is split so that the ones that
       indicate there is  a  reentrant  version  of  a  capability  are  listed
       separately

       "HAS_ACCEPT4",      "HAS_ACCESS",      "HAS_ACCESSX",      "HAS_ACOSH",
       "HAS_AINTL",  "HAS_ALARM",   "HAS_ASINH",   "HAS_ATANH",   "HAS_ATOLL",
       "HAS_CBRT",        "HAS_CHOWN",       "HAS_CHROOT",       "HAS_CHSIZE",
       "HAS_CLEARENV",    "HAS_COPYSIGN",    "HAS_COPYSIGNL",     "HAS_CRYPT",
       "HAS_CTERMID",      "HAS_CUSERID",      "HAS_DIRFD",      "HAS_DLADDR",
       "HAS_DLERROR",   "HAS_EACCESS",   "HAS_ENDHOSTENT",    "HAS_ENDNETENT",
       "HAS_ENDPROTOENT",     "HAS_ENDSERVENT",     "HAS_ERF",     "HAS_ERFC",
       "HAS_EXPM1",      "HAS_EXP2",       "HAS_FCHMOD",       "HAS_FCHMODAT",
       "HAS_FCHOWN",      "HAS_FDIM",      "HAS_FD_SET",     "HAS_FEGETROUND",
       "HAS_FFS",   "HAS_FFSL",   "HAS_FGETPOS",    "HAS_FLOCK",    "HAS_FMA",
       "HAS_FMAX",   "HAS_FMIN",   "HAS_FORK",   "HAS_FSEEKO",  "HAS_FSETPOS",
       "HAS_FSYNC",    "HAS_FTELLO",     "HAS__FWALK",     "HAS_GAI_STRERROR",
       "HAS_GETADDRINFO",   "HAS_GETCWD",  "HAS_GETESPWNAM",  "HAS_GETGROUPS",
       "HAS_GETHOSTBYADDR",       "HAS_GETHOSTBYNAME",       "HAS_GETHOSTENT",
       "HAS_GETLOGIN",          "HAS_GETNAMEINFO",         "HAS_GETNETBYADDR",
       "HAS_GETNETBYNAME",         "HAS_GETNETENT",         "HAS_GETPAGESIZE",
       "HAS_GETPGID",     "HAS_GETPGRP",     "HAS_GETPGRP2",    "HAS_GETPPID",
       "HAS_GETPRIORITY",    "HAS_GETPROTOBYNAME",     "HAS_GETPROTOBYNUMBER",
       "HAS_GETPROTOENT",        "HAS_GETPRPWNAM",        "HAS_GETSERVBYNAME",
       "HAS_GETSERVBYPORT",  "HAS_GETSERVENT",  "HAS_GETSPNAM",   "HAS_HTONL",
       "HAS_HTONS",      "HAS_HYPOT",      "HAS_ILOGBL",      "HAS_INET_ATON",
       "HAS_INETNTOP",  "HAS_INETPTON",  "HAS_IP_MREQ",  "HAS_IP_MREQ_SOURCE",
       "HAS_IPV6_MREQ",         "HAS_IPV6_MREQ_SOURCE",         "HAS_ISASCII",
       "HAS_ISBLANK",      "HAS_ISLESS",      "HAS_KILLPG",      "HAS_LCHOWN",
       "HAS_LINK",  "HAS_LINKAT",  "HAS_LLROUND",   "HAS_LOCKF",   "HAS_LOGB",
       "HAS_LOG1P",   "HAS_LOG2",  "HAS_LROUND",  "HAS_LSTAT",  "HAS_MADVISE",
       "HAS_MBLEN",     "HAS_MBRLEN",      "HAS_MBRTOWC",      "HAS_MBSTOWCS",
       "HAS_MBTOWC",      "HAS_MEMMEM",      "HAS_MEMRCHR",     "HAS_MKDTEMP",
       "HAS_MKFIFO",    "HAS_MKOSTEMP",     "HAS_MKSTEMP",     "HAS_MKSTEMPS",
       "HAS_MMAP",   "HAS_MPROTECT",   "HAS_MSG",  "HAS_MSYNC",  "HAS_MUNMAP",
       "HAS_NEARBYINT",     "HAS_NEXTAFTER",     "HAS_NICE",      "HAS_NTOHL",
       "HAS_NTOHS",      "HAS_PATHCONF",     "HAS_PAUSE",     "HAS_PHOSTNAME",
       "HAS_PIPE",      "HAS_PIPE2",       "HAS_PRCTL",       "HAS_PTRDIFF_T",
       "HAS_READLINK",      "HAS_READV",      "HAS_RECVMSG",     "HAS_REMQUO",
       "HAS_RENAME",      "HAS_RENAMEAT",       "HAS_RINT",       "HAS_ROUND",
       "HAS_SCALBNL",       "HAS_SEM",      "HAS_SENDMSG",      "HAS_SETEGID",
       "HAS_SETENV",   "HAS_SETEUID",    "HAS_SETGROUPS",    "HAS_SETHOSTENT",
       "HAS_SETLINEBUF",   "HAS_SETNETENT",   "HAS_SETPGRP",   "HAS_SETPGRP2",
       "HAS_SETPRIORITY",        "HAS_SETPROCTITLE",        "HAS_SETPROTOENT",
       "HAS_SETREGID",   "HAS_SETRESGID",   "HAS_SETRESUID",   "HAS_SETREUID",
       "HAS_SETRGID",    "HAS_SETRUID",    "HAS_SETSERVENT",     "HAS_SETSID",
       "HAS_SHM",   "HAS_SIGACTION",  "HAS_SIGPROCMASK",  "HAS_SIN6_SCOPE_ID",
       "HAS_SNPRINTF",    "HAS_STAT",     "HAS_STRCOLL",     "HAS_STRERROR_L",
       "HAS_STRLCAT",      "HAS_STRLCPY",     "HAS_STRNLEN",     "HAS_STRTOD",
       "HAS_STRTOL",     "HAS_STRTOLL",      "HAS_STRTOQ",      "HAS_STRTOUL",
       "HAS_STRTOULL",    "HAS_STRTOUQ",    "HAS_STRXFRM",    "HAS_STRXFRM_L",
       "HAS_SYMLINK",   "HAS_SYSCALL",    "HAS_SYSCONF",    "HAS_SYS_ERRLIST",
       "HAS_SYSTEM",    "HAS_TCGETPGRP",    "HAS_TCSETPGRP",   "HAS_TOWLOWER",
       "HAS_TOWUPPER",     "HAS_TRUNCATE",     "HAS_TRUNCL",     "HAS_UALARM",
       "HAS_UMASK",      "HAS_UNLINKAT",      "HAS_UNSETENV",     "HAS_VFORK",
       "HAS_VSNPRINTF",     "HAS_WAITPID",     "HAS_WAIT4",     "HAS_WCRTOMB",
       "HAS_WCSCMP",      "HAS_WCSTOMBS",     "HAS_WCSXFRM",     "HAS_WCTOMB",
       "HAS_WRITEV"

       And, the reentrant capabilities:

       "HAS_CRYPT_R",  "HAS_CTERMID_R",  "HAS_DRAND48_R",  "HAS_ENDHOSTENT_R",
       "HAS_ENDNETENT_R",       "HAS_ENDPROTOENT_R",       "HAS_ENDSERVENT_R",
       "HAS_GETGRGID_R",        "HAS_GETGRNAM_R",       "HAS_GETHOSTBYADDR_R",
       "HAS_GETHOSTBYNAME_R",      "HAS_GETHOSTENT_R",       "HAS_GETLOGIN_R",
       "HAS_GETNETBYADDR_R",      "HAS_GETNETBYNAME_R",     "HAS_GETNETENT_R",
       "HAS_GETPROTOBYNAME_R",                       "HAS_GETPROTOBYNUMBER_R",
       "HAS_GETPROTOENT_R",         "HAS_GETPWNAM_R",        "HAS_GETPWUID_R",
       "HAS_GETSERVBYNAME_R",    "HAS_GETSERVBYPORT_R",    "HAS_GETSERVENT_R",
       "HAS_GETSPNAM_R",            "HAS_RANDOM_R",           "HAS_READDIR_R",
       "HAS_SETHOSTENT_R",       "HAS_SETNETENT_R",       "HAS_SETPROTOENT_R",
       "HAS_SETSERVENT_R",          "HAS_SRANDOM_R",          "HAS_SRAND48_R",
       "HAS_STRERROR_R",  "HAS_TMPNAM_R",  "HAS_TTYNAME_R"

       Example usage:

        #ifdef HAS_STRNLEN
          use strnlen()
        #else
          use an alternative implementation
        #endif

   List of "#include" needed symbols
       This list contains symbols that indicate if certain "#include" files are
       present on the platform.  If your code accesses the  functionality  that
       one  of  these  is  for, you will need to "#include" it if the symbol on
       this list is "#define"d.  For more detail, see the  corresponding  entry
       in config.h.

       "I_ARPA_INET",      "I_BFD",     "I_CRYPT",     "I_DBM",     "I_DLFCN",
       "I_EXECINFO",    "I_FP",    "I_FP_CLASS",    "I_GDBM",    "I_GDBMNDBM",
       "I_GDBM_NDBM",    "I_GRP",   "I_IEEEFP",   "I_INTTYPES",   "I_LIBUTIL",
       "I_MNTENT",   "I_NDBM",   "I_NETDB",   "I_NET_ERRNO",   "I_NETINET_IN",
       "I_NETINET_TCP",    "I_PROT",   "I_PWD",   "I_RPCSVC_DBM",   "I_SGTTY",
       "I_SHADOW",  "I_STDBOOL",  "I_STDINT",   "I_SUNMATH",   "I_SYS_ACCESS",
       "I_SYS_IOCTL",       "I_SYSLOG",       "I_SYSMODE",      "I_SYS_MOUNT",
       "I_SYS_PARAM",    "I_SYS_POLL",    "I_SYS_SECURITY",    "I_SYS_SELECT",
       "I_SYS_STAT",     "I_SYS_STATVFS",    "I_SYS_SYSCALL",    "I_SYS_TIME",
       "I_SYS_TIME_KERNEL",    "I_SYS_TIMES",    "I_SYS_TYPES",    "I_SYSUIO",
       "I_SYS_UN",   "I_SYSUTSNAME",  "I_SYS_VFS",  "I_SYS_WAIT",  "I_TERMIO",
       "I_TERMIOS",    "I_UNISTD",    "I_USTAT",     "I_VFORK",     "I_WCHAR",
       "I_WCTYPE"

       Example usage:

        #ifdef I_WCHAR
          #include <wchar.h>
        #endif

Global Variables
       These  variables  are  global  to  an  entire  process.  They are shared
       between all interpreters and all threads in a  process.   Any  variables
       not  documented  here may be changed or removed without notice, so don't
       use them!  If you feel you really do need to use an  unlisted  variable,
       first         send         email        to        perl5-porters@perl.org
       <mailto:perl5-porters@perl.org>.  It may  be  that  someone  there  will
       point  out  a  way to accomplish what you need without using an internal
       variable.  But if not, you should get a go-ahead to  document  and  then
       use the variable.

       "PL_check"
           Array,  indexed  by opcode, of functions that will be called for the
           "check" phase of optree building during compilation  of  Perl  code.
           For  most  (but not all) types of op, once the op has been initially
           built and populated with child ops it will be filtered  through  the
           check  function referenced by the appropriate element of this array.
           The new op is passed in as the sole argument to the check  function,
           and the check function returns the completed op.  The check function
           may  (as  the  name  suggests)  check the op for validity and signal
           errors.  It may also initialise or  modify  parts  of  the  ops,  or
           perform  more  radical surgery such as adding or removing child ops,
           or even throw the op away and return a different op in its place.

           This array of function pointers is a convenient place to  hook  into
           the  compilation process.  An XS module can put its own custom check
           function in place of any of the  standard  ones,  to  influence  the
           compilation  of  a  particular  type of op.  However, a custom check
           function must never fully replace a standard check function (or even
           a custom check function from another module).   A  module  modifying
           checking must instead wrap the preexisting check function.  A custom
           check  function  must  be  selective  about when to apply its custom
           behaviour.  In the usual case where it decides not  to  do  anything
           special  with  an  op,  it  must  chain the preexisting op function.
           Check functions are thus linked in a chain,  with  the  core's  base
           checker at the end.

           For  thread safety, modules should not write directly to this array.
           Instead, use the function "wrap_op_checker".

       "PL_infix_plugin"
           NOTE: "PL_infix_plugin" is experimental and may change or be removed
           without notice.

           NOTE: This API exists entirely for the purpose of  making  the  CPAN
           module  "XS::Parse::Infix"  work. It is not expected that additional
           modules  will  make  use  of  it;  rather,  that  they  should   use
           "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.  "opname"  points  to  the  operator name in the
           parser's input buffer, and "oplen" gives the 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  %^H,  to  determine  whether it wants to handle the
           operator name.

           As compared to the single stage of "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  "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  "oplen".  In  the  case  of  an operator named by non-identifier
           characters, this is permitted to be shorter than  "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  "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 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
           "opdata"  to  provide  an SV containing additional data to be passed
           into the "build_op" function later on.

           The information structure gives the operator precedence level in the
           "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 "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 "build_op" function has returned, if the variable  pointed
           to  by  "opdata"  was  set  to  a  non-"NULL" value, it will then be
           destroyed by calling SvREFCNT_dec().

           For thread safety, modules should not set  this  variable  directly.
           Instead, use the function "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
           "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 "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.

       "PL_keyword_plugin"
           NOTE: "PL_keyword_plugin" is  experimental  and  may  change  or  be
           removed without notice.

           Function  pointer,  pointing  at  a function used to handle extended
           keywords.  The function should be declared as

                   int keyword_plugin_function(pTHX_
                           char *keyword_ptr, STRLEN keyword_len,
                           OP **op_ptr)

           The function is called  from  the  tokeniser,  whenever  a  possible
           keyword  is  seen.  "keyword_ptr" points at the word in the parser's
           input buffer, and "keyword_len" gives its length; it  is  not  null-
           terminated.   The  function  is  expected  to  examine the word, and
           possibly other state such as %^H, to  decide  whether  it  wants  to
           handle  it  as  an  extended  keyword.  If it does not, the function
           should  return  "KEYWORD_PLUGIN_DECLINE",  and  the  normal   parser
           process will continue.

           If  the  function  wants  to handle the keyword, it first must parse
           anything following the keyword that is part of the syntax introduced
           by the keyword.  See "Lexer interface" for details.

           When a keyword is being handled, the plugin function  must  build  a
           tree of "OP" structures, representing the code that was parsed.  The
           root  of  the  tree  must  be  stored in *op_ptr.  The function then
           returns a constant indicating the syntactic role  of  the  construct
           that  it  has  parsed:  "KEYWORD_PLUGIN_STMT"  if  it  is a complete
           statement, or "KEYWORD_PLUGIN_EXPR" if it is  an  expression.   Note
           that  a  statement  construct  cannot  be  used inside an expression
           (except via "do BLOCK" and similar), and  an  expression  is  not  a
           complete statement (it requires at least a terminating semicolon).

           When  a  keyword  is  handled,  the  plugin  function  may also have
           (compile-time) side effects.  It may modify "%^H", define functions,
           and so on.  Typically, if side effects are the  main  purpose  of  a
           handler,  it does not wish to generate any ops to be included in the
           normal compilation.  In this case it is still required to supply  an
           op tree, but it suffices to generate a single null op.

           That's  how the *PL_keyword_plugin function needs to behave overall.
           Conventionally,  however,  one  does  not  completely  replace   the
           existing    handler    function.     Instead,   take   a   copy   of
           "PL_keyword_plugin" before assigning your own  function  pointer  to
           it.   Your  handler  function  should  look  for keywords that it is
           interested in and handle those.  Where  it  is  not  interested,  it
           should  call  the saved plugin function, passing on the arguments it
           received.  Thus "PL_keyword_plugin" actually points at  a  chain  of
           handler  functions,  all  of  which  have  an  opportunity to handle
           keywords, and only the last function in the chain  (built  into  the
           Perl core) will normally return "KEYWORD_PLUGIN_DECLINE".

           For  thread  safety,  modules should not set this variable directly.
           Instead, use the function "wrap_keyword_plugin".

       "PL_phase"
           A  value  that  indicates  the  current  Perl  interpreter's  phase.
           Possible  values include "PERL_PHASE_CONSTRUCT", "PERL_PHASE_START",
           "PERL_PHASE_CHECK",       "PERL_PHASE_INIT",       "PERL_PHASE_RUN",
           "PERL_PHASE_END", and "PERL_PHASE_DESTRUCT".

           For  example, the following determines whether the interpreter is in
           global destruction:

               if (PL_phase == PERL_PHASE_DESTRUCT) {
                   // we are in global destruction
               }

           "PL_phase" was introduced in Perl 5.14; in prior perls you  can  use
           "PL_dirty"  (boolean)  to  determine  whether  the interpreter is in
           global destruction. (Use of "PL_dirty" is discouraged since 5.14.)

            enum perl_phase  PL_phase

GV Handling and Stashes
       A GV is a structure which corresponds to a Perl typeglob, ie  *foo.   It
       is  a  structure that holds a pointer to a scalar, an array, a hash etc,
       corresponding to $foo, @foo, %foo.

       GVs are usually found as values in stashes (symbol table  hashes)  where
       Perl stores its global variables.

       A  stash is a hash that contains all variables that are defined within a
       package.  See "Stashes and Globs" in perlguts

       "amagic_call"
           Perform the overloaded (active magic) operation given  by  "method".
           "method" is one of the values found in overload.h.

           "flags" affects how the operation is performed, as follows:

           "AMGf_noleft"
               "left" is not to be used in this operation.

           "AMGf_noright"
               "right" is not to be used in this operation.

           "AMGf_unary"
               The operation is done only on just one operand.

           "AMGf_assign"
               The operation changes one of the operands, e.g., $x += 1

            SV *  amagic_call(SV *left, SV *right, int method, int dir)

       "amagic_deref_call"
           Perform  "method"  overloading dereferencing on "ref", returning the
           dereferenced result.   "method"  must  be  one  of  the  dereference
           operations given in overload.h.

           If overloading is inactive on "ref", returns "ref" itself.

            SV *  amagic_deref_call(SV *ref, int method)

       "gv_add_by_type"
           Make sure there is a slot of type "type" in the GV "gv".

            GV *  gv_add_by_type(GV *gv, svtype type)

       "Gv_AMupdate"
           Recalculates overload magic in the package given by "stash".

           Returns:

           1 on success and there is some overload
           0 if there is no overload
           -1 if some error occurred and it couldn't croak (because
           "destructing" is true).

            int  Gv_AMupdate(HV *stash, bool destructing)

       "gv_autoload_pv"
       "gv_autoload_pvn"
       "gv_autoload_sv"
           These  each  search  for an "AUTOLOAD" method, returning NULL if not
           found, or else returning a pointer to  its  GV,  while  setting  the
           package  $AUTOLOAD  variable  to "name" (fully qualified).  Also, if
           found and the GV's CV is an XSUB, the CV's PV will be set to "name",
           and its stash will be set to the stash of the GV.

           Searching is done in "MRO" order, as specified in  ""gv_fetchmeth"",
           beginning with "stash" if it isn't NULL.

           The forms differ only in how "name" is specified.

           In "gv_autoload_pv", "namepv" is a C language NUL-terminated string.

           In  "gv_autoload_pvn",  "name" points to the first byte of the name,
           and an additional parameter, "len", specifies its length  in  bytes.
           Hence, *name may contain embedded-NUL characters.

           In  "gv_autoload_sv",  *namesv  is  an  SV,  and  the name is the PV
           extracted from that using ""SvPV"".  If the SV is marked as being in
           UTF-8, the extracted PV will also be.

            GV *  gv_autoload_pv (HV *stash, const char *namepv, U32 flags)
            GV *  gv_autoload_pvn(HV *stash, const char *name, STRLEN len,
                                  U32 flags)
            GV *  gv_autoload_sv (HV *stash, SV *namesv, U32 flags)

       "gv_autoload4"
           Equivalent to "gv_autoload_pvn".

            GV *  gv_autoload4(HV *stash, const char *name, STRLEN len,
                               I32 method)

       "GvAV"
           Return the AV from the GV.

            AV*  GvAV(GV* gv)

       "gv_AVadd"
       "gv_HVadd"
       "gv_IOadd"
       "gv_SVadd"
           Make sure there is a slot of the given type (AV, HV, IO, SV) in  the
           GV "gv".

            GV *  gv_AVadd(GV *gv)

       "gv_const_sv"
           If  "gv"  is  a  typeglob  whose  subroutine entry is a constant sub
           eligible for inlining, or "gv" is a placeholder reference that would
           be promoted to such a typeglob, then returns the value  returned  by
           the sub.  Otherwise, returns "NULL".

            SV *  gv_const_sv(GV *gv)

       "GvCV"
           Return the CV from the GV.

            CV*  GvCV(GV* gv)

       "gv_efullname3"
       "gv_efullname4"
       "gv_fullname3"
       "gv_fullname4"
           Place  the  full  package name of "gv" into "sv".  The "gv_e*" forms
           return instead the effective package name (see "HvENAME").

           If "prefix" is non-NULL, it is considered to be a  C  language  NUL-
           terminated string, and the stored name will be prefaced with it.

           The other difference between the functions is that the *4 forms have
           an  extra  parameter,  "keepmain".  If "true" an initial "main::" in
           the name is kept; if "false" it is stripped.  With the *3 forms,  it
           is always kept.

            void  gv_efullname3(SV *sv, const GV *gv, const char *prefix)
            void  gv_efullname4(SV *sv, const GV *gv, const char *prefix,
                                bool keepmain)
            void  gv_fullname3 (SV *sv, const GV *gv, const char *prefix)
            void  gv_fullname4 (SV *sv, const GV *gv, const char *prefix,
                                bool keepmain)

       "gv_fetchfile"
       "gv_fetchfile_flags"
           These return the debugger glob for the file (compiled by Perl) whose
           name is given by the "name" parameter.

           There are currently exactly two differences between these functions.

           The  "name" parameter to "gv_fetchfile" is a C string, meaning it is
           "NUL"-terminated;    whereas     the     "name"     parameter     to
           "gv_fetchfile_flags"  is  a  Perl string, whose length (in bytes) is
           passed in via the  "namelen"  parameter  This  means  the  name  may
           contain embedded "NUL" characters.  "namelen" doesn't exist in plain
           "gv_fetchfile").

           The  other  difference  is  that  "gv_fetchfile_flags"  has an extra
           "flags" parameter, which is currently completely ignored, but allows
           for possible future extensions.

            GV *  gv_fetchfile      (const char *name)
            GV *  gv_fetchfile_flags(const char * const name,
                                     const STRLEN len, const U32 flags)

       "gv_fetchmeth"
       "gv_fetchmeth_pv"
       "gv_fetchmeth_pvn"
       "gv_fetchmeth_sv"
           These each look for a glob with name "name",  containing  a  defined
           subroutine,  returning  the  GV  of that glob if found, or "NULL" if
           not.

           "stash" is always searched (first), unless it is "NULL".

           If "stash" is NULL, or was searched but nothing was found in it, and
           the "GV_SUPER" bit is set in "flags", stashes  accessible  via  @ISA
           are searched next.  Searching is conducted according to "MRO" order.

           Finally,  if  no matches were found so far, and the "GV_NOUNIVERSAL"
           flag in "flags" is not set,  "UNIVERSAL::" is searched.

           The argument "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 "name" in "stash", creating one if
           necessary.  The subroutine slot in the  glob  will  be  set  to  any
           subroutine  found in the "stash" and "SUPER::" search, hence caching
           any "SUPER::" result.  Note that subroutines found in  "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 "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 "GvCV" macro.

           The  only  other  significant  value  for  "flags"  is   "SVf_UTF8",
           indicating that "name" is to be treated as being encoded in UTF-8.

           Plain   "gv_fetchmeth"  lacks  a  "flags"  parameter,  hence  always
           searches in "stash", then "UNIVERSAL::", and "name" is never  UTF-8.
           Otherwise it is exactly like "gv_fetchmeth_pvn".

           The  other forms do have a "flags" parameter, and differ only in how
           the glob name is specified.

           In "gv_fetchmeth_pv", "name" is a C language NUL-terminated string.

           In "gv_fetchmeth_pvn", "name" points to the first byte of the  name,
           and  an  additional parameter, "len", specifies its length in bytes.
           Hence, the name may contain embedded-NUL characters.

           In "gv_fetchmeth_sv", *name is  an  SV,  and  the  name  is  the  PV
           extracted  from  that, using ""SvPV"".  If the SV is marked as being
           in UTF-8, the extracted PV will also be.

            GV *  gv_fetchmeth    (HV *stash, const char *name, STRLEN len,
                                   I32 level)
            GV *  gv_fetchmeth_pv (HV *stash, const char *name, I32 level,
                                   U32 flags)
            GV *  gv_fetchmeth_pvn(HV *stash, const char *name, STRLEN len,
                                   I32 level, U32 flags)
            GV *  gv_fetchmeth_sv (HV *stash, SV *namesv, I32 level,
                                   U32 flags)

       "gv_fetchmeth_autoload"
           This is the old form of "gv_fetchmeth_pvn_autoload",  which  has  no
           flags parameter.

            GV *  gv_fetchmeth_autoload(HV *stash, const char *name,
                                        STRLEN len, I32 level)

       "gv_fetchmethod"
           See "gv_fetchmethod_autoload".

            GV *  gv_fetchmethod(HV *stash, const char *name)

       "gv_fetchmethod_autoload"
           Returns the glob which contains the subroutine to call to invoke the
           method  on the "stash".  In fact in the presence of autoloading this
           may be the glob for "AUTOLOAD".   In  this  case  the  corresponding
           variable $AUTOLOAD is already setup.

           The  third parameter of "gv_fetchmethod_autoload" determines whether
           AUTOLOAD lookup is performed if the given  method  is  not  present:
           non-zero means yes, look for AUTOLOAD; zero means no, don't look for
           AUTOLOAD.    Calling   "gv_fetchmethod"  is  equivalent  to  calling
           "gv_fetchmethod_autoload" with a non-zero "autoload" parameter.

           These functions grant "SUPER" token as a prefix of the method  name.
           Note that if you want to keep the returned glob for a long time, you
           need  to  check for it being "AUTOLOAD", since at the later time the
           call may load a different subroutine due to $AUTOLOAD  changing  its
           value.  Use the glob created as a side effect to do this.

           These  functions  have  the same side-effects as "gv_fetchmeth" with
           "level==0".   The  warning  against  passing  the  GV  returned   by
           "gv_fetchmeth" to "call_sv" applies equally to these functions.

            GV *  gv_fetchmethod_autoload(HV *stash, const char *name,
                                          I32 autoload)

       "gv_fetchmeth_pv_autoload"
           Exactly like "gv_fetchmeth_pvn_autoload", but takes a nul-terminated
           string instead of a string/length pair.

            GV *  gv_fetchmeth_pv_autoload(HV *stash, const char *name,
                                           I32 level, U32 flags)

       "gv_fetchmeth_pvn_autoload"
           Same  as  gv_fetchmeth_pvn(),  but  looks for autoloaded subroutines
           too.  Returns a glob for the subroutine.

           For an autoloaded subroutine without a GV, will create a GV even  if
           "level < 0".  For an autoloaded subroutine without a stub, GvCV() of
           the result may be zero.

           Currently, the only significant value for "flags" is "SVf_UTF8".

            GV *  gv_fetchmeth_pvn_autoload(HV *stash, const char *name,
                                            STRLEN len, I32 level, U32 flags)

       "gv_fetchmeth_sv_autoload"
           Exactly  like "gv_fetchmeth_pvn_autoload", but takes the name string
           in the form of an SV instead of a string/length pair.

            GV *  gv_fetchmeth_sv_autoload(HV *stash, SV *namesv, I32 level,
                                           U32 flags)

       "gv_fetchpv"
       "gv_fetchpvn"
       "gv_fetchpvn_flags"
       "gv_fetchpvs"
       "gv_fetchsv"
       "gv_fetchsv_nomg"
           These all return the GV of type "sv_type" whose name is given by the
           inputs, or NULL if no GV of that name and type could be found.   See
           "Stashes and Globs" in perlguts.

           The  only  differences  are  how the input name is specified, and if
           'get' magic is normally used in getting that name.

           Don't be fooled by the fact that only one form has  "flags"  in  its
           name.   They  all have a "flags" parameter in fact, and all the flag
           bits have the same meanings for all

           If  any   of   the   flags   "GV_ADD",   "GV_ADDMG",   "GV_ADDWARN",
           "GV_ADDMULTI",  or  "GV_NOINIT"  is  set,  a  GV  is created if none
           already exists for the input name  and  type.   However,  "GV_ADDMG"
           will  only do the creation for magical GV's.  For all of these flags
           except "GV_NOINIT", "gv_init_pvn"  is  called  after  the  addition.
           "GV_ADDWARN"  is  used  when the caller expects that adding won't be
           necessary because the symbol should already exist; but if  not,  add
           it  anyway,  with  a  warning  that it was unexpectedly absent.  The
           "GV_ADDMULTI" flag means to pretend that the GV has been seen before
           (i.e., suppress "Used once" warnings).

           The flag "GV_NOADD_NOINIT" causes "gv_init_pvn" not be to called  if
           the GV existed but isn't PVGV.

           If  the  "SVf_UTF8" bit is set, the name is treated as being encoded
           in UTF-8; otherwise the name won't be considered to be UTF-8 in  the
           "pv"-named  forms,  and  the UTF-8ness of the underlying SVs will be
           used in the "sv" forms.

           If the flag "GV_NOTQUAL" is set, the caller warrants that the  input
           name is a plain symbol name, not qualified with a package, otherwise
           the name is checked for being a qualified one.

           In  "gv_fetchpv",  "nambeg"  is  a  C string, NUL-terminated with no
           intermediate NULs.

           In "gv_fetchpvs", "name" is a literal C string, hence is enclosed in
           double quotes.

           "gv_fetchpvn" and  "gv_fetchpvn_flags"  are  identical.   In  these,
           <nambeg>  is a Perl string whose byte length is given by "full_len",
           and may contain embedded NULs.

           In "gv_fetchsv" and "gv_fetchsv_nomg", the name  is  extracted  from
           the  PV  of  the input "name" SV.  The only difference between these
           two forms is  that  'get'  magic  is  normally  done  on  "name"  in
           "gv_fetchsv",  and always skipped with "gv_fetchsv_nomg".  Including
           "GV_NO_SVGMAGIC" in the "flags" parameter to "gv_fetchsv"  makes  it
           behave identically to "gv_fetchsv_nomg".

            GV *  gv_fetchpv       (const char *nambeg, I32 flags,
                                    const svtype sv_type)
            GV *  gv_fetchpvn      (const char * nambeg, STRLEN full_len,
                                    I32 flags, const svtype sv_type)
            GV *  gv_fetchpvn_flags(const char *name, STRLEN len, I32 flags,
                                    const svtype sv_type)
            GV *  gv_fetchpvs      ("name", I32 flags, const svtype sv_type)
            GV *  gv_fetchsv       (SV *name, I32 flags, const svtype sv_type)
            GV *  gv_fetchsv_nomg  (SV *name, I32 flags, const svtype sv_type)

       "GvHV"
           Return the HV from the GV.

            HV*  GvHV(GV* gv)

       "gv_init"
           The old form of gv_init_pvn().  It does not work with UTF-8 strings,
           as  it has no flags parameter.  If the "multi" parameter is set, the
           "GV_ADDMULTI" flag will be passed to gv_init_pvn().

            void  gv_init(GV *gv, HV *stash, const char *name, STRLEN len,
                          int multi)

       "gv_init_pv"
           Same as gv_init_pvn(), but takes a  nul-terminated  string  for  the
           name instead of separate char * and length parameters.

            void  gv_init_pv(GV *gv, HV *stash, const char *name, U32 flags)

       "gv_init_pvn"
           Converts a scalar into a typeglob.  This is an incoercible typeglob;
           assigning a reference to it will assign to one of its slots, instead
           of  overwriting  it  as happens with typeglobs created by "SvSetSV".
           Converting any scalar  that  is  SvOK()  may  produce  unpredictable
           results and is reserved for perl's internal use.

           "gv" is the scalar to be converted.

           "stash" is the parent stash/package, if any.

           "name"  and "len" give the name.  The name must be unqualified; that
           is, it must not include the  package  name.   If  "gv"  is  a  stash
           element,  it  is the caller's responsibility to ensure that the name
           passed to this function matches the name of the element.  If it does
           not match, perl's internal bookkeeping will get out of sync.

           "flags" can be set to "SVf_UTF8" if "name" is a UTF-8 string, or the
           return value of SvUTF8(sv).  It  can  also  take  the  "GV_ADDMULTI"
           flag, which means to pretend that the GV has been seen before (i.e.,
           suppress "Used once" warnings).

            void  gv_init_pvn(GV *gv, HV *stash, const char *name, STRLEN len,
                              U32 flags)

       "gv_init_sv"
           Same  as  gv_init_pvn(),  but  takes an SV * for the name instead of
           separate char * and length parameters.  "flags" is currently unused.

            void  gv_init_sv(GV *gv, HV *stash, SV *namesv, U32 flags)

       "gv_name_set"
           Set the name for GV "gv" to "name" which is "len" bytes long.   Thus
           it may contain embedded NUL characters.

           If "flags" contains "SVf_UTF8", the name is treated as being encoded
           in UTF-8; otherwise not.

            void  gv_name_set(GV *gv, const char *name, U32 len, U32 flags)

       "gv_stashpv"
           Returns  a  pointer  to  the  stash  for  a specified package.  Uses
           "strlen"  to  determine   the   length   of   "name",   then   calls
           gv_stashpvn().

            HV *  gv_stashpv(const char *name, I32 flags)

       "gv_stashpvn"
           Returns  a  pointer  to  the  stash  for  a  specified package.  The
           "namelen" parameter indicates the length of the  "name",  in  bytes.
           "flags" is passed to gv_fetchpvn_flags(), so if set to "GV_ADD" then
           the  package  will  be created if it does not already exist.  If the
           package does not exist and "flags" is 0 (or any other  setting  that
           does not create packages) then "NULL" is returned.

           Flags may be one of:

            GV_ADD           Create and initialize the package if doesn't
                             already exist
            GV_NOADD_NOINIT  Don't create the package,
            GV_ADDMG         GV_ADD iff the GV is magical
            GV_NOINIT        GV_ADD, but don't initialize
            GV_NOEXPAND      Don't expand SvOK() entries to PVGV
            SVf_UTF8         The name is in UTF-8

           The most important of which are probably "GV_ADD" and "SVf_UTF8".

           Note, use of "gv_stashsv" instead of "gv_stashpvn" where possible is
           strongly recommended for performance reasons.

            HV *  gv_stashpvn(const char *name, U32 namelen, I32 flags)

       "gv_stashpvs"
           Like  "gv_stashpvn",  but  takes  a  literal  string  instead  of  a
           string/length pair.

            HV*  gv_stashpvs("name", I32 create)

       "gv_stashsv"
           Returns a pointer  to  the  stash  for  a  specified  package.   See
           "gv_stashpvn".

           Note  this  interface  is  strongly preferred over "gv_stashpvn" for
           performance reasons.

            HV *  gv_stashsv(SV *sv, I32 flags)

       "GvSV"
           Return the SV from the GV.

           Prior to Perl v5.9.3, this would  add  a  scalar  if  none  existed.
           Nowadays,   use   "GvSVn"   for   that,   or   compile   perl   with
           "-DPERL_CREATE_GVSV".  See perl5100delta.

            SV*  GvSV(GV* gv)

       "GvSVn"
           Like "GvSV", but creates an empty scalar if none already exists.

            SV*  GvSVn(GV* gv)

       "newGVgen"
       "newGVgen_flags"
           Create a new, guaranteed to be unique, GV in the  package  given  by
           the NUL-terminated C language string "pack", and return a pointer to
           it.

           For  "newGVgen" or if "flags" in "newGVgen_flags" is 0, "pack" is to
           be considered to be  encoded  in  Latin-1.   The  only  other  legal
           "flags"  value  is  "SVf_UTF8",  which  indicates  "pack"  is  to be
           considered to be encoded in UTF-8.

            GV *  newGVgen      (const char *pack)
            GV *  newGVgen_flags(const char *pack, U32 flags)

       "PL_curstash"
           The stash for the package code will be compiled into.

           On threaded perls, each thread  has  an  independent  copy  of  this
           variable;  each  initialized at creation time with the current value
           of the creating thread's copy.

            HV*  PL_curstash

       "PL_defgv"
           The GV representing *_.  Useful for access to $_.

           On threaded perls, each thread  has  an  independent  copy  of  this
           variable;  each  initialized at creation time with the current value
           of the creating thread's copy.

            GV *  PL_defgv

       "PL_defoutgv"
           See "setdefout".

       "PL_defstash"
           Described in perlguts.

       "save_gp"
           Saves the current GP of gv on the save stack to be restored on scope
           exit.

           If "empty" is true, replace the GP with a new GP.

           If "empty"  is  false,  mark  "gv"  with  "GVf_INTRO"  so  the  next
           reference     assigned     is     localized,     which     is    how
           " local *foo = $someref; " works.

            void  save_gp(GV *gv, I32 empty)

       "setdefout"
           Sets "PL_defoutgv", the default  file  handle  for  output,  to  the
           passed  in  typeglob.   As  "PL_defoutgv"  "owns" a reference on its
           typeglob, the reference count of the passed in typeglob is increased
           by one, and the reference count of the typeglob  that  "PL_defoutgv"
           points to is decreased by one.

            void  setdefout(GV *gv)

Hook manipulation
       These functions provide convenient and thread-safe means of manipulating
       hook variables.

       "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);

            char *  rcpv_copy(char * const pv)

       "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);

            char *  rcpv_free(char * const pv)

       "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  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.

            char *  rcpv_new(const char * const pv, STRLEN len, U32 flags)

       "wrap_op_checker"
           Puts a C function into the chain of check functions for a  specified
           op  type.   This  is  the preferred way to manipulate the "PL_check"
           array.  "opcode" specifies which type  of  op  is  to  be  affected.
           "new_checker"  is a pointer to the C function that is to be added to
           that opcode's check chain, and "old_checker_p" points to the storage
           location where a pointer to the next function in the chain  will  be
           stored.   The  value of "new_checker" is written into the "PL_check"
           array, while  the  value  previously  stored  there  is  written  to
           *old_checker_p.

           "PL_check"  is  global to an entire process, and a module wishing to
           hook op checking may find itself invoked more than once per process,
           typically in different threads.   To  handle  that  situation,  this
           function  is idempotent.  The location *old_checker_p must initially
           (once per process) contain a null pointer.  A C variable  of  static
           duration  (declared at file scope, typically also marked "static" to
           give  it  internal   linkage)   will   be   implicitly   initialised
           appropriately,  if  it  does not have an explicit initialiser.  This
           function will only actually modify  the  check  chain  if  it  finds
           *old_checker_p to be null.  This function is also thread safe on the
           small  scale.   It uses appropriate locking to avoid race conditions
           in accessing "PL_check".

           When  this  function  is  called,   the   function   referenced   by
           "new_checker"  must be ready to be called, except for *old_checker_p
           being unfilled.  In a  threading  situation,  "new_checker"  may  be
           called   immediately,   even  before  this  function  has  returned.
           *old_checker_p will always be appropriately set before "new_checker"
           is called.  If "new_checker" decides not to do anything special with
           an op that it is given (which is the usual case for most uses of  op
           check  hooking),  it  must  chain  the  check function referenced by
           *old_checker_p.

           Taken all together, XS code to hook an op checker  should  typically
           look something like this:

               static Perl_check_t nxck_frob;
               static OP *myck_frob(pTHX_ OP *op) {
                   ...
                   op = nxck_frob(aTHX_ op);
                   ...
                   return op;
               }
               BOOT:
                   wrap_op_checker(OP_FROB, myck_frob, &nxck_frob);

           If  you  want  to  influence  compilation  of  calls  to  a specific
           subroutine, then use "cv_set_call_checker_flags" rather than hooking
           checking of all "entersub" ops.

            void  wrap_op_checker(Optype opcode, Perl_check_t new_checker,
                                  Perl_check_t *old_checker_p)

HV Handling
       A HV structure represents a Perl hash.  It consists mainly of  an  array
       of  pointers,  each  of  which points to a linked list of HE structures.
       The array is indexed by the hash function of the  key,  so  each  linked
       list  represents all the hash entries with the same hash value.  Each HE
       contains a pointer to  the  actual  value,  plus  a  pointer  to  a  HEK
       structure which holds the key and hash value.

       "get_hv"
           Returns  the  HV  of the specified Perl hash.  "flags" are passed to
           "gv_fetchpv".  If "GV_ADD" is set and the  Perl  variable  does  not
           exist  then  it  will  be  created.   If  "flags"  is zero (ignoring
           "SVf_UTF8") and the variable does not exist then "NULL" is returned.

           NOTE: the perl_get_hv() form is deprecated.

            HV *  get_hv(const char *name, I32 flags)

       "HE"
           Described in perlguts.

       "HEf_SVKEY"
           This flag, used in  the  length  slot  of  hash  entries  and  magic
           structures,  specifies the structure contains an "SV*" pointer where
           a "char*" pointer is to be expected.  (For information only--not  to
           be used).

       "HeHASH"
           Returns the computed hash stored in the hash entry.

            U32  HeHASH(HE* he)

       "HeKEY"
           Returns the actual pointer stored in the key slot of the hash entry.
           The  pointer  may be either "char*" or "SV*", depending on the value
           of HeKLEN().  Can be assigned to.  The HePV()  or  HeSVKEY()  macros
           are usually preferable for finding the value of a key.

            void*  HeKEY(HE* he)

       "HeKLEN"
           If  this  is  negative, and amounts to "HEf_SVKEY", it indicates the
           entry holds an "SV*" key.  Otherwise, holds the actual length of the
           key.  Can be assigned to.  The HePV() macro  is  usually  preferable
           for finding key lengths.

            STRLEN  HeKLEN(HE* he)

       "HePV"
           Returns the key slot of the hash entry as a "char*" value, doing any
           necessary  dereferencing  of possibly "SV*" keys.  The length of the
           string is placed in "len" (this is a macro, so do not use &len).  If
           you do not care about what the length of the key is, you may use the
           global variable "PL_na", though this is rather less  efficient  than
           using a local variable.  Remember though, that hash keys in perl are
           free  to contain embedded nulls, so using strlen() or similar is not
           a good way to find the length of hash keys.  This is very similar to
           the SvPV() macro described elsewhere in  this  document.   See  also
           "HeUTF8".

           If  you  are  using  "HePV"  to  get values to pass to newSVpvn() to
           create a new SV, you should consider using "newSVhek(HeKEY_hek(he))"
           as it is more efficient.

            char*  HePV(HE* he, STRLEN len)

       "HeSVKEY"
           Returns the key as an "SV*", or "NULL" if the hash  entry  does  not
           contain an "SV*" key.

            SV*  HeSVKEY(HE* he)

       "HeSVKEY_force"
           Returns  the  key  as  an "SV*".  Will create and return a temporary
           mortal "SV*" if the hash entry contains only a "char*" key.

            SV*  HeSVKEY_force(HE* he)

       "HeSVKEY_set"
           Sets the key to a given "SV*", taking care to  set  the  appropriate
           flags to indicate the presence of an "SV*" key, and returns the same
           "SV*".

            SV*  HeSVKEY_set(HE* he, SV* sv)

       "HeUTF8"
           Returns  whether the "char *" value returned by "HePV" is encoded in
           UTF-8, doing any necessary dereferencing  of  possibly  "SV*"  keys.
           The  value returned will be 0 or non-0, not necessarily 1 (or even a
           value with any low bits set), so do not blindly  assign  this  to  a
           "bool" variable, as "bool" may be a typedef for "char".

            U32  HeUTF8(HE* he)

       "HeVAL"
           Returns  the  value slot (type "SV*") stored in the hash entry.  Can
           be assigned to.

             SV *foo= HeVAL(hv);
             HeVAL(hv)= sv;

            SV*  HeVAL(HE* he)

       "HV"
           Described in perlguts.

       "hv_assert"
           Check that a hash is in an internally consistent state.

           NOTE: "hv_assert" must be explicitly called as "Perl_hv_assert" with
           an "aTHX_" parameter.

            void  Perl_hv_assert(pTHX_ HV *hv)

       "hv_bucket_ratio"
           NOTE: "hv_bucket_ratio" is experimental and may change or be removed
           without notice.

           If the hash is tied dispatches through to the  SCALAR  tied  method,
           otherwise  if the hash contains no keys returns 0, otherwise returns
           a mortal sv containing  a  string  specifying  the  number  of  used
           buckets,  followed  by  a slash, followed by the number of available
           buckets.

           This function is expensive, it must  scan  all  of  the  buckets  to
           determine  which  are used, and the count is NOT cached.  In a large
           hash this could be a lot of buckets.

            SV *  hv_bucket_ratio(HV *hv)

       "hv_clear"
           Frees all the  elements  of  a  hash,  leaving  it  empty.   The  XS
           equivalent of "%hash = ()".  See also "hv_undef".

           See  "av_clear"  for a note about the hash possibly being invalid on
           return.

            void  hv_clear(HV *hv)

       "hv_clear_placeholders"
           Clears any placeholders from a hash.  If a restricted hash  has  any
           of  its keys marked as readonly and the key is subsequently deleted,
           the key is not actually deleted but is  marked  by  assigning  it  a
           value  of &PL_sv_placeholder.  This tags it so it will be ignored by
           future operations such as iterating over the hash,  but  will  still
           allow  the hash to have a value reassigned to the key at some future
           point.  This function clears any  such  placeholder  keys  from  the
           hash.  See Hash::Util::lock_keys() for an example of its use.

            void  hv_clear_placeholders(HV *hv)

       "hv_copy_hints_hv"
           A specialised version of "newHVhv" for copying "%^H".  "ohv" must be
           a  pointer  to  a  hash  (which  may have "%^H" magic, but should be
           generally non-magical), or "NULL" (interpreted as  an  empty  hash).
           The  content  of  "ohv"  is  copied  to  a  new  hash, which has the
           "%^H"-specific magic added to it.  A pointer  to  the  new  hash  is
           returned.

            HV *  hv_copy_hints_hv(HV * const ohv)

       "hv_delete"
       "hv_deletes"
           These  delete  a  key/value  pair  in  the  hash.  The value's SV is
           removed from the hash, made mortal, and returned to the caller.

           In "hv_deletes", the key  must  be  a  C  language  string  literal,
           enclosed  in  double quotes.  It is never treated as being in UTF-8.
           There is no length_parameter.

           In "hv_delete", the absolute value of "klen" is the  length  of  the
           key.    If   "klen"  is  negative  the  key  is  assumed  to  be  in
           UTF-8-encoded Unicode.

           In both, the  "flags"  value  will  normally  be  zero;  if  set  to
           "G_DISCARD"  then  "NULL"  will  be  returned.   "NULL" will also be
           returned if the key is not found.

            SV *  hv_delete (HV *hv, const char *key, I32 klen, I32 flags)
            SV *  hv_deletes(HV *hv, "key", U32 flags)

       "hv_delete_ent"
           Deletes a key/value pair in the hash.  The value SV is removed  from
           the  hash,  made  mortal,  and  returned to the caller.  The "flags"
           value will normally be zero; if set to "G_DISCARD" then "NULL"  will
           be  returned.  "NULL" will also be returned if the key is not found.
           "hash" can be a valid precomputed hash value, or 0 to ask for it  to
           be computed.

            SV *  hv_delete_ent(HV *hv, SV *keysv, I32 flags, U32 hash)

       "HvENAME"
           Returns  the  effective  name  of a stash, or NULL if there is none.
           The effective name represents a location in the symbol  table  where
           this  stash  resides.  It is updated automatically when packages are
           aliased or deleted.  A stash that is no longer in the  symbol  table
           has  no effective name.  This name is preferable to "HvNAME" for use
           in MRO linearisations and isa caches.

            char*  HvENAME(HV* stash)

       "HvENAMELEN"
           Returns the length of the stash's effective name.

            STRLEN  HvENAMELEN(HV *stash)

       "HvENAMEUTF8"
           Returns true if the effective name is in UTF-8 encoding.

            unsigned char  HvENAMEUTF8(HV *stash)

       "hv_exists"
       "hv_existss"
           These return a boolean indicating whether  the  specified  hash  key
           exists.

           In  "hv_existss",  the  key  must  be  a  C language string literal,
           enclosed in double quotes.  It is never treated as being  in  UTF-8.
           There is no length_parameter.

           In  "hv_exists",  the  absolute value of "klen" is the length of the
           key.   If  "klen"  is  negative  the  key  is  assumed  to   be   in
           UTF-8-encoded Unicode.

            bool  hv_exists (HV *hv, const char *key, I32 klen)
            bool  hv_existss(HV *hv, "key")

       "hv_exists_ent"
           Returns  a boolean indicating whether the specified hash key exists.
           "hash" can be a valid precomputed hash value, or 0 to ask for it  to
           be computed.

            bool  hv_exists_ent(HV *hv, SV *keysv, U32 hash)

       "hv_fetch"
       "hv_fetchs"
           These  return  the  SV which corresponds to the specified key in the
           hash.

           In "hv_fetchs", the  key  must  be  a  C  language  string  literal,
           enclosed  in  double quotes.  It is never treated as being in UTF-8.
           There is no length_parameter.

           In "hv_fetch", the absolute value of "klen" is  the  length  of  the
           key.    If   "klen"  is  negative  the  key  is  assumed  to  be  in
           UTF-8-encoded Unicode.

           In both, if "lval" is set, then the fetch will be part of  a  store.
           This means that if there is no value in the hash associated with the
           given key, then one is created and a pointer to it is returned.  The
           "SV*"  it  points  to can be assigned to.  But always check that the
           return value is non-null before dereferencing it to an "SV*".

           See "Understanding the Magic of Tied Hashes and Arrays" in  perlguts
           for more information on how to use this function on tied hashes.

            SV **  hv_fetch (HV *hv, const char *key, I32 klen, I32 lval)
            SV **  hv_fetchs(HV *hv, "key", I32 lval)

       "hv_fetch_ent"
           Returns the hash entry which corresponds to the specified key in the
           hash.   "hash" must be a valid precomputed hash number for the given
           "key", or 0 if you want the function to compute it.   IF  "lval"  is
           set  then  the  fetch will be part of a store.  Make sure the return
           value is non-null before accessing it.  The return value  when  "hv"
           is a tied hash is a pointer to a static location, so be sure to make
           a copy of the structure if you need to store it somewhere.

           See  "Understanding the Magic of Tied Hashes and Arrays" in perlguts
           for more information on how to use this function on tied hashes.

            HE *  hv_fetch_ent(HV *hv, SV *keysv, I32 lval, U32 hash)

       "hv_fetchs"
           Like  "hv_fetch",  but  takes  a  literal  string   instead   of   a
           string/length pair.

            SV**  hv_fetchs(HV* tb, "key", I32 lval)

       "HvFILL"
           Returns the number of hash buckets that happen to be in use.

           As  of  perl 5.25 this function is used only for debugging purposes,
           and the number of used hash buckets is not in any way  cached,  thus
           this  function  can be costly to execute as it must iterate over all
           the buckets in the hash.

            STRLEN  HvFILL(HV *const hv)

       "HvHasAUX"
           Returns true if the HV has a "struct xpvhv_aux" extension. Use  this
           to check whether it is valid to call HvAUX().

            bool  HvHasAUX(HV *const hv)

       "hv_iterinit"
           Prepares  a  starting  point  to traverse a hash table.  Returns the
           number of keys in the hash, including placeholders (i.e. the same as
           HvTOTALKEYS(hv)).  The return value is currently only meaningful for
           hashes without tie magic.

           NOTE: Before version 5.004_65,  "hv_iterinit"  used  to  return  the
           number  of hash buckets that happen to be in use.  If you still need
           that esoteric value, you can get it through the macro HvFILL(hv).

            I32  hv_iterinit(HV *hv)

       "hv_iterkey"
           Returns the key from the current position of the hash iterator.  See
           "hv_iterinit".

            char *  hv_iterkey(HE *entry, I32 *retlen)

       "hv_iterkeysv"
           Returns the key as an "SV*" from the current position  of  the  hash
           iterator.  The return value will always be a mortal copy of the key.
           Also see "hv_iterinit".

            SV *  hv_iterkeysv(HE *entry)

       "hv_iternext"
           Returns entries from a hash iterator.  See "hv_iterinit".

           You  may  call "hv_delete" or "hv_delete_ent" on the hash entry that
           the iterator currently points  to,  without  losing  your  place  or
           invalidating  your  iterator.   Note  that  in this case the current
           entry is deleted from the hash with your iterator holding  the  last
           reference  to it.  Your iterator is flagged to free the entry on the
           next call to "hv_iternext", so you must not  discard  your  iterator
           immediately else the entry will leak - call "hv_iternext" to trigger
           the resource deallocation.

            HE *  hv_iternext(HV *hv)

       "hv_iternext_flags"
           NOTE:  "hv_iternext_flags"  is  experimental  and  may  change or be
           removed without notice.

           Returns  entries  from  a  hash  iterator.   See  "hv_iterinit"  and
           "hv_iternext".    The  "flags"  value  will  normally  be  zero;  if
           "HV_ITERNEXT_WANTPLACEHOLDERS" is set  the  placeholders  keys  (for
           restricted  hashes) will be returned in addition to normal keys.  By
           default placeholders are automatically skipped  over.   Currently  a
           placeholder  is implemented with a value that is &PL_sv_placeholder.
           Note that the implementation of placeholders and  restricted  hashes
           may  change,  and  the  implementation  currently  is insufficiently
           abstracted for any change to be tidy.

            HE *  hv_iternext_flags(HV *hv, I32 flags)

       "hv_iternextsv"
           Performs an "hv_iternext", "hv_iterkey",  and  "hv_iterval"  in  one
           operation.

            SV *  hv_iternextsv(HV *hv, char **key, I32 *retlen)

       "hv_iterval"
           Returns  the  value  from the current position of the hash iterator.
           See "hv_iterkey".

            SV *  hv_iterval(HV *hv, HE *entry)

       "hv_ksplit"
           Attempt to grow the hash "hv" so it has at  least  "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;

            void  hv_ksplit(HV *hv, IV newmax)

       "hv_magic"
           Adds magic to a hash.  See "sv_magic".

            void  hv_magic(HV *hv, GV *gv, int how)

       "HvNAME"
           Returns  the  package  name of a stash, or "NULL" if "stash" isn't a
           stash.  See "SvSTASH", "CvSTASH".

            char*  HvNAME(HV* stash)

       "HvNAMELEN"
           Returns the length of the stash's name.

           Disfavored forms of HvNAME and HvNAMELEN; suppress mention of them

            STRLEN  HvNAMELEN(HV *stash)

       "hv_name_set"
       "hv_name_sets"
           These each set the name of stash "hv" to the specified name.

           They differ only in how the name is specified.

           In "hv_name_sets", the name is  a  literal  C  string,  enclosed  in
           double quotes.

           In  "hv_name_set",  "name" points to the first byte of the name, and
           an additional parameter,  "len",  specifies  its  length  in  bytes.
           Hence, the name may contain embedded-NUL characters.

           If  "SVf_UTF8"  is  set  in "flags", the name is treated as being in
           UTF-8; otherwise not.

           If "HV_NAME_SETALL" is  set  in  "flags",  both  the  name  and  the
           effective name are set.

            void  hv_name_set (HV *hv, const char *name, U32 len, U32 flags)
            void  hv_name_sets(HV *hv, "name", U32 flags)

       "HvNAMEUTF8"
           Returns true if the name is in UTF-8 encoding.

            unsigned char  HvNAMEUTF8(HV *stash)

       "hv_scalar"
           Evaluates the hash in scalar context and returns the result.

           When  the  hash  is  tied  dispatches  through to the SCALAR method,
           otherwise returns a mortal SV containing the number of keys  in  the
           hash.

           Note,  prior  to 5.25 this function returned what is now returned by
           the hv_bucket_ratio() function.

            SV *  hv_scalar(HV *hv)

       "hv_store"
       "hv_stores"
           These each store SV "val" with  the  specified  key  in  hash  "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
           "SV*".

           They differ only in how the hash key is specified.

           In "hv_stores", the  key  must  be  a  C  language  string  literal,
           enclosed  in  double quotes.  It is never treated as being in UTF-8.
           There is no length_parameter.

           In "hv_store", "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, "klen".  A  NULL  key
           indicates  the  key  is  to  be  treated  as  "undef", and "klen" is
           ignored; otherwise the key string may  contain  embedded-NUL  bytes.
           If  "klen"  is  negative,  the string is treated as being encoded in
           UTF-8; otherwise not.

           "hv_store" has another extra parameter, "hash", a  precomputed  hash
           of  the  key  string,  or zero if it has not been precomputed.  This
           parameter  is  omitted  from  "hv_stores",   as   it   is   computed
           automatically at compile time.

           If <hv> is NULL, NULL is returned and no action is taken.

           If  "val"  is  NULL,  it  is treated as being "undef"; otherwise the
           caller is responsible for suitably incrementing the reference  count
           of  "val"  before  the  call,  and  decrementing  it if the function
           returned  "NULL".   Effectively  a   successful   "hv_store"   takes
           ownership of one reference to "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, "hv_store" will own
           the only reference to the new SV, and your code doesn't need  to  do
           anything further to tidy up.

           "hv_store"  is  not  implemented  as a call to ""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  "hv_store"  in  preference to
           "hv_store_ent".

           See "Understanding the Magic of Tied Hashes and Arrays" in  perlguts
           for more information on how to use this function on tied hashes.

            SV **  hv_store (HV *hv, const char *key, I32 klen, SV *val,
                             U32 hash)
            SV **  hv_stores(HV *hv, "key", SV *val)

       "hv_store_ent"
           Stores  "val"  in  a hash.  The hash key is specified as "key".  The
           "hash" parameter is the precomputed hash value; if it is  zero  then
           Perl  will  compute  it.   The return value is the new hash entry so
           created.  It will be "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 the contents of the return value can  be
           accessed  using  the  "He?"  macros  described  here.  Note that the
           caller is responsible for suitably incrementing the reference  count
           of  "val"  before  the  call,  and  decrementing  it if the function
           returned  NULL.   Effectively  a  successful  "hv_store_ent"   takes
           ownership of one reference to "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, "hv_store" will own
           the only reference to the new SV, and your code doesn't need  to  do
           anything  further  to  tidy up.  Note that "hv_store_ent" only reads
           the "key"; unlike "val"  it  does  not  take  ownership  of  it,  so
           maintaining  the  correct  reference  count on "key" is entirely the
           caller's responsibility.  The reason it does not take ownership,  is
           that  "key"  is  not used after this function returns, and so can be
           freed immediately.  "hv_store" is  not  implemented  as  a  call  to
           "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  "hv_store"  in
           preference to "hv_store_ent".

           See  "Understanding the Magic of Tied Hashes and Arrays" in perlguts
           for more information on how to use this function on tied hashes.

            HE *  hv_store_ent(HV *hv, SV *key, SV *val, U32 hash)

       "hv_undef"
           Undefines the hash.  The XS equivalent of undef(%hash).

           As well as freeing all the elements of the hash  (like  hv_clear()),
           this  also  frees any auxiliary data and storage associated with the
           hash.

           See "av_clear" for a note about the hash possibly being  invalid  on
           return.

            void  hv_undef(HV *hv)

       "newHV"
           Creates a new HV.  The reference count is set to 1.

            HV *  newHV()

       "newHVhv"
           The  content of "ohv" is copied to a new hash.  A pointer to the new
           hash is returned.

            HV *  newHVhv(HV *hv)

       "Nullhv"
           "DEPRECATED!"  It is  planned  to  remove  "Nullhv"  from  a  future
           release  of  Perl.   Do  not  use  it  for  new code; remove it from
           existing code.

           Null HV pointer.

           (deprecated - use "(HV *)NULL" instead)

       "PERL_HASH"
           Described in perlguts.

            void  PERL_HASH(U32 hash, char *key, STRLEN klen)

       "PL_modglobal"
           "PL_modglobal" is a general purpose, interpreter global HV  for  use
           by  extensions  that  need  to keep information on a per-interpreter
           basis.  In a pinch, it can also  be  used  as  a  symbol  table  for
           extensions to share data among each other.  It is a good idea to use
           keys  prefixed  by  the  package name of the extension that owns the
           data.

           On threaded perls, each thread  has  an  independent  copy  of  this
           variable;  each  initialized at creation time with the current value
           of the creating thread's copy.

            HV*  PL_modglobal

Input/Output
       "do_close"
           Close an I/O stream.  This implements Perl ""close"" in perlfunc.

           "gv" is the glob associated with the stream.

           "is_explict" is "true" if this is an explicit close of  the  stream;
           "false"  if  it is part of another operation, such as closing a pipe
           (which involves implicitly closing both ends).

           Returns "true" if successful; otherwise  returns  "false"  and  sets
           "errno" to indicate the cause.

            bool  do_close(GV *gv, bool is_explicit)

       "IoDIRP"
           Described in perlguts.

            DIR *  IoDIRP(IO *io)

       "IOf_FLUSH"
           Described in perlguts.

       "IoFLAGS"
           Described in perlguts.

            U8  IoFLAGS(IO *io)

       "IOf_UNTAINT"
           Described in perlguts.

       "IoIFP"
           Described in perlguts.

            PerlIO *  IoIFP(IO *io)

       "IoOFP"
           Described in perlguts.

            PerlIO *  IoOFP(IO *io)

       "IoTYPE"
           Described in perlguts.

            char  IoTYPE(IO *io)

       "my_chsize"
           The  C  library  chsize(3) if available, or a Perl implementation of
           it.

            I32  my_chsize(int fd, Off_t length)

       "my_dirfd"
           The C library dirfd(3) if available, or a Perl implementation of it,
           or die if not easily emulatable.

            int  my_dirfd(DIR *dir)

       "my_pclose"
           A wrapper for the C library pclose(3).  Don't use the latter, as the
           Perl version knows things that interact with the rest  of  the  perl
           interpreter.

            I32  my_pclose(PerlIO *ptr)

       "my_popen"
           A  wrapper for the C library popen(3).  Don't use the latter, as the
           Perl version knows things that interact with the rest  of  the  perl
           interpreter.

            PerlIO *  my_popen(const char *cmd, const char *mode)

       "newIO"
           Create a new IO, setting the reference count to 1.

            IO *  newIO()

       "PERL_FLUSHALL_FOR_CHILD"
           This  defines  a  way  to  flush  all output buffers.  This may be a
           performance issue, so we allow people to disable it.   Also,  if  we
           are  using  stdio,  there are broken implementations of fflush(NULL)
           out there, Solaris being the most prominent.

            void  PERL_FLUSHALL_FOR_CHILD

       "PerlIO_apply_layers"
       "PerlIO_binmode"
       "PerlIO_canset_cnt"
       "PerlIO_clearerr"
       "PerlIO_close"
       "PerlIO_debug"
       "PerlIO_eof"
       "PerlIO_error"
       "PerlIO_exportFILE"
       "PerlIO_fast_gets"
       "PerlIO_fdopen"
       "PerlIO_fileno"
       "PerlIO_fill"
       "PerlIO_findFILE"
       "PerlIO_flush"
       "PerlIO_get_base"
       "PerlIO_get_bufsiz"
       "PerlIO_get_cnt"
       "PerlIO_get_ptr"
       "PerlIO_getc"
       "PerlIO_getpos"
       "PerlIO_has_base"
       "PerlIO_has_cntptr"
       "PerlIO_importFILE"
       "PerlIO_open"
       "PerlIO_printf"
       "PerlIO_putc"
       "PerlIO_puts"
       "PerlIO_read"
       "PerlIO_releaseFILE"
       "PerlIO_reopen"
       "PerlIO_rewind"
       "PerlIO_seek"
       "PerlIO_set_cnt"
       "PerlIO_set_ptrcnt"
       "PerlIO_setlinebuf"
       "PerlIO_setpos"
       "PerlIO_stderr"
       "PerlIO_stdin"
       "PerlIO_stdout"
       "PerlIO_stdoutf"
       "PerlIO_tell"
       "PerlIO_ungetc"
       "PerlIO_unread"
       "PerlIO_vprintf"
       "PerlIO_write"
           Described in perlapio.

            int        PerlIO_apply_layers(PerlIO *f, const char *mode,
                                           const char *layers)
            int        PerlIO_binmode     (PerlIO *f, int ptype, int imode,
                                           const char *layers)
            int        PerlIO_canset_cnt  (PerlIO *f)
            void       PerlIO_clearerr    (PerlIO *f)
            int        PerlIO_close       (PerlIO *f)
            void       PerlIO_debug       (const char *fmt, ...)
            int        PerlIO_eof         (PerlIO *f)
            int        PerlIO_error       (PerlIO *f)
            FILE *     PerlIO_exportFILE  (PerlIO *f, const char *mode)
            int        PerlIO_fast_gets   (PerlIO *f)
            PerlIO *   PerlIO_fdopen      (int fd, const char *mode)
            int        PerlIO_fileno      (PerlIO *f)
            int        PerlIO_fill        (PerlIO *f)
            FILE *     PerlIO_findFILE    (PerlIO *f)
            int        PerlIO_flush       (PerlIO *f)
            STDCHAR *  PerlIO_get_base    (PerlIO *f)
            SSize_t    PerlIO_get_bufsiz  (PerlIO *f)
            SSize_t    PerlIO_get_cnt     (PerlIO *f)
            STDCHAR *  PerlIO_get_ptr     (PerlIO *f)
            int        PerlIO_getc        (PerlIO *d)
            int        PerlIO_getpos      (PerlIO *f, SV *save)
            int        PerlIO_has_base    (PerlIO *f)
            int        PerlIO_has_cntptr  (PerlIO *f)
            PerlIO *   PerlIO_importFILE  (FILE *stdio, const char *mode)
            PerlIO *   PerlIO_open        (const char *path, const char *mode)
            int        PerlIO_printf      (PerlIO *f, const char *fmt, ...)
            int        PerlIO_putc        (PerlIO *f, int ch)
            int        PerlIO_puts        (PerlIO *f, const char *string)
            SSize_t    PerlIO_read        (PerlIO *f, void *vbuf,
                                           Size_t count)
            void       PerlIO_releaseFILE (PerlIO *f, FILE *stdio)
            PerlIO *   PerlIO_reopen      (const char *path, const char *mode,
                                           PerlIO *old)
            void       PerlIO_rewind      (PerlIO *f)
            int        PerlIO_seek        (PerlIO *f, Off_t offset,
                                           int whence)
            void       PerlIO_set_cnt     (PerlIO *f, SSize_t cnt)
            void       PerlIO_set_ptrcnt  (PerlIO *f, STDCHAR *ptr,
                                           SSize_t cnt)
            void       PerlIO_setlinebuf  (PerlIO *f)
            int        PerlIO_setpos      (PerlIO *f, SV *saved)
            PerlIO *   PerlIO_stderr      (PerlIO *f, const char *mode,
                                           const char *layers)
            PerlIO *   PerlIO_stdin       (PerlIO *f, const char *mode,
                                           const char *layers)
            PerlIO *   PerlIO_stdout      (PerlIO *f, const char *mode,
                                           const char *layers)
            int        PerlIO_stdoutf     (const char *fmt, ...)
            Off_t      PerlIO_tell        (PerlIO *f)
            int        PerlIO_ungetc      (PerlIO *f, int ch)
            SSize_t    PerlIO_unread      (PerlIO *f, const void *vbuf,
                                           Size_t count)
            int        PerlIO_vprintf     (PerlIO *f, const char *fmt,
                                           va_list args)
            SSize_t    PerlIO_write       (PerlIO *f, const void *vbuf,
                                           Size_t count)

       "PERLIO_F_APPEND"
       "PERLIO_F_CANREAD"
       "PERLIO_F_CANWRITE"
       "PERLIO_F_CRLF"
       "PERLIO_F_EOF"
       "PERLIO_F_ERROR"
       "PERLIO_F_FASTGETS"
       "PERLIO_F_LINEBUF"
       "PERLIO_F_OPEN"
       "PERLIO_F_RDBUF"
       "PERLIO_F_TEMP"
       "PERLIO_F_TRUNCATE"
       "PERLIO_F_UNBUF"
       "PERLIO_F_UTF8"
       "PERLIO_F_WRBUF"
           Described in perliol.

       "PERLIO_FUNCS_CAST"
           Cast the pointer "func" to be of type "PerlIO_funcs *".

       "PERLIO_FUNCS_DECL"
           Declare "ftab" to be a PerlIO  function  table,  that  is,  of  type
           "PerlIO_funcs".

              PERLIO_FUNCS_DECL(PerlIO * ftab)

       "PERLIO_K_BUFFERED"
       "PERLIO_K_CANCRLF"
       "PERLIO_K_FASTGETS"
       "PERLIO_K_MULTIARG"
       "PERLIO_K_RAW"
           Described in perliol.

       "PERLIO_NOT_STDIO"
           Described in perlapio.

       "PL_maxsysfd"
           Described in perliol.

       "repeatcpy"
           Make  "count" copies of the "len" bytes beginning at "from", placing
           them into memory beginning at "to", which  must  be  big  enough  to
           accommodate them all.

            void  repeatcpy(char *to, const char *from, SSize_t len, IV count)

       "USE_STDIO"
           Described in perlapio.

Integer
       "CASTI32"
           This  symbol is defined if the C compiler can cast negative or large
           floating point numbers to 32-bit ints.

       "HAS_INT64_T"
           This symbol will defined  if  the  C  compiler  supports  "int64_t".
           Usually   the   inttypes.h  needs  to  be  included,  but  sometimes
           sys/types.h is enough.

       "HAS_LONG_LONG"
           This symbol will be defined if the C compiler supports long long.

       "HAS_QUAD"
           This symbol, if defined, tells that there's a 64-bit  integer  type,
           "Quad_t",  and  its unsigned counterpart, "Uquad_t". "QUADKIND" will
           be  one  of  "QUAD_IS_INT",   "QUAD_IS_LONG",   "QUAD_IS_LONG_LONG",
           "QUAD_IS_INT64_T", or "QUAD_IS___INT64".

       "I32df"
           This  symbol  defines the format string used for printing a Perl I32
           as a signed decimal integer.

       "INT16_C"
       "INT32_C"
       "INT64_C"
           Returns a token the C compiler recognizes for the constant  "number"
           of the corresponding integer type on the machine.

           If  the machine does not have a 64-bit type, "INT64_C" is undefined.
           Use "INTMAX_C" to get the largest type available on the platform.

            I16  INT16_C(number)
            I32  INT32_C(number)
            I64  INT64_C(number)

       "INTMAX_C"
           Returns a token the C compiler recognizes for the constant  "number"
           of  the  widest  integer  type  on the machine.  For example, if the
           machine has "long long"s, INTMAX_C(-1) would yield

            -1LL

           See also, for example, "INT32_C".

           Use "IV" to declare variables of the maximum  usable  size  on  this
           platform.

              INTMAX_C(number)

       "INTSIZE"
           This  symbol  contains  the  value  of  sizeof(int)  so  that  the C
           preprocessor can make decisions based on it.

       "I8SIZE"
           This symbol contains the sizeof(I8).

       "I16SIZE"
           This symbol contains the sizeof(I16).

       "I32SIZE"
           This symbol contains the sizeof(I32).

       "I64SIZE"
           This symbol contains the sizeof(I64).

       "I8TYPE"
           This symbol defines the C type used for Perl's I8.

       "I16TYPE"
           This symbol defines the C type used for Perl's I16.

       "I32TYPE"
           This symbol defines the C type used for Perl's I32.

       "I64TYPE"
           This symbol defines the C type used for Perl's I64.

       "IV"
       "I8"
       "I16"
       "I32"
       "I64"
           Described in perlguts.

       "IV_MAX"
           The largest signed integer that fits in an IV on this platform.

            IV  IV_MAX

       "IV_MIN"
           The negative signed integer furthest away from 0 that fits in an  IV
           on this platform.

            IV  IV_MIN

       "IVSIZE"
           This symbol contains the sizeof(IV).

       "IVTYPE"
           This symbol defines the C type used for Perl's IV.

       "line_t"
           The  typedef  to  use  to  declare  variables  that are to hold line
           numbers.

       "LONGLONGSIZE"
           This symbol contains the  size  of  a  long  long,  so  that  the  C
           preprocessor  can make decisions based on it.  It is only defined if
           the system supports long long.

       "LONGSIZE"
           This symbol contains  the  value  of  sizeof(long)  so  that  the  C
           preprocessor can make decisions based on it.

       "memzero"
           Set the "l" bytes starting at *d to all zeroes.

            void  memzero(void * d, Size_t l)

       "PERL_INT_FAST8_T"
       "PERL_INT_FAST16_T"
       "PERL_UINT_FAST8_T"
       "PERL_UINT_FAST16_T"
           These  are  equivalent  to the correspondingly-named C99 typedefs on
           platforms that have those; they evaluate to "int" and "unsigned int"
           on platforms that don't, so that you can portably take advantage  of
           this C99 feature.

       "PERL_INT_MAX"
       "PERL_INT_MIN"
       "PERL_LONG_MAX"
       "PERL_LONG_MIN"
       "PERL_QUAD_MAX"
       "PERL_QUAD_MIN"
       "PERL_SHORT_MAX"
       "PERL_SHORT_MIN"
       "PERL_UCHAR_MAX"
       "PERL_UCHAR_MIN"
       "PERL_UINT_MAX"
       "PERL_UINT_MIN"
       "PERL_ULONG_MAX"
       "PERL_ULONG_MIN"
       "PERL_UQUAD_MAX"
       "PERL_UQUAD_MIN"
       "PERL_USHORT_MAX"
       "PERL_USHORT_MIN"
           These  give  the  largest  and  smallest number representable in the
           current platform in variables of the corresponding types.

           For signed types, the smallest  representable  number  is  the  most
           negative number, the one furthest away from zero.

           For  C99  and  later  compilers,  these  correspond  to  things like
           "INT_MAX", which are available to the C code.  But these  constants,
           furnished  by  Perl,  allow  code  compiled  on earlier compilers to
           portably have access to the same constants.

            int             PERL_INT_MAX
            int             PERL_INT_MIN
            long            PERL_LONG_MAX
            long            PERL_LONG_MIN
            IV              PERL_QUAD_MAX
            IV              PERL_QUAD_MIN
            short           PERL_SHORT_MAX
            short           PERL_SHORT_MIN
            U8              PERL_UCHAR_MAX
            U8              PERL_UCHAR_MIN
            unsigned int    PERL_UINT_MAX
            unsigned int    PERL_UINT_MIN
            unsigned long   PERL_ULONG_MAX
            unsigned long   PERL_ULONG_MIN
            UV              PERL_UQUAD_MAX
            UV              PERL_UQUAD_MIN
            unsigned short  PERL_USHORT_MAX
            unsigned short  PERL_USHORT_MIN

       "SHORTSIZE"
           This symbol contains the  value  of  sizeof(short)  so  that  the  C
           preprocessor can make decisions based on it.

       "UINT16_C"
       "UINT32_C"
       "UINT64_C"
           Returns  a token the C compiler recognizes for the constant "number"
           of the corresponding unsigned integer type on the machine.

           If the machine does not have a 64-bit type, "UINT64_C" is undefined.
           Use "UINTMAX_C" to get the largest type available on the platform.

            U16  UINT16_C(number)
            U32  UINT32_C(number)
            U64  UINT64_C(number)

       "UINTMAX_C"
           Returns a token the C compiler recognizes for the constant  "number"
           of the widest unsigned integer type on the machine.  For example, if
           the machine has "long"s, UINTMAX_C(1) would yield

            1UL

           See also, for example, "UINT32_C".

           Use  "UV"  to  declare  variables of the maximum usable size on this
           platform.

              UINTMAX_C(number)

       "U32of"
           This symbol defines the format string used for printing a  Perl  U32
           as an unsigned octal integer.

       "U8SIZE"
           This symbol contains the sizeof(U8).

       "U16SIZE"
           This symbol contains the sizeof(U16).

       "U32SIZE"
           This symbol contains the sizeof(U32).

       "U64SIZE"
           This symbol contains the sizeof(U64).

       "U8TYPE"
           This symbol defines the C type used for Perl's U8.

       "U16TYPE"
           This symbol defines the C type used for Perl's U16.

       "U32TYPE"
           This symbol defines the C type used for Perl's U32.

       "U64TYPE"
           This symbol defines the C type used for Perl's U64.

       "U32uf"
           This  symbol  defines the format string used for printing a Perl U32
           as an unsigned decimal integer.

       "UV"
       "U8"
       "U16"
       "U32"
       "U64"
           Described in perlguts.

       "UV_MAX"
           The largest unsigned integer that fits in a UV on this platform.

            UV  UV_MAX

       "UV_MIN"
           The smallest unsigned integer that fits in a UV  on  this  platform.
           It should equal zero.

            UV  UV_MIN

       "UVSIZE"
           This symbol contains the sizeof(UV).

       "UVTYPE"
           This symbol defines the C type used for Perl's UV.

       "U32Xf"
           This  symbol  defines the format string used for printing a Perl U32
           as an unsigned hexadecimal integer in uppercase "ABCDEF".

       "U32xf"
           This symbol defines the format string used for printing a  Perl  U32
           as an unsigned hexadecimal integer in lowercase abcdef.

       "WIDEST_UTYPE"
           Yields  the  widest unsigned integer type on the platform, currently
           either "U32" or "U64".  This can be used in declarations such as

            WIDEST_UTYPE my_uv;

           or casts

            my_uv = (WIDEST_UTYPE) val;

I/O Formats
       These are used  for  formatting  the  corresponding  type  For  example,
       instead of saying

        Perl_newSVpvf(pTHX_ "Create an SV with a %d in it\n", iv);

       use

        Perl_newSVpvf(pTHX_ "Create an SV with a " IVdf " in it\n", iv);

       This keeps you from having to know if, say an IV, needs to be printed as
       %d, %ld, or something else.

       "HvNAMEf"
           Described in perlguts.

       "HvNAMEf_QUOTEDPREFIX"
           Described in perlguts.

       "IVdf"
           This symbol defines the format string used for printing a Perl IV as
           a signed decimal integer.

       "NVef"
           This  symbol  defines  the format string used for printing a Perl NV
           using %e-ish floating point format.

       "NVff"
           This symbol defines the format string used for printing  a  Perl  NV
           using %f-ish floating point format.

       "NVgf"
           This  symbol  defines  the format string used for printing a Perl NV
           using %g-ish floating point format.

       "PERL_PRIeldbl"
           This symbol, if defined, contains the string used by stdio to format
           long doubles (format 'e') for output.

       "PERL_PRIfldbl"
           This symbol, if defined, contains the string used by stdio to format
           long doubles (format 'f') for output.

       "PERL_PRIgldbl"
           This symbol, if defined, contains the string used by stdio to format
           long doubles (format 'g') for output.

       "PERL_SCNfldbl"
           This symbol, if defined, contains the string used by stdio to format
           long doubles (format 'f') for input.

       "PRINTF_FORMAT_NULL_OK"
           Allows "__printf__" format to be null when checking printf-style

       "SVf"
           Described in perlguts.

       "SVfARG"
           Described in perlguts.

              SVfARG(SV *sv)

       "SVf_QUOTEDPREFIX"
           Described in perlguts.

       "UTF8f"
           Described in perlguts.

       "UTF8fARG"
           Described in perlguts.

              UTF8fARG(bool is_utf8, Size_t byte_len, char *str)

       "UTF8f_QUOTEDPREFIX"
           Described in perlguts.

       "UVf"
           "DEPRECATED!"  It is planned to remove "UVf" from a  future  release
           of Perl.  Do not use it for new code; remove it from existing code.

           Obsolete form of "UVuf", which you should convert to instead use

            const char *  UVf

       "UVof"
           This symbol defines the format string used for printing a Perl UV as
           an unsigned octal integer.

       "UVuf"
           This symbol defines the format string used for printing a Perl UV as
           an unsigned decimal integer.

       "UVXf"
           This symbol defines the format string used for printing a Perl UV as
           an unsigned hexadecimal integer in uppercase "ABCDEF".

       "UVxf"
           This symbol defines the format string used for printing a Perl UV as
           an unsigned hexadecimal integer in lowercase abcdef.

Lexer interface
       This  is  the  lower  layer  of the Perl parser, managing characters and
       tokens.

       "BHK"
           Described in perlguts.

       "lex_bufutf8"
           NOTE: "lex_bufutf8" is experimental and may  change  or  be  removed
           without notice.

           Indicates    whether    the    octets    in    the    lexer   buffer
           ("PL_parser->linestr") should be interpreted as the  UTF-8  encoding
           of  Unicode  characters.   If  not,  they  should  be interpreted as
           Latin-1 characters.  This is analogous  to  the  "SvUTF8"  flag  for
           scalars.

           In  UTF-8  mode, it is not guaranteed that the lexer buffer actually
           contains valid UTF-8.  Lexing code must be robust  in  the  face  of
           invalid encoding.

           The  actual  "SvUTF8"  flag  of  the  "PL_parser->linestr" scalar is
           significant, but not the whole story regarding the  input  character
           encoding.   Normally, when a file is being read, the scalar contains
           octets and its "SvUTF8" flag  is  off,  but  the  octets  should  be
           interpreted  as UTF-8 if the "use utf8" pragma is in effect.  During
           a string eval, however, the scalar may have the  "SvUTF8"  flag  on,
           and  in  this  case its octets should be interpreted as UTF-8 unless
           the "use bytes" pragma is in effect.  This logic may change  in  the
           future;   use  this  function  instead  of  implementing  the  logic
           yourself.

            bool  lex_bufutf8()

       "lex_discard_to"
           NOTE: "lex_discard_to" is experimental and may change or be  removed
           without notice.

           Discards  the  first  part of the "PL_parser->linestr" buffer, up to
           "ptr".  The remaining content of the buffer will be moved,  and  all
           pointers  into  the buffer updated appropriately.  "ptr" must not be
           later in the buffer than the position of "PL_parser->bufptr": it  is
           not permitted to discard text that has yet to be lexed.

           Normally  it  is  not  necessarily  to  do this directly, because it
           suffices   to   use   the   implicit   discarding    behaviour    of
           "lex_next_chunk"  and  things  based  on  it.   However,  if a token
           stretches across multiple  lines,  and  the  lexing  code  has  kept
           multiple  lines  of  text in the buffer for that purpose, then after
           completion of the token it would be wise to explicitly  discard  the
           now-unneeded  earlier  lines,  to  avoid  future  multi-line  tokens
           growing the buffer without bound.

            void  lex_discard_to(char *ptr)

       "lex_grow_linestr"
           NOTE: "lex_grow_linestr"  is  experimental  and  may  change  or  be
           removed without notice.

           Reallocates  the  lexer buffer ("PL_parser->linestr") to accommodate
           at least "len" octets  (including  terminating  "NUL").   Returns  a
           pointer  to the reallocated buffer.  This is necessary before making
           any direct modification  of  the  buffer  that  would  increase  its
           length.   "lex_stuff_pvn"  provides  a more convenient way to insert
           text into the buffer.

           Do not use "SvGROW" or "sv_grow" directly  on  "PL_parser->linestr";
           this  function  updates  all  of  the  lexer's  variables that point
           directly into the buffer.

            char *  lex_grow_linestr(STRLEN len)

       "lex_next_chunk"
           NOTE: "lex_next_chunk" is experimental and may change or be  removed
           without notice.

           Reads  in  the  next  chunk  of  text  to  be lexed, appending it to
           "PL_parser->linestr".  This should be called when  lexing  code  has
           looked  to  the end of the current chunk and wants to know more.  It
           is usual, but  not  necessary,  for  lexing  to  have  consumed  the
           entirety of the current chunk at this time.

           If  "PL_parser->bufptr"  is  pointing to the very end of the current
           chunk (i.e., the current chunk has been entirely consumed), normally
           the current chunk will be discarded at the same time  that  the  new
           chunk  is  read in.  If "flags" has the "LEX_KEEP_PREVIOUS" bit set,
           the current chunk will not be discarded.  If the current  chunk  has
           not been entirely consumed, then it will not be discarded regardless
           of the flag.

           Returns  true  if some new text was added to the buffer, or false if
           the buffer has reached the end of the input text.

            bool  lex_next_chunk(U32 flags)

       "lex_peek_unichar"
           NOTE: "lex_peek_unichar"  is  experimental  and  may  change  or  be
           removed without notice.

           Looks  ahead  one  (Unicode)  character  in the text currently being
           lexed.  Returns the codepoint (unsigned integer value) of  the  next
           character,  or  -1  if lexing has reached the end of the input text.
           To consume the peeked character, use "lex_read_unichar".

           If the next character is in (or extends  into)  the  next  chunk  of
           input  text,  the  next chunk will be read in.  Normally the current
           chunk will be discarded at the same time, but  if  "flags"  has  the
           "LEX_KEEP_PREVIOUS"  bit  set,  then  the  current chunk will not be
           discarded.

           If the input is being interpreted as  UTF-8  and  a  UTF-8  encoding
           error is encountered, an exception is generated.

            I32  lex_peek_unichar(U32 flags)

       "lex_read_space"
           NOTE:  "lex_read_space" is experimental and may change or be removed
           without notice.

           Reads optional spaces, in Perl style, in the  text  currently  being
           lexed.   The  spaces  may include ordinary whitespace characters and
           Perl-style  comments.    "#line"   directives   are   processed   if
           encountered.   "PL_parser->bufptr" is moved past the spaces, so that
           it points at a non-space character (or the end of the input text).

           If spaces extend into the next chunk of input text, the  next  chunk
           will  be  read  in.  Normally the current chunk will be discarded at
           the same time, but if "flags" has the "LEX_KEEP_PREVIOUS"  bit  set,
           then the current chunk will not be discarded.

            void  lex_read_space(U32 flags)

       "lex_read_to"
           NOTE:  "lex_read_to"  is  experimental  and may change or be removed
           without notice.

           Consume text in the lexer buffer,  from  "PL_parser->bufptr"  up  to
           "ptr".  This advances "PL_parser->bufptr" to match "ptr", performing
           the  correct  bookkeeping  whenever  a  newline character is passed.
           This is the normal way to consume lexed text.

           Interpretation of the buffer's octets can be abstracted out by using
           the   slightly   higher-level   functions   "lex_peek_unichar"   and
           "lex_read_unichar".

            void  lex_read_to(char *ptr)

       "lex_read_unichar"
           NOTE:  "lex_read_unichar"  is  experimental  and  may  change  or be
           removed without notice.

           Reads the next (Unicode)  character  in  the  text  currently  being
           lexed.   Returns  the  codepoint  (unsigned  integer  value)  of the
           character read, and moves "PL_parser->bufptr" past the character, or
           returns -1 if lexing has reached the end of the input text.  To non-
           destructively examine the  next  character,  use  "lex_peek_unichar"
           instead.

           If  the  next  character  is  in (or extends into) the next chunk of
           input text, the next chunk will be read in.   Normally  the  current
           chunk  will  be  discarded  at the same time, but if "flags" has the
           "LEX_KEEP_PREVIOUS" bit set, then the  current  chunk  will  not  be
           discarded.

           If  the  input  is  being  interpreted as UTF-8 and a UTF-8 encoding
           error is encountered, an exception is generated.

            I32  lex_read_unichar(U32 flags)

       "lex_start"
           NOTE: "lex_start" is experimental  and  may  change  or  be  removed
           without notice.

           Creates and initialises a new lexer/parser state object, supplying a
           context in which to lex and parse from a new source of Perl code.  A
           pointer  to the new state object is placed in "PL_parser".  An entry
           is made on the save stack so that  upon  unwinding,  the  new  state
           object will be destroyed and the former value of "PL_parser" will be
           restored.   Nothing  else  need  be  done  to  clean  up the parsing
           context.

           The code to be parsed comes from "line" and "rsfp".  "line", if non-
           null, provides a string (in SV form) containing code to  be  parsed.
           A  copy  of the string is made, so subsequent modification of "line"
           does not affect parsing.  "rsfp", if  non-null,  provides  an  input
           stream  from which code will be read to be parsed.  If both are non-
           null, the code in "line" comes first and must  consist  of  complete
           lines of input, and "rsfp" supplies the remainder of the source.

           The  "flags"  parameter is reserved for future use.  Currently it is
           only used by perl internally, so extensions should always pass zero.

            void  lex_start(SV *line, PerlIO *rsfp, U32 flags)

       "lex_stuff_pv"
           NOTE: "lex_stuff_pv" is experimental and may change  or  be  removed
           without notice.

           Insert  characters  into  the  lexer  buffer ("PL_parser->linestr"),
           immediately after the current  lexing  point  ("PL_parser->bufptr"),
           reallocating  the  buffer if necessary.  This means that lexing code
           that runs later will see the characters as if they had  appeared  in
           the  input.   It  is  not  recommended  to do this as part of normal
           parsing, and most uses of this facility run the risk of the inserted
           characters being interpreted in an unintended manner.

           The string to be inserted is represented by octets starting at  "pv"
           and  continuing  to  the first nul.  These octets are interpreted as
           either UTF-8 or Latin-1, according to whether  the  "LEX_STUFF_UTF8"
           flag  is  set  in "flags".  The characters are recoded for the lexer
           buffer, according to how the buffer is currently  being  interpreted
           ("lex_bufutf8").   If it is not convenient to nul-terminate a string
           to be inserted, the "lex_stuff_pvn" function is more appropriate.

            void  lex_stuff_pv(const char *pv, U32 flags)

       "lex_stuff_pvn"
           NOTE: "lex_stuff_pvn" is experimental and may change or  be  removed
           without notice.

           Insert  characters  into  the  lexer  buffer ("PL_parser->linestr"),
           immediately after the current  lexing  point  ("PL_parser->bufptr"),
           reallocating  the  buffer if necessary.  This means that lexing code
           that runs later will see the characters as if they had  appeared  in
           the  input.   It  is  not  recommended  to do this as part of normal
           parsing, and most uses of this facility run the risk of the inserted
           characters being interpreted in an unintended manner.

           The string to be inserted is represented by "len" octets starting at
           "pv".  These octets are interpreted  as  either  UTF-8  or  Latin-1,
           according  to  whether  the "LEX_STUFF_UTF8" flag is set in "flags".
           The characters are recoded for the lexer buffer,  according  to  how
           the  buffer  is  currently  being interpreted ("lex_bufutf8").  If a
           string  to  be  inserted  is  available  as  a  Perl   scalar,   the
           "lex_stuff_sv" function is more convenient.

            void  lex_stuff_pvn(const char *pv, STRLEN len, U32 flags)

       "lex_stuff_pvs"
           NOTE:  "lex_stuff_pvs"  is experimental and may change or be removed
           without notice.

           Like "lex_stuff_pvn", but  takes  a  literal  string  instead  of  a
           string/length pair.

            void  lex_stuff_pvs("pv", U32 flags)

       "lex_stuff_sv"
           NOTE:  "lex_stuff_sv"  is  experimental and may change or be removed
           without notice.

           Insert characters  into  the  lexer  buffer  ("PL_parser->linestr"),
           immediately  after  the  current lexing point ("PL_parser->bufptr"),
           reallocating the buffer if necessary.  This means that  lexing  code
           that  runs  later will see the characters as if they had appeared in
           the input.  It is not recommended to  do  this  as  part  of  normal
           parsing, and most uses of this facility run the risk of the inserted
           characters being interpreted in an unintended manner.

           The  string  to  be  inserted  is  the  string  value  of "sv".  The
           characters are recoded for the lexer buffer, according  to  how  the
           buffer  is currently being interpreted ("lex_bufutf8").  If a string
           to be inserted is not already a  Perl  scalar,  the  "lex_stuff_pvn"
           function avoids the need to construct a scalar.

            void  lex_stuff_sv(SV *sv, U32 flags)

       "lex_unstuff"
           NOTE:  "lex_unstuff"  is  experimental  and may change or be removed
           without notice.

           Discards text about to be  lexed,  from  "PL_parser->bufptr"  up  to
           "ptr".    Text  following  "ptr"  will  be  moved,  and  the  buffer
           shortened.  This hides the discarded text from any lexing code  that
           runs later, as if the text had never appeared.

           This  is  not  the  normal way to consume lexed text.  For that, use
           "lex_read_to".

            void  lex_unstuff(char *ptr)

       "parse_arithexpr"
           NOTE: "parse_arithexpr" is experimental and may change or be removed
           without notice.

           Parse a Perl arithmetic expression.  This may contain  operators  of
           precedence  down to the bit shift operators.  The expression must be
           followed (and thus terminated) either  by  a  comparison  or  lower-
           precedence operator or by something that would normally terminate an
           expression  such  as semicolon.  If "flags" has the "PARSE_OPTIONAL"
           bit set, then the expression is optional, otherwise it is mandatory.
           It is up to the caller to  ensure  that  the  dynamic  parser  state
           ("PL_parser"  et  al)  is correctly set to reflect the source of the
           code to be parsed and the lexical context for the expression.

           The op tree representing the expression is returned.  If an optional
           expression is absent, a null  pointer  is  returned,  otherwise  the
           pointer will be non-null.

           If  an error occurs in parsing or compilation, in most cases 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.  Some
           compilation errors, however, will throw an exception immediately.

            OP *  parse_arithexpr(U32 flags)

       "parse_barestmt"
           NOTE: "parse_barestmt" is experimental and may change or be  removed
           without notice.

           Parse  a  single  unadorned  Perl  statement.   This may be a normal
           imperative statement or a declaration that has compile-time  effect.
           It  does  not include any label or other affixture.  It is up to the
           caller to ensure that the dynamic parser state ("PL_parser"  et  al)
           is  correctly set to reflect the source of the code to be parsed and
           the lexical context for the statement.

           The op tree representing the statement is returned.  This may  be  a
           null  pointer  if  the  statement  is  null,  for  example if it was
           actually  a  subroutine  definition  (which  has  compile-time  side
           effects).   If  not  null,  it will be ops directly implementing the
           statement, suitable to pass to "newSTATEOP".  It will  not  normally
           include a "nextstate" or equivalent op (except for those embedded in
           a scope contained entirely within the statement).

           If  an error occurs in parsing or compilation, in most cases a valid
           op tree (most  likely  null)  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.  Some compilation errors, however,
           will throw an exception immediately.

           The "flags" parameter is reserved for future use, and must always be
           zero.

            OP *  parse_barestmt(U32 flags)

       "parse_block"
           NOTE:  "parse_block"  is  experimental  and may change or be removed
           without notice.

           Parse a single complete  Perl  code  block.   This  consists  of  an
           opening  brace,  a sequence of statements, and a closing brace.  The
           block constitutes a lexical scope, so  "my"  variables  and  various
           compile-time  effects  can  be contained within it.  It is up to the
           caller to ensure that the dynamic parser state ("PL_parser"  et  al)
           is  correctly set to reflect the source of the code to be parsed and
           the lexical context for the statement.

           The op tree representing the code block is returned.  This is always
           a real op, never a null pointer.  It will normally  be  a  "lineseq"
           list,  including "nextstate" or equivalent ops.  No ops to construct
           any kind of runtime scope are included  by  virtue  of  it  being  a
           block.

           If  an error occurs in parsing or compilation, in most cases a valid
           op tree (most  likely  null)  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.  Some compilation errors, however,
           will throw an exception immediately.

           The "flags" parameter is reserved for future use, and must always be
           zero.

            OP *  parse_block(U32 flags)

       "parse_fullexpr"
           NOTE:  "parse_fullexpr" is experimental and may change or be removed
           without notice.

           Parse a single complete  Perl  expression.   This  allows  the  full
           expression  grammar,  including the lowest-precedence operators such
           as "or".  The expression must be followed (and thus terminated) by a
           token that an expression would normally be  terminated  by:  end-of-
           file,  closing  bracketing  punctuation,  semicolon,  or  one of the
           keywords that signals a postfix expression-statement  modifier.   If
           "flags"  has  the  "PARSE_OPTIONAL"  bit set, then the expression is
           optional, otherwise it is mandatory.  It is  up  to  the  caller  to
           ensure  that  the  dynamic  parser  state  ("PL_parser"  et  al)  is
           correctly set to reflect the source of the code to be parsed and the
           lexical context for the expression.

           The op tree representing the expression is returned.  If an optional
           expression is absent, a null  pointer  is  returned,  otherwise  the
           pointer will be non-null.

           If  an error occurs in parsing or compilation, in most cases 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.  Some
           compilation errors, however, will throw an exception immediately.

            OP *  parse_fullexpr(U32 flags)

       "parse_fullstmt"
           NOTE: "parse_fullstmt" is experimental and may change or be  removed
           without notice.

           Parse  a  single  complete  Perl  statement.   This  may be a normal
           imperative statement or a declaration that has compile-time  effect,
           and  may  include optional labels.  It is up to the caller to ensure
           that the dynamic parser state ("PL_parser" et al) is  correctly  set
           to  reflect  the  source  of  the  code to be parsed and the lexical
           context for the statement.

           The op tree representing the statement is returned.  This may  be  a
           null  pointer  if  the  statement  is  null,  for  example if it was
           actually  a  subroutine  definition  (which  has  compile-time  side
           effects).   If  not  null,  it  will be the result of a "newSTATEOP"
           call, normally including a "nextstate" or equivalent op.

           If an error occurs in parsing or compilation, in most cases a  valid
           op  tree  (most  likely  null)  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.  Some compilation errors, however,
           will throw an exception immediately.

           The "flags" parameter is reserved for future use, and must always be
           zero.

            OP *  parse_fullstmt(U32 flags)

       "parse_label"
           NOTE: "parse_label" is experimental and may  change  or  be  removed
           without notice.

           Parse a single label, possibly optional, of the type that may prefix
           a Perl statement.  It is up to the caller to ensure that the dynamic
           parser  state  ("PL_parser"  et  al) is correctly set to reflect the
           source  of  the  code  to   be   parsed.    If   "flags"   has   the
           "PARSE_OPTIONAL"  bit  set, then the label is optional, otherwise it
           is mandatory.

           The name of the label is returned in the form of a fresh scalar.  If
           an optional label is absent, a null pointer is returned.

           If an error occurs in parsing, which can only occur if the label  is
           mandatory, a valid label 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.

            SV *  parse_label(U32 flags)

       "parse_listexpr"
           NOTE: "parse_listexpr" is experimental and may change or be  removed
           without notice.

           Parse  a  Perl  list  expression.   This  may  contain  operators of
           precedence down to the  comma  operator.   The  expression  must  be
           followed  (and  thus  terminated)  either  by a low-precedence logic
           operator such as "or" or by something that would normally  terminate
           an   expression   such   as   semicolon.    If   "flags"   has   the
           "PARSE_OPTIONAL" bit set, then the expression is optional, otherwise
           it is mandatory.  It is up to the caller to ensure that the  dynamic
           parser  state  ("PL_parser"  et  al) is correctly set to reflect the
           source of the code to be parsed and  the  lexical  context  for  the
           expression.

           The op tree representing the expression is returned.  If an optional
           expression  is  absent,  a  null  pointer is returned, otherwise the
           pointer will be non-null.

           If an error occurs in parsing or compilation, in most cases 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.  Some
           compilation errors, however, will throw an exception immediately.

            OP *  parse_listexpr(U32 flags)

       "parse_stmtseq"
           NOTE:  "parse_stmtseq"  is experimental and may change or be removed
           without notice.

           Parse a sequence of zero or more  Perl  statements.   These  may  be
           normal   imperative   statements,   including  optional  labels,  or
           declarations that have compile-time effect, or any mixture  thereof.
           The  statement  sequence ends when a closing brace or end-of-file is
           encountered in a place where a  new  statement  could  have  validly
           started.   It  is up to the caller to ensure that the dynamic parser
           state ("PL_parser" et al) is correctly set to reflect the source  of
           the code to be parsed and the lexical context for the statements.

           The  op  tree representing the statement sequence is returned.  This
           may be a null pointer if the statements were all null,  for  example
           if  there  were  no  statements  or  if  there  were only subroutine
           definitions (which have compile-time side effects).  If not null, it
           will  be  a  "lineseq"  list,  normally  including  "nextstate"   or
           equivalent ops.

           If  an error occurs in parsing or compilation, in most cases 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.  Some
           compilation errors, however, will throw an exception immediately.

           The "flags" parameter is reserved for future use, and must always be
           zero.

            OP *  parse_stmtseq(U32 flags)

       "parse_subsignature"
           NOTE: "parse_subsignature" is experimental  and  may  change  or  be
           removed without notice.

           Parse  a  subroutine  signature declaration. This is the contents of
           the  parentheses  following  a   named   or   anonymous   subroutine
           declaration when the "signatures" feature is enabled. Note that this
           function  neither  expects  nor  consumes  the  opening  and closing
           parentheses around the signature; it is the caller's job  to  handle
           these.

           This  function  must  only be called during parsing of a subroutine;
           after "start_subparse" has been called. It  might  allocate  lexical
           variables on the pad for the current subroutine.

           The  op  tree  to  unpack the arguments from the stack at runtime is
           returned.  This op tree  should  appear  at  the  beginning  of  the
           compiled  function.  The  caller may wish to use "op_append_list" to
           build their function body after it, or splice it together  with  the
           body before calling "newATTRSUB".

           The "flags" parameter is reserved for future use, and must always be
           zero.

            OP *  parse_subsignature(U32 flags)

       "parse_termexpr"
           NOTE:  "parse_termexpr" is experimental and may change or be removed
           without notice.

           Parse a  Perl  term  expression.   This  may  contain  operators  of
           precedence down to the assignment operators.  The expression must be
           followed (and thus terminated) either by a comma or lower-precedence
           operator or by something that would normally terminate an expression
           such  as  semicolon.   If  "flags" has the "PARSE_OPTIONAL" bit set,
           then the expression is optional, otherwise it is mandatory.   It  is
           up   to   the  caller  to  ensure  that  the  dynamic  parser  state
           ("PL_parser" et al) is correctly set to reflect the  source  of  the
           code to be parsed and the lexical context for the expression.

           The op tree representing the expression is returned.  If an optional
           expression  is  absent,  a  null  pointer is returned, otherwise the
           pointer will be non-null.

           If an error occurs in parsing or compilation, in most cases 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.  Some
           compilation errors, however, will throw an exception immediately.

            OP *  parse_termexpr(U32 flags)

       "PL_parser"
           Pointer  to  a  structure  encapsulating  the  state  of the parsing
           operation currently in progress.  The pointer can be locally changed
           to perform a nested parse without interfering with the state  of  an
           outer  parse.   Individual  members  of  "PL_parser"  have their own
           documentation.

       "PL_parser->bufend"
           NOTE: "PL_parser->bufend" is  experimental  and  may  change  or  be
           removed without notice.

           Direct  pointer  to  the  end  of  the chunk of text currently being
           lexed,  the  end  of  the  lexer   buffer.    This   is   equal   to
           "SvPVX(PL_parser->linestr)  +  SvCUR(PL_parser->linestr)".   A "NUL"
           character (zero octet) is always located at the end of  the  buffer,
           and does not count as part of the buffer's contents.

       "PL_parser->bufptr"
           NOTE:  "PL_parser->bufptr"  is  experimental  and  may  change or be
           removed without notice.

           Points to the current position of lexing inside  the  lexer  buffer.
           Characters  around  this  point  may  be freely examined, within the
           range     delimited     by      SvPVX("PL_parser->linestr")      and
           "PL_parser->bufend".  The octets of the buffer may be intended to be
           interpreted   as   either   UTF-8   or   Latin-1,  as  indicated  by
           "lex_bufutf8".

           Lexing code (whether in the Perl core or  not)  moves  this  pointer
           past  the  characters  that  it  consumes.   It  is also expected to
           perform some bookkeeping whenever a newline character  is  consumed.
           This  movement  can  be  more conveniently performed by the function
           "lex_read_to", which handles newlines appropriately.

           Interpretation of the buffer's octets can be abstracted out by using
           the   slightly   higher-level   functions   "lex_peek_unichar"   and
           "lex_read_unichar".

       "PL_parser->linestart"
           NOTE:  "PL_parser->linestart"  is  experimental and may change or be
           removed without notice.

           Points to the start of the current line  inside  the  lexer  buffer.
           This is useful for indicating at which column an error occurred, and
           not  much  else.   This  must  be  updated  by  any lexing code that
           consumes a newline; the function "lex_read_to" handles this detail.

       "PL_parser->linestr"
           NOTE: "PL_parser->linestr" is experimental  and  may  change  or  be
           removed without notice.

           Buffer  scalar containing the chunk currently under consideration of
           the text currently being lexed.   This  is  always  a  plain  string
           scalar  (for  which "SvPOK" is true).  It is not intended to be used
           as a scalar by normal scalar means;  instead  refer  to  the  buffer
           directly by the pointer variables described below.

           The  lexer  maintains  various  "char*"  pointers  to  things in the
           "PL_parser->linestr"  buffer.   If  "PL_parser->linestr"   is   ever
           reallocated,  all  of these pointers must be updated.  Don't attempt
           to do this manually, but rather use "lex_grow_linestr" if  you  need
           to reallocate the buffer.

           The  content of the text chunk in the buffer is commonly exactly one
           complete line of input, up to and including  a  newline  terminator,
           but  there  are situations where it is otherwise.  The octets of the
           buffer may be intended to be interpreted as either UTF-8 or Latin-1.
           The function "lex_bufutf8" tells you which.  Do not use the "SvUTF8"
           flag on this scalar, which may disagree with it.

           For   direct   examination   of    the    buffer,    the    variable
           "PL_parser->bufend"  points  to  the end of the buffer.  The current
           lexing position is pointed to by "PL_parser->bufptr".  Direct use of
           these pointers is usually preferable to examination  of  the  scalar
           through normal scalar means.

       "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 ("PL_compcv") into the supplied buffer.  This should  be
           used initially to create the state in the buffer, as the final thing
           before a "LEAVE" within a block.

               ENTER;
               start_subparse(0);
               ...

               suspend_compcv(&buffer);
               LEAVE;

           Once       suspended,       the       "resume_compcv_final"       or
           "resume_compcv_and_save" function can later be used to continue  the
           parsing from the point this stopped.

            void  suspend_compcv(struct suspended_compcv *buffer)

       "wrap_infix_plugin"
           NOTE:  "wrap_infix_plugin"  is  experimental  and  may  change or be
           removed without notice.

           NOTE: This API exists entirely for the purpose of  making  the  CPAN
           module  "XS::Parse::Infix"  work. It is not expected that additional
           modules  will  make  use  of  it;  rather,  that  they  should   use
           "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   "PL_infix_plugin"   variable.
           "new_plugin"  is  a pointer to the C function that is to be added to
           the infix plugin chain,  and  "old_plugin_p"  points  to  a  storage
           location  where  a pointer to the next function in the chain will be
           stored.   The  value   of   "new_plugin"   is   written   into   the
           "PL_infix_plugin"  variable, while the value previously stored there
           is written to *old_plugin_p.

           Direct access to "PL_infix_plugin" should be avoided.

            void  wrap_infix_plugin(Perl_infix_plugin_t new_plugin,
                                    Perl_infix_plugin_t *old_plugin_p)

       "wrap_keyword_plugin"
           NOTE: "wrap_keyword_plugin" is experimental and  may  change  or  be
           removed without notice.

           Puts  a  C  function into the chain of keyword plugins.  This is the
           preferred  way  to  manipulate  the  "PL_keyword_plugin"   variable.
           "new_plugin"  is  a pointer to the C function that is to be added to
           the keyword plugin chain, and "old_plugin_p" points to  the  storage
           location  where  a pointer to the next function in the chain will be
           stored.   The  value   of   "new_plugin"   is   written   into   the
           "PL_keyword_plugin"  variable,  while  the  value  previously stored
           there is written to *old_plugin_p.

           "PL_keyword_plugin" is global to an entire  process,  and  a  module
           wishing  to  hook  keyword parsing may find itself invoked more than
           once per process, typically in different threads.   To  handle  that
           situation,  this function is idempotent.  The location *old_plugin_p
           must initially (once per process)  contain  a  null  pointer.   A  C
           variable  of static duration (declared at file scope, typically also
           marked "static" to give it  internal  linkage)  will  be  implicitly
           initialised   appropriately,   if  it  does  not  have  an  explicit
           initialiser.  This function will only  actually  modify  the  plugin
           chain  if  it finds *old_plugin_p to be null.  This function is also
           thread safe on the small scale.   It  uses  appropriate  locking  to
           avoid race conditions in accessing "PL_keyword_plugin".

           When   this   function   is   called,  the  function  referenced  by
           "new_plugin" must be ready to be called,  except  for  *old_plugin_p
           being  unfilled.   In  a  threading  situation,  "new_plugin" may be
           called  immediately,  even  before  this  function   has   returned.
           *old_plugin_p  will  always be appropriately set before "new_plugin"
           is called.  If "new_plugin" decides not to do anything special  with
           the  identifier  that  it is given (which is the usual case for most
           calls to a keyword  plugin),  it  must  chain  the  plugin  function
           referenced by *old_plugin_p.

           Taken  all  together,  XS  code  to  install a keyword plugin should
           typically look something like this:

               static Perl_keyword_plugin_t next_keyword_plugin;
               static OP *my_keyword_plugin(pTHX_
                   char *keyword_ptr, STRLEN keyword_len, OP **op_ptr)
               {
                   if (memEQs(keyword_ptr, keyword_len,
                              "my_new_keyword")) {
                       ...
                   } else {
                       return next_keyword_plugin(aTHX_
                           keyword_ptr, keyword_len, op_ptr);
                   }
               }
               BOOT:
                   wrap_keyword_plugin(my_keyword_plugin,
                                       &next_keyword_plugin);

           Direct access to "PL_keyword_plugin" should be avoided.

            void  wrap_keyword_plugin(Perl_keyword_plugin_t new_plugin,
                                      Perl_keyword_plugin_t *old_plugin_p)

Locales
       "DECLARATION_FOR_LC_NUMERIC_MANIPULATION"
           This macro should be used as a statement.   It  declares  a  private
           variable  (whose  name  begins with an underscore) that is needed by
           the other macros in this section.  Failing to include this correctly
           should lead to  a  syntax  error.   For  compatibility  with  C89  C
           compilers  it  should  be  placed  in  a block before any executable
           statements.

            void  DECLARATION_FOR_LC_NUMERIC_MANIPULATION

       "foldEQ_locale"
           Returns true if the leading "len" bytes of the strings "s1" and "s2"
           are  the  same  case-insensitively  in  the  current  locale;  false
           otherwise.

            I32  foldEQ_locale(const char *a, const char *b, I32 len)

       "HAS_DUPLOCALE"
           This  symbol,  if defined, indicates that the "duplocale" routine is
           available to duplicate a locale object.

       "HAS_FREELOCALE"
           This symbol, if defined, indicates that the "freelocale" routine  is
           available  to  deallocates  the  resources  associated with a locale
           object.

       "HAS_LC_MONETARY_2008"
           This symbol, if defined, indicates that the  localeconv  routine  is
           available   and   has   the  additional  members  added  in  "POSIX"
           1003.1-2008.

       "HAS_LOCALECONV"
           This symbol, if defined, indicates that the "localeconv" routine  is
           available for numeric and monetary formatting conventions.

       "HAS_LOCALECONV_L"
           This  symbol,  if defined, indicates that the "localeconv_l" routine
           is available to query certain information about a locale.

       "HAS_NEWLOCALE"
           This symbol, if defined, indicates that the "newlocale"  routine  is
           available to return a new locale object or modify an existing locale
           object.

       "HAS_NL_LANGINFO"
           This symbol, if defined, indicates that the "nl_langinfo" routine is
           available  to return locale data.  You will also need langinfo.h and
           therefore "I_LANGINFO".

       "HAS_NL_LANGINFO_L"
           This symbol, if defined, indicates that the "nl_langinfo_l"  routine
           is  available  to return locale data.  You will also need langinfo.h
           and therefore "I_LANGINFO".

       "HAS_QUERYLOCALE"
           This symbol, if defined, indicates that the "querylocale" routine is
           available to return the name of the locale for a category mask.

       "HAS_SETLOCALE"
           This symbol, if defined, indicates that the "setlocale"  routine  is
           available to handle locale-specific ctype implementations.

       "HAS_SETLOCALE_R"
           This symbol, if defined, indicates that the "setlocale_r" routine is
           available to setlocale re-entrantly.

       "HAS_USELOCALE"
           This  symbol,  if defined, indicates that the "uselocale" routine is
           available to set the current locale for the calling thread.

       "I_LANGINFO"
           This symbol, if defined, indicates that langinfo.h exists and should
           be included.

            #ifdef I_LANGINFO
                #include <langinfo.h>
            #endif

       "I_LOCALE"
           This symbol, if defined, indicates to the C program that  it  should
           include locale.h.

            #ifdef I_LOCALE
                #include <locale.h>
            #endif

       "IN_LOCALE"
           Evaluates  to  TRUE  if  the plain locale pragma without a parameter
           ("use locale") is in effect.

            bool  IN_LOCALE

       "IN_LOCALE_COMPILETIME"
           Evaluates to TRUE if, when compiling a perl  program  (including  an
           "eval")   if   the   plain   locale   pragma   without  a  parameter
           ("use locale") is in effect.

            bool  IN_LOCALE_COMPILETIME

       "IN_LOCALE_RUNTIME"
           Evaluates to TRUE if, when executing a perl  program  (including  an
           "eval")   if   the   plain   locale   pragma   without  a  parameter
           ("use locale") is in effect.

            bool  IN_LOCALE_RUNTIME

       "I_XLOCALE"
           This symbol, if defined, indicates to the C program that the  header
           xlocale.h is available.  See also "NEED_XLOCALE_H"

            #ifdef I_XLOCALE
                #include <xlocale.h>
            #endif

       "NEED_XLOCALE_H"
           This symbol, if defined, indicates that the C program should include
           xlocale.h to get newlocale() and its friends.

       "Perl_langinfo"
       "Perl_langinfo8"
           "Perl_langinfo"  is  an  (almost) drop-in replacement for the system
           nl_langinfo(3),  taking  the  same  "item"  parameter  values,   and
           returning  the  same  information.   But it is more thread-safe than
           regular  nl_langinfo(),  and  hides  the  quirks  of  Perl's  locale
           handling  from  your  code,  and  can be used on systems that lack a
           native "nl_langinfo".

           However, you should instead use either the improved version of this,
           "Perl_langinfo8", or even better, "sv_langinfo".  The latter returns
           an  SV,  handling  all  the   possible   non-standard   returns   of
           nl_langinfo(), including the UTF8ness of any returned string.

           "Perl_langinfo8"  is  identical  to  "Perl_langinfo"  except  for an
           additional  parameter,  a  pointer  to  a   variable   declared   as
           ""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.

           These  two  functions  share  private per-thread memory that will be
           changed the next time either one of them is called with  any  input,
           but not before.

           Concerning the differences between these and plain nl_langinfo():

           a.  "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 "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.

           b.  They  deliver  the  correct  results  for  the  "RADIXCHAR"  and
               "THOUSEP"  items,  without  you having to write extra code.  The
               reason for the extra code would be because these  are  from  the
               "LC_NUMERIC" locale category, which is normally kept set by Perl
               so  that  the  radix  is  a  dot, and the separator is the empty
               string, no matter what the underlying locale is supposed to  be,
               and  so  to  get  the  expected results, you have to temporarily
               toggle into the underlying locale, and later toggle back.   (You
               could         use         plain         "nl_langinfo"        and
               "STORE_LC_NUMERIC_FORCE_TO_UNDERLYING" for  this  but  then  you
               wouldn't  get  the  other  advantages  of  Perl_langinfo();  not
               keeping "LC_NUMERIC" in the C (or equivalent) locale would break
               a lot of CPAN, which is  expecting  the  radix  (decimal  point)
               character to be a dot.)

           c.  The  system  function  they  replace  can have its static return
               buffer trashed, not only by a subsequent call to that  function,
               but by a "freelocale", "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.

           d.  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.

           e.  But  most  importantly,  they  work  on  systems that don't have
               "nl_langinfo", such as Windows,  hence  making  your  code  more
               portable.   Of  the  fifty-some  possible items specified by the
               POSIX                       2008                       standard,
               <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/langinfo.h.html>,
               only  one  is  completely  unimplemented,  though on non-Windows
               platforms, another significant one is  not  fully  implemented).
               They   use  various  techniques  to  recover  the  other  items,
               including calling localeconv(3), and strftime(3), both of  which
               are  specified  in C89, so should be always be available.  Later
               strftime() versions have additional capabilities.  If an item is
               not available on your system,  this  returns  either  the  value
               associated  with  the  C locale, or simply "", whichever is more
               appropriate.

               It is important to note that, when called with an item  that  is
               recovered  by  using  "localeconv", the buffer from any previous
               explicit call to localeconv(3) will  be  overwritten.   But  you
               shouldn't  be  using  "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 "Perl_localeconv", which is
               thread-safe; or by using the methods given in perlcall  to  call
               POSIX::localeconv(), which is also thread-safe.

           The  details  for  those  items  which  may  deviate  from what this
           emulation returns and what a native nl_langinfo() would  return  are
           specified in I18N::Langinfo.

            const char *  Perl_langinfo (const nl_item item)
            const char *  Perl_langinfo8(const nl_item item,
                                         utf8ness_t *utf8ness)

       "PERL_LC_ALL_CATEGORY_POSITIONS_INIT"
           This  symbol,  when  defined,  gives  the C initializer for an array
           whose element [0] is the first category in the  string  returned  by
           "setlocale(LC_ALL,  NULL)"  when not all categories are the same, on
           systems that use  a  positional  notation.   After  element  [0]  is
           "LC_ALL_SEPARATOR",  then  the  category given by element [1] and so
           on.

       "PERL_LC_ALL_SEPARATOR"
           This  symbol,   if   defined,   gives   the   string   returned   by
           "setlocale(LC_ALL,   NULL)"  to  separate  categories  that  are  in
           different locales on systems  that  use  a  positional  notation  as
           opposed  to  'name=value' pairs.  An example on some platforms could
           be the '/' in "C/"de_DE"/C/"en_UK"/C/C"

       "PERL_LC_ALL_USES_NAME_VALUE_PAIRS"
           This symbol, if defined, indicates to the C program that the  string
           returned  by  "setlocale(LC_ALL,  NULL)" uses 'name=value;' pairs to
           indicate what each category's locale is when they aren't all set  to
           the           same           locale.           For          example,
           ""LC_NUMERIC"=C;"LC_CTYPE"="de_DE";..."   When  not   defined,   the
           system uses positional notation.

       "Perl_localeconv"
           This  is a thread-safe version of the libc localeconv(3).  It is the
           same as POSIX::localeconv (returning  a  hash  of  the  localeconv()
           fields),   but   directly  callable  from  XS  code.   The  hash  is
           mortalized, so must be dealt with immediately.

            HV *  Perl_localeconv(pTHX)

       "Perl_setlocale"
           This is an (almost) drop-in replacement for the system setlocale(3),
           taking the same parameters,  and  returning  the  same  information,
           except  that  it returns the correct underlying "LC_NUMERIC" locale.
           Regular "setlocale" will instead return "C" if the underlying locale
           has a non-dot decimal point  character,  or  a  non-empty  thousands
           separator  for  displaying  floating point numbers.  This is because
           perl keeps that locale category such that it has  a  dot  and  empty
           separator,  changing  the locale briefly during the operations where
           the underlying one is required. "Perl_setlocale" knows  about  this,
           and compensates; regular "setlocale" doesn't.

           Another  reason it isn't completely a drop-in replacement is that it
           is declared to return "const char *", whereas the  system  setlocale
           omits  the  "const"  (presumably  because its API was specified long
           ago, and can't be updated; it is illegal to change  the  information
           "setlocale" returns; doing so leads to segfaults.)

           Finally,  "Perl_setlocale"  works  under  all circumstances, whereas
           plain "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
           "${^SAFE_LOCALES}" is non-zero.  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
           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.
           "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 "Perl_setlocale" is called from the same
           thread.

            const char *  Perl_setlocale(const int category,
                                         const char *locale)

       "RESTORE_LC_NUMERIC"
           This   is   used   in   conjunction   with   one   of   the   macros
           "STORE_LC_NUMERIC_SET_TO_NEEDED"                                 and
           "STORE_LC_NUMERIC_FORCE_TO_UNDERLYING"  to  properly   restore   the
           "LC_NUMERIC" state.

           A  call  to "DECLARATION_FOR_LC_NUMERIC_MANIPULATION" must have been
           made to declare at compile time a  private  variable  used  by  this
           macro  and  the  two "STORE" ones.  This macro should be called as a
           single statement, not an expression,  but  with  an  empty  argument
           list, like this:

            {
               DECLARATION_FOR_LC_NUMERIC_MANIPULATION;
                ...
               RESTORE_LC_NUMERIC();
                ...
            }

            void  RESTORE_LC_NUMERIC()

       "SETLOCALE_ACCEPTS_ANY_LOCALE_NAME"
           This  symbol,  if  defined,  indicates that the setlocale routine is
           available and it accepts any input locale name as valid.

       "STORE_LC_NUMERIC_FORCE_TO_UNDERLYING"
           This is used by XS code that is "LC_NUMERIC" locale-aware  to  force
           the  locale  for category "LC_NUMERIC" to be what perl thinks is the
           current underlying locale.  (The perl  interpreter  could  be  wrong
           about  what  the  underlying locale actually is if some C or XS code
           has called the C library  function  setlocale(3)  behind  its  back;
           calling  "sync_locale"  before calling this macro will update perl's
           records.)

           A call to "DECLARATION_FOR_LC_NUMERIC_MANIPULATION" must  have  been
           made  to  declare  at  compile  time a private variable used by this
           macro.  This macro should be called as a single  statement,  not  an
           expression, but with an empty argument list, like this:

            {
               DECLARATION_FOR_LC_NUMERIC_MANIPULATION;
                ...
               STORE_LC_NUMERIC_FORCE_TO_UNDERLYING();
                ...
               RESTORE_LC_NUMERIC();
                ...
            }

           The  private  variable  is used to save the current locale state, so
           that the requisite matching call to "RESTORE_LC_NUMERIC" can restore
           it.

           On threaded perls not operating with thread-safe functionality, this
           macro uses a mutex to  force  a  critical  section.   Therefore  the
           matching RESTORE should be close by, and guaranteed to be called.

            void  STORE_LC_NUMERIC_FORCE_TO_UNDERLYING()

       "STORE_LC_NUMERIC_SET_TO_NEEDED"
           This  is used to help wrap XS or C code that is "LC_NUMERIC" locale-
           aware.  This locale category is generally kept set to a locale where
           the decimal radix character is a  dot,  and  the  separator  between
           groups  of digits is empty.  This is because most XS code that reads
           floating point numbers is expecting them to have this syntax.

           This  macro  makes  sure  the  current  "LC_NUMERIC"  state  is  set
           properly, to be aware of locale if the call to the XS or C code from
           the  Perl  program is from within the scope of a "use locale"; or to
           ignore locale if the call is instead from outside such scope.

           This macro is the start of wrapping the  C  or  XS  code;  the  wrap
           ending  is  done by calling the "RESTORE_LC_NUMERIC" macro after the
           operation.  Otherwise the state can be changed that  will  adversely
           affect other XS code.

           A  call  to "DECLARATION_FOR_LC_NUMERIC_MANIPULATION" must have been
           made to declare at compile time a  private  variable  used  by  this
           macro.   This  macro  should be called as a single statement, not an
           expression, but with an empty argument list, like this:

            {
               DECLARATION_FOR_LC_NUMERIC_MANIPULATION;
                ...
               STORE_LC_NUMERIC_SET_TO_NEEDED();
                ...
               RESTORE_LC_NUMERIC();
                ...
            }

           On threaded perls not operating with thread-safe functionality, this
           macro uses a mutex to  force  a  critical  section.   Therefore  the
           matching  RESTORE  should  be close by, and guaranteed to be called;
           see "WITH_LC_NUMERIC_SET_TO_NEEDED" for  a  more  contained  way  to
           ensure that.

            void  STORE_LC_NUMERIC_SET_TO_NEEDED()

       "STORE_LC_NUMERIC_SET_TO_NEEDED_IN"
           Same as "STORE_LC_NUMERIC_SET_TO_NEEDED" with in_lc_numeric provided
           as  the precalculated value of IN_LC(LC_NUMERIC). It is the caller's
           responsibility to ensure  that  the  status  of  "PL_compiling"  and
           "PL_hints" cannot have changed since the precalculation.

            void  STORE_LC_NUMERIC_SET_TO_NEEDED_IN(bool in_lc_numeric)

       "sv_langinfo"
           This  is  the  preferred  interface  for  accessing  the  data  that
           nl_langinfo(3) provides (or Perl's  emulation  of  it  on  platforms
           lacking   it),   returning   an  SV.   Unlike,  the  earlier-defined
           interfaces to this  ("Perl_langinfo"  and  "Perl_langinfo8"),  which
           return  strings, the UTF8ness of the result is automatically handled
           for you.  And like them, it is thread-safe and automatically handles
           getting the proper values for the "RADIXCHAR"  and  "THOUSEP"  items
           (that  calling  the  plain  libc  nl_langinfo() could give the wrong
           results for).  Like them, this also doesn't play well with the  libc
           localeconv(); use POSIX::localeconv() instead.

           There  are  a  few deviations from what a native nl_langinfo() would
           return and what this returns on platforms that don't implement  that
           function.  These are detailed in I18N::Langinfo.

            SV *  sv_langinfo(const nl_item item)

       "switch_to_global_locale"
           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 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  "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:

           POSIX::localeconv
           I18N::Langinfo, items "CRNCYSTR" and "THOUSEP"
           "sv_langinfo" in perlapi, items "CRNCYSTR" and "THOUSEP"

           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 having Perl change its algorithm for calculating  these
           to   use   Windows   API  functions  (likely  "GetNumberFormat"  and
           "GetCurrencyFormat"); patches welcome.

           XS code should never call plain "setlocale", but should  instead  be
           converted  to  either  call "Perl_setlocale" (which is a drop-in for
           the system "setlocale") or use the methods given in perlcall to call
           "POSIX::setlocale".  Either one will transparently  properly  handle
           all cases of single- vs multi-thread, POSIX 2008-supported or not.

            void  switch_to_global_locale()

       "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
           "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,
           "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 "Multi-threaded operation" in perllocale).

           Using  the   libc   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 "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.  "Gtk" is such a
           library.

           The return value is a boolean: TRUE if the global locale at the time
           of call was in effect for the caller;  and  FALSE  if  a  per-thread
           locale was in effect.

            bool  sync_locale()

       "WITH_LC_NUMERIC_SET_TO_NEEDED"
           This  macro  invokes  the  supplied  statement  or  block within the
           context      of      a      "STORE_LC_NUMERIC_SET_TO_NEEDED"      ..
           "RESTORE_LC_NUMERIC" pair if required, so eg:

             WITH_LC_NUMERIC_SET_TO_NEEDED(
               SNPRINTF_G(fv, ebuf, sizeof(ebuf), precis)
             );

           is equivalent to:

             {
           #ifdef USE_LOCALE_NUMERIC
               DECLARATION_FOR_LC_NUMERIC_MANIPULATION;
               STORE_LC_NUMERIC_SET_TO_NEEDED();
           #endif
               SNPRINTF_G(fv, ebuf, sizeof(ebuf), precis);
           #ifdef USE_LOCALE_NUMERIC
               RESTORE_LC_NUMERIC();
           #endif
             }

            void  WITH_LC_NUMERIC_SET_TO_NEEDED(block)

       "WITH_LC_NUMERIC_SET_TO_NEEDED_IN"
           Same  as "WITH_LC_NUMERIC_SET_TO_NEEDED" with in_lc_numeric provided
           as the precalculated value of IN_LC(LC_NUMERIC). It is the  caller's
           responsibility  to  ensure  that  the  status  of "PL_compiling" and
           "PL_hints" cannot have changed since the precalculation.

            void  WITH_LC_NUMERIC_SET_TO_NEEDED_IN(bool in_lc_numeric, block)

Magic
       "Magic" is special data attached to SV structures in order to give  them
       "magical"  properties.  When any Perl code tries to read from, or assign
       to, an SV marked as magical,  it  calls  the  'get'  or  'set'  function
       associated  with  that  SV's magic.  A get is called prior to reading an
       SV, in order to give it a chance to update its internal value (get on $.
       writes the line number of the last read  filehandle  into  the  SV's  IV
       slot),  while set is called after an SV has been written to, in order to
       allow it to make use of its changed value (set on $/ copies the SV's new
       value to the PL_rs global variable).

       Magic is implemented as a linked list of MAGIC  structures  attached  to
       the  SV.  Each MAGIC struct holds the type of the magic, a pointer to an
       array of  functions  that  implement  the  get(),  set(),  length()  etc
       functions,  plus space for some flags and pointers.  For example, a tied
       variable has a MAGIC structure that contains a  pointer  to  the  object
       associated with the tie.

       "mg_clear"
           Clear something magical that the SV represents.  See "sv_magic".

            int  mg_clear(SV *sv)

       "mg_copy"
           Copies the magic from one SV to another.  See "sv_magic".

            int  mg_copy(SV *sv, SV *nsv, const char *key, I32 klen)

       "MGf_COPY"
       "MGf_DUP"
       "MGf_LOCAL"
           Described in perlguts.

       "mg_find"
           Finds the magic pointer for "type" matching the SV.  See "sv_magic".

            MAGIC *  mg_find(const SV *sv, int type)

       "mg_findext"
           Finds  the  magic  pointer  of  "type" with the given "vtbl" for the
           "SV".  See "sv_magicext".

            MAGIC *  mg_findext(const SV *sv, int type, const MGVTBL *vtbl)

       "mg_free"
           Free any magic storage used by the SV.  See "sv_magic".

            int  mg_free(SV *sv)

       "mg_freeext"
           Remove any magic of type "how" using virtual table "vtbl"  from  the
           SV "sv".  See "sv_magic".

           "mg_freeext(sv,  how,  NULL)"  is  equivalent  to  "mg_free_type(sv,
           how)".

            void  mg_freeext(SV *sv, int how, const MGVTBL *vtbl)

       "mg_free_type"
           Remove any magic of type "how" from the SV "sv".  See "sv_magic".

            void  mg_free_type(SV *sv, int how)

       "mg_get"
           Do magic before a value is retrieved from the SV.  The  type  of  SV
           must be >= "SVt_PVMG".  See "sv_magic".

            int  mg_get(SV *sv)

       "mg_magical"
           Turns on the magical status of an SV.  See "sv_magic".

            void  mg_magical(SV *sv)

       "mg_set"
           Do magic after a value is assigned to the SV.  See "sv_magic".

            int  mg_set(SV *sv)

       "MGVTBL"
           Described in perlguts.

       "PERL_MAGIC_arylen"
       "PERL_MAGIC_arylen_p"
       "PERL_MAGIC_backref"
       "PERL_MAGIC_bm"
       "PERL_MAGIC_checkcall"
       "PERL_MAGIC_collxfrm"
       "PERL_MAGIC_dbfile"
       "PERL_MAGIC_dbline"
       "PERL_MAGIC_debugvar"
       "PERL_MAGIC_defelem"
       "PERL_MAGIC_destruct"
       "PERL_MAGIC_env"
       "PERL_MAGIC_envelem"
       "PERL_MAGIC_ext"
       "PERL_MAGIC_extvalue"
       "PERL_MAGIC_fm"
       "PERL_MAGIC_hints"
       "PERL_MAGIC_hintselem"
       "PERL_MAGIC_hook"
       "PERL_MAGIC_hookelem"
       "PERL_MAGIC_isa"
       "PERL_MAGIC_isaelem"
       "PERL_MAGIC_lvref"
       "PERL_MAGIC_nkeys"
       "PERL_MAGIC_nonelem"
       "PERL_MAGIC_overload_table"
       "PERL_MAGIC_pos"
       "PERL_MAGIC_qr"
       "PERL_MAGIC_regdata"
       "PERL_MAGIC_regdatum"
       "PERL_MAGIC_regex_global"
       "PERL_MAGIC_rhash"
       "PERL_MAGIC_shared"
       "PERL_MAGIC_shared_scalar"
       "PERL_MAGIC_sig"
       "PERL_MAGIC_sigelem"
       "PERL_MAGIC_substr"
       "PERL_MAGIC_sv"
       "PERL_MAGIC_symtab"
       "PERL_MAGIC_taint"
       "PERL_MAGIC_tied"
       "PERL_MAGIC_tiedelem"
       "PERL_MAGIC_tiedscalar"
       "PERL_MAGIC_utf8"
       "PERL_MAGIC_uvar"
       "PERL_MAGIC_uvar_elem"
       "PERL_MAGIC_vec"
       "PERL_MAGIC_vstring"
           Described in perlguts.

       "SvTIED_obj"
           Described in perlinterp.

              SvTIED_obj(SV *sv, MAGIC *mg)

Memory Management
       "dump_mstats"
           When  enabled  by  compiling  with  "-DDEBUGGING_MSTATS",  print out
           statistics about malloc as two lines of  numbers,  one  showing  the
           length  of  the free list for each size category, the second showing
           the number of mallocs - frees for each size category.

           "s", if not NULL, is used as a phrase to include in the output, such
           as "after compilation".

            void  dump_mstats(const char *s)

       "HASATTRIBUTE_MALLOC"
           Can we handle "GCC" attribute for malloc-style functions.

       "HAS_MALLOC_GOOD_SIZE"
           This symbol,  if  defined,  indicates  that  the  "malloc_good_size"
           routine is available for use.

       "HAS_MALLOC_SIZE"
           This symbol, if defined, indicates that the "malloc_size" routine is
           available for use.

       "I_MALLOCMALLOC"
           This  symbol,  if defined, indicates to the C program that it should
           include malloc/malloc.h.

            #ifdef I_MALLOCMALLOC
                #include <mallocmalloc.h>
            #endif

       "MYMALLOC"
           This symbol, if defined, indicates that we're using our own malloc.

       "Newx"
       "safemalloc"
           The XSUB-writer's interface to the C "malloc" function.

           Memory obtained by this should ONLY be freed with "Safefree".

           In 5.9.3, Newx() and friends replace the older New() API, and  drops
           the  first  parameter,  x,  a  debug  aid  which  allowed callers to
           identify themselves.  This aid has been superseded by  a  new  build
           option,  PERL_MEM_LOG  (see  "PERL_MEM_LOG"  in  perlhacktips).  The
           older API is still there for use  in  XS  modules  supporting  older
           perls.

            void   Newx      (void* ptr, int nitems, type)
            void*  safemalloc(size_t size)

       "Newxc"
           The  XSUB-writer's  interface to the C "malloc" function, with cast.
           See also "Newx".

           Memory obtained by this should ONLY be freed with "Safefree".

            void  Newxc(void* ptr, int nitems, type, cast)

       "Newxz"
       "safecalloc"
           The  XSUB-writer's  interface  to  the  C  "calloc"  function.   The
           allocated memory is zeroed with "memzero".  See also "Newx".

           Memory obtained by this should ONLY be freed with "Safefree".

            void   Newxz     (void* ptr, int nitems, type)
            void*  safecalloc(size_t nitems, size_t item_size)

       "PERL_MALLOC_WRAP"
           This  symbol,  if  defined,  indicates  that  we'd  like malloc wrap
           checks.

       "Renew"
       "saferealloc"
           The XSUB-writer's interface to the C "realloc" function.

           Memory obtained by this should ONLY be freed with "Safefree".

            void   Renew      (void* ptr, int nitems, type)
            void*  saferealloc(void *ptr, size_t size)

       "Renewc"
           The XSUB-writer's interface to the C "realloc" function, with cast.

           Memory obtained by this should ONLY be freed with "Safefree".

            void  Renewc(void* ptr, int nitems, type, cast)

       "Safefree"
           The XSUB-writer's interface to the C "free" function.

           This should ONLY  be  used  on  memory  obtained  using  "Newx"  and
           friends.

            void  Safefree(void* ptr)

       "safesyscalloc"
           Safe version of system's calloc()

            Malloc_t  safesyscalloc(MEM_SIZE elements, MEM_SIZE size)

       "safesysfree"
           Safe version of system's free()

            Free_t  safesysfree(Malloc_t where)

       "safesysmalloc"
           Paranoid version of system's malloc()

            Malloc_t  safesysmalloc(MEM_SIZE nbytes)

       "safesysrealloc"
           Paranoid version of system's realloc()

            Malloc_t  safesysrealloc(Malloc_t where, MEM_SIZE nbytes)

MRO
       These  functions  are  related  to  the  method resolution order of perl
       classes Also see perlmroapi.

       "HvMROMETA"
           Described in perlmroapi.

            struct mro_meta *  HvMROMETA(HV *hv)

       "mro_get_from_name"
           Returns the previously registered mro with the given "name", or NULL
           if not registered.  See ""mro_register"".

           NOTE:   "mro_get_from_name"   must   be   explicitly    called    as
           "Perl_mro_get_from_name" with an "aTHX_" parameter.

            const struct mro_alg *  Perl_mro_get_from_name(pTHX_ SV *name)

       "mro_get_linear_isa"
           Returns the mro linearisation for the given stash.  By default, this
           will  be whatever "mro_get_linear_isa_dfs" returns unless some other
           MRO is in effect for the stash.  The return value is a read-only AV*
           whose values are string SVs giving class names.

           You are responsible for SvREFCNT_inc() on the return  value  if  you
           plan  to  store  it anywhere semi-permanently (otherwise it might be
           deleted out from under you the next time the cache is invalidated).

            AV *  mro_get_linear_isa(HV *stash)

       "MRO_GET_PRIVATE_DATA"
           Described in perlmroapi.

            SV*  MRO_GET_PRIVATE_DATA(struct mro_meta *const smeta,
                                      const struct mro_alg *const which)

       "mro_method_changed_in"
           Invalidates method caching on any child classes of the given  stash,
           so that they might notice the changes in this one.

           Ideally,  all  instances  of  "PL_sub_generation++"  in  perl source
           outside of mro.c should be replaced by calls to this.

           Perl automatically handles most of the common ways a method might be
           redefined.  However, there are a few ways you could change a  method
           in  a  stash without the cache code noticing, in which case you need
           to call this method afterwards:

           1) Directly manipulating the stash HV entries from XS code.

           2) Assigning a reference to a readonly scalar constant into a  stash
           entry  in  order  to  create a constant subroutine (like constant.pm
           does).

           This   same   method   is   available   from    pure    perl    via,
           mro::method_changed_in(classname).

            void  mro_method_changed_in(HV *stash)

       "mro_register"
           Registers  a  custom mro plugin.  See perlmroapi for details on this
           and other mro functions.

           NOTE:    "mro_register"    must    be    explicitly    called     as
           "Perl_mro_register" with an "aTHX_" parameter.

            void  Perl_mro_register(pTHX_ const struct mro_alg *mro)

       "mro_set_mro"
           Set "meta" to the value contained in the registered mro plugin whose
           name is "name".

           Croaks if "name" hasn't been registered

           NOTE:  "mro_set_mro" must be explicitly called as "Perl_mro_set_mro"
           with an "aTHX_" parameter.

            void  Perl_mro_set_mro(pTHX_ struct mro_meta * const meta,
                                   SV * const name)

       "mro_set_private_data"
           Described in perlmroapi.

           NOTE:  "mro_set_private_data"   must   be   explicitly   called   as
           "Perl_mro_set_private_data" with an "aTHX_" parameter.

            SV *  Perl_mro_set_private_data(pTHX_
                                           struct mro_meta * const smeta,
                                           const struct mro_alg * const which,
                                           SV * const data)

Multicall Functions
       "dMULTICALL"
           Declare   local   variables   for  a  multicall.   See  "LIGHTWEIGHT
           CALLBACKS" in perlcall.

              dMULTICALL;

       "MULTICALL"
           Make  a  lightweight  callback.   See  "LIGHTWEIGHT  CALLBACKS"   in
           perlcall.

              MULTICALL;

       "POP_MULTICALL"
           Closing  bracket  for  a  lightweight  callback.   See  "LIGHTWEIGHT
           CALLBACKS" in perlcall.

              POP_MULTICALL;

       "PUSH_MULTICALL"
           Opening  bracket  for  a  lightweight  callback.   See  "LIGHTWEIGHT
           CALLBACKS" in perlcall.

              PUSH_MULTICALL(CV* the_cv);

Numeric Functions
       "Atol"
           "DEPRECATED!"   It is planned to remove "Atol" from a future release
           of Perl.  Do not use it for new code; remove it from existing code.

           Described in perlhacktips.

              Atol(const char * nptr)

       "Atoul"
           "DEPRECATED!"  It is planned to remove "Atoul" from a future release
           of Perl.  Do not use it for new code; remove it from existing code.

           Described in perlhacktips.

              Atoul(const char * nptr)

       "Drand01"
           This macro is to be used to generate  uniformly  distributed  random
           numbers  over the range [0., 1.[.  You may have to supply an 'extern
           double drand48();' in your program since SunOS 4.1.3 doesn't provide
           you with anything relevant in its headers.  See "HAS_DRAND48_PROTO".

            double  Drand01()

       "Gconvert"
           This preprocessor macro is  defined  to  convert  a  floating  point
           number  to a string without a trailing decimal point.  This emulates
           the behavior of sprintf("%g"), but is sometimes much more efficient.
           If gconvert() is  not  available,  but  gcvt()  drops  the  trailing
           decimal  point,  then  gcvt()  is  used.  If all else fails, a macro
           using sprintf("%g") is used. Arguments for the Gconvert  macro  are:
           value,  number of digits, whether trailing zeros should be retained,
           and the output buffer.  The usual values are:

            d_Gconvert='gconvert((x),(n),(t),(b))'
            d_Gconvert='gcvt((x),(n),(b))'
            d_Gconvert='sprintf((b),"%.*g",(n),(x))'

           The last two assume trailing zeros should not be kept.

            char *  Gconvert(double x, Size_t n, bool t, char * b)

       "grok_atoUV"
           parse a string, looking for a decimal unsigned integer.

           On entry, "pv" points to  the  beginning  of  the  string;  "valptr"
           points  to  a  UV  that  will receive the converted value, if found;
           "endptr" is either NULL or points to a variable that points  to  one
           byte  beyond the point in "pv" that this routine should examine.  If
           "endptr" is NULL, "pv" is assumed to be NUL-terminated.

           Returns FALSE if "pv" doesn't represent  a  valid  unsigned  integer
           value  (with no leading zeros).  Otherwise it returns TRUE, and sets
           *valptr to that value.

           If you constrain the portion of "pv"  that  is  looked  at  by  this
           function  (by passing a non-NULL "endptr"), and if the initial bytes
           of that portion form a valid value, it  will  return  TRUE,  setting
           *endptr  to the byte following the final digit of the value.  But if
           there is no constraint at what's looked at,  all  of  "pv"  must  be
           valid  in  order for TRUE to be returned.  *endptr is unchanged from
           its value on input if FALSE is returned;

           The only characters this accepts are the decimal digits '0'..'9'.

           As opposed to atoi(3) or  strtol(3),  "grok_atoUV"  does  NOT  allow
           optional  leading whitespace, nor negative inputs.  If such features
           are required, the calling code needs to explicitly implement those.

           Note that this function returns FALSE for inputs that would overflow
           a UV, or have leading zeros.  Thus a single 0 is accepted,  but  not
           00 nor 01, 002, etc.

           Background:  "atoi"  has  severe  problems  with  illegal inputs, it
           cannot be used for incremental  parsing,  and  therefore  should  be
           avoided  "atoi"  and  "strtol" are also affected by locale settings,
           which can also be seen as a bug (global  state  controlled  by  user
           environment).

            bool  grok_atoUV(const char *pv, UV *valptr, const char **endptr)

       "grok_bin"
           converts a string representing a binary number to numeric form.

           On  entry  "start"  and *len_p give the string to scan, *flags gives
           conversion flags, and "result" should be "NULL" or a pointer  to  an
           NV.   The scan stops at the end of the string, or at just before the
           first invalid character.  Unless "PERL_SCAN_SILENT_ILLDIGIT" is  set
           in  *flags, encountering an invalid character (except NUL) will also
           trigger a warning.  On return *len_p is set to  the  length  of  the
           scanned string, and *flags gives output flags.

           If the value is <= "UV_MAX" it is returned as a UV, the output flags
           are  clear,  and  nothing  is written to *result.  If the value is >
           "UV_MAX",       "grok_bin"       returns       "UV_MAX",        sets
           "PERL_SCAN_GREATER_THAN_UV_MAX"  in  the output flags, and writes an
           approximation of the correct value into *result (which is an NV;  or
           the approximation is discarded if "result" is NULL).

           The binary number may optionally be prefixed with "0b" or "b" unless
           "PERL_SCAN_DISALLOW_PREFIX" is set in *flags on entry.

           If  "PERL_SCAN_ALLOW_UNDERSCORES"  is  set in *flags then any or all
           pairs of digits may  be  separated  from  each  other  by  a  single
           underscore; also a single leading underscore is accepted.

            UV  grok_bin(const char *start, STRLEN *len_p, I32 *flags,
                         NV *result)

       "grok_hex"
           converts a string representing a hex number to numeric form.

           On  entry  "start"  and *len_p give the string to scan, *flags gives
           conversion flags, and "result" should be "NULL" or a pointer  to  an
           NV.   The scan stops at the end of the string, or at just before the
           first invalid character.  Unless "PERL_SCAN_SILENT_ILLDIGIT" is  set
           in  *flags, encountering an invalid character (except NUL) will also
           trigger a warning.  On return *len_p is set to  the  length  of  the
           scanned string, and *flags gives output flags.

           If the value is <= "UV_MAX" it is returned as a UV, the output flags
           are  clear,  and  nothing  is written to *result.  If the value is >
           "UV_MAX",       "grok_hex"       returns       "UV_MAX",        sets
           "PERL_SCAN_GREATER_THAN_UV_MAX"  in  the output flags, and writes an
           approximation of the correct value into *result (which is an NV;  or
           the approximation is discarded if "result" is NULL).

           The  hex  number  may optionally be prefixed with "0x" or "x" unless
           "PERL_SCAN_DISALLOW_PREFIX" is set in *flags on entry.

           If "PERL_SCAN_ALLOW_UNDERSCORES" is set in *flags then  any  or  all
           pairs  of  digits  may  be  separated  from  each  other by a single
           underscore; also a single leading underscore is accepted.

            UV  grok_hex(const char *start, STRLEN *len_p, I32 *flags,
                         NV *result)

       "grok_infnan"
           Helper  for  grok_number(),  accepts  various   ways   of   spelling
           "infinity"  or "not a number", and returns one of the following flag
           combinations:

             IS_NUMBER_INFINITY
             IS_NUMBER_NAN
             IS_NUMBER_INFINITY | IS_NUMBER_NEG
             IS_NUMBER_NAN | IS_NUMBER_NEG
             0

           possibly |-ed with "IS_NUMBER_TRAILING".

           If an infinity or a not-a-number is recognized, *sp  will  point  to
           one  byte past the end of the recognized string.  If the recognition
           fails, zero is returned, and *sp will not move.

            int  grok_infnan(const char **sp, const char *send)

       "grok_number"
           Identical to grok_number_flags() with "flags" set to zero.

            int  grok_number(const char *pv, STRLEN len, UV *valuep)

       "grok_number_flags"
           Recognise (or not) a number.  The type of the number is returned  (0
           if   unrecognised),  otherwise  it  is  a  bit-ORed  combination  of
           "IS_NUMBER_IN_UV",                  "IS_NUMBER_GREATER_THAN_UV_MAX",
           "IS_NUMBER_NOT_INT",      "IS_NUMBER_NEG",     "IS_NUMBER_INFINITY",
           "IS_NUMBER_NAN" (defined in perl.h).

           If the value of the number can fit  in  a  UV,  it  is  returned  in
           *valuep.   "IS_NUMBER_IN_UV" will be set to indicate that *valuep is
           valid, "IS_NUMBER_IN_UV" will never be set unless *valuep is  valid,
           but  *valuep may have been assigned to during processing even though
           "IS_NUMBER_IN_UV" is not set on  return.   If  "valuep"  is  "NULL",
           "IS_NUMBER_IN_UV" will be set for the same cases as when "valuep" is
           non-"NULL", but no actual assignment (or SEGV) will occur.

           "IS_NUMBER_NOT_INT"  will  be set with "IS_NUMBER_IN_UV" if trailing
           decimals were seen (in which  case  *valuep  gives  the  true  value
           truncated  to  an  integer),  and  "IS_NUMBER_NEG"  if the number is
           negative  (in  which  case  *valuep  holds  the   absolute   value).
           "IS_NUMBER_IN_UV"  is not set if "e" notation was used or the number
           is larger than a UV.

           "flags" allows only "PERL_SCAN_TRAILING", which allows for  trailing
           non-numeric   text   on   an   otherwise  successful  grok,  setting
           "IS_NUMBER_TRAILING" on the result.

            int  grok_number_flags(const char *pv, STRLEN len, UV *valuep,
                                   U32 flags)

       "GROK_NUMERIC_RADIX"
           A synonym for "grok_numeric_radix"

            bool  GROK_NUMERIC_RADIX(NN const char **sp, NN const char *send)

       "grok_numeric_radix"
           Scan and skip for a numeric decimal separator (radix).

            bool  grok_numeric_radix(const char **sp, const char *send)

       "grok_oct"
           converts a string representing an octal number to numeric form.

           On entry "start" and *len_p give the string to  scan,  *flags  gives
           conversion  flags,  and "result" should be "NULL" or a pointer to an
           NV.  The scan stops at the end of the string, or at just before  the
           first  invalid character.  Unless "PERL_SCAN_SILENT_ILLDIGIT" is set
           in *flags, encountering an invalid character (except NUL) will  also
           trigger  a  warning.   On  return *len_p is set to the length of the
           scanned string, and *flags gives output flags.

           If the value is <= "UV_MAX" it is returned as a UV, the output flags
           are clear, and nothing is written to *result.  If  the  value  is  >
           "UV_MAX",        "grok_oct"       returns       "UV_MAX",       sets
           "PERL_SCAN_GREATER_THAN_UV_MAX" in the output flags, and  writes  an
           approximation  of the correct value into *result (which is an NV; or
           the approximation is discarded if "result" is NULL).

           If "PERL_SCAN_ALLOW_UNDERSCORES" is set in *flags then  any  or  all
           pairs  of  digits  may  be  separated  from  each  other by a single
           underscore; also a single leading underscore is accepted.

           The "PERL_SCAN_DISALLOW_PREFIX" flag is always treated as being  set
           for this function.

            UV  grok_oct(const char *start, STRLEN *len_p, I32 *flags,
                         NV *result)

       "isinfnan"
           Perl_isinfnan()  is  a  utility function that returns true if the NV
           argument is either an infinity or a "NaN", false otherwise.  To test
           in more detail, use Perl_isinf() and Perl_isnan().

           This is also the logical inverse of Perl_isfinite().

            bool  isinfnan(NV nv)

       "my_atof"
           "atof"(3), but properly works with Perl locale handling, accepting a
           dot radix character always, but  also  the  current  locale's  radix
           character  if  and only if called from within the lexical scope of a
           Perl "use locale" statement.

           N.B. "s" must be NUL terminated.

            NV  my_atof(const char *s)

       "my_strtod"
           This function is equivalent to the libc strtod()  function,  and  is
           available  even  on  platforms that lack plain strtod().  Its return
           value  is  the  best  available  precision  depending  on   platform
           capabilities and Configure options.

           It properly handles the locale radix character, meaning it expects a
           dot  except  when  called  from within the scope of "use locale", in
           which case the radix character  should  be  that  specified  by  the
           current locale.

           The synonym Strtod() may be used instead.

            NV  my_strtod(const char * const s, char **e)

       "PERL_ABS"
           Typeless "abs" or "fabs", etc.  (The usage below indicates it is for
           integers,  but  it works for any type.)  Use instead of these, since
           the C library ones force their argument to be what it is  expecting,
           potentially   leading  to  disaster.   But  also  beware  that  this
           evaluates its argument twice, so no "x++".

            int  PERL_ABS(int x)

       "Perl_acos"
       "Perl_asin"
       "Perl_atan"
       "Perl_atan2"
       "Perl_ceil"
       "Perl_cos"
       "Perl_cosh"
       "Perl_exp"
       "Perl_floor"
       "Perl_fmod"
       "Perl_frexp"
       "Perl_isfinite"
       "Perl_isinf"
       "Perl_isnan"
       "Perl_ldexp"
       "Perl_log"
       "Perl_log10"
       "Perl_modf"
       "Perl_pow"
       "Perl_sin"
       "Perl_sinh"
       "Perl_sqrt"
       "Perl_tan"
       "Perl_tanh"
           These  perform  the  corresponding  mathematical  operation  on  the
           operand(s),  using  the libc function designed for the task that has
           just enough precision for an  NV  on  this  platform.   If  no  such
           function with sufficient precision exists, the highest precision one
           available is used.

            NV  Perl_acos    (NV x)
            NV  Perl_asin    (NV x)
            NV  Perl_atan    (NV x)
            NV  Perl_atan2   (NV x, NV y)
            NV  Perl_ceil    (NV x)
            NV  Perl_cos     (NV x)
            NV  Perl_cosh    (NV x)
            NV  Perl_exp     (NV x)
            NV  Perl_floor   (NV x)
            NV  Perl_fmod    (NV x, NV y)
            NV  Perl_frexp   (NV x, int *exp)
            IV  Perl_isfinite(NV x)
            IV  Perl_isinf   (NV x)
            IV  Perl_isnan   (NV x)
            NV  Perl_ldexp   (NV x, int exp)
            NV  Perl_log     (NV x)
            NV  Perl_log10   (NV x)
            NV  Perl_modf    (NV x, NV *iptr)
            NV  Perl_pow     (NV x, NV y)
            NV  Perl_sin     (NV x)
            NV  Perl_sinh    (NV x)
            NV  Perl_sqrt    (NV x)
            NV  Perl_tan     (NV x)
            NV  Perl_tanh    (NV x)

       "Perl_signbit"
           NOTE:  "Perl_signbit"  is  experimental and may change or be removed
           without notice.

           Return a non-zero integer if the sign bit on an NV is set, and 0  if
           it is not.

           If Configure detects this system has a signbit() that will work with
           our  NVs,  then  we  just  use  it  via  the  "#define"  in  perl.h.
           Otherwise, fall back on this implementation.  The main use  of  this
           function is catching -0.0.

           "Configure"  notes:   This function is called 'Perl_signbit' instead
           of a plain 'signbit' because it is easy to imagine a system having a
           signbit() function or macro that doesn't happen  to  work  with  our
           particular  choice of NVs.  We shouldn't just re-"#define" "signbit"
           as "Perl_signbit" and expect  the  standard  system  headers  to  be
           happy.   Also,  this  is  a no-context function (no "pTHX_") because
           Perl_signbit() is usually re-"#defined" in perl.h as a simple  macro
           call  to  the  system's  signbit().   Users  should just always call
           Perl_signbit().

            int  Perl_signbit(NV f)

       "PL_hexdigit"
           This array, indexed by an integer,  converts  that  value  into  the
           character  that  represents it.  For example, if the input is 8, the
           return will be a string whose  first  character  is  '8'.   What  is
           actually  returned  is  a  pointer  into  a  string.   All  you  are
           interested in is  the  first  character  of  that  string.   To  get
           uppercase  letters  (for  the  values  10..15), add 16 to the index.
           Hence, "PL_hexdigit[11]" is 'b', and  "PL_hexdigit[11+16]"  is  'B'.
           Adding  16  to  an index whose representation is '0'..'9' yields the
           same as not adding 16.  Indices outside the range  0..31  result  in
           (bad) undedefined behavior.

       "READ_XDIGIT"
           Returns  the  value  of  an  ASCII-range  hex digit and advances the
           string pointer.  Behaviour is only well defined when  isXDIGIT(*str)
           is true.

            U8  READ_XDIGIT(char str*)

       "scan_bin"
           For backwards compatibility.  Use "grok_bin" instead.

            NV  scan_bin(const char *start, STRLEN len, STRLEN *retlen)

       "scan_hex"
           For backwards compatibility.  Use "grok_hex" instead.

            NV  scan_hex(const char *start, STRLEN len, STRLEN *retlen)

       "scan_oct"
           For backwards compatibility.  Use "grok_oct" instead.

            NV  scan_oct(const char *start, STRLEN len, STRLEN *retlen)

       "seedDrand01"
           This  symbol  defines  the  macro  to  be used in seeding the random
           number generator (see "Drand01").

            void  seedDrand01(Rand_seed_t x)

       "Strtod"
           This is a synonym for "my_strtod".

            NV  Strtod(NN const char * const s, NULLOK char ** e)

       "Strtol"
           Platform and configuration independent "strtol".   This  expands  to
           the  appropriate  "strotol"-like  function based on the platform and
           Configure options>.  For example it could  expand  to  "strtoll"  or
           "strtoq" instead of "strtol".

            NV  Strtol(NN const char * const s, NULLOK char ** e, int base)

       "Strtoul"
           Platform  and  configuration independent "strtoul".  This expands to
           the appropriate "strotoul"-like function based on the  platform  and
           Configure  options>.   For  example it could expand to "strtoull" or
           "strtouq" instead of "strtoul".

            NV  Strtoul(NN const char * const s, NULLOK char ** e, int base)

Optrees
       "alloccopstash"
           NOTE: "alloccopstash" is experimental and may change or  be  removed
           without notice.

           Available  only  under  threaded  builds, this function allocates an
           entry in "PL_stashpad" for the stash passed to it.

            PADOFFSET  alloccopstash(HV *hv)

       "BINOP"
           Described in perlguts.

       "block_end"
           Handles compile-time scope exit.  "floor"  is  the  savestack  index
           returned  by  "block_start",  and  "seq"  is  the body of the block.
           Returns the block, possibly modified.

            OP *  block_end(I32 floor, OP *seq)

       "block_start"
           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
           "block_end".

            int  block_start(int full)

       "ck_entersub_args_list"
           Performs the default fixup of the arguments part of an "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 "&",  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.

            OP *  ck_entersub_args_list(OP *entersubop)

       "ck_entersub_args_proto"
           Performs  the  fixup  of the arguments part of an "entersub" op tree
           based on a subroutine prototype.  This makes  various  modifications
           to  the argument ops, from applying context up to inserting "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  "&",  where  the callee can be
           identified at compile time and has a prototype.

           "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 "CV*" that has been cast to "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
           "namegv" parameter.

            OP *  ck_entersub_args_proto(OP *entersubop, GV *namegv,
                                         SV *protosv)

       "ck_entersub_args_proto_or_list"
           Performs the fixup of the arguments part of an  "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 "&", where the callee  can  be  identified  at
           compile time.

           "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 "CV*" that has been cast to "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
           "namegv" parameter.

            OP *  ck_entersub_args_proto_or_list(OP *entersubop, GV *namegv,
                                                 SV *protosv)

       "cv_const_sv"
           If  "cv"  is  a  constant  sub  eligible  for  inlining, returns the
           constant value returned by the sub.  Otherwise, returns "NULL".

           Constant subs can be created with "newCONSTSUB" or as  described  in
           "Constant Functions" in perlsub.

            SV *  cv_const_sv(const CV * const cv)

       "cv_get_call_checker"
           The  original  form  of  "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
           "namegv" argument.

            void  cv_get_call_checker(CV *cv, Perl_call_checker *ckfun_p,
                                      SV **ckobj_p)

       "cv_get_call_checker_flags"
           Retrieves the function that will be used to fix up a call  to  "cv".
           Specifically, the function is applied to an "entersub" op tree for a
           subroutine  call,  not  marked  with  "&",  where  the callee can be
           identified at compile time as "cv".

           The C-level function pointer is returned in *ckfun_p, an SV argument
           for it is returned in *ckobj_p, and control flags  are  returned  in
           *ckflags_p.  The function is intended to be called in this manner:

            entersubop = (*ckfun_p)(aTHX_ entersubop, namegv, (*ckobj_p));

           In  this call, "entersubop" is a pointer to the "entersub" op, which
           may be replaced by the check function,  and  "namegv"  supplies  the
           name  that  should  be  used  by  the check function to refer to the
           callee of the "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.

           "namegv" may not actually be a GV.  If the "CALL_CHECKER_REQUIRE_GV"
           bit is clear in *ckflags_p, it is permitted to pass a CV or other SV
           instead, anything  that  can  be  used  as  the  first  argument  to
           "cv_name".    If   the   "CALL_CHECKER_REQUIRE_GV"  bit  is  set  in
           *ckflags_p then the check function requires "namegv" to be a genuine
           GV.

           By        default,        the        check        function        is
           Perl_ck_entersub_args_proto_or_list,   the   SV  parameter  is  "cv"
           itself, and  the  "CALL_CHECKER_REQUIRE_GV"  flag  is  clear.   This
           implements  standard prototype processing.  It can be changed, for a
           particular subroutine, by "cv_set_call_checker_flags".

           If the "CALL_CHECKER_REQUIRE_GV" bit is  set  in  "gflags"  then  it
           indicates that the caller only knows about the genuine GV version of
           "namegv",  and  accordingly the corresponding bit will always be set
           in  *ckflags_p,  regardless  of  the   check   function's   recorded
           requirements.   If  the  "CALL_CHECKER_REQUIRE_GV"  bit  is clear in
           "gflags" then it indicates the caller knows about the possibility of
           passing something other than a GV as "namegv", and  accordingly  the
           corresponding  bit  may  be  either  set  or  clear  in  *ckflags_p,
           indicating the check function's recorded requirements.

           "gflags" is a bitset  passed  into  "cv_get_call_checker_flags",  in
           which only the "CALL_CHECKER_REQUIRE_GV" bit currently has a defined
           meaning (for which see above).  All other bits should be clear.

            void  cv_get_call_checker_flags(CV *cv, U32 gflags,
                                            Perl_call_checker *ckfun_p,
                                            SV **ckobj_p, U32 *ckflags_p)

       "cv_set_call_checker"
           The  original  form  of "cv_set_call_checker_flags", which passes it
           the "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 "namegv" argument.

            void  cv_set_call_checker(CV *cv, Perl_call_checker ckfun,
                                      SV *ckobj)

       "cv_set_call_checker_flags"
           Sets  the  function  that  will  be  used  to fix up a call to "cv".
           Specifically, the function is applied to an "entersub" op tree for a
           subroutine call, not marked  with  "&",  where  the  callee  can  be
           identified at compile time as "cv".

           The  C-level function pointer is supplied in "ckfun", an SV argument
           for it is supplied in "ckobj", and control  flags  are  supplied  in
           "ckflags".  The function should be defined like this:

               STATIC OP * ckfun(pTHX_ OP *op, GV *namegv, SV *ckobj)

           It is intended to be called in this manner:

               entersubop = ckfun(aTHX_ entersubop, namegv, ckobj);

           In  this call, "entersubop" is a pointer to the "entersub" op, which
           may be replaced by the check function,  and  "namegv"  supplies  the
           name  that  should  be  used  by  the check function to refer to the
           callee of the "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.

           "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 "cv_name".  You can force perl to pass a GV by including
           "CALL_CHECKER_REQUIRE_GV" in the "ckflags".

           "ckflags"  is  a bitset, in which only the "CALL_CHECKER_REQUIRE_GV"
           bit currently has a defined meaning  (for  which  see  above).   All
           other bits should be clear.

           The  current  setting  for  a  particular  CV  can  be  retrieved by
           "cv_get_call_checker_flags".

            void  cv_set_call_checker_flags(CV *cv, Perl_call_checker ckfun,
                                            SV *ckobj, U32 ckflags)

       "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 "ck_"xxx functions and makes the
           tree thread-safe.

            void  finalize_optree(OP *o)

       "forbid_outofblock_ops"
           NOTE: "forbid_outofblock_ops" is experimental and may change  or  be
           removed without notice.

           Checks  an  optree  that  implements a block, to ensure there are no
           control-flow ops that attempt to leave the block.   Any  "OP_RETURN"
           is forbidden, as is any "OP_GOTO". Loops are analysed, so any LOOPEX
           op  ("OP_NEXT",  "OP_LAST"  or  "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 "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 all "OP_GOTO" ops are forbidden, even  in  cases
           where  they  might  otherwise  be  safe  to  execute.   This  may be
           permitted in a later version.

            void  forbid_outofblock_ops(OP *o, const char *blockname)

       "LINKLIST"
           Given the root of an optree, link the tree in execution order  using
           the  "op_next"  pointers  and return the first op executed.  If this
           has already been done, it will not be redone, and "o->op_next"  will
           be  returned.   If "o->op_next" is not already set, "o" should be at
           least an "UNOP".

            OP*  LINKLIST(OP *o)

       "LISTOP"
           Described in perlguts.

       "LOGOP"
           Described in perlguts.

       "LOOP"
           Described in perlguts.

       "newANONATTRSUB"
           Construct a nameless (anonymous) Perl  subroutine,  also  performing
           some surrounding jobs.

           This  is  the  same  as  ""newATTRSUB_x""  in  perlintern  with  its
           "o_is_gv" parameter set to FALSE, and its  "o"  parameter  to  NULL.
           For more details, see ""newATTRSUB_x"" in perlintern.

            OP *  newANONATTRSUB(I32 floor, OP *proto, OP *attrs, OP *block)

       "newANONHASH"
           Constructs, checks, and returns an anonymous hash op.

            OP *  newANONHASH(OP *o)

       "newANONLIST"
           Constructs, checks, and returns an anonymous list op.

            OP *  newANONLIST(OP *o)

       "newANONSUB"
           Construct a nameless (anonymous) Perl subroutine without attributes,
           also performing some surrounding jobs.

           This  is  the  same  as  ""newATTRSUB_x""  in  perlintern  with  its
           "o_is_gv" parameter set to FALSE, and its "o" and "attrs" parameters
           to NULL.  For more details, see ""newATTRSUB_x"" in perlintern.

            OP *  newANONSUB(I32 floor, OP *proto, OP *block)

       "newARGDEFELEMOP"
           Constructs and returns a new "OP_ARGDEFELEM"  op  which  provides  a
           defaulting expression given by "expr" for the signature parameter at
           the  index given by "argindex". The expression optree is consumed by
           this function and becomes part of the returned optree.

            OP *  newARGDEFELEMOP(I32 flags, OP *expr, I32 argindex)

       "newASSIGNOP"
           Constructs, checks,  and  returns  an  assignment  op.   "left"  and
           "right"  supply  the parameters of the assignment; they are consumed
           by this function and become part of the constructed op tree.

           If "optype" is  "OP_ANDASSIGN",  "OP_ORASSIGN",  or  "OP_DORASSIGN",
           then  a  suitable conditional optree is constructed.  If "optype" is
           the opcode of a binary operator, such as "OP_BIT_OR", then an op  is
           constructed  that  performs  the  binary  operation  and assigns the
           result to the left argument.  Either way, if  "optype"  is  non-zero
           then "flags" has no effect.

           If  "optype"  is  zero,  then  a  plain scalar or list assignment is
           constructed.  Which  type  of  assignment  it  is  is  automatically
           determined.  "flags" gives the eight bits of "op_flags", except that
           "OPf_KIDS"  will  be  set automatically, and, shifted up eight bits,
           the eight bits of "op_private", except that the bit with value 1  or
           2 is automatically set as required.

            OP *  newASSIGNOP(I32 flags, OP *left, I32 optype, OP *right)

       "newATTRSUB"
           Construct  a Perl subroutine, also performing some surrounding jobs,
           returning a pointer to the constructed subroutine.

           This  is  the  same  as  ""newATTRSUB_x""  in  perlintern  with  its
           "o_is_gv"  parameter  set to FALSE.  This means that if "o" is null,
           the new sub will be anonymous; otherwise the name  will  be  derived
           from  "o"  in  the  way  described  (as  with  all other details) in
           ""newATTRSUB_x"" in perlintern.

            CV *  newATTRSUB(I32 floor, OP *o, OP *proto, OP *attrs,
                             OP *block)

       "newAVREF"
           Constructs, checks, and returns an arrary reference op.

            OP *  newAVREF(OP *o)

       "newBINOP"
           Constructs, checks, and returns an op of any binary type.  "type" is
           the opcode.  "flags" gives the eight bits of "op_flags", except that
           "OPf_KIDS" will be set automatically, and, shifted  up  eight  bits,
           the  eight bits of "op_private", except that the bit with value 1 or
           2 is automatically set as required.  "first" and "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.

            OP *  newBINOP(I32 type, I32 flags, OP *first, OP *last)

       "newCONDOP"
           Constructs,   checks,   and   returns    a    conditional-expression
           ("cond_expr")  op.   "flags"  gives  the  eight  bits of "op_flags",
           except that "OPf_KIDS" will be set automatically,  and,  shifted  up
           eight bits, the eight bits of "op_private", except that the bit with
           value  1  is  automatically  set.   "first"  supplies the expression
           selecting between the  two  branches,  and  "trueop"  and  "falseop"
           supply  the  branches; they are consumed by this function and become
           part of the constructed op tree.

            OP *  newCONDOP(I32 flags, OP *first, OP *trueop, OP *falseop)

       "newCONSTSUB"
       "newCONSTSUB_flags"
           Construct a constant subroutine, also  performing  some  surrounding
           jobs.   A scalar constant-valued subroutine is eligible for inlining
           at  compile-time,   and   in   Perl   code   can   be   created   by
           "sub FOO () { 123 }".  Other kinds of constant subroutine have other
           treatment.

           The  subroutine  will  have  an  empty prototype and will ignore any
           arguments when called.  Its  constant  behaviour  is  determined  by
           "sv".  If "sv" is null, the subroutine will yield an empty list.  If
           "sv"  points  to  a  scalar,  the  subroutine will always yield that
           scalar.  If "sv" points to an  array,  the  subroutine  will  always
           yield  a  list of the elements of that array in list context, or the
           number of elements in the array in scalar  context.   This  function
           takes ownership of one counted reference to the scalar or array, and
           will  arrange for the object to live as long as the subroutine does.
           If "sv" points to a scalar then the inlining assumes that the  value
           of  the scalar will never change, so the caller must ensure that the
           scalar is not subsequently written to.  If "sv" points to  an  array
           then  no such assumption is made, so it is ostensibly safe to mutate
           the array or its elements, but whether this is really supported  has
           not been determined.

           The  subroutine  will  have  "CvFILE"  set according to "PL_curcop".
           Other aspects of the subroutine will be left in their default state.
           The caller is free to mutate the subroutine beyond its initial state
           after this function has returned.

           If "name" is null then the subroutine will be  anonymous,  with  its
           "CvGV"  referring to an "__ANON__" glob.  If "name" is non-null then
           the  subroutine  will  be  named  accordingly,  referenced  by   the
           appropriate glob.

           "name"   is   a   string,  giving  a  sigilless  symbol  name.   For
           "/newCONSTSUB", "name" is NUL-terminated, interpreted as Latin-1.

           For "/newCONSTSUB_flags", "name" has length "len" bytes,  hence  may
           contain  embedded  NULs.   It is interpreted as UTF-8 if "flags" has
           the "SVf_UTF8" bit set, and Latin-1 otherwise.  "flags"  should  not
           have bits set other than "SVf_UTF8".

           The  name  may  be  either qualified or unqualified.  If the name is
           unqualified then it defaults to being  in  the  stash  specified  by
           "stash" if that is non-null, or to "PL_curstash" if "stash" is null.
           The  symbol  is  always  added  to  the  stash  if  necessary,  with
           "GV_ADDMULTI" semantics.

           If there is already a subroutine of the specified name, then the new
           sub will replace the existing one in the glob.   A  warning  may  be
           generated about the redefinition.

           If the subroutine has one of a few special names, such as "BEGIN" or
           "END",  then  it  will  be  claimed  by  the  appropriate  queue for
           automatic running of phase-related subroutines.  In  this  case  the
           relevant glob will be left not containing any subroutine, even if it
           did  contain one before.  Execution of the subroutine will likely be
           a no-op, unless "sv" was a tied array or  the  caller  modified  the
           subroutine  in  some interesting way before it was executed.  In the
           case of "BEGIN", the treatment is buggy: the sub  will  be  executed
           when  only  half  built,  and  may  be deleted prematurely, possibly
           causing a crash.

           The function returns a pointer to the  constructed  subroutine.   If
           the  sub is anonymous then ownership of one counted reference to the
           subroutine is transferred to the caller.  If the sub is  named  then
           the  caller  does  not  get  ownership of a reference.  In most such
           cases, where the sub has a non-phase name, the sub will be alive  at
           the  point  it  is returned by virtue of being contained in the glob
           that names it.  A phase-named subroutine will usually  be  alive  by
           virtue of the reference owned by the phase's automatic run queue.  A
           "BEGIN"  subroutine may have been destroyed already by the time this
           function returns, but currently bugs occur in that case  before  the
           caller  gets  control.   It is the caller's responsibility to ensure
           that it knows which of these situations applies.

            CV *  newCONSTSUB      (HV *stash, const char *name, SV *sv)
            CV *  newCONSTSUB_flags(HV *stash, const char *name, STRLEN len,
                                    U32 flags, SV *sv)

       "newCVREF"
           Constructs, checks, and returns a code reference op.

            OP *  newCVREF(I32 flags, OP *o)

       "newDEFEROP"
           NOTE: "newDEFEROP" is experimental and  may  change  or  be  removed
           without notice.

           Constructs  and  returns  a deferred-block statement that implements
           the "defer" semantics.  The  "block"  optree  is  consumed  by  this
           function and becomes part of the returned optree.

           The "flags" argument carries additional flags to set on the returned
           op, including the "op_private" field.

            OP *  newDEFEROP(I32 flags, OP *block)

       "newDEFSVOP"
           Constructs and returns an op to access $_.

            OP *  newDEFSVOP()

       "newFOROP"
           Constructs,  checks,  and  returns an op tree expressing a "foreach"
           loop (iteration through a list of values).  This  is  a  heavyweight
           loop,  with  structure  that  allows  exiting the loop by "last" and
           suchlike.

           "sv" optionally supplies the variable(s) that  will  be  aliased  to
           each  item in turn; if null, it defaults to $_.  "expr" supplies the
           list of values to iterate over.  "block" supplies the main  body  of
           the  loop,  and  "cont"  optionally supplies a "continue" block that
           operates as a second half of the body.  All of these  optree  inputs
           are  consumed by this function and become part of the constructed op
           tree.

           "flags" gives the eight bits of "op_flags" for  the  "leaveloop"  op
           and,  shifted  up eight bits, the eight bits of "op_private" for the
           "leaveloop" op, except that (in both cases) some bits  will  be  set
           automatically.

            OP *  newFOROP(I32 flags, OP *sv, OP *expr, OP *block, OP *cont)

       "newGIVENOP"
           Constructs,  checks,  and  returns  an  op tree expressing a "given"
           block.  "cond" supplies the expression to whose  value  $_  will  be
           locally  aliased,  and  "block"  supplies  the  body  of the "given"
           construct; they are consumed by this function and become part of the
           constructed op tree.  "defsv_off" must be zero (it used to  identity
           the pad slot of lexical $_).

            OP *  newGIVENOP(OP *cond, OP *block, PADOFFSET defsv_off)

       "newGVOP"
           Constructs,  checks,  and returns an op of any type that involves an
           embedded reference to a GV.  "type" is the  opcode.   "flags"  gives
           the  eight  bits  of "op_flags".  "gv" identifies the GV that the op
           should reference; calling this function does not transfer  ownership
           of any reference to it.

            OP *  newGVOP(I32 type, I32 flags, GV *gv)

       "newGVREF"
           Constructs, checks, and returns a glob reference op.

            OP *  newGVREF(I32 type, OP *o)

       "newHVREF"
           Constructs, checks, and returns a hash reference op.

            OP *  newHVREF(OP *o)

       "newLISTOP"
           Constructs,  checks,  and returns an op of any list type.  "type" is
           the opcode.  "flags" gives the eight bits of "op_flags", except that
           "OPf_KIDS" will be  set  automatically  if  required.   "first"  and
           "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 "newLISTOP(OP_JOIN,  ...)"  (e.g.)
           is  not  appropriate.  What you want to do in that case is create an
           op of type "OP_LIST", append more children  to  it,  and  then  call
           "op_convert_list".  See "op_convert_list" for more information.

           If  a  compiletime-known  fixed  list  of child ops is required, the
           "newLISTOPn" function can be used as a convenient shortcut, avoiding
           the need to create a temporary plain "OP_LIST" in a new variable.

            OP *  newLISTOP(I32 type, I32 flags, OP *first, OP *last)

       "newLISTOPn"
           Constructs, checks, and returns an op of any list type.   "type"  is
           the opcode.  "flags" gives the eight bits of "op_flags", except that
           "OPf_KIDS"  will  be  set  automatically  if required.  The variable
           number  of  arguments  after  "flags"  must  all  be  OP   pointers,
           terminated by a final "NULL" pointer.  These will all be consumed as
           direct children of the list op and become part of the constructed op
           tree.

           Do not forget to end the arguments list with a "NULL" pointer.

           This  function is useful as a shortcut to performing the sequence of
           newLISTOP(),   op_append_elem()   on   each   element   and    final
           op_convert_list()  in  the  case  where  a  compiletime-known  fixed
           sequence of child ops is required.  If a variable number of elements
           are required, or for splicing in an entire sub-list  of  child  ops,
           see instead "newLISTOP" and "op_convert_list".

            OP *  newLISTOPn(I32 type, I32 flags, ...)

       "newLOGOP"
           Constructs, checks, and returns a logical (flow control) op.  "type"
           is  the  opcode.  "flags" gives the eight bits of "op_flags", except
           that "OPf_KIDS" will be set automatically,  and,  shifted  up  eight
           bits, the eight bits of "op_private", except that the bit with value
           1 is automatically set.  "first" supplies the expression controlling
           the  flow,  and  "other" supplies the side (alternate) chain of ops;
           they  are  consumed  by  this  function  and  become  part  of   the
           constructed op tree.

            OP *  newLOGOP(I32 optype, I32 flags, OP *first, OP *other)

       "newLOOPEX"
           Constructs, checks, and returns a loop-exiting op (such as "goto" or
           "last").   "type"  is  the  opcode.   "label" supplies the parameter
           determining the target of the op; it is consumed  by  this  function
           and becomes part of the constructed op tree.

            OP *  newLOOPEX(I32 type, OP *label)

       "newLOOPOP"
           Constructs,  checks, and returns an op tree expressing a loop.  This
           is only a loop in the control flow through the op tree; it does  not
           have  the heavyweight loop structure that allows exiting the loop by
           "last" and suchlike.  "flags" gives the eight bits of "op_flags" for
           the top-level op, except that some bits will be set automatically as
           required.   "expr"  supplies   the   expression   controlling   loop
           iteration,  and  "block"  supplies  the  body  of the loop; they are
           consumed by this function and become  part  of  the  constructed  op
           tree.  "debuggable" is currently unused and should always be 1.

            OP *  newLOOPOP(I32 flags, I32 debuggable, OP *expr, OP *block)

       "newMETHOP"
           Constructs,  checks,  and returns an op of method type with a method
           name evaluated at runtime.  "type" is the opcode.  "flags" gives the
           eight bits  of  "op_flags",  except  that  "OPf_KIDS"  will  be  set
           automatically,  and,  shifted  up  eight  bits,  the  eight  bits of
           "op_private", except that the bit with value 1 is automatically set.
           "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: "OP_METHOD".

            OP *  newMETHOP(I32 type, I32 flags, OP *dynamic_meth)

       "newMETHOP_named"
           Constructs, checks, and returns an op of method type with a constant
           method name.  "type" is the opcode.  "flags" gives the eight bits of
           "op_flags",  and,  shifted  up  eight  bits,  the  eight   bits   of
           "op_private".  "const_meth" supplies a constant method name; it must
           be a shared COW string.  Supported optypes: "OP_METHOD_NAMED".

            OP *  newMETHOP_named(I32 type, I32 flags, SV * const_meth)

       "newNULLLIST"
           Constructs, checks, and returns a new "stub" op, which represents an
           empty list expression.

            OP *  newNULLLIST()

       "newOP"
           Constructs,  checks,  and  returns  an op of any base type (any type
           that has no extra fields).  "type" is the opcode.  "flags" gives the
           eight bits of "op_flags", and, shifted up eight bits, the eight bits
           of "op_private".

            OP *  newOP(I32 optype, I32 flags)

       "newPADOP"
           Constructs, checks, and returns an op of any type  that  involves  a
           reference  to  a  pad element.  "type" is the opcode.  "flags" gives
           the  eight  bits  of  "op_flags".   A  pad  slot  is   automatically
           allocated, and is populated with "sv"; this function takes ownership
           of one reference to it.

           This function only exists if Perl has been compiled to use ithreads.

            OP *  newPADOP(I32 type, I32 flags, SV *sv)

       "newPMOP"
           Constructs,  checks, and returns an op of any pattern matching type.
           "type" is the opcode.  "flags" gives the eight  bits  of  "op_flags"
           and, shifted up eight bits, the eight bits of "op_private".

            OP *  newPMOP(I32 type, I32 flags)

       "newPVOP"
           Constructs,  checks,  and returns an op of any type that involves an
           embedded C-level pointer (PV).  "type" is the opcode.  "flags" gives
           the eight bits of "op_flags".  "pv" supplies  the  C-level  pointer.
           Depending on the op type, the memory referenced by "pv" may be freed
           when the op is destroyed.  If the op is of a freeing type, "pv" must
           have been allocated using "PerlMemShared_malloc".

            OP *  newPVOP(I32 type, I32 flags, char *pv)

       "newRANGE"
           Constructs  and  returns  a  "range" op, with subordinate "flip" and
           "flop" ops.  "flags" gives the eight  bits  of  "op_flags"  for  the
           "flip" op and, shifted up eight bits, the eight bits of "op_private"
           for  both the "flip" and "range" ops, except that the bit with value
           1 is automatically set.  "left" and "right" supply  the  expressions
           controlling  the  endpoints  of the range; they are consumed by this
           function and become part of the constructed op tree.

            OP *  newRANGE(I32 flags, OP *left, OP *right)

       "newSLICEOP"
           Constructs,  checks,  and  returns  an  "lslice"  (list  slice)  op.
           "flags"  gives  the eight bits of "op_flags", except that "OPf_KIDS"
           will be set automatically, and, shifted up  eight  bits,  the  eight
           bits  of  "op_private",  except  that  the  bit with value 1 or 2 is
           automatically set as required.  "listval" and "subscript" supply the
           parameters of the slice; they are  consumed  by  this  function  and
           become part of the constructed op tree.

            OP *  newSLICEOP(I32 flags, OP *subscript, OP *listop)

       "newSTATEOP"
           Constructs a state op (COP).  The state op is normally a "nextstate"
           op,  but  will  be  a  "dbstate"  op  if  debugging  is  enabled for
           currently-compiled code.  The state op is populated from "PL_curcop"
           (or "PL_compiling").  If "label" is non-null, it supplies  the  name
           of  a label to attach to the state op; this function takes ownership
           of the memory pointed at by "label",  and  will  free  it.   "flags"
           gives the eight bits of "op_flags" for the state op.

           If "o" is null, the state op is returned.  Otherwise the state op is
           combined  with "o" into a "lineseq" list op, which is returned.  "o"
           is consumed by this function and becomes part  of  the  returned  op
           tree.

            OP *  newSTATEOP(I32 flags, char *label, OP *o)

       "newSUB"
           Construct  a Perl subroutine without attributes, and also performing
           some surrounding  jobs,  returning  a  pointer  to  the  constructed
           subroutine.

           This  is  the  same  as  ""newATTRSUB_x""  in  perlintern  with  its
           "o_is_gv" parameter set to FALSE, and its "attrs" parameter to NULL.
           This means that if "o" is null,  the  new  sub  will  be  anonymous;
           otherwise the name will be derived from "o" in the way described (as
           with all other details) in ""newATTRSUB_x"" in perlintern.

            CV *  newSUB(I32 floor, OP *o, OP *proto, OP *block)

       "newSVOP"
           Constructs,  checks,  and returns an op of any type that involves an
           embedded SV.  "type" is the opcode.  "flags" gives the eight bits of
           "op_flags".  "sv" gives the SV to embed in  the  op;  this  function
           takes ownership of one reference to it.

            OP *  newSVOP(I32 type, I32 flags, SV *sv)

       "newSVREF"
           Constructs, checks, and returns a scalar reference op.

            OP *  newSVREF(OP *o)

       "newTRYCATCHOP"
           NOTE:  "newTRYCATCHOP"  is experimental and may change or be removed
           without notice.

           Constructs  and  returns  a  conditional  execution  statement  that
           implements  the  "try"/"catch"  semantics.   First  the  op  tree in
           "tryblock" is executed, inside a context that traps exceptions.   If
           an  exception  occurs  then  the optree in "catchblock" is executed,
           with the trapped exception set into the lexical  variable  given  by
           "catchvar"  (which  must  be  an  op  of  type "OP_PADSV").  All the
           optrees are consumed  by  this  function  and  become  part  of  the
           returned op tree.

           The "flags" argument is currently ignored.

            OP *  newTRYCATCHOP(I32 flags, OP *tryblock, OP *catchvar,
                                OP *catchblock)

       "newUNOP"
           Constructs,  checks, and returns an op of any unary type.  "type" is
           the opcode.  "flags" gives the eight bits of "op_flags", except that
           "OPf_KIDS" will be set automatically if required,  and,  shifted  up
           eight bits, the eight bits of "op_private", except that the bit with
           value 1 is automatically set.  "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.

            OP *  newUNOP(I32 type, I32 flags, OP *first)

       "newUNOP_AUX"
           Similar to "newUNOP", but creates an "UNOP_AUX" struct instead, with
           "op_aux" initialised to "aux"

            OP *  newUNOP_AUX(I32 type, I32 flags, OP *first,
                              UNOP_AUX_item *aux)

       "newWHENOP"
           Constructs, checks, and returns  an  op  tree  expressing  a  "when"
           block.   "cond"  supplies  the test expression, and "block" supplies
           the block that will be executed if the test evaluates to true;  they
           are  consumed by this function and become part of the constructed op
           tree.  "cond" will be interpreted DWIMically, often as a  comparison
           against $_, and may be null to generate a "default" block.

            OP *  newWHENOP(OP *cond, OP *block)

       "newWHILEOP"
           Constructs,  checks,  and  returns  an  op tree expressing a "while"
           loop.  This is  a  heavyweight  loop,  with  structure  that  allows
           exiting the loop by "last" and suchlike.

           "loop"  is  an  optional preconstructed "enterloop" op to use in the
           loop; if  it  is  null  then  a  suitable  op  will  be  constructed
           automatically.   "expr"  supplies the loop's controlling expression.
           "block" supplies the main body of the loop,  and  "cont"  optionally
           supplies  a  "continue"  block that operates as a second half of the
           body.  All of these optree inputs are consumed by this function  and
           become part of the constructed op tree.

           "flags"  gives  the  eight bits of "op_flags" for the "leaveloop" op
           and, shifted up eight bits, the eight bits of "op_private"  for  the
           "leaveloop"  op,  except  that (in both cases) some bits will be set
           automatically.  "debuggable" is currently unused and  should  always
           be 1.  "has_my" can be supplied as true to force the loop body to be
           enclosed in its own scope.

            OP *  newWHILEOP(I32 flags, I32 debuggable, LOOP *loop, OP *expr,
                             OP *block, OP *cont, I32 has_my)

       "newXS"
           Used by "xsubpp" to hook up XSUBs as Perl subs.  "filename" needs to
           be  static  storage,  as  it is used directly as CvFILE(), without a
           copy being made.

       "OA_BASEOP"
       "OA_BINOP"
       "OA_COP"
       "OA_LISTOP"
       "OA_LOGOP"
       "OA_LOOP"
       "OA_PADOP"
       "OA_PMOP"
       "OA_PVOP_OR_SVOP"
       "OA_SVOP"
       "OA_UNOP"
           Described in perlguts.

       "OP"
           Described in perlguts.

       "op_append_elem"
           Append an item to the list of ops contained directly within a  list-
           type  op,  returning  the lengthened list.  "first" is the list-type
           op, and "last" is the op to append to the list.  "optype"  specifies
           the  intended opcode for the list.  If "first" is not already a list
           of the right type, it will be upgraded into one.  If either  "first"
           or "last" is null, the other is returned unchanged.

            OP *  op_append_elem(I32 optype, OP *first, OP *last)

       "op_append_list"
           Concatenate the lists of ops contained directly within two list-type
           ops,  returning the combined list.  "first" and "last" are the list-
           type ops to concatenate.  "optype" specifies the intended opcode for
           the list.  If either "first" or "last" is not already a list of  the
           right  type,  it  will  be  upgraded into one.  If either "first" or
           "last" is null, the other is returned unchanged.

            OP *  op_append_list(I32 optype, OP *first, OP *last)

       "OP_CLASS"
           Return the class of the provided OP:  that  is,  which  of  the  *OP
           structures   it   uses.   For  core  ops  this  currently  gets  the
           information out of "PL_opargs", which  does  not  always  accurately
           reflect  the  type  used;  in  v5.26  onwards, see also the function
           "op_class" which can do a better job of determining the used type.

           For custom ops the type is returned from the registration, and it is
           up to the registree to ensure it is accurate.   The  value  returned
           will be one of the "OA_"* constants from op.h.

            U32  OP_CLASS(OP *o)

       "op_contextualize"
           Applies   a   syntactic  context  to  an  op  tree  representing  an
           expression.  "o" is the op tree, and "context" must  be  "G_SCALAR",
           "G_LIST", or "G_VOID" to specify the context to apply.  The modified
           op tree is returned.

            OP *  op_contextualize(OP *o, I32 context)

       "op_convert_list"
           Converts  "o"  into  a  list  op  if it is not one already, and then
           converts it into the specified "type", calling its  check  function,
           allocating a target if it needs one, and folding constants.

           A  list-type  op  is  usually  constructed  one  kid  at  a time via
           "newLISTOP", "op_prepend_elem" and "op_append_elem".   Then  finally
           it is passed to "op_convert_list" to make it the right type.

            OP *  op_convert_list(I32 optype, I32 flags, OP *o)

       "OP_DESC"
           Return a short description of the provided OP.

            const char *  OP_DESC(OP *o)

       "op_force_list"
           Promotes o and any siblings to be an "OP_LIST" if it is not already.
           If  a  new  "OP_LIST"  op  was  created,  its  first  child  will be
           "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);

            OP *  op_force_list(OP *o)

       "op_free"
           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 "OPf_KIDS" set is expected to have a valid
           "op_first"  pointer.   If  you  are  attempting  to  free  an op but
           preserve its child op, make sure to clear that flag  before  calling
           op_free().  For example:

               OP *kid = o->op_first; o->op_first = NULL;
               o->op_flags &= ~OPf_KIDS;
               op_free(o);

            void  op_free(OP *arg)

       "OpHAS_SIBLING"
           Returns true if "o" has a sibling

            bool  OpHAS_SIBLING(OP *o)

       "OpLASTSIB_set"
           Marks  "o"  as  having no further siblings and marks o as having the
           specified parent. See also "OpMORESIB_set" and "OpMAYBESIB_set". For
           a higher-level interface, see "op_sibling_splice".

            void  OpLASTSIB_set(OP *o, OP *parent)

       "op_linklist"
           This function is the implementation of  the  "LINKLIST"  macro.   It
           should not be called directly.

            OP *  op_linklist(OP *o)

       "op_lvalue"
           NOTE:  "op_lvalue"  is  experimental  and  may  change or be removed
           without notice.

           Propagate lvalue ("modifiable") context to an op and  its  children.
           "type"  represents the context type, roughly based on the type of op
           that would do the modifying,  although  local()  is  represented  by
           "OP_NULL",  because it has no op type of its own (it is signalled by
           a flag on the lvalue op).

           This function detects things that can't be modified, such as "$x+1",
           and generates errors for them.  For example, "$x+1 = 2" would  cause
           it to be called with an op of type "OP_ADD" and a "type" argument of
           "OP_SASSIGN".

           It  also  flags  things  that  need to behave specially in an lvalue
           context, such as "$$x = 5" which might have to vivify a reference in
           $x.

            OP *  op_lvalue(OP *o, I32 type)

       "OpMAYBESIB_set"
           Conditionally does "OpMORESIB_set" or "OpLASTSIB_set"  depending  on
           whether  "sib"  is  non-null.  For  a  higher-level  interface,  see
           "op_sibling_splice".

            void  OpMAYBESIB_set(OP *o, OP *sib, OP *parent)

       "OpMORESIB_set"
           Sets the sibling of "o"  to  the  non-zero  value  "sib".  See  also
           "OpLASTSIB_set"  and "OpMAYBESIB_set". For a higher-level interface,
           see "op_sibling_splice".

            void  OpMORESIB_set(OP *o, OP *sib)

       "OP_NAME"
           Return the name of the provided OP.  For core ops this looks up  the
           name from the op_type; for custom ops from the op_ppaddr.

            const char *  OP_NAME(OP *o)

       "op_null"
           Neutralizes  an  op when it is no longer needed, but is still linked
           to from other ops.

            void  op_null(OP *o)

       "op_parent"
           Returns the parent OP of "o", if it has  a  parent.  Returns  "NULL"
           otherwise.

            OP *  op_parent(OP *o)

       "op_prepend_elem"
           Prepend an item to the list of ops contained directly within a list-
           type  op,  returning  the  lengthened  list.   "first"  is the op to
           prepend to the list, and  "last"  is  the  list-type  op.   "optype"
           specifies  the  intended  opcode  for  the  list.   If "last" is not
           already a list of the right type, it will be upgraded into one.   If
           either "first" or "last" is null, the other is returned unchanged.

            OP *  op_prepend_elem(I32 optype, OP *first, OP *last)

       "op_scope"
           NOTE:  "op_scope"  is  experimental  and  may  change  or be removed
           without notice.

           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  "enter"/"leave"  pair, but a
           "scope" op may be used instead if the ops are simple enough  to  not
           need the full dynamic scope structure.

            OP *  op_scope(OP *o)

       "OpSIBLING"
           Returns the sibling of "o", or "NULL" if there is no sibling

            OP*  OpSIBLING(OP *o)

       "op_sibling_splice"
           A general function for editing the structure of an existing chain of
           op_sibling nodes.  By analogy with the perl-level splice() function,
           allows  you  to delete zero or more sequential nodes, replacing them
           with  zero  or  more  different  nodes.   Performs   the   necessary
           op_first/op_last  housekeeping  on  the  parent  node and op_sibling
           manipulation on the children.  The last deleted node will be  marked
           as   the  last  node  by  updating  the  op_sibling/op_sibparent  or
           op_moresib field as appropriate.

           Note that op_next is not manipulated, and nodes are not freed;  that
           is  the  responsibility  of  the caller.  It also won't create a new
           list op for an empty  list  etc;  use  higher-level  functions  like
           op_append_elem() for that.

           "parent"  is  the parent node of the sibling chain. It may passed as
           "NULL" if the splicing doesn't affect the first or last  op  in  the
           chain.

           "start" is the node preceding the first node to be spliced.  Node(s)
           following it will be deleted, and ops will be inserted after it.  If
           it  is  "NULL",  the  first  node  onwards is deleted, and nodes are
           inserted at the beginning.

           "del_count" is the number of nodes to delete.  If zero, no nodes are
           deleted.  If -1 or greater than or equal to the number of  remaining
           kids, all remaining kids are deleted.

           "insert" is the first of a chain of nodes to be inserted in place of
           the nodes.  If "NULL", no nodes are inserted.

           The  head  of  the chain of deleted ops is returned, or "NULL" if no
           ops were deleted.

           For example:

               action                    before      after         returns
               ------                    -----       -----         -------

                                         P           P
               splice(P, A, 2, X-Y-Z)    |           |             B-C
                                         A-B-C-D     A-X-Y-Z-D

                                         P           P
               splice(P, NULL, 1, X-Y)   |           |             A
                                         A-B-C-D     X-Y-B-C-D

                                         P           P
               splice(P, NULL, 3, NULL)  |           |             A-B-C
                                         A-B-C-D     D

                                         P           P
               splice(P, B, 0, X-Y)      |           |             NULL
                                         A-B-C-D     A-B-X-Y-C-D

           For  lower-level   direct   manipulation   of   "op_sibparent"   and
           "op_moresib",       see       "OpMORESIB_set",      "OpLASTSIB_set",
           "OpMAYBESIB_set".

            OP *  op_sibling_splice(OP *parent, OP *start, int del_count,
                                    OP *insert)

       "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.

            void  optimize_optree(OP *o)

       "OP_TYPE_IS"
           Returns true if the given OP is not a "NULL" pointer and if it is of
           the given type.

           The negation of this macro, "OP_TYPE_ISNT" is also available as well
           as  "OP_TYPE_IS_NN"  and  "OP_TYPE_ISNT_NN"  which  elide  the  NULL
           pointer check.

            bool  OP_TYPE_IS(OP *o, Optype type)

       "OP_TYPE_IS_OR_WAS"
           Returns  true  if the given OP is not a NULL pointer and if it is of
           the given type or used to be before being replaced by an OP of  type
           OP_NULL.

           The   negation  of  this  macro,  "OP_TYPE_ISNT_AND_WASNT"  is  also
           available     as     well     as     "OP_TYPE_IS_OR_WAS_NN"      and
           "OP_TYPE_ISNT_AND_WASNT_NN" which elide the "NULL" pointer check.

            bool  OP_TYPE_IS_OR_WAS(OP *o, Optype type)

       "op_wrap_finally"
           NOTE: "op_wrap_finally" is experimental and may change or be removed
           without notice.

           Wraps  the  given  "block"  optree fragment in its own scoped block,
           arranging for the "finally"  optree  fragment  to  be  invoked  when
           leaving  that  block  for  any  reason.  Both  optree  fragments are
           consumed and the combined result is returned.

            OP *  op_wrap_finally(OP *block, OP *finally)

       "peep_t"
           Described in perlguts.

       "Perl_cpeep_t"
           Described in perlguts.

       "PL_opfreehook"
           When non-"NULL", the function  pointed  by  this  variable  will  be
           called  each  time  an  OP is freed with the corresponding OP as the
           argument.  This allows extensions to free any extra  attribute  they
           have  locally  attached  to an OP.  It is also assured to first fire
           for the parent OP and then for its kids.

           When you replace this variable, it is considered a good practice  to
           store  the possibly previously installed hook and that you recall it
           inside your own.

           On threaded perls, each thread  has  an  independent  copy  of  this
           variable;  each  initialized at creation time with the current value
           of the creating thread's copy.

            Perl_ophook_t  PL_opfreehook

       "PL_peepp"
           Pointer  to  the  per-subroutine  peephole  optimiser.   This  is  a
           function  that  gets  called  at  the  end  of compilation of a Perl
           subroutine (or equivalently  independent  piece  of  Perl  code)  to
           perform fixups of some ops and to perform small-scale optimisations.
           The  function  is  called once for each subroutine that is compiled,
           and is passed, as sole parameter, a pointer to the op  that  is  the
           entry point to the subroutine.  It modifies the op tree in place.

           The peephole optimiser should never be completely replaced.  Rather,
           add code to it by wrapping the existing optimiser.  The basic way to
           do  this  can  be seen in "Compile pass 3: peephole optimization" in
           perlguts.  If the new code wishes to operate on ops  throughout  the
           subroutine's  structure,  rather  than  just at the top level, it is
           likely to be more convenient to wrap the "PL_rpeepp" hook.

           On threaded perls, each thread  has  an  independent  copy  of  this
           variable;  each  initialized at creation time with the current value
           of the creating thread's copy.

            peep_t  PL_peepp

       "PL_rpeepp"
           Pointer to the recursive peephole optimiser.   This  is  a  function
           that  gets called at the end of compilation of a Perl subroutine (or
           equivalently independent piece of Perl code) to  perform  fixups  of
           some  ops and to perform small-scale optimisations.  The function is
           called once for each chain of ops  linked  through  their  "op_next"
           fields;  it  is recursively called to handle each side chain.  It is
           passed, as sole parameter, a pointer to the op that is at  the  head
           of the chain.  It modifies the op tree in place.

           The peephole optimiser should never be completely replaced.  Rather,
           add code to it by wrapping the existing optimiser.  The basic way to
           do  this  can  be seen in "Compile pass 3: peephole optimization" in
           perlguts.  If the new code wishes  to  operate  only  on  ops  at  a
           subroutine's  top level, rather than throughout the structure, it is
           likely to be more convenient to wrap the "PL_peepp" hook.

           On threaded perls, each thread  has  an  independent  copy  of  this
           variable;  each  initialized at creation time with the current value
           of the creating thread's copy.

            peep_t  PL_rpeepp

       "PMOP"
           Described in perlguts.

       "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.
           "cvop" is the op  being  considered,  normally  an  "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 "rv2cv" is to operate on is provided by a suitable "gv"  or
           "const" op.  A "gv" op is suitable if the GV's CV slot is populated.
           A  "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 "rv2cv" op has the "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 "flags" has the bit "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 "gv" op has the  "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 "flags" has the bit "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 "CvGV" of  the  subroutine,  but
           for  an anonymous ("CvANON") subroutine that is referenced through a
           GV it will be the referencing GV.  The resulting "GV*"  is  cast  to
           "CV*"  to be returned.  A null pointer is returned as usual if there
           is no statically-determinable subroutine.

            CV *  rv2cv_op_cv(OP *cvop, U32 flags)

       "UNOP"
           Described in perlguts.

       "XOP"
           Described in perlguts.

Pack and Unpack
       "packlist"
           The engine implementing pack() Perl function.

            void  packlist(SV *cat, const char *pat, const char *patend,
                           SV **beglist, SV **endlist)

       "unpackstring"
           The engine implementing the unpack() Perl function.

           Using the template "pat..patend", this function unpacks  the  string
           "s..strend"  into  a  number of mortal SVs, which it pushes onto the
           perl argument (@_) stack (so you will  need  to  issue  a  "PUTBACK"
           before  and  "SPAGAIN" after the call to this function).  It returns
           the number of pushed elements.

           The  "strend"  and  "patend"  pointers  should  point  to  the  byte
           following the last character of each string.

           Although  this  function  returns  its  values  on the perl argument
           stack, it doesn't take any parameters from that stack (and  thus  in
           particular  there's  no  need  to do a "PUSHMARK" before calling it,
           unlike "call_pv" for example).

            SSize_t  unpackstring(const char *pat, const char *patend,
                                  const char *s, const char *strend,
                                  U32 flags)

Pad Data Structures
       "CvPADLIST"
           NOTE: "CvPADLIST" is experimental  and  may  change  or  be  removed
           without notice.

           CV's  can have CvPADLIST(cv) set to point to a PADLIST.  This is the
           CV's scratchpad, which stores lexical variables and opcode temporary
           and per-thread values.

           For these purposes "formats" are  a  kind-of  CV;  eval""s  are  too
           (except  they're  not  callable  at  will and are always thrown away
           after the eval"" is done executing).   Require'd  files  are  simply
           evals without any outer lexical scope.

           XSUBs  do  not  have  a  "CvPADLIST".  "dXSTARG" fetches values from
           "PL_curpad", but that is really the callers pad (a slot of which  is
           allocated  by every entersub). Do not get or set "CvPADLIST" if a CV
           is an XSUB (as determined by CvISXSUB()), "CvPADLIST" slot is reused
           for a different internal purpose in XSUBs.

           The PADLIST has a C array where pads are stored.

           The 0th entry of the PADLIST is a PADNAMELIST which  represents  the
           "names"  or  rather the "static type information" for lexicals.  The
           individual  elements  of  a  PADNAMELIST   are   PADNAMEs.    Future
           refactorings  might  stop  the  PADNAMELIST from being stored in the
           PADLIST's array, so don't rely on it.  See "PadlistNAMES".

           The CvDEPTH'th entry of a PADLIST is a PAD  (an  AV)  which  is  the
           stack frame at that depth of recursion into the CV.  The 0th slot of
           a  frame  AV  is  an  AV which is @_.  Other entries are storage for
           variables and op targets.

           Iterating over the PADNAMELIST iterates over all possible pad items.
           Pad  slots  for  targets  ("SVs_PADTMP")  and  GVs  end  up   having
           &PL_padname_undef   "names",   while   slots   for   constants  have
           &PL_padname_const "names" (see "pad_alloc").  That &PL_padname_undef
           and &PL_padname_const are used is an implementation  detail  subject
           to   change.    To   test   for  them,  use  "!PadnamePV(name)"  and
           "PadnamePV(name) && !PadnameLEN(name)", respectively.

           Only "my"/"our" variable slots get valid names.   The  rest  are  op
           targets/GVs/constants  which are statically allocated or resolved at
           compile time.  These don't have names by which they can be looked up
           from Perl code  at  run  time  through  eval""  the  way  "my"/"our"
           variables  can be.  Since they can't be looked up by "name" but only
           by their index allocated  at  compile  time  (which  is  usually  in
           "PL_op->op_targ"), wasting a name SV for them doesn't make sense.

           The  pad  names in the PADNAMELIST have their PV holding the name of
           the variable.  The "COP_SEQ_RANGE_LOW" and  "_HIGH"  fields  form  a
           range  (low+1..high inclusive) of cop_seq numbers for which the name
           is valid.  During compilation, these fields  may  hold  the  special
           value PERL_PADSEQ_INTRO to indicate various stages:

            COP_SEQ_RANGE_LOW        _HIGH
            -----------------        -----
            PERL_PADSEQ_INTRO            0   variable not yet introduced:
                                             { my ($x
            valid-seq#   PERL_PADSEQ_INTRO   variable in scope:
                                             { my ($x);
            valid-seq#          valid-seq#   compilation of scope complete:
                                             { my ($x); .... }

           When  a  lexical  var  hasn't yet been introduced, it already exists
           from the perspective of duplicate declarations, but not for variable
           lookups, e.g.

               my ($x, $x); # '"my" variable $x masks earlier declaration'
               my $x = $x;  # equal to my $x = $::x;

           For typed lexicals "PadnameTYPE" points  at  the  type  stash.   For
           "our"  lexicals,  "PadnameOURSTASH"  points  at  the  stash  of  the
           associated global (so that duplicate "our" declarations in the  same
           package  can  be detected).  "PadnameGEN" is sometimes used to store
           the generation number during compilation.

           If "PadnameOUTER" is set on the pad name,  then  that  slot  in  the
           frame AV is a REFCNT'ed reference to a lexical from "outside".  Such
           entries are sometimes referred to as 'fake'.  In this case, the name
           does  not use 'low' and 'high' to store a cop_seq range, since it is
           in scope throughout.  Instead 'high' stores  some  flags  containing
           info  about  the  real lexical (is it declared in an anon, and is it
           capable of being instantiated multiple times?), and for fake  ANONs,
           'low' contains the index within the parent's pad where the lexical's
           value is stored, to make cloning quicker.

           If  the  'name'  is  "&"  the corresponding entry in the PAD is a CV
           representing a possible closure.

           Note that formats are treated as anon subs, and are cloned each time
           write is called (if necessary).

           The flag "SVs_PADSTALE" is cleared on lexicals each time the my() is
           executed, and set on scope exit.  This allows the  "Variable  $x  is
           not available" warning to be generated in evals, such as

               { my $x = 1; sub f { eval '$x'} } f();

           For  state  vars,  "SVs_PADSTALE"  is  overloaded  to  mean 'not yet
           initialised', but this internal state is stored in  a  separate  pad
           entry.

            PADLIST *  CvPADLIST(CV *cv)

       "pad_add_name_pvs"
           Exactly  like "pad_add_name_pvn", but takes a literal string instead
           of a string/length pair.

            PADOFFSET  pad_add_name_pvs("name", U32 flags, HV *typestash,
                                        HV *ourstash)

       "PadARRAY"
           NOTE: "PadARRAY" is  experimental  and  may  change  or  be  removed
           without notice.

           The C array of pad entries.

            SV **  PadARRAY(PAD * pad)

       "pad_findmy_pvs"
           Exactly like "pad_findmy_pvn", but takes a literal string instead of
           a string/length pair.

            PADOFFSET  pad_findmy_pvs("name", U32 flags)

       "PadlistARRAY"
           NOTE:  "PadlistARRAY"  is  experimental and may change or be removed
           without notice.

           The C array of a padlist, containing the pads.   Only  subscript  it
           with  numbers  >=  1,  as  the 0th entry is not guaranteed to remain
           usable.

            PAD **  PadlistARRAY(PADLIST * padlist)

       "PadlistMAX"
           NOTE: "PadlistMAX" is experimental and  may  change  or  be  removed
           without notice.

           The index of the last allocated space in the padlist.  Note that the
           last  pad  may be in an earlier slot.  Any entries following it will
           be "NULL" in that case.

            SSize_t  PadlistMAX(PADLIST * padlist)

       "PadlistNAMES"
           NOTE: "PadlistNAMES" is experimental and may change  or  be  removed
           without notice.

           The names associated with pad entries.

            PADNAMELIST *  PadlistNAMES(PADLIST * padlist)

       "PadlistNAMESARRAY"
           NOTE:  "PadlistNAMESARRAY"  is  experimental  and  may  change or be
           removed without notice.

           The C array of pad names.

            PADNAME **  PadlistNAMESARRAY(PADLIST * padlist)

       "PadlistNAMESMAX"
           NOTE: "PadlistNAMESMAX" is experimental and may change or be removed
           without notice.

           The index of the last pad name.

            SSize_t  PadlistNAMESMAX(PADLIST * padlist)

       "PadlistREFCNT"
           NOTE: "PadlistREFCNT" is experimental and may change or  be  removed
           without notice.

           The reference count of the padlist.  Currently this is always 1.

            U32  PadlistREFCNT(PADLIST * padlist)

       "PadMAX"
           NOTE:  "PadMAX" is experimental and may change or be removed without
           notice.

           The index of the last pad entry.

            SSize_t  PadMAX(PAD * pad)

       "PadnameLEN"
           NOTE: "PadnameLEN" is experimental and  may  change  or  be  removed
           without notice.

           The length of the name.

            STRLEN  PadnameLEN(PADNAME * pn)

       "PadnamelistARRAY"
           NOTE:  "PadnamelistARRAY"  is  experimental  and  may  change  or be
           removed without notice.

           The C array of pad names.

            PADNAME **  PadnamelistARRAY(PADNAMELIST * pnl)

       "PadnamelistMAX"
           NOTE: "PadnamelistMAX" is experimental and may change or be  removed
           without notice.

           The index of the last pad name.

            SSize_t  PadnamelistMAX(PADNAMELIST * pnl)

       "PadnamelistREFCNT"
           NOTE:  "PadnamelistREFCNT"  is  experimental  and  may  change or be
           removed without notice.

           The reference count of the pad name list.

            SSize_t  PadnamelistREFCNT(PADNAMELIST * pnl)

       "PadnamelistREFCNT_dec"
           NOTE: "PadnamelistREFCNT_dec" is experimental and may change  or  be
           removed without notice.

           Lowers the reference count of the pad name list.

            void  PadnamelistREFCNT_dec(PADNAMELIST * pnl)

       "PadnamePV"
           NOTE:  "PadnamePV"  is  experimental  and  may  change or be removed
           without notice.

           The name stored in the pad name struct.  This returns "NULL"  for  a
           target slot.

            char *  PadnamePV(PADNAME * pn)

       "PadnameREFCNT"
           NOTE:  "PadnameREFCNT"  is experimental and may change or be removed
           without notice.

           The reference count of the pad name.

            SSize_t  PadnameREFCNT(PADNAME * pn)

       "PadnameREFCNT_dec"
           NOTE: "PadnameREFCNT_dec" is  experimental  and  may  change  or  be
           removed without notice.

           Lowers the reference count of the pad name.

            void  PadnameREFCNT_dec(PADNAME * pn)

       "PadnameREFCNT_inc"
           NOTE:  "PadnameREFCNT_inc"  is  experimental  and  may  change or be
           removed without notice.

           Increases the reference count of the pad name.  Returns the pad name
           itself.

            PADNAME *  PadnameREFCNT_inc(PADNAME * pn)

       "PadnameSV"
           NOTE: "PadnameSV" is experimental  and  may  change  or  be  removed
           without notice.

           Returns the pad name as a mortal SV.

            SV *  PadnameSV(PADNAME * pn)

       "PadnameUTF8"
           NOTE:  "PadnameUTF8"  is  experimental  and may change or be removed
           without notice.

           Whether PadnamePV is in UTF-8.  Currently, this is always true.

            bool  PadnameUTF8(PADNAME * pn)

       "pad_new"
           Create  a  new  padlist,  updating  the  global  variables  for  the
           currently-compiling  padlist  to  point  to  the  new  padlist.  The
           following flags can be OR'ed together:

               padnew_CLONE        this pad is for a cloned CV
               padnew_SAVE         save old globals on the save stack
               padnew_SAVESUB      also save extra stuff for start of sub

            PADLIST *  pad_new(int flags)

       "PL_comppad"
           NOTE: "PL_comppad" is experimental and  may  change  or  be  removed
           without notice.

           During  compilation,  this points to the array containing the values
           part of the pad for the currently-compiling code.  (At runtime a  CV
           may  have  many  such  value  arrays;  at  compile  time just one is
           constructed.)  At runtime, this points to the array  containing  the
           currently-relevant  values  for  the pad for the currently-executing
           code.

       "PL_comppad_name"
           NOTE: "PL_comppad_name" is experimental and may change or be removed
           without notice.

           During compilation, this points to the array  containing  the  names
           part of the pad for the currently-compiling code.

       "PL_curpad"
           NOTE:  "PL_curpad"  is  experimental  and  may  change or be removed
           without notice.

           Points directly to the body of the "PL_comppad" array.  (I.e.,  this
           is PadARRAY(PL_comppad).)

       "SVs_PADMY"
           "DEPRECATED!"   It  is  planned  to remove "SVs_PADMY" from a future
           release of Perl.  Do not  use  it  for  new  code;  remove  it  from
           existing code.

           Described in perlguts.

       "SVs_PADTMP"
           Described in perlguts.

Password and Group access
       "GRPASSWD"
           This  symbol,  if  defined,  indicates to the C program that "struct
           group" in grp.h contains "gr_passwd".

       "HAS_ENDGRENT"
           This symbol, if defined, indicates  that  the  getgrent  routine  is
           available for finalizing sequential access of the group database.

       "HAS_ENDGRENT_R"
           This  symbol, if defined, indicates that the "endgrent_r" routine is
           available to endgrent re-entrantly.

       "HAS_ENDPWENT"
           This symbol, if defined, indicates that the  "endpwent"  routine  is
           available for finalizing sequential access of the passwd database.

       "HAS_ENDPWENT_R"
           This  symbol, if defined, indicates that the "endpwent_r" routine is
           available to endpwent re-entrantly.

       "HAS_GETGRENT"
           This symbol, if defined, indicates that the  "getgrent"  routine  is
           available for sequential access of the group database.

       "HAS_GETGRENT_R"
           This  symbol, if defined, indicates that the "getgrent_r" routine is
           available to getgrent re-entrantly.

       "HAS_GETPWENT"
           This symbol, if defined, indicates that the  "getpwent"  routine  is
           available  for sequential access of the passwd database.  If this is
           not available, the older getpw() function may be available.

       "HAS_GETPWENT_R"
           This symbol, if defined, indicates that the "getpwent_r" routine  is
           available to getpwent re-entrantly.

       "HAS_SETGRENT"
           This  symbol,  if  defined, indicates that the "setgrent" routine is
           available for initializing sequential access of the group database.

       "HAS_SETGRENT_R"
           This symbol, if defined, indicates that the "setgrent_r" routine  is
           available to setgrent re-entrantly.

       "HAS_SETPWENT"
           This  symbol,  if  defined, indicates that the "setpwent" routine is
           available for initializing sequential access of the passwd database.

       "HAS_SETPWENT_R"
           This symbol, if defined, indicates that the "setpwent_r" routine  is
           available to setpwent re-entrantly.

       "PWAGE"
           This  symbol,  if  defined,  indicates to the C program that "struct
           passwd" contains "pw_age".

       "PWCHANGE"
           This symbol, if defined, indicates to the  C  program  that  "struct
           passwd" contains "pw_change".

       "PWCLASS"
           This  symbol,  if  defined,  indicates to the C program that "struct
           passwd" contains "pw_class".

       "PWCOMMENT"
           This symbol, if defined, indicates to the  C  program  that  "struct
           passwd" contains "pw_comment".

       "PWEXPIRE"
           This  symbol,  if  defined,  indicates to the C program that "struct
           passwd" contains "pw_expire".

       "PWGECOS"
           This symbol, if defined, indicates to the  C  program  that  "struct
           passwd" contains "pw_gecos".

       "PWPASSWD"
           This  symbol,  if  defined,  indicates to the C program that "struct
           passwd" contains "pw_passwd".

       "PWQUOTA"
           This symbol, if defined, indicates to the  C  program  that  "struct
           passwd" contains "pw_quota".

Paths to system commands
       "CSH"
           This symbol, if defined, contains the full pathname of csh.

       "LOC_SED"
           This symbol holds the complete pathname to the sed program.

       "SH_PATH"
           This  symbol contains the full pathname to the shell used on this on
           this system to execute Bourne shell scripts.  Usually, this will  be
           /bin/sh,  though it's possible that some systems will have /bin/ksh,
           /bin/pdksh,  /bin/ash,  /bin/bash,  or  even   something   such   as
           D:/bin/sh.exe.

Prototype information
       "CRYPT_R_PROTO"
           This  symbol  encodes  the  prototype  of  "crypt_r".  It is zero if
           "d_crypt_r" is undef, and one of the "REENTRANT_PROTO_T_ABC"  macros
           of reentr.h if "d_crypt_r" is defined.

       "CTERMID_R_PROTO"
           This  symbol  encodes  the  prototype of "ctermid_r".  It is zero if
           "d_ctermid_r" is  undef,  and  one  of  the  "REENTRANT_PROTO_T_ABC"
           macros of reentr.h if "d_ctermid_r" is defined.

       "DRAND48_R_PROTO"
           This  symbol  encodes  the  prototype of "drand48_r".  It is zero if
           "d_drand48_r" is  undef,  and  one  of  the  "REENTRANT_PROTO_T_ABC"
           macros of reentr.h if "d_drand48_r" is defined.

       "ENDGRENT_R_PROTO"
           This  symbol  encodes  the prototype of "endgrent_r".  It is zero if
           "d_endgrent_r" is undef,  and  one  of  the  "REENTRANT_PROTO_T_ABC"
           macros of reentr.h if "d_endgrent_r" is defined.

       "ENDHOSTENT_R_PROTO"
           This  symbol encodes the prototype of "endhostent_r".  It is zero if
           "d_endhostent_r" is undef, and one  of  the  "REENTRANT_PROTO_T_ABC"
           macros of reentr.h if "d_endhostent_r" is defined.

       "ENDNETENT_R_PROTO"
           This  symbol  encodes the prototype of "endnetent_r".  It is zero if
           "d_endnetent_r" is undef, and  one  of  the  "REENTRANT_PROTO_T_ABC"
           macros of reentr.h if "d_endnetent_r" is defined.

       "ENDPROTOENT_R_PROTO"
           This symbol encodes the prototype of "endprotoent_r".  It is zero if
           "d_endprotoent_r"  is  undef, and one of the "REENTRANT_PROTO_T_ABC"
           macros of reentr.h if "d_endprotoent_r" is defined.

       "ENDPWENT_R_PROTO"
           This symbol encodes the prototype of "endpwent_r".  It  is  zero  if
           "d_endpwent_r"  is  undef,  and  one  of the "REENTRANT_PROTO_T_ABC"
           macros of reentr.h if "d_endpwent_r" is defined.

       "ENDSERVENT_R_PROTO"
           This symbol encodes the prototype of "endservent_r".  It is zero  if
           "d_endservent_r"  is  undef,  and one of the "REENTRANT_PROTO_T_ABC"
           macros of reentr.h if "d_endservent_r" is defined.

       "GDBMNDBM_H_USES_PROTOTYPES"
           This symbol, if defined, indicates that gdbm/ndbm.h uses real "ANSI"
           C prototypes instead of K&R style function declarations without  any
           parameter  information.  While  "ANSI" C prototypes are supported in
           C++, K&R style function declarations will yield errors.

       "GDBM_NDBM_H_USES_PROTOTYPES"
           This symbol, if defined,  indicates  that  <gdbm-ndbm.h>  uses  real
           "ANSI"  C  prototypes  instead  of  K&R  style function declarations
           without any parameter information. While  "ANSI"  C  prototypes  are
           supported in C++, K&R style function declarations will yield errors.

       "GETGRENT_R_PROTO"
           This  symbol  encodes  the prototype of "getgrent_r".  It is zero if
           "d_getgrent_r" is undef,  and  one  of  the  "REENTRANT_PROTO_T_ABC"
           macros of reentr.h if "d_getgrent_r" is defined.

       "GETGRGID_R_PROTO"
           This  symbol  encodes  the prototype of "getgrgid_r".  It is zero if
           "d_getgrgid_r" is undef,  and  one  of  the  "REENTRANT_PROTO_T_ABC"
           macros of reentr.h if "d_getgrgid_r" is defined.

       "GETGRNAM_R_PROTO"
           This  symbol  encodes  the prototype of "getgrnam_r".  It is zero if
           "d_getgrnam_r" is undef,  and  one  of  the  "REENTRANT_PROTO_T_ABC"
           macros of reentr.h if "d_getgrnam_r" is defined.

       "GETHOSTBYADDR_R_PROTO"
           This  symbol encodes the prototype of "gethostbyaddr_r".  It is zero
           if    "d_gethostbyaddr_r"    is    undef,    and    one    of    the
           "REENTRANT_PROTO_T_ABC" macros of reentr.h if "d_gethostbyaddr_r" is
           defined.

       "GETHOSTBYNAME_R_PROTO"
           This  symbol encodes the prototype of "gethostbyname_r".  It is zero
           if    "d_gethostbyname_r"    is    undef,    and    one    of    the
           "REENTRANT_PROTO_T_ABC" macros of reentr.h if "d_gethostbyname_r" is
           defined.

       "GETHOSTENT_R_PROTO"
           This  symbol encodes the prototype of "gethostent_r".  It is zero if
           "d_gethostent_r" is undef, and one  of  the  "REENTRANT_PROTO_T_ABC"
           macros of reentr.h if "d_gethostent_r" is defined.

       "GETLOGIN_R_PROTO"
           This  symbol  encodes  the prototype of "getlogin_r".  It is zero if
           "d_getlogin_r" is undef,  and  one  of  the  "REENTRANT_PROTO_T_ABC"
           macros of reentr.h if "d_getlogin_r" is defined.

       "GETNETBYADDR_R_PROTO"
           This  symbol  encodes the prototype of "getnetbyaddr_r".  It is zero
           if    "d_getnetbyaddr_r"    is    undef,    and    one    of     the
           "REENTRANT_PROTO_T_ABC"  macros of reentr.h if "d_getnetbyaddr_r" is
           defined.

       "GETNETBYNAME_R_PROTO"
           This symbol encodes the prototype of "getnetbyname_r".  It  is  zero
           if     "d_getnetbyname_r"    is    undef,    and    one    of    the
           "REENTRANT_PROTO_T_ABC" macros of reentr.h if "d_getnetbyname_r"  is
           defined.

       "GETNETENT_R_PROTO"
           This  symbol  encodes the prototype of "getnetent_r".  It is zero if
           "d_getnetent_r" is undef, and  one  of  the  "REENTRANT_PROTO_T_ABC"
           macros of reentr.h if "d_getnetent_r" is defined.

       "GETPROTOBYNAME_R_PROTO"
           This symbol encodes the prototype of "getprotobyname_r".  It is zero
           if    "d_getprotobyname_r"    is    undef,    and    one    of   the
           "REENTRANT_PROTO_T_ABC" macros of reentr.h  if  "d_getprotobyname_r"
           is defined.

       "GETPROTOBYNUMBER_R_PROTO"
           This  symbol  encodes  the prototype of "getprotobynumber_r".  It is
           zero  if  "d_getprotobynumber_r"  is   undef,   and   one   of   the
           "REENTRANT_PROTO_T_ABC" macros of reentr.h if "d_getprotobynumber_r"
           is defined.

       "GETPROTOENT_R_PROTO"
           This symbol encodes the prototype of "getprotoent_r".  It is zero if
           "d_getprotoent_r"  is  undef, and one of the "REENTRANT_PROTO_T_ABC"
           macros of reentr.h if "d_getprotoent_r" is defined.

       "GETPWENT_R_PROTO"
           This symbol encodes the prototype of "getpwent_r".  It  is  zero  if
           "d_getpwent_r"  is  undef,  and  one  of the "REENTRANT_PROTO_T_ABC"
           macros of reentr.h if "d_getpwent_r" is defined.

       "GETPWNAM_R_PROTO"
           This symbol encodes the prototype of "getpwnam_r".  It  is  zero  if
           "d_getpwnam_r"  is  undef,  and  one  of the "REENTRANT_PROTO_T_ABC"
           macros of reentr.h if "d_getpwnam_r" is defined.

       "GETPWUID_R_PROTO"
           This symbol encodes the prototype of "getpwuid_r".  It  is  zero  if
           "d_getpwuid_r"  is  undef,  and  one  of the "REENTRANT_PROTO_T_ABC"
           macros of reentr.h if "d_getpwuid_r" is defined.

       "GETSERVBYNAME_R_PROTO"
           This symbol encodes the prototype of "getservbyname_r".  It is  zero
           if    "d_getservbyname_r"    is    undef,    and    one    of    the
           "REENTRANT_PROTO_T_ABC" macros of reentr.h if "d_getservbyname_r" is
           defined.

       "GETSERVBYPORT_R_PROTO"
           This symbol encodes the prototype of "getservbyport_r".  It is  zero
           if    "d_getservbyport_r"    is    undef,    and    one    of    the
           "REENTRANT_PROTO_T_ABC" macros of reentr.h if "d_getservbyport_r" is
           defined.

       "GETSERVENT_R_PROTO"
           This symbol encodes the prototype of "getservent_r".  It is zero  if
           "d_getservent_r"  is  undef,  and one of the "REENTRANT_PROTO_T_ABC"
           macros of reentr.h if "d_getservent_r" is defined.

       "GETSPNAM_R_PROTO"
           This symbol encodes the prototype of "getspnam_r".  It  is  zero  if
           "d_getspnam_r"  is  undef,  and  one  of the "REENTRANT_PROTO_T_ABC"
           macros of reentr.h if "d_getspnam_r" is defined.

       "HAS_DBMINIT_PROTO"
           This symbol, if  defined,  indicates  that  the  system  provides  a
           prototype  for  the  dbminit() function.  Otherwise, it is up to the
           program to supply one.  A good guess is

            extern int dbminit(char *);

       "HAS_DRAND48_PROTO"
           This symbol, if  defined,  indicates  that  the  system  provides  a
           prototype  for  the  drand48() function.  Otherwise, it is up to the
           program to supply one.  A good guess is

            extern double drand48(void);

       "HAS_FLOCK_PROTO"
           This symbol, if  defined,  indicates  that  the  system  provides  a
           prototype  for  the  flock()  function.   Otherwise, it is up to the
           program to supply one.  A good guess is

            extern int flock(int, int);

       "HAS_GETHOST_PROTOS"
           This symbol, if defined, indicates that netdb.h includes  prototypes
           for  gethostent(), gethostbyname(), and gethostbyaddr().  Otherwise,
           it is up to the program to guess them.   See  netdbtype.U  (part  of
           metaconfig) for probing for various "Netdb_xxx_t" types.

       "HAS_GETNET_PROTOS"
           This  symbol, if defined, indicates that netdb.h includes prototypes
           for getnetent(), getnetbyname(), and getnetbyaddr().  Otherwise,  it
           is  up  to  the  program  to  guess  them.  See netdbtype.U (part of
           metaconfig) for probing for various "Netdb_xxx_t" types.

       "HAS_GETPROTO_PROTOS"
           This symbol, if defined, indicates that netdb.h includes  prototypes
           for    getprotoent(),    getprotobyname(),   and   getprotobyaddr().
           Otherwise, it is up to the program to guess them.   See  netdbtype.U
           (part of metaconfig) for probing for various "Netdb_xxx_t" types.

       "HAS_GETSERV_PROTOS"
           This  symbol, if defined, indicates that netdb.h includes prototypes
           for getservent(), getservbyname(), and getservbyaddr().   Otherwise,
           it  is  up  to  the program to guess them.  See netdbtype.U (part of
           metaconfig) for probing for various "Netdb_xxx_t" types.

       "HAS_MODFL_PROTO"
           This symbol, if  defined,  indicates  that  the  system  provides  a
           prototype  for  the  modfl()  function.   Otherwise, it is up to the
           program to supply one.

       "HAS_SBRK_PROTO"
           This symbol, if  defined,  indicates  that  the  system  provides  a
           prototype  for  the  sbrk()  function.   Otherwise,  it is up to the
           program to supply one.  Good guesses are

            extern void* sbrk(int);
            extern void* sbrk(size_t);

       "HAS_SETRESGID_PROTO"
           This symbol, if  defined,  indicates  that  the  system  provides  a
           prototype  for the setresgid() function.  Otherwise, it is up to the
           program to supply one.  Good guesses are

            extern int setresgid(uid_t ruid, uid_t euid, uid_t suid);

       "HAS_SETRESUID_PROTO"
           This symbol, if  defined,  indicates  that  the  system  provides  a
           prototype  for the setresuid() function.  Otherwise, it is up to the
           program to supply one.  Good guesses are

            extern int setresuid(uid_t ruid, uid_t euid, uid_t suid);

       "HAS_SHMAT_PROTOTYPE"
           This symbol, if defined, indicates that  the  sys/shm.h  includes  a
           prototype  for shmat().  Otherwise, it is up to the program to guess
           one.  "Shmat_t" "shmat(int, Shmat_t, int)" is a good guess, but  not
           always  right  so  it  should  be  emitted  by the program only when
           "HAS_SHMAT_PROTOTYPE" is not defined to avoid conflicting defs.

       "HAS_SOCKATMARK_PROTO"
           This symbol, if  defined,  indicates  that  the  system  provides  a
           prototype for the sockatmark() function.  Otherwise, it is up to the
           program to supply one.  A good guess is

            extern int sockatmark(int);

       "HAS_SYSCALL_PROTO"
           This  symbol,  if  defined,  indicates  that  the  system provides a
           prototype for the syscall() function.  Otherwise, it is  up  to  the
           program to supply one.  Good guesses are

            extern int syscall(int,  ...);
            extern int syscall(long, ...);

       "HAS_TELLDIR_PROTO"
           This  symbol,  if  defined,  indicates  that  the  system provides a
           prototype for the telldir() function.  Otherwise, it is  up  to  the
           program to supply one.  A good guess is

            extern long telldir(DIR*);

       "NDBM_H_USES_PROTOTYPES"
           This  symbol,  if  defined, indicates that ndbm.h uses real "ANSI" C
           prototypes instead of K&R style function  declarations  without  any
           parameter  information.  While  "ANSI" C prototypes are supported in
           C++, K&R style function declarations will yield errors.

       "RANDOM_R_PROTO"
           This symbol encodes the prototype of  "random_r".   It  is  zero  if
           "d_random_r" is undef, and one of the "REENTRANT_PROTO_T_ABC" macros
           of reentr.h if "d_random_r" is defined.

       "READDIR_R_PROTO"
           This  symbol  encodes  the  prototype of "readdir_r".  It is zero if
           "d_readdir_r" is  undef,  and  one  of  the  "REENTRANT_PROTO_T_ABC"
           macros of reentr.h if "d_readdir_r" is defined.

       "SETGRENT_R_PROTO"
           This  symbol  encodes  the prototype of "setgrent_r".  It is zero if
           "d_setgrent_r" is undef,  and  one  of  the  "REENTRANT_PROTO_T_ABC"
           macros of reentr.h if "d_setgrent_r" is defined.

       "SETHOSTENT_R_PROTO"
           This  symbol encodes the prototype of "sethostent_r".  It is zero if
           "d_sethostent_r" is undef, and one  of  the  "REENTRANT_PROTO_T_ABC"
           macros of reentr.h if "d_sethostent_r" is defined.

       "SETLOCALE_R_PROTO"
           This  symbol  encodes the prototype of "setlocale_r".  It is zero if
           "d_setlocale_r" is undef, and  one  of  the  "REENTRANT_PROTO_T_ABC"
           macros of reentr.h if "d_setlocale_r" is defined.

       "SETNETENT_R_PROTO"
           This  symbol  encodes the prototype of "setnetent_r".  It is zero if
           "d_setnetent_r" is undef, and  one  of  the  "REENTRANT_PROTO_T_ABC"
           macros of reentr.h if "d_setnetent_r" is defined.

       "SETPROTOENT_R_PROTO"
           This symbol encodes the prototype of "setprotoent_r".  It is zero if
           "d_setprotoent_r"  is  undef, and one of the "REENTRANT_PROTO_T_ABC"
           macros of reentr.h if "d_setprotoent_r" is defined.

       "SETPWENT_R_PROTO"
           This symbol encodes the prototype of "setpwent_r".  It  is  zero  if
           "d_setpwent_r"  is  undef,  and  one  of the "REENTRANT_PROTO_T_ABC"
           macros of reentr.h if "d_setpwent_r" is defined.

       "SETSERVENT_R_PROTO"
           This symbol encodes the prototype of "setservent_r".  It is zero  if
           "d_setservent_r"  is  undef,  and one of the "REENTRANT_PROTO_T_ABC"
           macros of reentr.h if "d_setservent_r" is defined.

       "SRANDOM_R_PROTO"
           This symbol encodes the prototype of "srandom_r".   It  is  zero  if
           "d_srandom_r"  is  undef,  and  one  of  the "REENTRANT_PROTO_T_ABC"
           macros of reentr.h if "d_srandom_r" is defined.

       "SRAND48_R_PROTO"
           This symbol encodes the prototype of "srand48_r".   It  is  zero  if
           "d_srand48_r"  is  undef,  and  one  of  the "REENTRANT_PROTO_T_ABC"
           macros of reentr.h if "d_srand48_r" is defined.

       "STRERROR_R_PROTO"
           This symbol encodes the prototype of "strerror_r".  It  is  zero  if
           "d_strerror_r"  is  undef,  and  one  of the "REENTRANT_PROTO_T_ABC"
           macros of reentr.h if "d_strerror_r" is defined.

       "TMPNAM_R_PROTO"
           This symbol encodes the prototype of  "tmpnam_r".   It  is  zero  if
           "d_tmpnam_r" is undef, and one of the "REENTRANT_PROTO_T_ABC" macros
           of reentr.h if "d_tmpnam_r" is defined.

       "TTYNAME_R_PROTO"
           This  symbol  encodes  the  prototype of "ttyname_r".  It is zero if
           "d_ttyname_r" is  undef,  and  one  of  the  "REENTRANT_PROTO_T_ABC"
           macros of reentr.h if "d_ttyname_r" is defined.

Reference-counted stack manipulation
       Functions  for  pushing and pulling items on the stack when the stack is
       reference counted. They are intended as replacements for the old  PUSHs,
       POPi, EXTEND etc pp macros within pp functions.

       "rpp_context"
           NOTE:  "rpp_context"  is  experimental  and may change or be removed
           without notice.

           Impose void, scalar or  list  context  on  the  stack.   First,  pop
           "extra"  items  off  the  stack,  then  when  "gimme"  is: "G_LIST":
           return as-is.  "G_VOID":   pop everything back to "mark" "G_SCALAR":
           move the top stack item (or &PL_sv_undef if none)  to  "mark+1"  and
           free everything above it.

            void  rpp_context(SV **mark, U8 gimme, SSize_t extra)

       "rpp_extend"
           NOTE:  "rpp_extend"  is  experimental  and  may change or be removed
           without notice.

           Ensures that there  is  space  on  the  stack  to  push  "n"  items,
           extending it if necessary.

            void  rpp_extend(SSize_t n)

       "rpp_invoke_xs"
           NOTE:  "rpp_invoke_xs"  is experimental and may change or be removed
           without notice.

           Call the XS  function  associated  with  "cv".  Wraps  the  call  if
           necessary  to  handle XS functions which are not aware of reference-
           counted stacks.

            void  rpp_invoke_xs(CV *cv)

       "rpp_is_lone"
           NOTE: "rpp_is_lone" is experimental and may  change  or  be  removed
           without notice.

           Indicates  whether the stacked SV "sv" (assumed to be not yet popped
           off the stack) is only kept alive due to a single reference from the
           argument stack and/or and the temps stack.

           This can used for example to decide whether the  copying  of  return
           values  in rvalue context can be skipped, or whether it shouldn't be
           assigned to in lvalue context.

            bool  rpp_is_lone(SV *sv)

       "rpp_popfree_1_NN"
           NOTE: "rpp_popfree_1_NN"  is  experimental  and  may  change  or  be
           removed without notice.

           A  variant  of  rpp_popfree_1() which assumes that the pointer being
           popped off the stack is non-NULL.

            void  rpp_popfree_1_NN()

       "rpp_popfree_2_NN"
           NOTE: "rpp_popfree_2_NN"  is  experimental  and  may  change  or  be
           removed without notice.

           A  variant  of  rpp_popfree_2()  which assumes that the two pointers
           being popped off the stack are non-NULL.

            void  rpp_popfree_2_NN()

       "rpp_popfree_to"
           NOTE: "rpp_popfree_to" is experimental and may change or be  removed
           without notice.

           Pop  and free all items on the argument stack above "sp". On return,
           "PL_stack_sp" will be equal to "sp".

            void  rpp_popfree_to(SV **sp)

       "rpp_popfree_to_NN"
           NOTE: "rpp_popfree_to_NN" is  experimental  and  may  change  or  be
           removed without notice.

           A  variant  of  rpp_popfree_to() which assumes that all the pointers
           being popped off the stack are non-NULL.

            void  rpp_popfree_to_NN(SV **sp)

       "rpp_popfree_1"
           NOTE: "rpp_popfree_1" is experimental and may change or  be  removed
           without notice.

           Pop  and  free  the  top  item  on  the  argument  stack  and update
           "PL_stack_sp".

            void  rpp_popfree_1()

       "rpp_popfree_2"
           NOTE: "rpp_popfree_2" is experimental and may change or  be  removed
           without notice.

           Pop  and  free  the  top  two items on the argument stack and update
           "PL_stack_sp".

            void  rpp_popfree_2()

       "rpp_pop_1_norc"
           NOTE: "rpp_pop_1_norc" is experimental and may change or be  removed
           without notice.

           Pop  and  return  the  top  item  off  the argument stack and update
           "PL_stack_sp". It's  similar  to  rpp_popfree_1(),  except  that  it
           actually  returns  a  value,  and  it  doesn't  decrement  the  SV's
           reference  count.   On  non-"PERL_RC_STACK"   builds   it   actually
           increments the SV's reference count.

           This  is  useful  in  cases  where  the  popped value is immediately
           embedded  somewhere  e.g.  via   av_store(),   allowing   you   skip
           decrementing  and  then immediately incrementing the reference count
           again (and risk prematurely freeing the SV if it had a RC of 1).  On
           non-RC  builds,  the  reference  count  bookkeeping still works too,
           which  is  why  it   should   be   used   rather   than   a   simple
           "*PL_stack_sp--".

            SV *  rpp_pop_1_norc()

       "rpp_push_1_norc"
           NOTE: "rpp_push_1_norc" is experimental and may change or be removed
           without notice.

           Push  "sv"  onto the stack without incrementing its reference count,
           and update "PL_stack_sp".  On  non-PERL_RC_STACK  builds,  mortalise
           too.

           This  is  most  useful where an SV has just been created and already
           has a reference count of 1, but has not yet been anchored anywhere.

            void  rpp_push_1_norc(SV *sv)

       "rpp_push_1"
       "rpp_push_IMM"
       "rpp_push_2"
       "rpp_xpush_1"
       "rpp_xpush_IMM"
       "rpp_xpush_2"
           NOTE: all these forms are experimental and may change or be  removed
           without notice.

           Push  one  or  two  SVs onto the stack, incrementing their reference
           counts and updating "PL_stack_sp". With the "x" variants, it extends
           the stack first. The "IMM" variants assume that the single  argument
           is an immortal such as <&PL_sv_undef> and, for efficiency, will skip
           incrementing its reference count.

            void  rpp_push_1   (SV *sv)
            void  rpp_push_IMM (SV *sv)
            void  rpp_push_2   (SV *sv1, SV *sv2)
            void  rpp_xpush_1  (SV *sv)
            void  rpp_xpush_IMM(SV *sv)
            void  rpp_xpush_2  (SV *sv1, SV *sv2)

       "rpp_replace_at"
           NOTE:  "rpp_replace_at" is experimental and may change or be removed
           without notice.

           Replace the SV at address sp  within  the  stack  with  "sv",  while
           suitably  adjusting  reference  counts.  Equivalent  to  "*sp = sv",
           except with proper reference count handling.

            void  rpp_replace_at(SV **sp, SV *sv)

       "rpp_replace_at_NN"
           NOTE: "rpp_replace_at_NN" is  experimental  and  may  change  or  be
           removed without notice.

           A  variant  of rpp_replace_at() which assumes that the SV pointer on
           the stack is non-NULL.

            void  rpp_replace_at_NN(SV **sp, SV *sv)

       "rpp_replace_at_norc"
           NOTE: "rpp_replace_at_norc" is experimental and  may  change  or  be
           removed without notice.

           Replace  the  SV  at  address  sp  within the stack with "sv", while
           suitably adjusting the reference count of the old SV. Equivalent  to
           "*sp = sv", except with proper reference count handling.

           "sv"'s    reference    count    doesn't    get    incremented.    On
           non-"PERL_RC_STACK" builds, it gets mortalised too.

           This is most useful where an SV has just been  created  and  already
           has a reference count of 1, but has not yet been anchored anywhere.

            void  rpp_replace_at_norc(SV **sp, SV *sv)

       "rpp_replace_at_norc_NN"
           NOTE:  "rpp_replace_at_norc_NN" is experimental and may change or be
           removed without notice.

           A variant of rpp_replace_at_norc() which assumes that the SV pointer
           on the stack is non-NULL.

            void  rpp_replace_at_norc_NN(SV **sp, SV *sv)

       "rpp_replace_1_1"
       "rpp_replace_1_1_NN"
       "rpp_replace_1_IMM_NN"
           NOTE: all these forms are experimental and may change or be  removed
           without notice.

           Replace  the  current  top  stack  item  with  "sv",  while suitably
           adjusting   reference   counts.   Equivalent   to   rpp_popfree_1();
           rpp_push_1(sv), but is more efficient and handles both SVs being the
           same.

           The  "_NN"  variant  assumes that the pointer on the stack to the SV
           being freed is non-NULL.

           The "IMM_NN" variant is like the "_NN"  variant,  but  in  addition,
           assumes   that   the   single   argument  is  an  immortal  such  as
           <&PL_sv_undef> and,  for  efficiency,  will  skip  incrementing  its
           reference count.

            void  rpp_replace_1_1(SV *sv)

       "rpp_replace_2_1"
       "rpp_replace_2_1_NN"
       "rpp_replace_2_IMM_NN"
           NOTE:  all these forms are experimental and may change or be removed
           without notice.

           Replace the current top to stacks item  with  "sv",  while  suitably
           adjusting   reference   counts.   Equivalent   to   rpp_popfree_2();
           rpp_push_1(sv), but is more efficient  and  handles  SVs  being  the
           same.

           The  "_NN" variant assumes that the pointers on the stack to the SVs
           being freed are non-NULL.

           The "IMM_NN" variant is like the "_NN"  variant,  but  in  addition,
           assumes   that   the   single   argument  is  an  immortal  such  as
           <&PL_sv_undef> and,  for  efficiency,  will  skip  incrementing  its
           reference count.

            void  rpp_replace_2_1(SV *sv)

       "rpp_stack_is_rc"
           NOTE: "rpp_stack_is_rc" is experimental and may change or be removed
           without notice.

           Returns  a  boolean  value indicating whether the stack is currently
           reference-counted. Note that if the stack is split (bottom half  RC,
           top  half non-RC), this function returns false, even if the top half
           currently contains zero items.

            bool  rpp_stack_is_rc()

       "rpp_try_AMAGIC_1"
       "rpp_try_AMAGIC_2"
           NOTE: both forms are experimental  and  may  change  or  be  removed
           without notice.

           Check  whether  either of the one or two SVs at the top of the stack
           is magical or a ref, and in either case handle it specially:  invoke
           get  magic,  call  an  overload  method,  or  replace  a  ref with a
           temporary numeric value, as appropriate. If  this  function  returns
           true,  it  indicates that the correct return value is already on the
           stack. Intended to be used at the beginning of the PP  function  for
           unary or binary ops.

            bool  rpp_try_AMAGIC_1(int method, int flags)

       "XSPP_wrapped"
           NOTE:  "XSPP_wrapped"  is  experimental and may change or be removed
           without notice.

           Declare and wrap  a  non-reference-counted  PP-style  function.   On
           traditional  perl  builds  where  the stack isn't reference-counted,
           this just produces a function declaration like

             OP * xsppw_name(pTHX)

           Conversely, in ref-counted builds it creates xsppw_name() as a small
           wrapper function which calls the real function via a  wrapper  which
           processes the args and return values to ensure that reference counts
           are  properly  handled  for  code which uses old-style dSP, PUSHs(),
           POPs() etc, which don't adjust the reference  counts  of  the  items
           they manipulate.

           xsppw_nargs  indicates  how many arguments the function consumes off
           the stack. It can be a constant value or an expression, such as

               ((PL_op->op_flags & OPf_STACKED) ? 2 : 1)

           Alternatively if  xsppw_nlists  is  1,  it  indicates  that  the  PP
           function  consumes  a  list (or - rarely - if 2, consumes two lists,
           like pp_aassign()), as indicated by the top markstack position.

           This is intended as a temporary fix when converting XS code  to  run
           under  PERL_RC_STACK  builds.  In  the  longer term, the PP function
           should be rewritten to replace PUSHs() etc with rpp_push_1() etc.

              XSPP_wrapped(xsppw_name, I32 xsppw_nargs, I32 xsppw_nlists)

REGEXP Functions
       "pregcomp"
           Described in perlreguts.

            REGEXP *  pregcomp(SV * const pattern, const U32 flags)

       "pregexec"
           Described in perlreguts.

            I32  pregexec(REGEXP * const prog, char *stringarg, char *strend,
                          char *strbeg, SSize_t minend, SV *screamer,
                          U32 nosave)

       "re_compile"
           Compile  the  regular  expression  pattern  "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  ".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  ""pregcomp""  to  compile  using  the
           currently active regexp engine.

           If  "pattern"  is already a "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 perlre.

           The  possible  flags  for  "rx_flags"  are  documented in perlreapi.
           Their names all begin with "RXf_".

            REGEXP *  re_compile(SV * const pattern, U32 orig_rx_flags)

       "re_dup_guts"
           Duplicate a regexp.

           This routine is expected to clone a given regexp  structure.  It  is
           only compiled under USE_ITHREADS.

           After all of the core data stored in struct regexp is duplicated the
           "regexp_engine.dupe"  method is used to copy any private data stored
           in the *pprivate pointer.  This  allows  extensions  to  handle  any
           duplication they need to do.

            void  re_dup_guts(const REGEXP *sstr, REGEXP *dstr,
                              CLONE_PARAMS *param)

       "REGEX_LOCALE_CHARSET"
           Described in perlreapi.

       "REGEXP"
           Described in perlreapi.

       "regexp_engine"
           When  a  regexp is compiled, its "engine" field is then set to point
           at the appropriate structure, so that when it needs to be used  Perl
           can find the right routines to do so.

           In  order to install a new regexp handler, $^H{regcomp} is set to an
           integer which (when casted appropriately) resolves to one  of  these
           structures.   When compiling, the "comp" method is executed, and the
           resulting "regexp" structure's engine field  is  expected  to  point
           back at the same structure.

           The  pTHX_  symbol  in  the definition is a macro used by Perl under
           threading to provide an extra argument  to  the  routine  holding  a
           pointer  back  to  the  interpreter that is executing the regexp. So
           under threading all routines get an extra argument.

       "regexp_paren_pair"
           Described in perlreapi.

       "regmatch_info"
           Some basic information about the current match that  is  created  by
           Perl_regexec_flags  and then passed to regtry(), regmatch() etc.  It
           is allocated as a local var on  the  stack,  so  nothing  should  be
           stored  in  it that needs preserving or clearing up on croak().  For
           that,  see  the  aux_info   and   aux_info_eval   members   of   the
           regmatch_state union.

       "REXEC_COPY_SKIP_POST"
       "REXEC_COPY_SKIP_PRE"
       "REXEC_COPY_STR"
           Described in perlreapi.

       "RXapif_ALL"
       "RXapif_CLEAR"
       "RXapif_DELETE"
       "RXapif_EXISTS"
       "RXapif_FETCH"
       "RXapif_FIRSTKEY"
       "RXapif_NEXTKEY"
       "RXapif_ONE"
       "RXapif_REGNAME"
       "RXapif_REGNAMES"
       "RXapif_REGNAMES_COUNT"
       "RXapif_SCALAR"
       "RXapif_STORE"
           Described in perlreapi.

       "RX_BUFF_IDX_CARET_FULLMATCH"
       "RX_BUFF_IDX_CARET_POSTMATCH"
       "RX_BUFF_IDX_CARET_PREMATCH"
       "RX_BUFF_IDX_FULLMATCH"
       "RX_BUFF_IDX_POSTMATCH"
       "RX_BUFF_IDX_PREMATCH"
           Described in perlreapi.

       "RXf_NO_INPLACE_SUBST"
       "RXf_NULL"
       "RXf_SKIPWHITE"
       "RXf_SPLIT"
       "RXf_START_ONLY"
       "RXf_WHITE"
           Described in perlreapi.

       "RXf_PMf_EXTENDED"
       "RXf_PMf_FOLD"
       "RXf_PMf_KEEPCOPY"
       "RXf_PMf_MULTILINE"
       "RXf_PMf_SINGLELINE"
           Described in perlreapi.

       "RX_MATCH_COPIED"
           Described in perlreapi.

              RX_MATCH_COPIED(const REGEXP * rx_sv)

       "struct regexp"
           Described in perlreapi.

       "SvRX"
           Convenience   macro   to   get  the  REGEXP  from  a  SV.   This  is
           approximately equivalent to the following snippet:

               if (SvMAGICAL(sv))
                   mg_get(sv);
               if (SvROK(sv))
                   sv = MUTABLE_SV(SvRV(sv));
               if (SvTYPE(sv) == SVt_REGEXP)
                   return (REGEXP*) sv;

           "NULL" will be returned if a REGEXP* is not found.

            REGEXP *  SvRX(SV *sv)

       "SvRXOK"
           Returns  a  boolean  indicating  whether  the  SV  (or  the  one  it
           references) is a REGEXP.

           If  you want to do something with the REGEXP* later use SvRX instead
           and check for NULL.

            bool  SvRXOK(SV* sv)

       "SV_SAVED_COPY"
           Described in perlreapi.

Reports and Formats
       These are used in the simple report generation  feature  of  Perl.   See
       perlform.

       "IoBOTTOM_GV"
           Described in perlguts.

            GV *  IoBOTTOM_GV(IO *io)

       "IoBOTTOM_NAME"
           Described in perlguts.

            char *  IoBOTTOM_NAME(IO *io)

       "IoFMT_GV"
           Described in perlguts.

            GV *  IoFMT_GV(IO *io)

       "IoFMT_NAME"
           Described in perlguts.

            char *  IoFMT_NAME(IO *io)

       "IoLINES"
           Described in perlguts.

            IV  IoLINES(IO *io)

       "IoLINES_LEFT"
           Described in perlguts.

            IV  IoLINES_LEFT(IO *io)

       "IoPAGE"
           Described in perlguts.

            IV  IoPAGE(IO *io)

       "IoPAGE_LEN"
           Described in perlguts.

            IV  IoPAGE_LEN(IO *io)

       "IoTOP_GV"
           Described in perlguts.

            GV *  IoTOP_GV(IO *io)

       "IoTOP_NAME"
           Described in perlguts.

            char *  IoTOP_NAME(IO *io)

Signals
       "HAS_SIGINFO_SI_ADDR"
           This   symbol,  if  defined,  indicates  that  "siginfo_t"  has  the
           "si_addr" member

       "HAS_SIGINFO_SI_BAND"
           This  symbol,  if  defined,  indicates  that  "siginfo_t"  has   the
           "si_band" member

       "HAS_SIGINFO_SI_ERRNO"
           This   symbol,  if  defined,  indicates  that  "siginfo_t"  has  the
           "si_errno" member

       "HAS_SIGINFO_SI_PID"
           This symbol, if defined, indicates that "siginfo_t" has the "si_pid"
           member

       "HAS_SIGINFO_SI_STATUS"
           This  symbol,  if  defined,  indicates  that  "siginfo_t"  has   the
           "si_status" member

       "HAS_SIGINFO_SI_UID"
           This symbol, if defined, indicates that "siginfo_t" has the "si_uid"
           member

       "HAS_SIGINFO_SI_VALUE"
           This   symbol,  if  defined,  indicates  that  "siginfo_t"  has  the
           "si_value" member

       "PERL_SIGNALS_UNSAFE_FLAG"
           If this bit in "PL_signals" is set, the system is uing the  pre-Perl
           5.8  unsafe  signals.   See  "PERL_SIGNALS" in perlrun and "Deferred
           Signals (Safe Signals)" in perlipc.

            U32  PERL_SIGNALS_UNSAFE_FLAG

       "rsignal"
           A wrapper for the C library  functions  sigaction(2)  or  signal(2).
           Use  this instead of those libc functions, as the Perl version gives
           the safest available implementation, and knows things that  interact
           with the rest of the perl interpreter.

            Sighandler_t  rsignal(int i, Sighandler_t t)

       "rsignal_state"
           Returns  a  the  current  signal  handler  for  signal "signo".  See
           ""rsignal"".

            Sighandler_t  rsignal_state(int i)

       "Sigjmp_buf"
           This is the buffer type to be used with Sigsetjmp and Siglongjmp.

       "Siglongjmp"
           This macro is used in the same way as siglongjmp(), but will  invoke
           traditional   longjmp()   if   siglongjmp   isn't   available.   See
           "HAS_SIGSETJMP".

            void  Siglongjmp(jmp_buf env, int val)

       "SIG_NAME"
           This symbol contains a list of  signal  names  in  order  of  signal
           number.   This   is   intended   to   be  used  as  a  static  array
           initialization, like this:

            char *sig_name[] = { SIG_NAME };

           The signals in the list are separated with commas, and  each  signal
           is  surrounded  by  double  quotes. There is no leading "SIG" in the
           signal name, i.e. "SIGQUIT" is  known  as  ""QUIT"".   Gaps  in  the
           signal  numbers  (up  to  "NSIG")  are filled in with "NUMnn", etc.,
           where nn is the actual signal number  (e.g.  "NUM37").   The  signal
           number  for  "sig_name[i]"  is  stored  in  "sig_num[i]".   The last
           element is 0 to terminate the list with a "NULL".  This  corresponds
           to  the  0  at  the end of the "sig_name_init" list.  Note that this
           variable  is  initialized  from  the   "sig_name_init",   not   from
           "sig_name" (which is unused).

       "SIG_NUM"
           This  symbol contains a list of signal numbers, in the same order as
           the "SIG_NAME" list. It is suitable for static array initialization,
           as in:

            int sig_num[] = { SIG_NUM };

           The signals in the list are separated with commas, and  the  indices
           within  that  list  and  the  "SIG_NAME" list match, so it's easy to
           compute the signal name from a number or vice versa at the price  of
           a  small  dynamic  linear  lookup.   Duplicates are allowed, but are
           moved to the end of the list.  The signal  number  corresponding  to
           "sig_name[i]"   is   "sig_number[i]".    if   (i   <   "NSIG")  then
           "sig_number[i]" == i.  The last element is 0, corresponding to the 0
           at the end of the "sig_name_init" list.  Note that this variable  is
           initialized  from  the  "sig_num_init", not from "sig_num" (which is
           unused).

       "Sigsetjmp"
           This macro is used in the same way as sigsetjmp(), but  will  invoke
           traditional    setjmp()   if   sigsetjmp   isn't   available.    See
           "HAS_SIGSETJMP".

            int  Sigsetjmp(jmp_buf env, int savesigs)

       "SIG_SIZE"
           This variable contains the number of elements of the "SIG_NAME"  and
           "SIG_NUM" arrays, excluding the final "NULL" entry.

       "whichsig"
       "whichsig_pv"
       "whichsig_pvn"
       "whichsig_sv"
           These  all  convert  a  signal  name  into  its corresponding signal
           number; returning -1 if no corresponding number was found.

           They differ only in the source of the signal name:

           "whichsig_pv"  takes  the  name  from  the  "NUL"-terminated  string
           starting at "sig".

           "whichsig"   is   merely   a   different  spelling,  a  synonym,  of
           "whichsig_pv".

           "whichsig_pvn" takes the name from the  string  starting  at  "sig",
           with length "len" bytes.

           "whichsig_sv" takes the name from the PV stored in the SV "sigsv".

            I32  whichsig    (const char *sig)
            I32  whichsig_pv (const char *sig)
            I32  whichsig_pvn(const char *sig, STRLEN len)
            I32  whichsig_sv (SV *sigsv)

Site configuration
       These variables give details as to where various libraries, installation
       destinations,  etc.,  go,  as  well as what various installation options
       were selected

       "ARCHLIB"
           This variable, if defined, holds the name of the directory in  which
           the  user  wants  to put architecture-dependent public library files
           for  perl5.   It  is  most  often  a   local   directory   such   as
           /usr/local/lib.   Programs  using  this variable must be prepared to
           deal  with  filename  expansion.   If  "ARCHLIB"  is  the  same   as
           "PRIVLIB",  it  is not defined, since presumably the program already
           searches "PRIVLIB".

       "ARCHLIB_EXP"
           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.

       "ARCHNAME"
           This symbol holds a string representing the architecture  name.   It
           may  be  used  to construct an architecture-dependant pathname where
           library files may be held under a private library, for instance.

       "BIN"
           This symbol holds the path of the bin directory  where  the  package
           will  be  installed.  Program  must  be  prepared to deal with ~name
           substitution.

       "BIN_EXP"
           This symbol is the filename expanded version of  the  "BIN"  symbol,
           for programs that do not want to deal with that at run-time.

       "INSTALL_USR_BIN_PERL"
           This symbol, if defined, indicates that Perl is to be installed also
           as /usr/bin/perl.

       "MULTIARCH"
           This  symbol,  if  defined,  signifies  that  the build process will
           produce some binary files that are going to  be  used  in  a  cross-
           platform  environment.   This  is the case for example with the NeXT
           "fat" binaries that contain executables for several "CPUs".

       "PERL_INC_VERSION_LIST"
           This variable specifies the list of  subdirectories  in  over  which
           perl.c:incpush()  and  lib/lib.pm  will  automatically  search  when
           adding  directories  to  @"INC",  in  a  format  suitable  for  a  C
           initialization   string.    See   the  "inc_version_list"  entry  in
           Porting/Glossary for more details.

       "PERL_OTHERLIBDIRS"
           This variable contains a colon-separated set of paths for  the  perl
           binary  to  search  for  additional library files or modules.  These
           directories will  be  tacked  to  the  end  of  @"INC".   Perl  will
           automatically  search below each path for version- and architecture-
           specific directories.  See "PERL_INC_VERSION_LIST" for more details.

       "PERL_RELOCATABLE_INC"
           This symbol, if  defined,  indicates  that  we'd  like  to  relocate
           entries  in  @"INC"  at  run  time based on the location of the perl
           binary.

       "PERL_TARGETARCH"
           This symbol, if defined, indicates the target architecture Perl  has
           been cross-compiled to.  Undefined if not a cross-compile.

       "PERL_USE_DEVEL"
           This  symbol,  if  defined,  indicates that Perl was configured with
           "-Dusedevel", to enable development features.  This  should  not  be
           done for production builds.

       "PERL_VENDORARCH"
           If defined, this symbol contains the name of a private library.  The
           library  is  private  in  the  sense  that it needn't be in anyone's
           execution path, but it should be accessible by the  world.   It  may
           have  a  ~ on the front.  The standard distribution will put nothing
           in this directory.  Vendors who distribute perl may  wish  to  place
           their  own  architecture-dependent  modules  and  extensions in this
           directory with

            MakeMaker Makefile.PL INSTALLDIRS=vendor

           or equivalent.  See "INSTALL" for details.

       "PERL_VENDORARCH_EXP"
           This   symbol   contains   the    ~name    expanded    version    of
           "PERL_VENDORARCH",  to  be used in programs that are not prepared to
           deal with ~ expansion at run-time.

       "PERL_VENDORLIB_EXP"
           This symbol contains the ~name expanded version of  "VENDORLIB",  to
           be  used  in programs that are not prepared to deal with ~ expansion
           at run-time.

       "PERL_VENDORLIB_STEM"
           This define  is  "PERL_VENDORLIB_EXP"  with  any  trailing  version-
           specific  component  removed.   The  elements  in "inc_version_list"
           ("inc_version_list".U (part of metaconfig)) can be tacked onto  this
           variable to generate a list of directories to search.

       "PRIVLIB"
           This  symbol  contains  the  name  of  the  private library for this
           package.  The library is private in the sense that it needn't be  in
           anyone's  execution  path, but it should be accessible by the world.
           The program should be prepared to do ~ expansion.

       "PRIVLIB_EXP"
           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.

       "SITEARCH"
           This symbol contains the  name  of  the  private  library  for  this
           package.   The library is private in the sense that it needn't be in
           anyone's execution path, but it should be accessible by  the  world.
           The  program  should  be  prepared  to do ~ expansion.  The standard
           distribution will put nothing in this  directory.   After  perl  has
           been  installed,  users  may  install  their own local architecture-
           dependent modules in this directory with

            MakeMaker Makefile.PL

           or equivalent.  See "INSTALL" for details.

       "SITEARCH_EXP"
           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.

       "SITELIB"
           This  symbol  contains  the  name  of  the  private library for this
           package.  The library is private in the sense that it needn't be  in
           anyone's  execution  path, but it should be accessible by the world.
           The program should be prepared to  do  ~  expansion.   The  standard
           distribution  will  put  nothing  in this directory.  After perl has
           been installed, users may  install  their  own  local  architecture-
           independent modules in this directory with

            MakeMaker Makefile.PL

           or equivalent.  See "INSTALL" for details.

       "SITELIB_EXP"
           This  symbol contains the ~name expanded version of "SITELIB", to be
           used in programs that are not prepared to deal with ~  expansion  at
           run-time.

       "SITELIB_STEM"
           This  define  is  "SITELIB_EXP"  with  any trailing version-specific
           component   removed.     The    elements    in    "inc_version_list"
           ("inc_version_list".U  (part of metaconfig)) can be tacked onto this
           variable to generate a list of directories to search.

       "STARTPERL"
           This variable contains the string to put in front of a  perl  script
           to make sure (one hopes) that it runs with perl and not some shell.

       "USE_64_BIT_ALL"
           This  symbol,  if  defined, indicates that 64-bit integers should be
           used when available.  If not defined, the native  integers  will  be
           used  (be  they  32 or 64 bits).  The maximal possible 64-bitness is
           employed: LP64 or "ILP64", meaning that you will be able to use more
           than  2  gigabytes  of  memory.   This  mode  is  even  more  binary
           incompatible  than  "USE_64_BIT_INT". You may not be able to run the
           resulting executable in a 32-bit "CPU" at all or  you  may  need  at
           least to reboot your OS to 64-bit mode.

       "USE_64_BIT_INT"
           This  symbol,  if  defined, indicates that 64-bit integers should be
           used when available.  If not defined, the native  integers  will  be
           employed  (be  they 32 or 64 bits).  The minimal possible 64-bitness
           is used, just enough to get 64-bit integers  into  Perl.   This  may
           mean  using for example "long longs", while your memory may still be
           limited to 2 gigabytes.

       "USE_BSD_GETPGRP"
           This symbol, if defined, indicates that getpgrp needs one  arguments
           whereas "USG" one needs none.

       "USE_BSD_SETPGRP"
           This  symbol, if defined, indicates that setpgrp needs two arguments
           whereas "USG" one needs none.  See also "HAS_SETPGID" for a  "POSIX"
           interface.

       "USE_C_BACKTRACE"
           This  symbol,  if  defined, indicates that Perl should be built with
           support for backtrace.

       "USE_CPLUSPLUS"
           This symbol, if defined, indicates that a C++ compiler was  used  to
           compiled Perl and will be used to compile extensions.

       "USE_CROSS_COMPILE"
           This  symbol,  if  defined,  indicates  that  Perl  is  being cross-
           compiled.

       "USE_DTRACE"
           This symbol, if defined, indicates that Perl should  be  built  with
           support for DTrace.

       "USE_DYNAMIC_LOADING"
           This symbol, if defined, indicates that dynamic loading of some sort
           is available.

       "USE_FAST_STDIO"
           This  symbol, if defined, indicates that Perl should be built to use
           'fast stdio'.  Defaults to define in Perls 5.8 and earlier, to undef
           later.

       "USE_ITHREADS"
           This symbol, if defined, indicates that Perl should be built to  use
           the interpreter-based threading implementation.

       "USE_KERN_PROC_PATHNAME"
           This  symbol,  if  defined,  indicates  that  we can use sysctl with
           "KERN_PROC_PATHNAME" to get a full  path  for  the  executable,  and
           hence convert $^X to an absolute path.

       "USE_LARGE_FILES"
           This symbol, if defined, indicates that large file support should be
           used when available.

       "USE_LONG_DOUBLE"
           This  symbol, if defined, indicates that long doubles should be used
           when available.

       "USE_MORE_BITS"
           This symbol, if defined, indicates that 64-bit interfaces  and  long
           doubles should be used when available.

       "USE_NSGETEXECUTABLEPATH"
           This    symbol,    if   defined,   indicates   that   we   can   use
           "_NSGetExecutablePath" and realpath to  get  a  full  path  for  the
           executable, and hence convert $^X to an absolute path.

       "USE_PERLIO"
           This  symbol,  if  defined,  indicates  that  the PerlIO abstraction
           should be used throughout.  If not defined, stdio should be used  in
           a fully backward compatible manner.

       "USE_QUADMATH"
           This  symbol, if defined, indicates that the quadmath library should
           be used when available.

       "USE_REENTRANT_API"
           This symbol, if defined, indicates that Perl should try to  use  the
           various  "_r"  versions  of  library  functions.   This is extremely
           experimental.

       "USE_SEMCTL_SEMID_DS"
           This symbol, if defined, indicates that "struct semid_ds" * is  used
           for semctl "IPC_STAT".

       "USE_SEMCTL_SEMUN"
           This  symbol,  if  defined, indicates that "union semun" is used for
           semctl "IPC_STAT".

       "USE_SITECUSTOMIZE"
           This symbol, if defined,  indicates  that  sitecustomize  should  be
           used.

       "USE_SOCKS"
           This  symbol, if defined, indicates that Perl should be built to use
           socks.

       "USE_STAT_BLOCKS"
           This symbol is defined if this system has a stat structure declaring
           "st_blksize" and "st_blocks".

       "USE_STDIO_BASE"
           This symbol is defined if the "_base"  field  (or  similar)  of  the
           stdio  "FILE" structure can be used to access the stdio buffer for a
           file handle.  If this is defined, then the FILE_base(fp) macro  will
           also  be defined and should be used to access this field.  Also, the
           FILE_bufsiz(fp)  macro  will  be  defined  and  should  be  used  to
           determine  the number of bytes in the buffer.  "USE_STDIO_BASE" will
           never be defined unless "USE_STDIO_PTR" is.

       "USE_STDIO_PTR"
           This symbol is defined if the "_ptr" and "_cnt" fields (or  similar)
           of the stdio "FILE" structure can be used to access the stdio buffer
           for  a  file  handle.  If this is defined, then the FILE_ptr(fp) and
           FILE_cnt(fp) macros will also be  defined  and  should  be  used  to
           access these fields.

       "USE_STRICT_BY_DEFAULT"
           This  symbol, if defined, enables additional defaults.  At this time
           it only enables implicit strict by default.

       "USE_THREADS"
           This symbol, if defined, indicates that Perl should be built to  use
           threads.   At  present,  it is a synonym for and "USE_ITHREADS", but
           eventually the source ought to  be  changed  to  use  this  to  mean
           "_any_" threading implementation.

Sockets configuration values
       "HAS_SOCKADDR_IN6"
           This  symbol,  if  defined,  indicates  the  availability of "struct
           sockaddr_in6";

       "HAS_SOCKADDR_SA_LEN"
           This symbol,  if  defined,  indicates  that  the  "struct  sockaddr"
           structure has a member called "sa_len", indicating the length of the
           structure.

       "HAS_SOCKADDR_STORAGE"
           This  symbol,  if  defined,  indicates  the  availability of "struct
           sockaddr_storage";

       "HAS_SOCKATMARK"
           This symbol, if defined, indicates that the "sockatmark" routine  is
           available to test whether a socket is at the out-of-band mark.

       "HAS_SOCKET"
           This symbol, if defined, indicates that the "BSD" "socket" interface
           is supported.

       "HAS_SOCKETPAIR"
           This  symbol, if defined, indicates that the "BSD" socketpair() call
           is supported.

       "HAS_SOCKS5_INIT"
           This symbol, if defined, indicates that the "socks5_init" routine is
           available to initialize "SOCKS" 5.

       "I_SOCKS"
           This symbol, if defined, indicates that socks.h exists and should be
           included.

            #ifdef I_SOCKS
                #include <socks.h>
            #endif

       "I_SYS_SOCKIO"
           This symbol,  if  defined,  indicates  the  sys/sockio.h  should  be
           included to get socket ioctl options, like "SIOCATMARK".

            #ifdef I_SYS_SOCKIO
                #include <sys_sockio.h>
            #endif

Source Filters
       "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.

            OP *  apply_builtin_cv_attributes(CV *cv, OP *attrlist)

       "filter_add"
           Described in perlfilter.

            SV *  filter_add(filter_t funcp, SV *datasv)

       "filter_del"
           Delete most recently added instance of the filter function argument

            void  filter_del(filter_t funcp)

       "filter_read"
           Described in perlfilter.

            I32  filter_read(int idx, SV *buf_sv, int maxlen)

       "scan_vstring"
           Returns a pointer to the next character after the parsed vstring, as
           well as updating the passed in sv.

           Function must be called like

                   sv = sv_2mortal(newSV(5));
                   s = scan_vstring(s,e,sv);

           where  s  and  e are the start and end of the string.  The sv should
           already be  large  enough  to  store  the  vstring  passed  in,  for
           performance reasons.

           This function may croak if fatal warnings are enabled in the calling
           scope,  hence  the  sv_2mortal  in  the example (to prevent a leak).
           Make sure to do SvREFCNT_inc afterwards if you use sv_2mortal.

            char *  scan_vstring(const char *s, const char * const e, SV *sv)

       "start_subparse"
           Set things up for parsing a subroutine.

           If "is_format" is non-zero, the input is to be considered  a  format
           sub  (a  specialised sub used to implement perl's "format" feature);
           else a normal "sub".

           "flags" are added to the flags for "PL_compcv".  "flags" may include
           the "CVf_IsMETHOD" bit, which causes the  new  subroutine  to  be  a
           method.

           This  returns the value of "PL_savestack_ix" that was in effect upon
           entry to the function;

            I32  start_subparse(I32 is_format, U32 flags)

Stack Manipulation Macros
       "dMARK"
           Declare a stack marker variable, "mark", for the XSUB.   See  "MARK"
           and "dORIGMARK".

              dMARK;

       "dORIGMARK"
           Saves the original stack mark for the XSUB.  See "ORIGMARK".

              dORIGMARK;

       "dSP"
           Declares  a  local  copy  of  perl's  stack  pointer  for  the XSUB,
           available via the "SP" macro.  See "SP".

              dSP;

       "dTARGET"
           Declare that this function uses "TARG", and initializes it

              dTARGET;

       "EXTEND"
           Used to extend the argument stack for an XSUB's return values.  Once
           used, guarantees that there is room for  at  least  "nitems"  to  be
           pushed onto the stack.

            void  EXTEND(SP, SSize_t nitems)

       "MARK"
           Stack marker variable for the XSUB.  See "dMARK".

       "mPUSHi"
           Push  an  integer onto the stack.  The stack must have room for this
           element.  Does not use "TARG".   See  also  "PUSHi",  "mXPUSHi"  and
           "XPUSHi".

            void  mPUSHi(IV iv)

       "mPUSHn"
           Push  a  double  onto  the stack.  The stack must have room for this
           element.  Does not use "TARG".   See  also  "PUSHn",  "mXPUSHn"  and
           "XPUSHn".

            void  mPUSHn(NV nv)

       "mPUSHp"
           Push  a  string  onto  the stack.  The stack must have room for this
           element.  The "len" indicates the length of the  string.   Does  not
           use "TARG".  See also "PUSHp", "mXPUSHp" and "XPUSHp".

            void  mPUSHp(char* str, STRLEN len)

       "mPUSHpvs"
           A  variation  on "mPUSHp" that takes a literal string and calculates
           its size directly.

            void  mPUSHpvs("literal string")

       "mPUSHs"
           Push an SV onto the stack and mortalizes the  SV.   The  stack  must
           have  room for this element.  Does not use "TARG".  See also "PUSHs"
           and "mXPUSHs".

            void  mPUSHs(SV* sv)

       "mPUSHu"
           Push an unsigned integer onto the stack.  The stack must  have  room
           for this element.  Does not use "TARG".  See also "PUSHu", "mXPUSHu"
           and "XPUSHu".

            void  mPUSHu(UV uv)

       "mXPUSHi"
           Push  an  integer  onto the stack, extending the stack if necessary.
           Does not use "TARG".  See also "XPUSHi", "mPUSHi" and "PUSHi".

            void  mXPUSHi(IV iv)

       "mXPUSHn"
           Push a double onto the stack,  extending  the  stack  if  necessary.
           Does not use "TARG".  See also "XPUSHn", "mPUSHn" and "PUSHn".

            void  mXPUSHn(NV nv)

       "mXPUSHp"
           Push a string onto the stack, extending the stack if necessary.  The
           "len" indicates the length of the string.  Does not use "TARG".  See
           also "XPUSHp", "mPUSHp" and "PUSHp".

            void  mXPUSHp(char* str, STRLEN len)

       "mXPUSHpvs"
           A  variation on "mXPUSHp" that takes a literal string and calculates
           its size directly.

            void  mXPUSHpvs("literal string")

       "mXPUSHs"
           Push an SV onto the stack, extending  the  stack  if  necessary  and
           mortalizes  the  SV.   Does  not  use "TARG".  See also "XPUSHs" and
           "mPUSHs".

            void  mXPUSHs(SV* sv)

       "mXPUSHu"
           Push an unsigned integer onto the  stack,  extending  the  stack  if
           necessary.   Does  not  use "TARG".  See also "XPUSHu", "mPUSHu" and
           "PUSHu".

            void  mXPUSHu(UV uv)

       "newXSproto"
           Used by  "xsubpp"  to  hook  up  XSUBs  as  Perl  subs.   Adds  Perl
           prototypes to the subs.

       "ORIGMARK"
           The original stack mark for the XSUB.  See "dORIGMARK".

       "PL_markstack"
           Described in perlguts.

       "PL_markstack_ptr"
           Described in perlguts.

       "PL_savestack"
           Described in perlguts.

       "PL_savestack_ix"
           Described in perlguts.

       "PL_scopestack"
           Described in perlguts.

       "PL_scopestack_ix"
           Described in perlguts.

       "PL_scopestack_name"
           Described in perlguts.

       "PL_stack_base"
           Described in perlguts.

       "PL_stack_sp"
           Described in perlguts.

       "PL_tmps_floor"
           Described in perlguts.

       "PL_tmps_ix"
           Described in perlguts.

       "PL_tmps_stack"
           Described in perlguts.

       "POPi"
           Pops an integer off the stack.

            IV  POPi

       "POPl"
           Pops a long off the stack.

            long  POPl

       "POPn"
           Pops a double off the stack.

            NV  POPn

       "POPp"
           Pops a string off the stack.

            char*  POPp

       "POPpbytex"
           Pops  a  string  off  the  stack  which  must  consist of bytes i.e.
           characters < 256.

            char*  POPpbytex

       "POPpx"
           Pops a string off the stack.  Identical  to  POPp.   There  are  two
           names for historical reasons.

            char*  POPpx

       "POPs"
           Pops an SV off the stack.

            SV*  POPs

       "POPu"
           Pops an unsigned integer off the stack.

            UV  POPu

       "POPul"
           Pops an unsigned long off the stack.

            long  POPul

       "PUSHi"
           Push  an  integer onto the stack.  The stack must have room for this
           element.   Handles  'set'  magic.   Uses  "TARG",  so  "dTARGET"  or
           "dXSTARG"  should  be  called  to  declare it.  Do not call multiple
           "TARG"-oriented macros to return lists from XSUB's  -  see  "mPUSHi"
           instead.  See also "XPUSHi" and "mXPUSHi".

            void  PUSHi(IV iv)

       "PUSHMARK"
           Opening  bracket  for  arguments  on  a callback.  See "PUTBACK" and
           perlcall.

            void  PUSHMARK(SP)

       "PUSHmortal"
           Push a new mortal SV onto the stack.  The stack must have  room  for
           this element.  Does not use "TARG".  See also "PUSHs", "XPUSHmortal"
           and "XPUSHs".

            void  PUSHmortal

       "PUSHn"
           Push  a  double  onto  the stack.  The stack must have room for this
           element.   Handles  'set'  magic.   Uses  "TARG",  so  "dTARGET"  or
           "dXSTARG"  should  be  called  to  declare it.  Do not call multiple
           "TARG"-oriented macros to return lists from XSUB's  -  see  "mPUSHn"
           instead.  See also "XPUSHn" and "mXPUSHn".

            void  PUSHn(NV nv)

       "PUSHp"
           Push  a  string  onto  the stack.  The stack must have room for this
           element.  The "len" indicates the length  of  the  string.   Handles
           'set'  magic.   Uses  "TARG",  so  "dTARGET"  or "dXSTARG" should be
           called to declare it.  Do not call multiple  "TARG"-oriented  macros
           to  return  lists  from  XSUB's  -  see  "mPUSHp" instead.  See also
           "XPUSHp" and "mXPUSHp".

            void  PUSHp(char* str, STRLEN len)

       "PUSHpvs"
           A variation on "PUSHp" that takes a literal  string  and  calculates
           its size directly.

            void  PUSHpvs("literal string")

       "PUSHs"
           Push  an  SV  onto  the  stack.   The  stack must have room for this
           element.  Does not handle 'set' magic.  Does not  use  "TARG".   See
           also "PUSHmortal", "XPUSHs", and "XPUSHmortal".

            void  PUSHs(SV* sv)

       "PUSHu"
           Push  an  unsigned integer onto the stack.  The stack must have room
           for this element.  Handles 'set' magic.  Uses "TARG",  so  "dTARGET"
           or  "dXSTARG"  should be called to declare it.  Do not call multiple
           "TARG"-oriented macros to return lists from XSUB's  -  see  "mPUSHu"
           instead.  See also "XPUSHu" and "mXPUSHu".

            void  PUSHu(UV uv)

       "PUTBACK"
           Closing  bracket  for  XSUB  arguments.   This is usually handled by
           "xsubpp".  See "PUSHMARK" and perlcall for other uses.

              PUTBACK;

       "SAVEt_INT"
           Described in perlguts.

       "SP"
           Stack pointer.  This is usually handled by "xsubpp".  See "dSP"  and
           "SPAGAIN".

       "SPAGAIN"
           Refetch the stack pointer.  Used after a callback.  See perlcall.

              SPAGAIN;

       "SSNEW"
       "SSNEWa"
       "SSNEWat"
       "SSNEWt"
           These  each temporarily allocate 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 ""SSPTR"" to convert
           the returned index into a pointer.

           The forms differ in  that  plain  "SSNEW"  allocates  "size"  bytes;
           "SSNEWt"  and  "SSNEWat"  allocate  "size" objects, each of which is
           type "type"; and <SSNEWa> and "SSNEWat" make sure to align  the  new
           data  to  an  "align"  boundary.   The  most  useful  value  for the
           alignment is likely to be ""MEM_ALIGNBYTES"".  The alignment will be
           preserved through savestack reallocation  only  if  realloc  returns
           data aligned to a size divisible by "align"!

            SSize_t  SSNEW  (Size_t size)
            SSize_t  SSNEWa (Size_t size, Size_t align)
            SSize_t  SSNEWat(Size_t size, type, Size_t align)
            SSize_t  SSNEWt (Size_t size, type)

       "SSPTR"
       "SSPTRt"
           These  convert  the  "index"  returned  by  L/<"SSNEW"> and kin into
           actual pointers.

           The difference is that "SSPTR"  casts  the  result  to  "type",  and
           "SSPTRt" casts it to a pointer of that "type".

            type    SSPTR (SSize_t index, type)
            type *  SSPTRt(SSize_t index, type)

       "TARG"
           "TARG" is short for "target".  It is an entry in the pad that an OPs
           "op_targ" refers to.  It is scratchpad space, often used as a return
           value for the OP, but some use it for other purposes.

              TARG;

       "TOPs"
           Described in perlguts.

       "XPUSHi"
           Push  an  integer  onto the stack, extending the stack if necessary.
           Handles 'set' magic.  Uses "TARG", so "dTARGET" or "dXSTARG"  should
           be  called  to  declare  it.   Do  not call multiple "TARG"-oriented
           macros to return lists from XSUB's -  see  "mXPUSHi"  instead.   See
           also "PUSHi" and "mPUSHi".

            void  XPUSHi(IV iv)

       "XPUSHmortal"
           Push  a  new  mortal  SV  onto  the  stack,  extending  the stack if
           necessary.  Does not use "TARG".  See  also  "XPUSHs",  "PUSHmortal"
           and "PUSHs".

            void  XPUSHmortal

       "XPUSHn"
           Push  a  double  onto  the  stack, extending the stack if necessary.
           Handles 'set' magic.  Uses "TARG", so "dTARGET" or "dXSTARG"  should
           be  called  to  declare  it.   Do  not call multiple "TARG"-oriented
           macros to return lists from XSUB's -  see  "mXPUSHn"  instead.   See
           also "PUSHn" and "mPUSHn".

            void  XPUSHn(NV nv)

       "XPUSHp"
           Push a string onto the stack, extending the stack if necessary.  The
           "len"  indicates  the  length  of  the string.  Handles 'set' magic.
           Uses "TARG", so "dTARGET" or "dXSTARG" should be called  to  declare
           it.   Do  not  call  multiple "TARG"-oriented macros to return lists
           from XSUB's - see "mXPUSHp" instead.  See also "PUSHp" and "mPUSHp".

            void  XPUSHp(char* str, STRLEN len)

       "XPUSHpvs"
           A variation on "XPUSHp" that takes a literal string  and  calculates
           its size directly.

            void  XPUSHpvs("literal string")

       "XPUSHs"
           Push  an  SV onto the stack, extending the stack if necessary.  Does
           not  handle  'set'  magic.   Does  not   use   "TARG".    See   also
           "XPUSHmortal", "PUSHs" and "PUSHmortal".

            void  XPUSHs(SV* sv)

       "XPUSHu"
           Push  an  unsigned  integer  onto  the stack, extending the stack if
           necessary.  Handles 'set'  magic.   Uses  "TARG",  so  "dTARGET"  or
           "dXSTARG"  should  be  called  to  declare it.  Do not call multiple
           "TARG"-oriented macros to return lists from XSUB's -  see  "mXPUSHu"
           instead.  See also "PUSHu" and "mPUSHu".

            void  XPUSHu(UV uv)

       "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.

              XS_APIVERSION_BOOTCHECK;

       "XSRETURN"
           Return  from XSUB, indicating number of items on the stack.  This is
           usually handled by "xsubpp".

            void  XSRETURN(int nitems)

       "XSRETURN_EMPTY"
           Return an empty list from an XSUB immediately.

              XSRETURN_EMPTY;

       "XSRETURN_IV"
           Return an integer from an XSUB immediately.  Uses "XST_mIV".

            void  XSRETURN_IV(IV iv)

       "XSRETURN_NO"
           Return &PL_sv_no from an XSUB immediately.  Uses "XST_mNO".

              XSRETURN_NO;

       "XSRETURN_NV"
           Return a double from an XSUB immediately.  Uses "XST_mNV".

            void  XSRETURN_NV(NV nv)

       "XSRETURN_PV"
           Return a copy of a string from an XSUB immediately.  Uses "XST_mPV".

            void  XSRETURN_PV(char* str)

       "XSRETURN_UNDEF"
           Return &PL_sv_undef from an XSUB immediately.  Uses "XST_mUNDEF".

              XSRETURN_UNDEF;

       "XSRETURN_UV"
           Return an integer from an XSUB immediately.  Uses "XST_mUV".

            void  XSRETURN_UV(IV uv)

       "XSRETURN_YES"
           Return &PL_sv_yes from an XSUB immediately.  Uses "XST_mYES".

              XSRETURN_YES;

       "XST_mIV"
           Place an integer into the specified position  "pos"  on  the  stack.
           The value is stored in a new mortal SV.

            void  XST_mIV(int pos, IV iv)

       "XST_mNO"
           Place &PL_sv_no into the specified position "pos" on the stack.

            void  XST_mNO(int pos)

       "XST_mNV"
           Place  a double into the specified position "pos" on the stack.  The
           value is stored in a new mortal SV.

            void  XST_mNV(int pos, NV nv)

       "XST_mPV"
           Place a copy of a string into the specified position  "pos"  on  the
           stack.  The value is stored in a new mortal SV.

            void  XST_mPV(int pos, char* str)

       "XST_mUNDEF"
           Place &PL_sv_undef into the specified position "pos" on the stack.

            void  XST_mUNDEF(int pos)

       "XST_mUV"
           Place  an  unsigned integer into the specified position "pos" on the
           stack.  The value is stored in a new mortal SV.

            void  XST_mUV(int pos, UV uv)

       "XST_mYES"
           Place &PL_sv_yes into the specified position "pos" on the stack.

            void  XST_mYES(int pos)

       "XS_VERSION"
           The version identifier for an XS module.  This  is  usually  handled
           automatically by "ExtUtils::MakeMaker".  See "XS_VERSION_BOOTCHECK".

       "XS_VERSION_BOOTCHECK"
           Macro  to verify that a PM module's $VERSION variable matches the XS
           module's   "XS_VERSION"   variable.    This   is   usually   handled
           automatically  by  "xsubpp".   See  "The  VERSIONCHECK:  Keyword" in
           perlxs.

              XS_VERSION_BOOTCHECK;

String Handling
       See also "Unicode Support".

       "CAT2"
           This macro concatenates 2 tokens together.

            token  CAT2(token x, token y)

       "Copy"
       "CopyD"
           The XSUB-writer's interface to the C "memcpy" function.   The  "src"
           is  the source, "dest" is the destination, "nitems" is the number of
           items, and "type" is the type.  May fail on overlapping copies.  See
           also "Move".

           "CopyD" is like "Copy" but returns "dest".  Useful  for  encouraging
           compilers to tail-call optimise.

            void    Copy (void* src, void* dest, int nitems, type)
            void *  CopyD(void* src, void* dest, int nitems, type)

       "delimcpy"
           Copy  a  source buffer to a destination buffer, stopping at (but not
           including) the first  occurrence  in  the  source  of  an  unescaped
           (defined  below)  delimiter  byte, "delim".  The source is the bytes
           between "from" and "from_end" - 1.  Similarly, the dest is  "to"  up
           to "to_end".

           The number of bytes copied is written to *retlen.

           Returns  the  position  of  the first uncopied "delim" in the "from"
           buffer, but if there is no such occurrence before  "from_end",  then
           "from_end"     is     returned,     and     the     entire    buffer
           "from" .. "from_end" - 1 is copied.

           If there is room in the destination available  after  the  copy,  an
           extra terminating safety "NUL" byte is appended (not included in the
           returned length).

           The  error  case is if the destination buffer is not large enough to
           accommodate everything that should be copied.  In this situation,  a
           value larger than "to_end" - "to" is written to *retlen, and as much
           of  the  source  as  fits  will  be written to the destination.  Not
           having room for the safety "NUL" is not considered an error.

           In the following examples, let "x" be the delimiter, and 0 represent
           a "NUL" byte (NOT the digit 0).  Then we would have

             Source     Destination
            abcxdef        abc0

           provided the destination buffer is at least 4 bytes long.

           An escaped delimiter is one  which  is  immediately  preceded  by  a
           single  backslash.   Escaped  delimiters  are  copied,  and the copy
           continues past the delimiter; the backslash is not copied:

             Source       Destination
            abc\xdef       abcxdef0

           (provided the destination buffer is at least 8 bytes long).

           It's actually somewhat more complicated than that. A sequence of any
           odd number of backslashes escapes the following delimiter,  and  the
           copy continues with exactly one of the backslashes stripped.

                Source         Destination
                abc\xdef          abcxdef0
              abc\\\xdef        abc\\xdef0
            abc\\\\\xdef      abc\\\\xdef0

           (as always, if the destination is large enough)

           An  even  number  of  preceding  backslashes  does  not  escape  the
           delimiter, so that the copy stops just before it, and  includes  all
           the backslashes (no stripping; zero is considered even):

                 Source         Destination
                 abcxdef          abc0
               abc\\xdef          abc\\0
             abc\\\\xdef          abc\\\\0

            char *  delimcpy(char *to, const char *to_end, const char *from,
                             const char *from_end, const int delim,
                             I32 *retlen)

       "do_join"
           This performs a Perl "join", placing the joined output into "sv".

           The  elements to join are in SVs, stored in a C array of pointers to
           SVs, from **mark to "**sp - 1".  Hence *mark is a reference  to  the
           first SV.  Each SV will be coerced into a PV if not one already.

           "delim"  contains  the  string (or coerced into a string) that is to
           separate each of the joined elements.

           If any component is in UTF-8, the result will be as  well,  and  all
           non-UTF-8 components will be converted to UTF-8 as necessary.

           Magic and tainting are handled.

            void  do_join(SV *sv, SV *delim, SV **mark, SV **sp)

       "do_sprintf"
           This performs a Perl "sprintf" placing the string output into "sv".

           The  elements  to format are in SVs, stored in a C array of pointers
           to SVs of length  "len">  and  beginning  at  **sarg.   The  element
           referenced by *sarg is the format.

           Magic and tainting are handled.

            void  do_sprintf(SV *sv, SSize_t len, SV **sarg)

       "fbm_compile"
           Analyzes  the  string  in  order  to  make fast searches on it using
           fbm_instr() -- the Boyer-Moore algorithm.

            void  fbm_compile(SV *sv, U32 flags)

       "fbm_instr"
           Returns the location of the SV in the string delimited by "big"  and
           "bigend"  ("bigend")  is  the  char  following  the  last char).  It
           returns "NULL" if the string can't be found.  The "sv" does not have
           to be "fbm_compiled", but the search will not be as fast then.

            char *  fbm_instr(unsigned char *big, unsigned char *bigend,
                              SV *littlestr, U32 flags)

       "foldEQ"
           Returns true if the leading "len" bytes of the strings "s1" and "s2"
           are the same case-insensitively;  false  otherwise.   Uppercase  and
           lowercase ASCII range bytes match themselves and their opposite case
           counterparts.   Non-cased  and  non-ASCII  range  bytes  match  only
           themselves.

            I32  foldEQ(const char *a, const char *b, I32 len)

       "ibcmp"
           This is a synonym for "(! foldEQ())"

            I32  ibcmp(const char *a, const char *b, I32 len)

       "ibcmp_locale"
           This is a synonym for "(! foldEQ_locale())"

            I32  ibcmp_locale(const char *a, const char *b, I32 len)

       "ibcmp_utf8"
           This is a synonym for "(! foldEQ_utf8())"

            I32  ibcmp_utf8(const char *s1, char **pe1, UV l1, bool u1,
                            const char *s2, char **pe2, UV l2, bool u2)

       "instr"
           Same as strstr(3), which finds and returns a pointer  to  the  first
           occurrence  of  the  NUL-terminated  substring  "little" in the NUL-
           terminated  string  "big",  returning  NULL  if  not   found.    The
           terminating NUL bytes are not compared.

            char *  instr(const char *big, const char *little)

       "memCHRs"
           Returns  the position of the first occurrence of the byte "c" in the
           literal string "list", or NULL if "c" doesn't appear in "list".  All
           bytes are treated as unsigned char.  Thus this macro can be used  to
           determine  if  "c"  is  in  a  set of particular characters.  Unlike
           strchr(3), it works even if  "c"  is  "NUL"  (and  the  set  doesn't
           include "NUL").

            bool  memCHRs("list", char c)

       "memEQ"
           Test  two  buffers  (which may contain embedded "NUL" characters, to
           see if they are equal.  The "len" parameter indicates the number  of
           bytes  to compare.  Returns true or false.  It is undefined behavior
           if either of the buffers doesn't contain at least "len" bytes.

            bool  memEQ(char* s1, char* s2, STRLEN len)

       "memEQs"
           Like "memEQ", but the second string is a literal enclosed in  double
           quotes,  "l1"  gives  the  number of bytes in "s1".  Returns true or
           false.

            bool  memEQs(char* s1, STRLEN l1, "s2")

       "memNE"
           Test two buffers (which may contain embedded  "NUL"  characters,  to
           see if they are not equal.  The "len" parameter indicates the number
           of  bytes  to  compare.   Returns  true  or  false.  It is undefined
           behavior if either of the buffers doesn't  contain  at  least  "len"
           bytes.

            bool  memNE(char* s1, char* s2, STRLEN len)

       "memNEs"
           Like  "memNE", but the second string is a literal enclosed in double
           quotes, "l1" gives the number of bytes in  "s1".   Returns  true  or
           false.

            bool  memNEs(char* s1, STRLEN l1, "s2")

       "Move"
       "MoveD"
           The  XSUB-writer's interface to the C "memmove" function.  The "src"
           is the source, "dest" is the destination, "nitems" is the number  of
           items,  and "type" is the type.  Can do overlapping moves.  See also
           "Copy".

           "MoveD" is like "Move" but returns "dest".  Useful  for  encouraging
           compilers to tail-call optimise.

            void    Move (void* src, void* dest, int nitems, type)
            void *  MoveD(void* src, void* dest, int nitems, type)

       "my_snprintf"
           The  C library "snprintf" functionality, if available and standards-
           compliant (uses "vsnprintf", actually).  However, if the "vsnprintf"
           is not available, will unfortunately use the unsafe "vsprintf" which
           can overrun the buffer (there is an overrun check, but that  may  be
           too   late).    Consider  using  "sv_vcatpvf"  instead,  or  getting
           "vsnprintf".

            int  my_snprintf(char *buffer, const Size_t len,
                             const char *format, ...)

       "my_sprintf"
           "DEPRECATED!"  It is planned to remove "my_sprintf"  from  a  future
           release  of  Perl.   Do  not  use  it  for  new code; remove it from
           existing code.

           Do NOT use this due to  the  possibility  of  overflowing  "buffer".
           Instead use my_snprintf()

            int  my_sprintf(NN char *buffer, NN const char *pat, ...)

       "my_strnlen"
           The  C  library  "strnlen" if available, or a Perl implementation of
           it.

           my_strnlen() computes the length  of  the  string,  up  to  "maxlen"
           bytes.   It  will never attempt to address more than "maxlen" bytes,
           making it suitable for use with strings that are not  guaranteed  to
           be NUL-terminated.

            Size_t  my_strnlen(const char *str, Size_t maxlen)

       "my_vsnprintf"
           The  C  library  "vsnprintf"  if  available and standards-compliant.
           However, if the "vsnprintf" is not available, will unfortunately use
           the unsafe "vsprintf" which can overrun  the  buffer  (there  is  an
           overrun   check,   but  that  may  be  too  late).   Consider  using
           "sv_vcatpvf" instead, or getting "vsnprintf".

            int  my_vsnprintf(char *buffer, const Size_t len,
                              const char *format, va_list ap)

       "NewCopy"
           Combines Newx() and  Copy()  into  a  single  macro.  Dest  will  be
           allocated using Newx() and then src will be copied into it.

            void  NewCopy(void* src, void* dest, int nitems, type)

       "ninstr"
           Find  the  first (leftmost) occurrence of a sequence of bytes within
           another sequence.  This is the Perl version of strstr(), extended to
           handle arbitrary sequences, potentially  containing  embedded  "NUL"
           characters  ("NUL"  is  what  the  initial  "n" in the function name
           stands for; some systems have an equivalent, memmem(),  but  with  a
           somewhat different API).

           Another way of thinking about this function is finding a needle in a
           haystack.    "big"  points  to  the  first  byte  in  the  haystack.
           "big_end" points to one byte beyond the final byte in the  haystack.
           "little"  points  to  the  first  byte  in the needle.  "little_end"
           points to one byte beyond the final byte in  the  needle.   All  the
           parameters must be non-"NULL".

           The  function  returns  "NULL" if there is no occurrence of "little"
           within "big".  If "little" is the empty string, "big" is returned.

           Because this function operates at the byte level, and because of the
           inherent characteristics of UTF-8  (or  UTF-EBCDIC),  it  will  work
           properly  if  both  the needle and the haystack are strings with the
           same UTF-8ness, but not if the UTF-8ness differs.

            char *  ninstr(const char *big, const char *bigend,
                           const char *little, const char *lend)

       "Nullch"
           Null character pointer.  (No longer available  when  "PERL_CORE"  is
           defined.)

       "PL_na"
           A scratch pad variable in which to store a "STRLEN" value.  If would
           have been better named something like "PL_temp_strlen".

           It is is typically used with "SvPV" when one is actually planning to
           discard  the returned length, (hence the length is "Not Applicable",
           which is how this variable got its name).

           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 "SvPV_nolen" macro.

            STRLEN  PL_na

       "rninstr"
           Like "ninstr", but instead finds the final (rightmost) occurrence of
           a  sequence  of  bytes  within another sequence, returning "NULL" if
           there is no such occurrence.

            char *  rninstr(const char *big, const char *bigend,
                            const char *little, const char *lend)

       "savepv"
           Perl's version of strdup().  Returns a pointer to a newly  allocated
           string  which  is  a  duplicate  of "pv".  The size of the string is
           determined by strlen(), which means  it  may  not  contain  embedded
           "NUL"  characters and must have a trailing "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 "Safefree"
           function, or "SAVEFREEPV".

           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 "savesharedpv".

            char *  savepv(const char *pv)

       "savepvn"
           Perl's  version of what strndup() would be if it existed.  Returns a
           pointer to a newly allocated string which  is  a  duplicate  of  the
           first "len" bytes from "pv", plus a trailing "NUL" byte.  The memory
           allocated  for  the  new  string  can  be  freed with the 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 "savesharedpvn".

            char *  savepvn(const char *pv, Size_t len)

       "savepvs"
           Like   "savepvn",   but   takes   a  literal  string  instead  of  a
           string/length pair.

            char*  savepvs("literal string")

       "savesharedpv"
           A version of savepv() which allocates the duplicate string in memory
           which is shared between threads.

            char *  savesharedpv(const char *pv)

       "savesharedpvn"
           A version of savepvn()  which  allocates  the  duplicate  string  in
           memory   which  is  shared  between  threads.   (With  the  specific
           difference that a "NULL" pointer is not acceptable)

            char *  savesharedpvn(const char * const pv, const STRLEN len)

       "savesharedpvs"
           A version of savepvs()  which  allocates  the  duplicate  string  in
           memory which is shared between threads.

            char*  savesharedpvs("literal string")

       "savesharedsvpv"
           A  version of savesharedpv() which allocates the duplicate string in
           memory which is shared between threads.

            char *  savesharedsvpv(SV *sv)

       "savesvpv"
           A version of savepv()/savepvn() which gets the string  to  duplicate
           from the passed in SV using 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 "savesharedsvpv".

            char *  savesvpv(SV *sv)

       "strEQ"
           Test two "NUL"-terminated strings to see if they are equal.  Returns
           true or false.

            bool  strEQ(char* s1, char* s2)

       "strGE"
           Test two "NUL"-terminated strings to see  if  the  first,  "s1",  is
           greater than or equal to the second, "s2".  Returns true or false.

            bool  strGE(char* s1, char* s2)

       "strGT"
           Test  two  "NUL"-terminated  strings  to  see if the first, "s1", is
           greater than the second, "s2".  Returns true or false.

            bool  strGT(char* s1, char* s2)

       "STRINGIFY"
           This macro surrounds its token with double quotes.

            string  STRINGIFY(token x)

       "strLE"
           Test two "NUL"-terminated strings to see if the first, "s1", is less
           than or equal to the second, "s2".  Returns true or false.

            bool  strLE(char* s1, char* s2)

       "STRLEN"
           Described in perlguts.

       "strLT"
           Test two "NUL"-terminated strings to see if the first, "s1", is less
           than the second, "s2".  Returns true or false.

            bool  strLT(char* s1, char* s2)

       "strNE"
           Test two "NUL"-terminated strings to  see  if  they  are  different.
           Returns true or false.

            bool  strNE(char* s1, char* s2)

       "strnEQ"
           Test  two  "NUL"-terminated  strings  to see if they are equal.  The
           "len" parameter indicates the number of bytes to  compare.   Returns
           true or false.  (A wrapper for "strncmp").

            bool  strnEQ(char* s1, char* s2, STRLEN len)

       "strnNE"
           Test two "NUL"-terminated strings to see if they are different.  The
           "len"  parameter  indicates the number of bytes to compare.  Returns
           true or false.  (A wrapper for "strncmp").

            bool  strnNE(char* s1, char* s2, STRLEN len)

       "STR_WITH_LEN"
           Returns two comma separated tokens of the input literal string,  and
           its  length.   This is convenience macro which helps out in some API
           calls.  Note that it can't be used  as  an  argument  to  macros  or
           functions  that  under  some  configurations  might be macros, which
           means that it requires the full Perl_xxx(aTHX_ ...) form for any API
           calls where it's used.

            pair  STR_WITH_LEN("literal string")

       "Zero"
       "ZeroD"
           The XSUB-writer's interface to the C "memzero" function.  The "dest"
           is the destination, "nitems" is the number of items, and  "type"  is
           the type.

           "ZeroD"  is  like "Zero" but returns "dest".  Useful for encouraging
           compilers to tail-call optimise.

            void    Zero (void* dest, int nitems, type)
            void *  ZeroD(void* dest, int nitems, type)

SV Flags
       "SVt_IV"
           Type flag for scalars.  See "svtype".

       "SVt_NULL"
           Type flag for scalars.  See "svtype".

       "SVt_NV"
           Type flag for scalars.  See "svtype".

       "SVt_PV"
           Type flag for scalars.  See "svtype".

       "SVt_PVAV"
           Type flag for arrays.  See "svtype".

       "SVt_PVCV"
           Type flag for subroutines.  See "svtype".

       "SVt_PVFM"
           Type flag for formats.  See "svtype".

       "SVt_PVGV"
           Type flag for typeglobs.  See "svtype".

       "SVt_PVHV"
           Type flag for hashes.  See "svtype".

       "SVt_PVIO"
           Type flag for I/O objects.  See "svtype".

       "SVt_PVIV"
           Type flag for scalars.  See "svtype".

       "SVt_PVLV"
           Type flag for scalars.  See "svtype".

       "SVt_PVMG"
           Type flag for scalars.  See "svtype".

       "SVt_PVNV"
           Type flag for scalars.  See "svtype".

       "SVt_PVOBJ"
           NOTE: "SVt_PVOBJ" is experimental  and  may  change  or  be  removed
           without notice.

           Type flag for object instances.  See "svtype".

       "SVt_REGEXP"
           Type flag for regular expressions.  See "svtype".

       "svtype"
           An  enum  of flags for Perl types.  These are found in the file sv.h
           in the "svtype" enum.  Test these flags with the "SvTYPE" macro.

           The types are:

               SVt_NULL
               SVt_IV
               SVt_NV
               SVt_RV
               SVt_PV
               SVt_PVIV
               SVt_PVNV
               SVt_PVMG
               SVt_INVLIST
               SVt_REGEXP
               SVt_PVGV
               SVt_PVLV
               SVt_PVAV
               SVt_PVHV
               SVt_PVCV
               SVt_PVFM
               SVt_PVIO
               SVt_PVOBJ

           These are most easily explained from the bottom up.

           "SVt_PVOBJ" is for object instances of the new `use feature 'class'`
           kind.  "SVt_PVIO"  is  for  I/O  objects,  "SVt_PVFM"  for  formats,
           "SVt_PVCV" for subroutines, "SVt_PVHV" for hashes and "SVt_PVAV" for
           arrays.

           All  the  others are scalar types, that is, things that can be bound
           to a "$"  variable.   For  these,  the  internal  types  are  mostly
           orthogonal to types in the Perl language.

           Hence,  checking  "SvTYPE(sv)  <  SVt_PVAV"  is  the best way to see
           whether something is a scalar.

           "SVt_PVGV" represents a typeglob.  If "!SvFAKE(sv)", then  it  is  a
           real,  incoercible  typeglob.  If SvFAKE(sv), then it is a scalar to
           which a typeglob has been assigned.  Assigning to it again will stop
           it from being a  typeglob.   "SVt_PVLV"  represents  a  scalar  that
           delegates  to  another  scalar behind the scenes.  It is used, e.g.,
           for the return value  of  "substr"  and  for  tied  hash  and  array
           elements.   It  can  hold  any  scalar  value, including a typeglob.
           "SVt_REGEXP" is for regular expressions.  "SVt_INVLIST" is for  Perl
           core internal use only.

           "SVt_PVMG"  represents  a  "normal"  scalar (not a typeglob, regular
           expression, or delegate).  Since most scalars do not  need  all  the
           internal  fields  of  a  PVMG,  we save memory by allocating smaller
           structs when possible.  All the other types are just  simpler  forms
           of "SVt_PVMG", with fewer internal fields.  "SVt_NULL" can only hold
           undef.   "SVt_IV"  can  hold  undef,  an  integer,  or  a reference.
           ("SVt_RV" is an  alias  for  "SVt_IV",  which  exists  for  backward
           compatibility.)   "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.)  "SVt_PV"  can
           hold "undef", a string, or a reference.  "SVt_PVIV" is a superset of
           "SVt_PV"  and  "SVt_IV".  "SVt_PVNV"  is  a superset of "SVt_PV" and
           "SVt_NV". "SVt_PVMG" can hold anything "SVt_PVNV" can hold,  but  it
           may also be blessed or magical.

SV Handling
       "AV_FROM_REF"
       "CV_FROM_REF"
       "HV_FROM_REF"
           The  "*V_FROM_REF"  macros extract the SvRV() from a given reference
           SV and return a suitably-cast to pointer to the referenced SV.  When
           running  under "-DDEBUGGING", assertions are also applied that check
           that ref is definitely a reference SV that refers to an  SV  of  the
           right type.

            AV *  AV_FROM_REF(SV * ref)
            CV *  CV_FROM_REF(SV * ref)
            HV *  HV_FROM_REF(SV * ref)

       "BOOL_INTERNALS_sv_isbool"
           Checks  if  a  SvBoolFlagsOK()  sv  is  a  bool. Note that it is the
           caller's responsibility to ensure that  the  sv  is  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 sv_isbool(sv) instead.

            bool  BOOL_INTERNALS_sv_isbool(SV* sv)

       "BOOL_INTERNALS_sv_isbool_false"
           Checks if a SvBoolFlagsOK() sv is a false bool. Note that it is  the
           caller's  responsibility  to  ensure  that the sv is 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 NOT what you should  use
           to  check  if  an  SV  is  "false",  for  that  you  should be using
           "!SvTRUE(sv)" instead.

            bool  BOOL_INTERNALS_sv_isbool_false(SV* sv)

       "BOOL_INTERNALS_sv_isbool_true"
           Checks if a SvBoolFlagsOK() sv is a true bool. Note that it  is  the
           caller's  responsibility  to  ensure  that the sv is 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 NOT what you should  use
           to check if an SV is "true", for that you should be using SvTRUE(sv)
           instead.

            bool  BOOL_INTERNALS_sv_isbool_true(SV* sv)

       "boolSV"
           Returns a true SV if "b" is a true value, or a false SV if "b" is 0.

           See also "PL_sv_yes" and "PL_sv_no".

            SV *  boolSV(bool b)

       "croak_xs_usage"
           A  specialised variant of croak() for emitting the usage message for
           xsubs

               croak_xs_usage(cv, "eee_yow");

           works out the package name and subroutine name from "cv",  and  then
           calls  croak().   Hence if "cv" is &ouch::awk, it would call "croak"
           as:

            diag_listed_as: SKIPME
            Perl_croak(aTHX_ "Usage: %" SVf "::%" SVf "(%s)", "ouch" "awk",
                                                                "eee_yow");

            void  croak_xs_usage(const CV * const cv,
                                 const char * const params)

       "DEFSV"
           Returns the SV associated with $_

            SV *  DEFSV

       "DEFSV_set"
           Associate "sv" with $_

            void  DEFSV_set(SV * sv)

       "get_sv"
           Returns the SV of the specified Perl scalar.  "flags" are passed  to
           ""gv_fetchpv"".   If  "GV_ADD" is set and the Perl variable does not
           exist then it will be created.  If "flags" is zero and the  variable
           does not exist then NULL is returned.

           NOTE: the perl_get_sv() form is deprecated.

            SV *  get_sv(const char *name, I32 flags)

       "isGV_with_GP"
           Returns  a  boolean as to whether or not "sv" is a GV with a pointer
           to a GP (glob pointer).

            bool  isGV_with_GP(SV * sv)

       "looks_like_number"
           Test if the content of an SV looks like a number (or is  a  number).
           "Inf"  and  "Infinity"  are  treated as numbers (so will not issue a
           non-numeric warning), even if your atof() doesn't grok  them.   Get-
           magic is ignored.

            I32  looks_like_number(SV * const sv)

       "MUTABLE_AV"
       "MUTABLE_CV"
       "MUTABLE_GV"
       "MUTABLE_HV"
       "MUTABLE_IO"
       "MUTABLE_PTR"
       "MUTABLE_SV"
           The "MUTABLE_*"() macros cast pointers to the types shown, in such a
           way  (compiler  permitting) that casting away const-ness will give a
           warning; e.g.:

            const SV *sv = ...;
            AV *av1 = (AV*)sv;        <== BAD:  the const has been silently
                                                cast away
            AV *av2 = MUTABLE_AV(sv); <== GOOD: it may warn

           "MUTABLE_PTR" is the base macro used to derive new casts.  The other
           already-built-in ones return pointers to what their names indicate.

            AV *    MUTABLE_AV (AV * p)
            CV *    MUTABLE_CV (CV * p)
            GV *    MUTABLE_GV (GV * p)
            HV *    MUTABLE_HV (HV * p)
            IO *    MUTABLE_IO (IO * p)
            void *  MUTABLE_PTR(void * p)
            SV *    MUTABLE_SV (SV * p)

       "newRV"
       "newRV_inc"
           These are identical.  They create an RV  wrapper  for  an  SV.   The
           reference count for the original SV is incremented.

            SV *  newRV(SV * const sv)

       "newRV_noinc"
           Creates  an  RV  wrapper  for  an  SV.   The reference count for the
           original SV is not incremented.

            SV *  newRV_noinc(SV * const tmpRef)

       "newSV"
           Creates a new SV.  A non-zero "len" parameter indicates  the  number
           of  bytes of preallocated string space the SV should have.  An extra
           byte for a trailing "NUL" is also reserved.  ("SvPOK" is not set for
           the SV even if string space is allocated.)  The reference count  for
           the new SV is set to 1.

           In  5.9.3,  newSV()  replaces  the  older NEWSV() API, and drops the
           first parameter, x, a debug aid which allowed  callers  to  identify
           themselves.   This  aid  has  been superseded by a new build option,
           "PERL_MEM_LOG" (see "PERL_MEM_LOG" in perlhacktips).  The older  API
           is still there for use in XS modules supporting older perls.

            SV *  newSV(const STRLEN len)

       "newSVbool"
           Creates a new SV boolean.

            SV *  newSVbool(const bool bool_val)

       "newSV_false"
           Creates a new SV that is a boolean false.

            SV *  newSV_false()

       "newSVhek"
           Creates  a  new  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 "hek" is NULL.

            SV *  newSVhek(const HEK * const hek)

       "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 "hek" is NULL.

           This is more efficient than using sv_2mortal(newSVhek( ... ))

            SV *  newSVhek_mortal(const HEK * const hek)

       "newSViv"
           Creates a new SV and copies an integer into it.  The reference count
           for the SV is set to 1.

            SV *  newSViv(const IV i)

       "newSVnv"
           Creates  a  new  SV  and copies a floating point value into it.  The
           reference count for the SV is set to 1.

            SV *  newSVnv(const NV n)

       "newSVpadname"
           NOTE: "newSVpadname" is experimental and may change  or  be  removed
           without notice.

           Creates a new SV containing the pad name.

            SV*  newSVpadname(PADNAME *pn)

       "newSVpv"
           Creates a new SV and copies a string (which may contain "NUL" ("\0")
           characters)  into  it.   The reference count for the SV is set to 1.
           If "len" is zero, Perl  will  compute  the  length  using  strlen(),
           (which  means  if  you use this option, that "s" can't have embedded
           "NUL" characters and has to have a terminating "NUL" byte).

           This function can cause reliability issues if you are likely to pass
           in empty strings that are not null terminated, because it  will  run
           strlen on the string and potentially run past valid memory.

           Using  "newSVpvn"  is  a  safer alternative for non "NUL" terminated
           strings.  For string literals use "newSVpvs" instead.  This function
           will work fine for "NUL" terminated strings,  but  if  you  want  to
           avoid  the  if  statement on whether to call "strlen" use "newSVpvn"
           instead (calling "strlen" yourself).

            SV *  newSVpv(const char * const s, const STRLEN len)

       "newSVpvf"
           Creates a new SV and initializes it with the string  formatted  like
           "sv_catpvf".

           NOTE:  "newSVpvf"  must be explicitly called as "Perl_newSVpvf" with
           an "aTHX_" parameter.

            SV *  Perl_newSVpvf(pTHX_ const char * const pat, ...)

       "newSVpvf_nocontext"
           Like  "newSVpvf"  but  does  not  take  a  thread  context  ("aTHX")
           parameter, so is used in situations where the caller doesn't already
           have the thread context.

            SV *  newSVpvf_nocontext(const char * const pat, ...)

       "newSVpvn"
           Creates  a  new  SV  and  copies a string into it, which may contain
           "NUL" characters ("\0") and other binary data.  The reference  count
           for  the  SV  is  set  to  1.  Note that if "len" is zero, Perl will
           create a  zero  length  (Perl)  string.   You  are  responsible  for
           ensuring  that  the  source buffer is at least "len" bytes long.  If
           the "buffer" argument is NULL the new SV will be undefined.

            SV *  newSVpvn(const char * const buffer, const STRLEN len)

       "newSVpvn_flags"
           Creates a new SV and copies a string (which may contain "NUL" ("\0")
           characters) into it.  The reference count for the SV is  set  to  1.
           Note  that  if "len" is zero, Perl will create a zero length string.
           You are responsible for ensuring that the source string is at  least
           "len"  bytes  long.   If the "s" argument is NULL the new SV will be
           undefined.  Currently the only flag bits accepted are "SVf_UTF8" and
           "SVs_TEMP".  If "SVs_TEMP" is set, then sv_2mortal()  is  called  on
           the   result  before  returning.   If  "SVf_UTF8"  is  set,  "s"  is
           considered to be in UTF-8 and the "SVf_UTF8" flag will be set on the
           new SV.  newSVpvn_utf8() is a convenience wrapper for this function,
           defined as

               #define newSVpvn_utf8(s, len, u)                    \
                   newSVpvn_flags((s), (len), (u) ? SVf_UTF8 : 0)

            SV *  newSVpvn_flags(const char * const s, const STRLEN len,
                                 const U32 flags)

       "newSVpvn_share"
           Creates a new SV with its "SvPVX_const" pointing to a shared  string
           in  the  string  table.  If the string does not already exist in the
           table, it is  created  first.   Turns  on  the  "SvIsCOW"  flag  (or
           "READONLY" and "FAKE" in 5.16 and earlier).  If the "hash" parameter
           is  non-zero,  that  value  is used; otherwise the hash is computed.
           The string's hash can later  be  retrieved  from  the  SV  with  the
           "SvSHARED_HASH" macro.  The idea here is that as the string table is
           used  for  shared  hash keys these strings will have "SvPVX_const ==
           HeKEY" and hash lookup will avoid string compare.

            SV *  newSVpvn_share(const char *s, I32 len, U32 hash)

       "newSVpvn_utf8"
           Creates a new SV and copies a string (which may contain "NUL" ("\0")
           characters) into it.  If "utf8" is true, calls  "SvUTF8_on"  on  the
           new SV.  Implemented as a wrapper around "newSVpvn_flags".

            SV*  newSVpvn_utf8(const char* s, STRLEN len, U32 utf8)

       "newSVpvs"
           Like   "newSVpvn",   but   takes  a  literal  string  instead  of  a
           string/length pair.

            SV*  newSVpvs("literal string")

       "newSVpvs_flags"
           Like "newSVpvn_flags", but takes  a  literal  string  instead  of  a
           string/length pair.

            SV*  newSVpvs_flags("literal string", U32 flags)

       "newSVpv_share"
           Like  "newSVpvn_share",  but takes a "NUL"-terminated string instead
           of a string/length pair.

            SV *  newSVpv_share(const char *s, U32 hash)

       "newSVpvs_share"
           Like "newSVpvn_share", but takes  a  literal  string  instead  of  a
           string/length pair and omits the hash parameter.

            SV*  newSVpvs_share("literal string")

       "newSVrv"
           Creates a new SV for the existing RV, "rv", to point to.  If "rv" is
           not  an  RV then it will be upgraded to one.  If "classname" is non-
           null then the new SV will be blessed in the specified package.   The
           new  SV  is  returned  and  its reference count is 1.  The reference
           count 1 is owned by "rv". See also newRV_inc() and newRV_noinc() for
           creating a new RV properly.

            SV *  newSVrv(SV * const rv, const char * const classname)

       "newSVsv"
       "newSVsv_flags"
       "newSVsv_nomg"
           These create a new SV which is an exact duplicate of the original SV
           (using "sv_setsv".)

           They  differ  only  in  that   "newSVsv"   performs   'get'   magic;
           "newSVsv_nomg"  skips  any  magic; and "newSVsv_flags" allows you to
           explicitly set a "flags" parameter.

            SV *  newSVsv      (SV * const old)
            SV *  newSVsv_flags(SV * const old, I32 flags)
            SV *  newSVsv_nomg (SV * const old)

       "newSV_true"
           Creates a new SV that is a boolean true.

            SV *  newSV_true()

       "newSV_type"
           Creates a new SV, of the type specified.  The  reference  count  for
           the new SV is set to 1.

            SV *  newSV_type(const svtype type)

       "newSV_type_mortal"
           Creates a new mortal SV, of the type specified.  The reference count
           for the new SV is set to 1.

           This is equivalent to
               SV* sv = sv_2mortal(newSV_type(<some type>)) and
               SV* sv = sv_newmortal();
               sv_upgrade(sv,  <some_type>)  but  should be more efficient than
           both of them. (Unless sv_2mortal is inlined at  some  point  in  the
           future.)

            SV *  newSV_type_mortal(const svtype type)

       "newSVuv"
           Creates  a  new  SV  and  copies  an  unsigned integer into it.  The
           reference count for the SV is set to 1.

            SV *  newSVuv(const UV u)

       "Nullsv"
           Null SV pointer.  (No longer available when "PERL_CORE" is defined.)

       "PL_sv_no"
           This is the "false" SV.  It is readonly.  See  "PL_sv_yes".   Always
           refer to this as &PL_sv_no.

            SV  PL_sv_no

       "PL_sv_undef"
           This  is  the  "undef" SV.  It is readonly.  Always refer to this as
           &PL_sv_undef.

            SV  PL_sv_undef

       "PL_sv_yes"
           This is the "true" SV.  It is  readonly.   See  "PL_sv_no".   Always
           refer to this as &PL_sv_yes.

            SV  PL_sv_yes

       "PL_sv_zero"
           This  readonly  SV  has a zero numeric value and a "0" string value.
           It's similar to "PL_sv_no" except for its string value. Can be  used
           as  a  cheap alternative to mXPUSHi(0) for example.  Always refer to
           this as &PL_sv_zero. Introduced in 5.28.

            SV  PL_sv_zero

       "SAVE_DEFSV"
           Localize $_.  See "Localizing changes" in perlguts.

            void  SAVE_DEFSV

       "sortsv"
           In-place sort an array of SV  pointers  with  the  given  comparison
           routine.

           Currently this always uses mergesort.  See "sortsv_flags" for a more
           flexible routine.

            void  sortsv(SV **array, size_t num_elts, SVCOMPARE_t cmp)

       "sortsv_flags"
           In-place  sort  an  array  of  SV pointers with the given comparison
           routine, with various SORTf_* flag options.

            void  sortsv_flags(SV **array, size_t num_elts, SVCOMPARE_t cmp,
                               U32 flags)

       "SV"
           Described in perlguts.

       "SvAMAGIC"
           Returns a boolean as to whether "sv" has overloading (active  magic)
           enabled or not.

            bool  SvAMAGIC(SV * sv)

       "SvAMAGIC_off"
           Indicate that "sv" has overloading (active magic) disabled.

            void  SvAMAGIC_off(SV *sv)

       "SvAMAGIC_on"
           Indicate that "sv" has overloading (active magic) enabled.

            void  SvAMAGIC_on(SV *sv)

       "sv_backoff"
           Remove  any  string offset.  You should normally use the "SvOOK_off"
           macro wrapper instead.

            void  sv_backoff(SV * const sv)

       "sv_bless"
           Blesses an SV into a specified package.  The SV must be an RV.   The
           package  must  be  designated  by its stash (see "gv_stashpv").  The
           reference count of the SV is unaffected.

            SV *  sv_bless(SV * const sv, HV * const stash)

       "SvBoolFlagsOK"
           Returns a bool indicating whether the SV has  the  right  flags  set
           such   that   it  is  safe  to  call  BOOL_INTERNALS_sv_isbool()  or
           BOOL_INTERNALS_sv_isbool_true() or BOOL_INTERNALS_sv_isbool_false().
           Currently equivalent to SvIandPOK(sv) or "SvIOK(sv)  &&  SvPOK(sv)".
           Serialization  may want to unroll this check. If so you are strongly
           recommended to add  code  like  "assert(SvBoolFlagsOK(sv));"  before
           calling using any of the BOOL_INTERNALS macros.

            U32  SvBoolFlagsOK(SV* sv)

       "sv_catpv"
       "sv_catpv_flags"
       "sv_catpv_mg"
       "sv_catpv_nomg"
           These concatenate the "NUL"-terminated string "sstr" onto the end of
           the  string which is in the SV.  If the SV has the UTF-8 status set,
           then the bytes appended should be valid UTF-8.

           They differ only in how they handle magic:

           "sv_catpv_mg" performs both 'get' and 'set' magic.

           "sv_catpv" performs only 'get' magic.

           "sv_catpv_nomg" skips all magic.

           "sv_catpv_flags" has an extra "flags" parameter which allows you  to
           specify  any combination of magic handling (using "SV_GMAGIC" and/or
           "SV_SMAGIC"), and to also override the UTF-8 handling.  By supplying
           the  "SV_CATUTF8"  flag,  the  appended  string  is  forced  to   be
           interpreted  as  UTF-8; by supplying instead the "SV_CATBYTES" flag,
           it will be interpreted as just bytes.  Either the SV or  the  string
           appended will be upgraded to UTF-8 if necessary.

            void  sv_catpv      (SV * const dsv, const char *sstr)
            void  sv_catpv_flags(SV *dsv, const char *sstr, const I32 flags)
            void  sv_catpv_mg   (SV * const dsv, const char * const sstr)
            void  sv_catpv_nomg (SV * const dsv, const char *sstr)

       "sv_catpvf"
       "sv_catpvf_mg"
       "sv_catpvf_mg_nocontext"
       "sv_catpvf_nocontext"
           These  process  their  arguments  like  "sprintf",  and  append  the
           formatted  output  to  an  SV.   As  with  "sv_vcatpvfn",   argument
           reordering  is  not  supporte  when  called  with a non-null C-style
           variable argument list.

           If the appended data contains "wide" characters (including, but  not
           limited  to,  SVs  with a UTF-8 PV formatted with %s, and characters
           >255 formatted with %c), the  original  SV  might  get  upgraded  to
           UTF-8.

           If  the original SV was UTF-8, the pattern should be valid UTF-8; if
           the original SV was bytes, the pattern should be too.

           All   perform   'get'   magic,   but   only    "sv_catpvf_mg"    and
           "sv_catpvf_mg_nocontext" perform 'set' magic.

           "sv_catpvf_nocontext"  and  "sv_catpvf_mg_nocontext"  do  not take a
           thread context ("aTHX") parameter, so are used in  situations  where
           the caller doesn't already have the thread context.

           NOTE: "sv_catpvf" must be explicitly called as "Perl_sv_catpvf" with
           an "aTHX_" parameter.

           NOTE:     "sv_catpvf_mg"    must    be    explicitly    called    as
           "Perl_sv_catpvf_mg" with an "aTHX_" parameter.

            void  Perl_sv_catpvf        (pTHX_ SV * const sv,
                                         const char * const pat, ...)
            void  Perl_sv_catpvf_mg     (pTHX_ SV * const sv,
                                         const char * const pat, ...)
            void  sv_catpvf_mg_nocontext(SV * const sv,
                                         const char * const pat, ...)
            void  sv_catpvf_nocontext   (SV * const sv,
                                         const char * const pat, ...)

       "sv_catpvn"
       "sv_catpvn_flags"
       "sv_catpvn_mg"
       "sv_catpvn_nomg"
           These concatenate the "len" bytes of the string beginning  at  "ptr"
           onto  the end of the string which is in "dsv".  The caller must make
           sure "ptr" contains at least "len" bytes.

           For all but "sv_catpvn_flags", the string appended is assumed to  be
           valid  UTF-8  if  the  SV  has the UTF-8 status set, and a string of
           bytes otherwise.

           They differ in that:

           "sv_catpvn_mg" performs both 'get' and 'set' magic on "dsv".

           "sv_catpvn" performs only 'get' magic.

           "sv_catpvn_nomg" skips all magic.

           "sv_catpvn_flags" has an extra "flags" parameter which allows you to
           specify any combination of magic handling (using "SV_GMAGIC"  and/or
           "SV_SMAGIC")  and to also override the UTF-8 handling.  By supplying
           the "SV_CATBYTES" flag, the appended string is interpreted as  plain
           bytes;  by  supplying  instead  the  "SV_CATUTF8"  flag,  it will be
           interpreted as UTF-8, and the "dsv" will be  upgraded  to  UTF-8  if
           necessary.

           "sv_catpvn", "sv_catpvn_mg", and "sv_catpvn_nomg" are implemented in
           terms of "sv_catpvn_flags".

            void  sv_catpvn      (SV *dsv, const char *sstr, STRLEN len)
            void  sv_catpvn_flags(SV * const dsv, const char *sstr,
                                  const STRLEN len, const I32 flags)
            void  sv_catpvn_mg   (SV *dsv, const char *sstr, STRLEN len)
            void  sv_catpvn_nomg (SV *dsv, const char *sstr, STRLEN len)

       "sv_catpvs"
           Like   "sv_catpvn",   but  takes  a  literal  string  instead  of  a
           string/length pair.

            void  sv_catpvs(SV* sv, "literal string")

       "sv_catpvs_flags"
           Like "sv_catpvn_flags", but takes a  literal  string  instead  of  a
           string/length pair.

            void  sv_catpvs_flags(SV* sv, "literal string", I32 flags)

       "sv_catpvs_mg"
           Like  "sv_catpvn_mg",  but  takes  a  literal  string  instead  of a
           string/length pair.

            void  sv_catpvs_mg(SV* sv, "literal string")

       "sv_catpvs_nomg"
           Like "sv_catpvn_nomg", but takes  a  literal  string  instead  of  a
           string/length pair.

            void  sv_catpvs_nomg(SV* sv, "literal string")

       "sv_catsv"
       "sv_catsv_flags"
       "sv_catsv_mg"
       "sv_catsv_nomg"
           These  concatenate  the  string  from  SV "sstr" onto the end of the
           string in SV "dsv".  If "sstr" is null, these are no-ops;  otherwise
           only "dsv" is modified.

           They differ only in what magic they perform:

           "sv_catsv_mg"  performs 'get' magic on both SVs before the copy, and
           'set' magic on "dsv" afterwards.

           "sv_catsv" performs just 'get' magic, on both SVs.

           "sv_catsv_nomg" skips all magic.

           "sv_catsv_flags" has an extra "flags" parameter which allows you  to
           use  "SV_GMAGIC"  and/or  "SV_SMAGIC"  to specify any combination of
           magic handling (although either both or neither SV will  have  'get'
           magic applied to it.)

           "sv_catsv",  "sv_catsv_mg",  and  "sv_catsv_nomg" are implemented in
           terms of "sv_catsv_flags".

            void  sv_catsv      (SV *dsv, SV *sstr)
            void  sv_catsv_flags(SV * const dsv, SV * const sstr,
                                 const I32 flags)
            void  sv_catsv_mg   (SV *dsv, SV *sstr)
            void  sv_catsv_nomg (SV *dsv, SV *sstr)

       "SV_CHECK_THINKFIRST"
           Remove any encumbrances from "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  "sv",
           instead use ""SV_CHECK_THINKFIRST_COW_DROP"" to avoid the write that
           would be immediately written again.

            void  SV_CHECK_THINKFIRST(SV * sv)

       "SV_CHECK_THINKFIRST_COW_DROP"
           Call  this when you are about to replace the PV value in "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 "sv".

            void  SV_CHECK_THINKFIRST_COW_DROP(SV * sv)

       "sv_chop"
           Efficient removal of characters from the  beginning  of  the  string
           buffer.   SvPOK(sv),  or at least SvPOKp(sv), must be true and "ptr"
           must be a pointer to somewhere  inside  the  string  buffer.   "ptr"
           becomes  the first character of the adjusted string.  Uses the "OOK"
           hack.  On return, only SvPOK(sv) and SvPOKp(sv) among the "OK" flags
           will be true.

           Beware: after this function returns, "ptr" and  SvPVX_const(sv)  may
           no longer refer to the same chunk of data.

           The unfortunate similarity of this function's name to that of Perl's
           "chop"  operator is strictly coincidental.  This function works from
           the left; "chop" works from the right.

            void  sv_chop(SV * const sv, const char * const ptr)

       "sv_clear"
           Clear an SV: call any destructors, free up any memory  used  by  the
           body,  and  free  the  body  itself.   The  SV's  head is not freed,
           although 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 "REFCNT"  is  zero.   Most  of  the  time
           you'll want to call "SvREFCNT_dec" instead.

            void  sv_clear(SV * const orig_sv)

       "sv_cmp"
           Compares  the  strings  in  two SVs.  Returns -1, 0, or 1 indicating
           whether the string in "sv1" is less than, equal to, or greater  than
           the  string  in  "sv2".  Is UTF-8 and 'use bytes' aware, handles get
           magic, and will coerce its args to strings if necessary.   See  also
           "sv_cmp_locale".

            I32  sv_cmp(SV * const sv1, SV * const sv2)

       "sv_cmp_flags"
           Compares  the  strings  in  two SVs.  Returns -1, 0, or 1 indicating
           whether the string in "sv1" is less than, equal to, or greater  than
           the string in "sv2".  Is UTF-8 and 'use bytes' aware and will coerce
           its  args to strings if necessary.  If the flags has the "SV_GMAGIC"
           bit set, it handles get magic.  See also "sv_cmp_locale_flags".

            I32  sv_cmp_flags(SV * const sv1, SV * const sv2, const U32 flags)

       "sv_cmp_locale"
           Compares the strings in two SVs in a locale-aware manner.  Is  UTF-8
           and  'use bytes'  aware, handles get magic, and will coerce its args
           to strings if necessary.  See also "sv_cmp".

            I32  sv_cmp_locale(SV * const sv1, SV * const sv2)

       "sv_cmp_locale_flags"
           Compares the strings in two SVs in a locale-aware manner.  Is  UTF-8
           and  'use bytes'  aware  and  will  coerce  its  args  to strings if
           necessary.  If the flags contain "SV_GMAGIC", it handles get  magic.
           See also "sv_cmp_flags".

            I32  sv_cmp_locale_flags(SV * const sv1, SV * const sv2,
                                     const U32 flags)

       "sv_collxfrm"
           This   calls  "sv_collxfrm_flags"  with  the  SV_GMAGIC  flag.   See
           "sv_collxfrm_flags".

            char *  sv_collxfrm(SV * const sv, STRLEN * const nxp)

       "sv_collxfrm_flags"
           Add Collate Transform magic to an SV if it doesn't already have  it.
           If the flags contain "SV_GMAGIC", it handles get-magic.

           Any  scalar  variable  may  carry  "PERL_MAGIC_collxfrm"  magic that
           contains the scalar data of the variable, but transformed to such  a
           format  that  a  normal memory comparison can be used to compare the
           data according to the locale settings.

            char *  sv_collxfrm_flags(SV * const sv, STRLEN * const nxp,
                                      I32 const flags)

       "sv_copypv"
       "sv_copypv_flags"
       "sv_copypv_nomg"
           These copy a stringified representation of the source  SV  into  the
           destination  SV.   They  automatically  perform  coercion of numeric
           values into strings.  Guaranteed to preserve the  "UTF8"  flag  even
           from  overloaded objects.  Similar in nature to "sv_2pv[_flags]" but
           they operate directly on an SV instead of just the  string.   Mostly
           they  use  ""sv_2pv_flags""  to  do the work, except when that would
           lose the UTF-8'ness of the PV.

           The three forms differ only in whether  or  not  they  perform  'get
           magic'  on  "sv".   "sv_copypv_nomg"  skips 'get magic'; "sv_copypv"
           performs it;  and  "sv_copypv_flags"  either  performs  it  (if  the
           "SV_GMAGIC"  bit  is  set  in  "flags")  or  doesn't (if that bit is
           cleared).

            void  sv_copypv      (SV * const dsv, SV * const ssv)
            void  sv_copypv_flags(SV * const dsv, SV * const ssv,
                                  const I32 flags)
            void  sv_copypv_nomg (SV * const dsv, SV * const ssv)

       "SvCUR"
           Returns the length, in bytes, of the PV inside the  SV.   Note  that
           this  may  not match Perl's "length"; for that, use sv_len_utf8(sv).
           See "SvLEN" also.

            STRLEN  SvCUR(SV* sv)

       "SvCUR_set"
           Sets the current length, in bytes, of the C string which is  in  the
           SV.  See "SvCUR" and "SvIV_set">.

            void  SvCUR_set(SV* sv, STRLEN len)

       "sv_2cv"
           Using  various gambits, try to get a CV from an SV; in addition, try
           if possible to set *st and *gvp to the stash and GV associated  with
           it.  The flags in "lref" are passed to "gv_fetchsv".

            CV *  sv_2cv(SV *sv, HV ** const st, GV ** const gvp,
                         const I32 lref)

       "sv_dec"
       "sv_dec_nomg"
           These  auto-decrement  the  value in the SV, doing string to numeric
           conversion if necessary.  They both handle operator overloading.

           They differ only in that:

           "sv_dec" handles 'get' magic; "sv_dec_nomg" skips 'get' magic.

            void  sv_dec(SV * const sv)

       "sv_derived_from"
           Exactly  like  "sv_derived_from_pv",  but  doesn't  take  a  "flags"
           parameter.

            bool  sv_derived_from(SV *sv, const char * const name)

       "sv_derived_from_hv"
           Exactly like "sv_derived_from_pvn", but takes the name string as the
           "HvNAME" of the given HV (which would presumably represent a stash).

            bool  sv_derived_from_hv(SV *sv, HV *hv)

       "sv_derived_from_pv"
           Exactly  like  "sv_derived_from_pvn",  but  takes  a  nul-terminated
           string instead of a string/length pair.

            bool  sv_derived_from_pv(SV *sv, const char * const name,
                                     U32 flags)

       "sv_derived_from_pvn"
           Returns a boolean indicating whether the  SV  is  derived  from  the
           specified  class  at  the  C level.  To check derivation at the Perl
           level, call isa() as a normal Perl method.

           Currently, the only significant value for "flags" is SVf_UTF8.

            bool  sv_derived_from_pvn(SV *sv, const char * const name,
                                      const STRLEN len, U32 flags)

       "sv_derived_from_sv"
           Exactly like "sv_derived_from_pvn", but takes the name string in the
           form of an SV instead of a string/length pair. This is  the  advised
           form.

            bool  sv_derived_from_sv(SV *sv, SV *namesv, U32 flags)

       "sv_does"
           Like "sv_does_pv", but doesn't take a "flags" parameter.

            bool  sv_does(SV *sv, const char * const name)

       "sv_does_pv"
           Like  "sv_does_sv",  but takes a nul-terminated string instead of an
           SV.

            bool  sv_does_pv(SV *sv, const char * const name, U32 flags)

       "sv_does_pvn"
           Like "sv_does_sv", but takes a string/length pair instead of an SV.

            bool  sv_does_pvn(SV *sv, const char * const name,
                              const STRLEN len, U32 flags)

       "sv_does_sv"
           Returns a boolean indicating whether the  SV  performs  a  specific,
           named  role.   The  SV  can  be  a Perl object or the name of a Perl
           class.

            bool  sv_does_sv(SV *sv, SV *namesv, U32 flags)

       "SvEND"
           Returns a pointer to the spot just after the last character  in  the
           string  which  is in the SV, where there is usually a trailing "NUL"
           character (even though Perl scalars do  not  strictly  require  it).
           See "SvCUR".  Access the character as "*(SvEND(sv))".

           Warning:  If  "SvCUR"  is  equal  to "SvLEN", then "SvEND" points to
           unallocated memory.

            char*  SvEND(SV* sv)

       "sv_eq"
       "sv_eq_flags"
           These each return a boolean indicating whether or not the strings in
           the two SVs are equal.  If 'use bytes' is in effect, the  comparison
           is byte-by-byte; otherwise character-by-character.  Each will coerce
           its args to strings if necessary.

           They  differ  only in that "sv_eq" always processes get magic, while
           "sv_eq_flags" processes get magic only when  the  "flags"  parameter
           has the "SV_GMAGIC" bit set.

           These  functions  do  not handle operator overloading.  For versions
           that do, see instead "sv_streq" or "sv_streq_flags".

            I32  sv_eq      (SV *sv1, SV *sv2)
            I32  sv_eq_flags(SV *sv1, SV *sv2, const U32 flags)

       "sv_force_normal"
           Undo various types of fakery on an SV: if the PV is a shared string,
           make a private copy; if we're a ref, stop refing; if we're  a  glob,
           downgrade to an "xpvmg".  See also "sv_force_normal_flags".

            void  sv_force_normal(SV *sv)

       "sv_force_normal_flags"
           Undo  various  types  of  fakery  on an SV, where fakery means "more
           than" a string: if the PV is a shared string, make a  private  copy;
           if  we're  a  ref,  stop  refing;  if  we're a glob, downgrade to an
           "xpvmg"; if we're a copy-on-write scalar, this is the on-write  time
           when we do the copy, and is also used locally; if this is a vstring,
           drop  the vstring magic.  If "SV_COW_DROP_PV" is set then a copy-on-
           write scalar drops its PV buffer (if any)  and  becomes  "SvPOK_off"
           rather  than  making a copy.  (Used where this scalar is about to be
           set to some other value.)  In addition, the "flags"  parameter  gets
           passed  to sv_unref_flags() when unreffing.  "sv_force_normal" calls
           this function with flags set to 0.

           This function is expected to be used to signal to perl that this  SV
           is  about  to  be written to, and any extra book-keeping needs to be
           taken care of.  Hence, it croaks on read-only values.

            void  sv_force_normal_flags(SV * const sv, const U32 flags)

       "sv_free"
           Decrement an SV's reference count, and if it  drops  to  zero,  call
           "sv_clear"  to invoke destructors and free up any memory used by the
           body; finally, deallocating the SV's head itself.   Normally  called
           via a wrapper macro "SvREFCNT_dec".

            void  sv_free(SV * const sv)

       "SvGAMAGIC"
           Returns  true  if the SV has get magic or overloading.  If either is
           true then the scalar is active data, and has the potential to return
           a new value every time it is accessed.  Hence you must be careful to
           only read it once per user logical  operation  and  work  with  that
           returned  value.   If neither is true then the scalar's value cannot
           change unless written to.

            U32  SvGAMAGIC(SV* sv)

       "sv_get_backrefs"
           NOTE: "sv_get_backrefs" is experimental and may change or be removed
           without notice.

           If "sv" is the target of a weak reference then it returns  the  back
           references  structure  associated  with  the  sv;  otherwise  return
           "NULL".

           When returning a non-null result the type of the return is relevant.
           If it is an AV then the elements of the AV are  the  weak  reference
           RVs  which point at this item. If it is any other type then the item
           itself is the weak reference.

           See     also      Perl_sv_add_backref(),      Perl_sv_del_backref(),
           Perl_sv_kill_backrefs()

            SV *  sv_get_backrefs(SV * const sv)

       "SvGETMAGIC"
           Invokes  "mg_get" on an SV if it has 'get' magic.  For example, this
           will call "FETCH" on a tied variable.  As of 5.37.1,  this  function
           is guaranteed to evaluate its argument exactly once.

            void  SvGETMAGIC(SV *sv)

       "sv_gets"
           Get  a line from the filehandle and store it into the SV, optionally
           appending to the currently-stored string.  If "append" is not 0, the
           line is appended to the SV  instead  of  overwriting  it.   "append"
           should  be  set  to  the byte offset that the appended string should
           start at in the SV (typically, SvCUR(sv) is a suitable choice).

            char *  sv_gets(SV * const sv, PerlIO * const fp, I32 append)

       "SvGROW"
           Expands the character buffer in the SV so that it has room  for  the
           indicated  number  of  bytes (remember to reserve space for an extra
           trailing "NUL" character).  Calls "sv_grow" to perform the expansion
           if necessary.  Returns a pointer to the character buffer.   SV  must
           be of type >= "SVt_PV".  One alternative is to call "sv_grow" if you
           are not sure of the type of SV.

           You  might mistakenly think that "len" is the number of bytes to add
           to the existing size, but instead it is the total size  "sv"  should
           be.

            char *  SvGROW(SV* sv, STRLEN len)

       "SvIandPOK"
           Returns a bool indicating whether the SV is both SvPOK() and SvIOK()
           at  the  same  time. Equivalent to "SvIOK(sv) && SvPOK(sv)" but more
           efficient.

            U32  SvIandPOK(SV* sv)

       "SvIandPOK_off"
           Unsets the PV and IV status of an SV in one operation. Equivalent to
           "SvIOK_off(sv); SvPK_off(v);" but more efficient.

            void  SvIandPOK_off(SV* sv)

       "SvIandPOK_on"
           Tells an SV that  is  a  string  and  a  number  in  one  operation.
           Equivalent to "SvIOK_on(sv); SvPOK_on(sv);" but more efficient.

            void  SvIandPOK_on(SV* sv)

       "sv_inc"
       "sv_inc_nomg"
           These  auto-increment  the  value in the SV, doing string to numeric
           conversion if necessary.  They both handle operator overloading.

           They  differ  only  in   that   "sv_inc"   performs   'get'   magic;
           "sv_inc_nomg" skips any magic.

            void  sv_inc(SV * const sv)

       "sv_insert"
       "sv_insert_flags"
           These  insert and/or replace a string at the specified offset/length
           within  the  SV.   Similar  to  the  Perl  substr()  function,  with
           "littlelen"  bytes starting at "little" replacing "len" bytes of the
           string in "bigstr" starting at "offset".  They handle get magic.

           "sv_insert_flags" is identical to plain "sv_insert", but  the  extra
           "flags"  are  passed  to  the  "SvPV_force_flags"  operation that is
           internally applied to "bigstr".

            void  sv_insert      (SV * const bigstr, const STRLEN offset,
                                  const STRLEN len, const char * const little,
                                  const STRLEN littlelen)
            void  sv_insert_flags(SV * const bigstr, const STRLEN offset,
                                  const STRLEN len, const char *little,
                                  const STRLEN littlelen, const U32 flags)

       "sv_2io"
           Using various gambits, try to get an IO from an SV: the IO  slot  if
           its  a GV; or the recursive result if we're an RV; or the IO slot of
           the symbol named after the PV if we're a string.

           'Get' magic is ignored on the "sv" passed in, but will be called  on
           SvRV(sv) if "sv" is an RV.

            IO *  sv_2io(SV * const sv)

       "SvIOK"
           Returns a U32 value indicating whether the SV contains an integer.

            U32  SvIOK(SV* sv)

       "SvIOK_notUV"
           Returns  a  boolean  indicating  whether  the  SV  contains a signed
           integer.

            bool  SvIOK_notUV(SV* sv)

       "SvIOK_off"
           Unsets the IV status of an SV.

            void  SvIOK_off(SV* sv)

       "SvIOK_on"
           Tells an SV that it is an integer.

            void  SvIOK_on(SV* sv)

       "SvIOK_only"
           Tells an SV that it is an integer and disables all other "OK" bits.

            void  SvIOK_only(SV* sv)

       "SvIOK_only_UV"
           Tells an SV that it is an unsigned integer and  disables  all  other
           "OK" bits.

            void  SvIOK_only_UV(SV* sv)

       "SvIOKp"
           Returns  a  U32 value indicating whether the SV contains an integer.
           Checks the private setting.  Use "SvIOK" instead.

            U32  SvIOKp(SV* sv)

       "SvIOK_UV"
           Returns a boolean indicating whether the SV contains an integer that
           must be interpreted as unsigned.  A non-negative integer whose value
           is within the range of both an IV and a UV may be flagged as  either
           "SvUOK" or "SvIOK".

            bool  SvIOK_UV(SV* sv)

       "sv_isa"
           Returns  a  boolean  indicating  whether  the SV is blessed into the
           specified class.

           This  does  not  check  for  subtypes  or  method  overloading.  Use
           "sv_isa_sv" to verify an inheritance relationship in the same way as
           the  "isa"  operator  by respecting any isa() method overloading; or
           "sv_derived_from_sv" to test directly on the actual object type.

            int  sv_isa(SV *sv, const char * const name)

       "sv_isa_sv"
           Returns a boolean indicating whether the SV is an  object  reference
           and is derived from the specified class, respecting any isa() method
           overloading it may have. Returns false if "sv" is not a reference to
           an object, or is not derived from the specified class.

           This  is  the  function used to implement the behaviour of the "isa"
           operator.

           Does not invoke magic on "sv".

           Not to be confused with the older "sv_isa" function, which does  not
           use an overloaded isa() method, nor will check subclassing.

            bool  sv_isa_sv(SV *sv, SV *namesv)

       "SvIsBOOL"
           Returns  true  if  the  SV  is  one of the special boolean constants
           (PL_sv_yes or PL_sv_no), or is a regular SV  whose  last  assignment
           stored a copy of one.

            bool  SvIsBOOL(SV* sv)

       "SvIsCOW"
           Returns  a  U32  value  indicating  whether  the SV is Copy-On-Write
           (either shared hash key scalars, or full Copy On  Write  scalars  if
           5.9.0 is configured for COW).

            U32  SvIsCOW(SV* sv)

       "SvIsCOW_shared_hash"
           Returns  a boolean indicating whether the SV is Copy-On-Write shared
           hash key scalar.

            bool  SvIsCOW_shared_hash(SV* sv)

       "sv_isobject"
           Returns a boolean indicating whether the SV is an RV pointing  to  a
           blessed  object.   If  the  SV is not an RV, or if the object is not
           blessed, then this will return false.

            int  sv_isobject(SV *sv)

       "SvIV"
       "SvIV_nomg"
       "SvIVx"
           These each coerce the given SV to IV and return  it.   The  returned
           value  in  many circumstances will get stored in "sv"'s IV slot, but
           not in all cases.  (Use "sv_setiv" to make sure it does).

           As of 5.37.1, all are guaranteed to evaluate "sv" only once.

           "SvIVx" is now identical to "SvIV", but prior to 5.37.1, it was  the
           only form guaranteed to evaluate "sv" only once.

           "SvIV_nomg" is the same as "SvIV", but does not perform 'get' magic.

            IV  SvIV(SV *sv)

       "sv_2iv_flags"
           Return  the  integer  value  of  an  SV,  doing any necessary string
           conversion.  If  "flags"  has  the  "SV_GMAGIC"  bit  set,  does  an
           mg_get()  first.   Normally  used  via  the  SvIV(sv)  and SvIVx(sv)
           macros.

            IV  sv_2iv_flags(SV * const sv, const I32 flags)

       "SvIV_set"
           Set the value of the IV pointer in sv to val.   It  is  possible  to
           perform the same function of this macro with an lvalue assignment to
           "SvIVX".   With  future Perls, however, it will be more efficient to
           use "SvIV_set" instead of the lvalue assignment to "SvIVX".

            void  SvIV_set(SV* sv, IV val)

       "SvIVX"
           Returns the raw value  in  the  SV's  IV  slot,  without  checks  or
           conversions.   Only use when you are sure "SvIOK" is true.  See also
           "SvIV".

            IV  SvIVX(SV* sv)

       "SvLEN"
           Returns the size of the string buffer in the SV, not  including  any
           part attributable to "SvOOK".  See "SvCUR".

            STRLEN  SvLEN(SV* sv)

       "sv_len"
           Returns  the length of the string in the SV.  Handles magic and type
           coercion and sets the UTF8 flag appropriately.   See  also  "SvCUR",
           which gives raw access to the "xpv_cur" slot.

            STRLEN  sv_len(SV * const sv)

       "SvLEN_set"
           Set the size of the string buffer for the SV. See "SvLEN".

            void  SvLEN_set(SV* sv, STRLEN len)

       "sv_len_utf8"
       "sv_len_utf8_nomg"
           These  return  the  number  of  characters  in  the string in an SV,
           counting wide UTF-8 bytes as a single character.  Both  handle  type
           coercion.   They  differ  only  in that "sv_len_utf8" performs 'get'
           magic; "sv_len_utf8_nomg" skips any magic.

            STRLEN  sv_len_utf8(SV * const sv)

       "SvLOCK"
           Arranges for a mutual exclusion lock to be obtained  on  "sv"  if  a
           suitable module has been loaded.

            void  SvLOCK(SV* sv)

       "sv_magic"
           Adds  magic  to  an  SV.   First upgrades "sv" to type "SVt_PVMG" if
           necessary, then adds a new magic item of type "how" to the  head  of
           the magic list.

           See  "sv_magicext" (which "sv_magic" now calls) for a description of
           the handling of the "name" and "namlen" arguments.

           You need to use "sv_magicext" to add magic to "SvREADONLY"  SVs  and
           also to add more than one instance of the same "how".

            void  sv_magic(SV * const sv, SV * const obj, const int how,
                           const char * const name, const I32 namlen)

       "sv_magicext"
           Adds  magic  to  an  SV,  upgrading  it  if  necessary.  Applies the
           supplied "vtable" and returns a pointer to the magic added.

           Note that "sv_magicext" will allow things that "sv_magic" will  not.
           In  particular,  you can add magic to "SvREADONLY" SVs, and add more
           than one instance of the same "how".

           If "namlen" is greater than zero then a "savepvn" copy of "name"  is
           stored,  if  "namlen"  is  zero then "name" is stored as-is and - as
           another special case - if  "(name  &&  namlen  ==  HEf_SVKEY)"  then
           "name"  is  assumed  to  contain an SV* and is stored as-is with its
           "REFCNT" incremented.

           (This is now used as a subroutine by "sv_magic".)

            MAGIC *  sv_magicext(SV * const sv, SV * const obj, const int how,
                                 const MGVTBL * const vtbl,
                                 const char * const name, const I32 namlen)

       "SvMAGIC_set"
           Set the value of the MAGIC pointer in "sv" to val.  See "SvIV_set".

            void  SvMAGIC_set(SV* sv, MAGIC* val)

       "sv_2mortal"
           Marks an existing SV as mortal.  The SV will  be  destroyed  "soon",
           either  by an explicit call to "FREETMPS", or by an implicit call at
           places such as statement boundaries.  SvTEMP() is  turned  on  which
           means  that  the  SV's  string  buffer can be "stolen" if this SV is
           copied.  See also "sv_newmortal" and "sv_mortalcopy".

            SV *  sv_2mortal(SV * const sv)

       "sv_mortalcopy"
           Creates a new  SV  which  is  a  copy  of  the  original  SV  (using
           "sv_setsv").   The new SV is marked as mortal.  It will be destroyed
           "soon", either by an explicit call to "FREETMPS", or by an  implicit
           call   at   places   such   as   statement   boundaries.   See  also
           "sv_newmortal" and "sv_2mortal".

            SV *  sv_mortalcopy(SV * const oldsv)

       "sv_mortalcopy_flags"
           Like "sv_mortalcopy", but  the  extra  "flags"  are  passed  to  the
           "sv_setsv_flags".

            SV *  sv_mortalcopy_flags(SV * const oldsv, U32 flags)

       "sv_newmortal"
           Creates  a  new null SV which is mortal.  The reference count of the
           SV is set to 1.  It will be destroyed "soon", either by an  explicit
           call  to  "FREETMPS",  or  by  an  implicit  call  at places such as
           statement boundaries.  See also "sv_mortalcopy" and "sv_2mortal".

            SV *  sv_newmortal()

       "SvNIOK"
           Returns a U32 value indicating whether the  SV  contains  a  number,
           integer or double.

            U32  SvNIOK(SV* sv)

       "SvNIOK_off"
           Unsets the NV/IV status of an SV.

            void  SvNIOK_off(SV* sv)

       "SvNIOKp"
           Returns  a  U32  value  indicating whether the SV contains a number,
           integer or  double.   Checks  the  private  setting.   Use  "SvNIOK"
           instead.

            U32  SvNIOKp(SV* sv)

       "SvNOK"
           Returns a U32 value indicating whether the SV contains a double.

            U32  SvNOK(SV* sv)

       "SvNOK_off"
           Unsets the NV status of an SV.

            void  SvNOK_off(SV* sv)

       "SvNOK_on"
           Tells an SV that it is a double.

            void  SvNOK_on(SV* sv)

       "SvNOK_only"
           Tells an SV that it is a double and disables all other OK bits.

            void  SvNOK_only(SV* sv)

       "SvNOKp"
           Returns  a  U32  value  indicating whether the SV contains a double.
           Checks the private setting.  Use "SvNOK" instead.

            U32  SvNOKp(SV* sv)

       "sv_nolocking"
           "DEPRECATED!"  It is planned to remove "sv_nolocking" from a  future
           release  of  Perl.   Do  not  use  it  for  new code; remove it from
           existing code.

           Dummy routine which "locks" an SV when there is  no  locking  module
           present.   Exists  to  avoid  test for a "NULL" function pointer and
           because it could potentially warn under some level of strict-ness.

           "Superseded" by sv_nosharing().

            void  sv_nolocking(SV *sv)

       "sv_nounlocking"
           "DEPRECATED!"  It is  planned  to  remove  "sv_nounlocking"  from  a
           future  release of Perl.  Do not use it for new code; remove it from
           existing code.

           Dummy routine which "unlocks" an SV when there is no locking  module
           present.   Exists  to  avoid  test for a "NULL" function pointer and
           because it could potentially warn under some level of strict-ness.

           "Superseded" by sv_nosharing().

            void  sv_nounlocking(SV *sv)

       "sv_numeq"
           A  convenient  shortcut  for  calling  "sv_numeq_flags"   with   the
           "SV_GMAGIC" flag. This function basically behaves like the Perl code
           "$sv1 == $sv2".

            bool  sv_numeq(SV *sv1, SV *sv2)

       "sv_numeq_flags"
           Returns  a boolean indicating whether the numbers in the two SVs are
           identical. If the flags argument has the  "SV_GMAGIC"  bit  set,  it
           handles get-magic too. Will coerce its args to numbers if necessary.
           Treats "NULL" as undef.

           If flags does not have the "SV_SKIP_OVERLOAD" bit set, an attempt to
           use  "=="  overloading  will  be  made. If such overloading does not
           exist or the flag is set, then regular numerical comparison will  be
           used instead.

            bool  sv_numeq_flags(SV *sv1, SV *sv2, const U32 flags)

       "SvNV"
       "SvNV_nomg"
       "SvNVx"
           These  each  coerce  the given SV to NV and return it.  The returned
           value in many circumstances will get stored in "sv"'s NV  slot,  but
           not in all cases.  (Use "sv_setnv" to make sure it does).

           As of 5.37.1, all are guaranteed to evaluate "sv" only once.

           "SvNVx"  is now identical to "SvNV", but prior to 5.37.1, it was the
           only form guaranteed to evaluate "sv" only once.

           "SvNV_nomg" is the same as "SvNV", but does not perform 'get' magic.

            NV  SvNV(SV *sv)

       "sv_2nv_flags"
           Return the num value of an SV, doing any necessary string or integer
           conversion.  If  "flags"  has  the  "SV_GMAGIC"  bit  set,  does  an
           mg_get()  first.   Normally  used  via  the  SvNV(sv)  and SvNVx(sv)
           macros.

            NV  sv_2nv_flags(SV * const sv, const I32 flags)

       "SvNV_set"
           Set the value of the NV pointer in "sv" to val.  See "SvIV_set".

            void  SvNV_set(SV* sv, NV val)

       "SvNVX"
           Returns the raw value  in  the  SV's  NV  slot,  without  checks  or
           conversions.   Only use when you are sure "SvNOK" is true.  See also
           "SvNV".

            NV  SvNVX(SV* sv)

       "SvOK"
           Returns a U32 value indicating whether the value is  defined.   This
           is only meaningful for scalars.

            U32  SvOK(SV* sv)

       "SvOOK"
           Returns a U32 indicating whether the pointer to the string buffer is
           offset.   This  hack  is  used  internally  to  speed  up removal of
           characters from the beginning of a "SvPV".  When  "SvOOK"  is  true,
           then   the   start  of  the  allocated  string  buffer  is  actually
           SvOOK_offset() bytes before "SvPVX".  This offset used to be  stored
           in "SvIVX", but is now stored within the spare part of the buffer.

            U32  SvOOK(SV* sv)

       "SvOOK_off"
           Remove any string offset.

            void  SvOOK_off(SV * sv)

       "SvOOK_offset"
           Reads  into  "len" the offset from "SvPVX" back to the true start of
           the allocated buffer, which will be non-zero if "sv_chop"  has  been
           used  to  efficiently  remove  characters  from start of the buffer.
           Implemented as a macro, which takes the address of "len", which must
           be of type "STRLEN".  Evaluates "sv" more than once.  Sets "len"  to
           0 if SvOOK(sv) is false.

            void  SvOOK_offset(SV*sv, STRLEN len)

       "SvPOK"
           Returns  a  U32 value indicating whether the SV contains a character
           string.

            U32  SvPOK(SV* sv)

       "SvPOK_off"
           Unsets the PV status of an SV.

            void  SvPOK_off(SV* sv)

       "SvPOK_on"
           Tells an SV that it is a string.

            void  SvPOK_on(SV* sv)

       "SvPOK_only"
           Tells an SV that it is a string and disables all  other  "OK"  bits.
           Will also turn off the UTF-8 status.

            void  SvPOK_only(SV* sv)

       "SvPOK_only_UTF8"
           Tells  an  SV  that it is a string and disables all other "OK" bits,
           and leaves the UTF-8 status as it was.

            void  SvPOK_only_UTF8(SV* sv)

       "SvPOKp"
           Returns a U32 value indicating whether the SV contains  a  character
           string.  Checks the private setting.  Use "SvPOK" instead.

            U32  SvPOKp(SV* sv)

       "sv_pos_b2u"
           Converts  the  value  pointed  to by "offsetp" from a count of bytes
           from the start of the string, to a count of the equivalent number of
           UTF-8 chars.  Handles magic and type coercion.

           Use  "sv_pos_b2u_flags"  in  preference,  which  correctly   handles
           strings longer than 2Gb.

            void  sv_pos_b2u(SV * const sv, I32 * const offsetp)

       "sv_pos_b2u_flags"
           Converts  "offset"  from  a  count  of  bytes  from the start of the
           string, to a count of the equivalent number of UTF-8 chars.  Handles
           type coercion.  "flags"  is  passed  to  "SvPV_flags",  and  usually
           should be "SV_GMAGIC|SV_CONST_RETURN" to handle magic.

            STRLEN  sv_pos_b2u_flags(SV * const sv, STRLEN const offset,
                                     U32 flags)

       "sv_pos_u2b"
           Converts  the  value  pointed  to by "offsetp" from a count of UTF-8
           chars from the start of the string, to a  count  of  the  equivalent
           number  of bytes; if "lenp" is non-zero, it does the same to "lenp",
           but this time starting from the offset, rather than from  the  start
           of the string.  Handles magic and type coercion.

           Use   "sv_pos_u2b_flags"  in  preference,  which  correctly  handles
           strings longer than 2Gb.

            void  sv_pos_u2b(SV * const sv, I32 * const offsetp,
                             I32 * const lenp)

       "sv_pos_u2b_flags"
           Converts the offset from a count of UTF-8 chars from  the  start  of
           the  string, to a count of the equivalent number of bytes; if "lenp"
           is non-zero, it does the same to "lenp", but this time starting from
           "offset", rather than from the start of the  string.   Handles  type
           coercion.   "flags" is passed to "SvPV_flags", and usually should be
           "SV_GMAGIC|SV_CONST_RETURN" to handle magic.

            STRLEN  sv_pos_u2b_flags(SV * const sv, STRLEN uoffset,
                                     STRLEN * const lenp, U32 flags)

       "SvPV"
       "SvPV_const"
       "SvPV_flags"
       "SvPV_flags_const"
       "SvPV_flags_mutable"
       "SvPV_mutable"
       "SvPV_nolen"
       "SvPV_nolen_const"
       "SvPV_nomg"
       "SvPV_nomg_const"
       "SvPV_nomg_const_nolen"
       "SvPV_nomg_nolen"
       "SvPVbyte"
       "SvPVbyte_nolen"
       "SvPVbyte_nomg"
       "SvPVbyte_or_null"
       "SvPVbyte_or_null_nomg"
       "SvPVbytex"
       "SvPVbytex_nolen"
       "SvPVutf8"
       "SvPVutf8_nolen"
       "SvPVutf8_nomg"
       "SvPVutf8_or_null"
       "SvPVutf8_or_null_nomg"
       "SvPVutf8x"
       "SvPVx"
       "SvPVx_const"
       "SvPVx_nolen"
       "SvPVx_nolen_const"
           These each return a pointer to the string in "sv", or a  stringified
           form  of "sv" if it does not contain a string.  The SV may cache the
           stringified version becoming "SvPOK".

           This is a very basic and common operation,  so  there  are  lots  of
           slightly different versions of it.

           Note  that  there is no guarantee that the return value of SvPV(sv),
           for example, is equal to SvPVX(sv), or that SvPVX(sv) contains valid
           data, or that successive calls to  SvPV(sv)  (or  another  of  these
           forms) will return the same pointer value each time.  This is due to
           the  way that things like overloading and Copy-On-Write are handled.
           In these cases, the return value may point to a temporary buffer  or
           similar.   If you absolutely need the "SvPVX" field to be valid (for
           example, if you intend to write to it), then see "SvPV_force".

           The differences between the forms are:

           The forms with neither "byte"  nor  "utf8"  in  their  names  (e.g.,
           "SvPV"  or "SvPV_nolen") can expose the SV's internal string buffer.
           If that buffer consists entirely of bytes  0-255  and  includes  any
           bytes  above  127,  then  you MUST consult "SvUTF8" to determine the
           actual code  points  the  string  is  meant  to  contain.  Generally
           speaking, it is probably safer to prefer "SvPVbyte", "SvPVutf8", and
           the  like.  See  "How  do  I  pass a Perl string to a C library?" in
           perlguts for more details.

           The forms with "flags" in their names allow you to use  the  "flags"
           parameter  to  specify  to  process  'get'  magic  (by  setting  the
           "SV_GMAGIC" flag) or to skip 'get'  magic  (by  clearing  it).   The
           other  forms process 'get' magic, except for the ones with "nomg" in
           their names, which skip 'get' magic.

           The forms that take a "len" parameter will set that variable to  the
           byte  length of the resultant string (these are macros, so don't use
           &len).

           The forms with "nolen" in their names indicate  they  don't  have  a
           "len" parameter.  They should be used only when it is known that the
           PV is a C string, terminated by a NUL byte, and without intermediate
           NUL characters; or when you don't care about its length.

           The  forms with "const" in their names return "const char *" so that
           the compiler will hopefully complain if you were to  try  to  modify
           the contents of the string (unless you cast away const yourself).

           The  other  forms  return  a  mutable  pointer so that the string is
           modifiable by the caller; this  is  emphasized  for  the  ones  with
           "mutable" in their names.

           As  of 5.38, all forms are guaranteed to evaluate "sv" exactly once.
           For earlier Perls, use a form whose name ends with  "x"  for  single
           evaluation.

           "SvPVutf8"  is  like "SvPV", but converts "sv" to UTF-8 first if not
           already UTF-8.  Similarly, the other  forms  with  "utf8"  in  their
           names correspond to their respective forms without.

           "SvPVutf8_or_null"    and    "SvPVutf8_or_null_nomg"    don't   have
           corresponding   non-"utf8"   forms.    Instead   they    are    like
           "SvPVutf8_nomg", but when "sv" is undef, they return "NULL".

           "SvPVbyte"  is like "SvPV", but converts "sv" to byte representation
           first if currently encoded as UTF-8.  If "sv" cannot  be  downgraded
           from  UTF-8,  it  croaks.  Similarly, the other forms with "byte" in
           their names correspond to their respective forms without.

           "SvPVbyte_or_null" doesn't have  a  corresponding  non-"byte"  form.
           Instead  it  is  like "SvPVbyte", but when "sv" is undef, it returns
           "NULL".

            char*        SvPV                 (SV* sv, STRLEN len)
            const char*  SvPV_const           (SV* sv, STRLEN len)
            char*        SvPV_flags           (SV* sv, STRLEN len, U32 flags)
            const char*  SvPV_flags_const     (SV* sv, STRLEN len, U32 flags)
            char*        SvPV_flags_mutable   (SV* sv, STRLEN len, U32 flags)
            char*        SvPV_mutable         (SV* sv, STRLEN len)
            char*        SvPV_nolen           (SV* sv)
            const char*  SvPV_nolen_const     (SV* sv)
            char*        SvPV_nomg            (SV* sv, STRLEN len)
            const char*  SvPV_nomg_const      (SV* sv, STRLEN len)
            const char*  SvPV_nomg_const_nolen(SV* sv)
            char*        SvPV_nomg_nolen      (SV* sv)
            char*        SvPVbyte             (SV* sv, STRLEN len)
            char*        SvPVbyte_nolen       (SV* sv)
            char*        SvPVbyte_nomg        (SV* sv, STRLEN len)
            char*        SvPVbyte_or_null     (SV* sv, STRLEN len)
            char*        SvPVbyte_or_null_nomg(SV* sv, STRLEN len)
            char*        SvPVbytex            (SV* sv, STRLEN len)
            char*        SvPVbytex_nolen      (SV* sv)
            char*        SvPVutf8             (SV* sv, STRLEN len)
            char*        SvPVutf8_nolen       (SV* sv)
            char*        SvPVutf8_nomg        (SV* sv, STRLEN len)
            char*        SvPVutf8_or_null     (SV* sv, STRLEN len)
            char*        SvPVutf8_or_null_nomg(SV* sv, STRLEN len)
            char*        SvPVutf8x            (SV* sv, STRLEN len)
            char*        SvPVx                (SV* sv, STRLEN len)
            const char*  SvPVx_const          (SV* sv, STRLEN len)
            char*        SvPVx_nolen          (SV* sv)
            const char*  SvPVx_nolen_const    (SV* sv)

       "sv_2pv"
       "sv_2pv_flags"
           These implement the various forms of the ""SvPV"" in perlapi macros.
           The macros are the preferred interface.

           These return a pointer to the string value of an SV (coercing it  to
           a string if necessary), and set *lp to its length in bytes.

           The  forms  differ in that plain "sv_2pvbyte" always processes 'get'
           magic; and "sv_2pvbyte_flags" processes 'get' magic if and  only  if
           "flags" contains "SV_GMAGIC".

            char *  sv_2pv      (SV *sv, STRLEN *lp)
            char *  sv_2pv_flags(SV * const sv, STRLEN * const lp,
                                 const U32 flags)

       "sv_2pvbyte"
       "sv_2pvbyte_flags"
           These  implement  the  various  forms of the ""SvPVbyte"" in perlapi
           macros.  The macros are the preferred interface.

           These return a pointer to the byte-encoded representation of the SV,
           and set *lp to its length.  If the SV is marked as being encoded  as
           UTF-8, it will be downgraded, if possible, to a byte string.  If the
           SV cannot be downgraded, they croak.

           The  forms  differ in that plain "sv_2pvbyte" always processes 'get'
           magic; and "sv_2pvbyte_flags" processes 'get' magic if and  only  if
           "flags" contains "SV_GMAGIC".

            char *  sv_2pvbyte      (SV *sv, STRLEN * const lp)
            char *  sv_2pvbyte_flags(SV *sv, STRLEN * const lp,
                                     const U32 flags)

       "SvPVCLEAR"
           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.

            char *  SvPVCLEAR(SV* sv)

       "SvPVCLEAR_FRESH"
           Like SvPVCLEAR, but optimized for newly-minted SVt_PV/PVIV/PVNV/PVMG
           that already have a PV buffer allocated, but no SvTHINKFIRST.

            char *  SvPVCLEAR_FRESH(SV* sv)

       "SvPV_force"
       "SvPV_force_flags"
       "SvPV_force_flags_mutable"
       "SvPV_force_flags_nolen"
       "SvPV_force_mutable"
       "SvPV_force_nolen"
       "SvPV_force_nomg"
       "SvPV_force_nomg_nolen"
       "SvPVbyte_force"
       "SvPVbytex_force"
       "SvPVutf8_force"
       "SvPVutf8x_force"
       "SvPVx_force"
           These  are  like  "SvPV",  returning  the string in the SV, but will
           force the SV into containing a string ("SvPOK"), and only  a  string
           ("SvPOK_only"),  by  hook or by crook.  You need to use one of these
           "force" routines if you are going to update the "SvPVX" directly.

           Note that  coercing  an  arbitrary  scalar  into  a  plain  PV  will
           potentially  strip  useful  data from it.  For example if the SV was
           "SvROK",  then  the  referent  will   have   its   reference   count
           decremented, and the SV itself may be converted to an "SvPOK" scalar
           with a string buffer containing a value such as "ARRAY(0x1234)".

           The differences between the forms are:

           The  forms  with "flags" in their names allow you to use the "flags"
           parameter  to  specify  to  perform  'get'  magic  (by  setting  the
           "SV_GMAGIC"  flag)  or  to  skip  'get' magic (by clearing it).  The
           other forms do perform 'get' magic, except for the ones with  "nomg"
           in their names, which skip 'get' magic.

           The  forms that take a "len" parameter will set that variable to the
           byte length of the resultant string (these are macros, so don't  use
           &len).

           The  forms  with  "nolen"  in their names indicate they don't have a
           "len" parameter.  They should be used only when it is known that the
           PV is a C string, terminated by a NUL byte, and without intermediate
           NUL characters; or when you don't care about its length.

           The forms with "mutable" in their names are effectively the same  as
           those without, but the name emphasizes that the string is modifiable
           by the caller, which it is in all the forms.

           "SvPVutf8_force"  is  like  "SvPV_force", but converts "sv" to UTF-8
           first if not already UTF-8.

           "SvPVutf8x_force"  is  like  "SvPVutf8_force",  but  guarantees   to
           evaluate  "sv"  only  once;  use the more efficient "SvPVutf8_force"
           otherwise.

           "SvPVbyte_force" is like "SvPV_force", but  converts  "sv"  to  byte
           representation  first  if  currently  encoded  as  UTF-8.  If the SV
           cannot be downgraded from UTF-8, this croaks.

           "SvPVbytex_force"  is  like  "SvPVbyte_force",  but  guarantees   to
           evaluate  "sv"  only  once;  use the more efficient "SvPVbyte_force"
           otherwise.

            char*  SvPV_force              (SV* sv, STRLEN len)
            char*  SvPV_force_flags        (SV * sv, STRLEN len, U32 flags)
            char*  SvPV_force_flags_mutable(SV * sv, STRLEN len, U32 flags)
            char*  SvPV_force_flags_nolen  (SV * sv, U32 flags)
            char*  SvPV_force_mutable      (SV * sv, STRLEN len)
            char*  SvPV_force_nolen        (SV* sv)
            char*  SvPV_force_nomg         (SV* sv, STRLEN len)
            char*  SvPV_force_nomg_nolen   (SV * sv)
            char*  SvPVbyte_force          (SV * sv, STRLEN len)
            char*  SvPVbytex_force         (SV * sv, STRLEN len)
            char*  SvPVutf8_force          (SV * sv, STRLEN len)
            char*  SvPVutf8x_force         (SV * sv, STRLEN len)
            char*  SvPVx_force             (SV* sv, STRLEN len)

       "SvPV_free"
           Frees the PV buffer in "sv", leaving things in a  precarious  state,
           so should only be used as part of a larger operation

            void  SvPV_free(SV * sv)

       "sv_pvn_force_flags"
           Get  a  sensible  string  out of the SV somehow.  If "flags" has the
           "SV_GMAGIC" bit set, will "mg_get" on "sv" if appropriate, else not.
           "sv_pvn_force" and "sv_pvn_force_nomg" are implemented in  terms  of
           this  function.  You normally want to use the various wrapper macros
           instead: see "SvPV_force" and "SvPV_force_nomg".

            char *  sv_pvn_force_flags(SV * const sv, STRLEN * const lp,
                                       const U32 flags)

       "SvPV_renew"
           Low level micro optimization of "SvGROW".  It is generally better to
           use  "SvGROW"  instead.   This  is  because   "SvPV_renew"   ignores
           potential  issues  that "SvGROW" handles.  "sv" needs to have a real
           "PV"   that   is   unencumbered   by   things   like   COW.    Using
           "SV_CHECK_THINKFIRST"   or   "SV_CHECK_THINKFIRST_COW_DROP"   before
           calling this should clean it up, but why not just  use  "SvGROW"  if
           you're not sure about the provenance?

            void  SvPV_renew(SV* sv, STRLEN len)

       "SvPV_set"
           This  is  probably  not  what  you  want to use, you probably wanted
           "sv_usepvn_flags" or "sv_setpvn" or "sv_setpvs".

           Set the value of the PV  pointer  in  "sv"  to  the  Perl  allocated
           "NUL"-terminated string "val".  See also "SvIV_set".

           Remember  to  free  the previous PV buffer. There are many things to
           check.  Beware that the existing pointer may be involved in copy-on-
           write   or   other   mischief,   so   do   SvOOK_off(sv)   and   use
           "sv_force_normal"  or  "SvPV_force"  (or  check  the "SvIsCOW" flag)
           first to make sure this modification is safe. Then finally, if it is
           not a COW, call "SvPV_free" to free the previous PV buffer.

            void  SvPV_set(SV* sv, char* val)

       "SvPV_shrink_to_cur"
           Trim any trailing unused memory in the PV of "sv",  which  needs  to
           have  a  real  "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 "sv" stay the same?

           If  the  answers  are  both yes, then use ""SV_CHECK_THINKFIRST"" or
           ""SV_CHECK_THINKFIRST_COW_DROP"" before calling this.

            void  SvPV_shrink_to_cur(SV* sv)

       "sv_2pvutf8"
       "sv_2pvutf8_flags"
           These implement the various forms of  the  ""SvPVutf8""  in  perlapi
           macros.  The macros are the preferred interface.

           These  return  a  pointer to the UTF-8-encoded representation of the
           SV, and set *lp to its length in bytes.  They may cause the SV to be
           upgraded to UTF-8 as a side-effect.

           The forms differ in that plain "sv_2pvutf8" always  processes  'get'
           magic;  and  "sv_2pvutf8_flags" processes 'get' magic if and only if
           "flags" contains "SV_GMAGIC".

            char *  sv_2pvutf8      (SV *sv, STRLEN * const lp)
            char *  sv_2pvutf8_flags(SV *sv, STRLEN * const lp,
                                     const U32 flags)

       "SvPVX"
       "SvPVX_const"
       "SvPVX_mutable"
       "SvPVXx"
           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 type >= "SVt_PV".

           These are also used to store the name of an autoloaded subroutine in
           an XS AUTOLOAD routine.  See "Autoloading with XSUBs" in perlguts.

           "SvPVXx" is identical to "SvPVX".

           "SvPVX_mutable" is merely  a  synonym  for  "SvPVX",  but  its  name
           emphasizes that the string is modifiable by the caller.

           "SvPVX_const" differs in that the return value has been cast so that
           the compiler will complain if you were to try to modify the contents
           of the string, (unless you cast away const yourself).

            char*        SvPVX        (SV* sv)
            const char*  SvPVX_const  (SV* sv)
            char*        SvPVX_mutable(SV* sv)
            char*        SvPVXx       (SV* sv)

       "SvPVXtrue"
           Returns  a  boolean  as to whether or not "sv" contains a PV that is
           considered TRUE.  FALSE is returned if "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,  "sv"  is  evaluated exactly once; in earlier
           releases, it could be evaluated more than once.

            bool  SvPVXtrue(SV *sv)

       "SvREADONLY"
           Returns true if the argument is readonly, otherwise  returns  false.
           Exposed to perl code via Internals::SvREADONLY().

            U32  SvREADONLY(SV* sv)

       "SvREADONLY_off"
           Mark  an  object  as not-readonly. Exactly what this mean depends on
           the object type. Exposed to perl code via Internals::SvREADONLY().

            U32  SvREADONLY_off(SV* sv)

       "SvREADONLY_on"
           Mark an object as readonly. Exactly what this means depends  on  the
           object type. Exposed to perl code via Internals::SvREADONLY().

            U32  SvREADONLY_on(SV* sv)

       "sv_ref"
           Returns a SV describing what the SV passed in is a reference to.

           dst  can be a SV to be set to the description or NULL, in which case
           a mortal SV is returned.

           If ob is true and the SV is blessed, the description  is  the  class
           name, otherwise it is the type of the SV, "SCALAR", "ARRAY" etc.

            SV *  sv_ref(SV *dst, const SV * const sv, const int ob)

       "SvREFCNT"
           Returns  the  value of the object's reference count. Exposed to perl
           code via Internals::SvREFCNT().

            U32  SvREFCNT(SV* sv)

       "SvREFCNT_dec"
       "SvREFCNT_dec_set_NULL"
       "SvREFCNT_dec_ret_NULL"
       "SvREFCNT_dec_NN"
           These decrement the reference count of the given SV.

           "SvREFCNT_dec_NN" may only be used when "sv"  is  known  to  not  be
           "NULL".

           The   function   SvREFCNT_dec_ret_NULL()   is   identical   to   the
           SvREFCNT_dec() except it returns a NULL  "SV  *".   It  is  used  by
           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);

            void  SvREFCNT_dec         (SV *sv)
            void  SvREFCNT_dec_set_NULL(SV *sv)
            SV *  SvREFCNT_dec_ret_NULL(SV *sv)
            void  SvREFCNT_dec_NN      (SV *sv)

       "SvREFCNT_inc"
       "SvREFCNT_inc_NN"
       "SvREFCNT_inc_simple"
       "SvREFCNT_inc_simple_NN"
       "SvREFCNT_inc_simple_void"
       "SvREFCNT_inc_simple_void_NN"
       "SvREFCNT_inc_void"
       "SvREFCNT_inc_void_NN"
           These all increment the reference count of the given SV.   The  ones
           without "void" in their names return the SV.

           "SvREFCNT_inc"  is the base operation; the rest are optimizations if
           various input constraints are known to be true; hence,  all  can  be
           replaced with "SvREFCNT_inc".

           "SvREFCNT_inc_NN"  can  only be used if you know "sv" is not "NULL".
           Since we don't have to check the NULLness, it's faster and smaller.

           "SvREFCNT_inc_void" can only be used if you don't  need  the  return
           value.  The macro doesn't need to return a meaningful value.

           "SvREFCNT_inc_void_NN"  can  only be used if you both don't need the
           return value, and you know that  "sv"  is  not  "NULL".   The  macro
           doesn't need to return a meaningful value, or check for NULLness, so
           it's smaller and faster.

           "SvREFCNT_inc_simple" can only be used with expressions without side
           effects.   Since  we  don't  have  to  store a temporary value, it's
           faster.

           "SvREFCNT_inc_simple_NN" can only be used with  expressions  without
           side  effects  and you know "sv" is not "NULL".  Since we don't have
           to store a temporary value, nor check for NULLness, it's faster  and
           smaller.

           "SvREFCNT_inc_simple_void" can only be used with expressions without
           side effects and you don't need the return value.

           "SvREFCNT_inc_simple_void_NN"  can  only  be  used  with expressions
           without side effects, you don't need the return value, and you  know
           "sv" is not "NULL".

            SV *  SvREFCNT_inc               (SV *sv)
            SV *  SvREFCNT_inc_NN            (SV *sv)
            SV*   SvREFCNT_inc_simple        (SV* sv)
            SV*   SvREFCNT_inc_simple_NN     (SV* sv)
            void  SvREFCNT_inc_simple_void   (SV* sv)
            void  SvREFCNT_inc_simple_void_NN(SV* sv)
            void  SvREFCNT_inc_void          (SV *sv)
            void  SvREFCNT_inc_void_NN       (SV* sv)

       "sv_reftype"
           Returns a string describing what the SV is a reference to.

           If  ob  is true and the SV is blessed, the string is the class name,
           otherwise it is the type of the SV, "SCALAR", "ARRAY" etc.

            const char *  sv_reftype(const SV * const sv, const int ob)

       "sv_replace"
           Make the first argument a  copy  of  the  second,  then  delete  the
           original.  The target SV physically takes over ownership of the body
           of  the  source SV and inherits its flags; however, the target keeps
           any magic it owns, and any magic in the source is  discarded.   Note
           that  this  is a rather specialist SV copying operation; most of the
           time you'll want to use "sv_setsv" or one of its many  macro  front-
           ends.

            void  sv_replace(SV * const sv, SV * const nsv)

       "sv_report_used"
           Dump the contents of all SVs not yet freed (debugging aid).

            void  sv_report_used()

       "sv_reset"
           Underlying  implementation for the "reset" Perl function.  Note that
           the perl-level function is vaguely deprecated.

            void  sv_reset(const char *s, HV * const stash)

       "SvROK"
           Tests if the SV is an RV.

            U32  SvROK(SV* sv)

       "SvROK_off"
           Unsets the RV status of an SV.

            void  SvROK_off(SV* sv)

       "SvROK_on"
           Tells an SV that it is an RV.

            void  SvROK_on(SV* sv)

       "SvRV"
           Dereferences an RV to return the SV.

            SV*  SvRV(SV* sv)

       "SvRV_set"
           Set the value of the RV pointer in "sv" to val.  See "SvIV_set".

            void  SvRV_set(SV* sv, SV* val)

       "sv_rvunweaken"
           Unweaken a reference: Clear the "SvWEAKREF" flag on this RV;  remove
           the  backreference  to  this  RV  from  the  array of backreferences
           associated with the target SV, increment the refcount of the target.
           Silently ignores "undef" and warns on non-weak references.

            SV *  sv_rvunweaken(SV * const sv)

       "sv_rvweaken"
           Weaken a reference: set the "SvWEAKREF" flag on this  RV;  give  the
           referred-to  SV "PERL_MAGIC_backref" magic if it hasn't already; and
           push a back-reference to this RV onto the  array  of  backreferences
           associated with that magic.  If the RV is magical, set magic will be
           called  after the RV is cleared.  Silently ignores "undef" and warns
           on already-weak references.

            SV *  sv_rvweaken(SV * const sv)

       "sv_setbool"
       "sv_setbool_mg"
           These set an SV to a true or false boolean value, upgrading first if
           necessary.

           They differ  only  in  that  "sv_setbool_mg"  handles  'set'  magic;
           "sv_setbool" does not.

            void  sv_setbool(SV *sv, bool b)

       "sv_set_bool"
           Equivalent to "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 "$sv = !!$expr;".

           Introduced in perl 5.35.11.

            void  sv_set_bool(SV *sv, const bool bool_val)

       "sv_set_false"
           Equivalent  to  "sv_setsv(sv,  &PL_sv_no)",  but  may  be  made more
           efficient in the future. Doesn't handle set magic.

           The perl equivalent is "$sv = !1;".

           Introduced in perl 5.35.11.

            void  sv_set_false(SV *sv)

       "sv_setiv"
       "sv_setiv_mg"
           These copy  an  integer  into  the  given  SV,  upgrading  first  if
           necessary.

           They   differ  only  in  that  "sv_setiv_mg"  handles  'set'  magic;
           "sv_setiv" does not.

            void  sv_setiv   (SV * const sv, const IV num)
            void  sv_setiv_mg(SV * const sv, const IV i)

       "SvSETMAGIC"
           Invokes "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 $|
           or a tied variable (it calls "STORE").   This  macro  evaluates  its
           argument more than once.

            void  SvSETMAGIC(SV* sv)

       "SvSetMagicSV"
       "SvSetMagicSV_nosteal"
       "SvSetSV"
       "SvSetSV_nosteal"
           if "dsv" is the same as "ssv", these do nothing.  Otherwise they all
           call  some  form  of  "sv_setsv".  They may evaluate their arguments
           more than once.

           The only differences are:

           "SvSetMagicSV" and "SvSetMagicSV_nosteal" perform any required 'set'
           magic   afterwards   on   the   destination   SV;   "SvSetSV"    and
           "SvSetSV_nosteal" do not.

           "SvSetSV_nosteal"   "SvSetMagicSV_nosteal"  call  a  non-destructive
           version of "sv_setsv".

            void  SvSetMagicSV(SV* dsv, SV* ssv)

       "sv_setnv"
       "sv_setnv_mg"
           These copy a double into the given SV, upgrading first if necessary.

           They  differ  only  in  that  "sv_setnv_mg"  handles  'set'   magic;
           "sv_setnv" does not.

            void  sv_setnv(SV * const sv, const NV num)

       "sv_setpv"
       "sv_setpv_mg"
       "sv_setpvn"
       "sv_setpvn_fresh"
       "sv_setpvn_mg"
       "sv_setpvs"
       "sv_setpvs_mg"
           These   copy   a  string  into  the  SV  "sv",  making  sure  it  is
           "SvPOK_only".

           In the "pvs" forms, the string must be a C literal string,  enclosed
           in double quotes.

           In  the  "pvn"  forms, the first byte of the string is pointed to by
           "ptr", and "len"  indicates  the  number  of  bytes  to  be  copied,
           potentially including embedded "NUL" characters.

           In  the plain "pv" forms, "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 encountered "NUL" byte.

           In  the forms that take a "ptr" argument, if it is NULL, the SV will
           become undefined.

           The UTF-8 flag is not changed by these functions.

           A terminating NUL byte is guaranteed in the result.

           The "_mg" forms handle 'set' magic; the other forms skip all magic.

           "sv_setpvn_fresh" is a cut-down alternative to "sv_setpvn", intended
           ONLY to be used with a fresh sv that has been upgraded to a  SVt_PV,
           SVt_PVIV, SVt_PVNV, or SVt_PVMG.

            void  sv_setpv       (SV * const sv, const char * const ptr)
            void  sv_setpv_mg    (SV * const sv, const char * const ptr)
            void  sv_setpvn      (SV * const sv, const char * const ptr,
                                  const STRLEN len)
            void  sv_setpvn_fresh(SV * const sv, const char * const ptr,
                                  const STRLEN len)
            void  sv_setpvn_mg   (SV * const sv, const char * const ptr,
                                  const STRLEN len)
            void  sv_setpvs      (SV* sv, "literal string")
            void  sv_setpvs_mg   (SV* sv, "literal string")

       "sv_setpv_bufsize"
           Sets  the  SV  to  be  a string of "cur" bytes length, with at least
           "len" bytes available.   Ensures  that  there  is  a  null  byte  at
           "SvEND".

           Returns a char * pointer to the SvPV buffer.

           The  caller  must set the first "cur" bytes of "sv" before the first
           use of its contents.  This means that if "cur" is zero,  the  SV  is
           immediately  fully  formed  and ready to use, just like any other SV
           containing an empty string.

            char  *  sv_setpv_bufsize(SV * const sv, const STRLEN cur,
                                      const STRLEN len)

       "sv_setpvf"
       "sv_setpvf_mg"
       "sv_setpvf_mg_nocontext"
       "sv_setpvf_nocontext"
           These work like "sv_catpvf" but copy the text into the SV instead of
           appending it.

           The differences between these are:

           "sv_setpvf_mg" and  "sv_setpvf_mg_nocontext"  perform  'set'  magic;
           "sv_setpvf" and "sv_setpvf_nocontext" skip all magic.

           "sv_setpvf_nocontext"  and  "sv_setpvf_mg_nocontext"  do  not take a
           thread context ("aTHX") parameter, so are used in  situations  where
           the caller doesn't already have the thread context.

           The UTF-8 flag is not changed by these functions.

           NOTE: "sv_setpvf" must be explicitly called as "Perl_sv_setpvf" with
           an "aTHX_" parameter.

           NOTE:     "sv_setpvf_mg"    must    be    explicitly    called    as
           "Perl_sv_setpvf_mg" with an "aTHX_" parameter.

            void  Perl_sv_setpvf        (pTHX_ SV * const sv,
                                         const char * const pat, ...)
            void  Perl_sv_setpvf_mg     (pTHX_ SV * const sv,
                                         const char * const pat, ...)
            void  sv_setpvf_mg_nocontext(SV * const sv,
                                         const char * const pat, ...)
            void  sv_setpvf_nocontext   (SV * const sv,
                                         const char * const pat, ...)

       "sv_setref_iv"
           Copies an integer into a new SV, optionally blessing  the  SV.   The
           "rv"  argument  will be upgraded to an RV.  That RV will be modified
           to point to the new SV.   The  "classname"  argument  indicates  the
           package  for  the  blessing.  Set "classname" to "NULL" to avoid the
           blessing.  The new SV will have a reference count of 1, and  the  RV
           will be returned.

            SV *  sv_setref_iv(SV * const rv, const char * const classname,
                               const IV iv)

       "sv_setref_nv"
           Copies a double into a new SV, optionally blessing the SV.  The "rv"
           argument  will  be  upgraded  to an RV.  That RV will be modified to
           point to the new SV.  The "classname" argument indicates the package
           for the blessing.  Set "classname" to "NULL" to avoid the  blessing.
           The  new  SV  will  have  a reference count of 1, and the RV will be
           returned.

            SV *  sv_setref_nv(SV * const rv, const char * const classname,
                               const NV nv)

       "sv_setref_pv"
           Copies a pointer into a new SV, optionally  blessing  the  SV.   The
           "rv"  argument  will be upgraded to an RV.  That RV will be modified
           to point to the new SV.   If  the  "pv"  argument  is  "NULL",  then
           "PL_sv_undef"  will be placed into the SV.  The "classname" argument
           indicates the package for the blessing.  Set "classname"  to  "NULL"
           to avoid the blessing.  The new SV will have a reference count of 1,
           and the RV will be returned.

           Do  not  use  with  other Perl types such as HV, AV, SV, CV, because
           those objects will become corrupted by the pointer copy process.

           Note that "sv_setref_pvn" copies the string while  this  copies  the
           pointer.

            SV *  sv_setref_pv(SV * const rv, const char * const classname,
                               void * const pv)

       "sv_setref_pvn"
           Copies  a  string  into  a  new SV, optionally blessing the SV.  The
           length of the string must be specified with "n".  The "rv"  argument
           will be upgraded to an RV.  That RV will be modified to point to the
           new  SV.   The  "classname"  argument  indicates the package for the
           blessing.  Set "classname" to "NULL" to avoid the blessing.  The new
           SV will have a reference count of 1, and the RV will be returned.

           Note that "sv_setref_pv" copies the pointer while  this  copies  the
           string.

            SV *  sv_setref_pvn(SV * const rv, const char * const classname,
                                const char * const pv, const STRLEN n)

       "sv_setref_pvs"
           Like  "sv_setref_pvn",  but  takes  a  literal  string  instead of a
           string/length pair.

            SV *  sv_setref_pvs(SV *const rv, const char *const classname,
                                "literal string")

       "sv_setref_uv"
           Copies an unsigned integer into a new SV,  optionally  blessing  the
           SV.   The  "rv" argument will be upgraded to an RV.  That RV will be
           modified to point to the new SV.  The "classname" argument indicates
           the package for the blessing.  Set "classname" to  "NULL"  to  avoid
           the  blessing.  The new SV will have a reference count of 1, and the
           RV will be returned.

            SV *  sv_setref_uv(SV * const rv, const char * const classname,
                               const UV uv)

       "sv_setrv_inc"
       "sv_setrv_inc_mg"
           As "sv_setrv_noinc" but increments the reference count of ref.

           "sv_setrv_inc_mg" will invoke 'set' magic on the SV;  "sv_setrv_inc"
           will not.

            void  sv_setrv_inc(SV * const sv, SV * const ref)

       "sv_setrv_noinc"
       "sv_setrv_noinc_mg"
           Copies an SV pointer into the given SV as an SV reference, upgrading
           it if necessary. After this, SvRV(sv) is equal to ref. This does not
           adjust  the  reference  count  of ref. The reference ref must not be
           NULL.

           "sv_setrv_noinc_mg"   will   invoke   'set'   magic   on   the   SV;
           "sv_setrv_noinc" will not.

            void  sv_setrv_noinc(SV * const sv, SV * const ref)

       "sv_setsv"
       "sv_setsv_flags"
       "sv_setsv_mg"
       "sv_setsv_nomg"
           These  copy the contents of the source SV "ssv" into the destination
           SV "dsv".  "ssv" may be destroyed if it  is  mortal,  so  don't  use
           these  functions  if  the  source  SV  needs  to be reused.  Loosely
           speaking, they perform a copy-by-value,  obliterating  any  previous
           content of the destination.

           They differ only in that:

           "sv_setsv"  calls  'get'  magic  on  "ssv", but skips 'set' magic on
           "dsv".

           "sv_setsv_mg" calls both 'get' magic on "ssv"  and  'set'  magic  on
           "dsv".

           "sv_setsv_nomg" skips all magic.

           "sv_setsv_flags"  has  a  "flags"  parameter  which  you  can use to
           specify any combination of magic handling, and also you can  specify
           "SV_NOSTEAL" so that the buffers of temps will not be stolen.

           You  probably want to instead use one of the assortment of wrappers,
           such   as   "SvSetSV",   "SvSetSV_nosteal",    "SvSetMagicSV"    and
           "SvSetMagicSV_nosteal".

           "sv_setsv_flags"  is  the  primary function for copying scalars, and
           most other copy-ish functions and macros use it underneath.

            void  sv_setsv      (SV *dsv, SV *ssv)
            void  sv_setsv_flags(SV *dsv, SV *ssv, const I32 flags)
            void  sv_setsv_mg   (SV * const dsv, SV * const ssv)
            void  sv_setsv_nomg (SV *dsv, SV *ssv)

       "sv_set_true"
           Equivalent to "sv_setsv(sv,  &PL_sv_yes)",  but  may  be  made  more
           efficient in the future. Doesn't handle set magic.

           The perl equivalent is "$sv = !0;".

           Introduced in perl 5.35.11.

            void  sv_set_true(SV *sv)

       "sv_set_undef"
           Equivalent  to  "sv_setsv(sv,  &PL_sv_undef)",  but  more efficient.
           Doesn't handle set magic.

           The perl equivalent is "$sv = undef;". Note that it doesn't free any
           string buffer, unlike "undef $sv".

           Introduced in perl 5.25.12.

            void  sv_set_undef(SV *sv)

       "sv_setuv"
       "sv_setuv_mg"
           These copy an unsigned integer into the given SV, upgrading first if
           necessary.

           They  differ  only  in  that  "sv_setuv_mg"  handles  'set'   magic;
           "sv_setuv" does not.

            void  sv_setuv   (SV * const sv, const UV num)
            void  sv_setuv_mg(SV * const sv, const UV u)

       "SvSHARE"
           Arranges  for "sv" to be shared between threads if a suitable module
           has been loaded.

            void  SvSHARE(SV* sv)

       "SvSHARED_HASH"
           Returns the hash for "sv" created by "newSVpvn_share".

            struct hek*  SvSHARED_HASH(SV * sv)

       "SvSTASH"
           Returns the stash of the SV.

            HV*  SvSTASH(SV* sv)

       "SvSTASH_set"
           Set the value of the STASH pointer in "sv" to val.  See "SvIV_set".

            void  SvSTASH_set(SV* sv, HV* val)

       "sv_streq"
           A  convenient  shortcut  for  calling  "sv_streq_flags"   with   the
           "SV_GMAGIC" flag. This function basically behaves like the Perl code
           "$sv1 eq $sv2".

            bool  sv_streq(SV *sv1, SV *sv2)

       "sv_streq_flags"
           Returns  a boolean indicating whether the strings in the two SVs are
           identical. If the flags argument has the  "SV_GMAGIC"  bit  set,  it
           handles get-magic too. Will coerce its args to strings if necessary.
           Treats "NULL" as undef. Correctly handles the UTF8 flag.

           If flags does not have the "SV_SKIP_OVERLOAD" bit set, an attempt to
           use  "eq"  overloading  will  be  made. If such overloading does not
           exist or the flag is set, then regular  string  comparison  will  be
           used instead.

            bool  sv_streq_flags(SV *sv1, SV *sv2, const U32 flags)

       "SvTRUE"
       "SvTRUE_NN"
       "SvTRUE_nomg"
       "SvTRUE_nomg_NN"
       "SvTRUEx"
           These return a boolean indicating whether Perl would evaluate the SV
           as true or false.  See "SvOK" for a defined/undefined test.

           As  of  Perl  5.32,  all  are guaranteed to evaluate "sv" only once.
           Prior to that release, only "SvTRUEx" guaranteed single  evaluation;
           now "SvTRUEx" is identical to "SvTRUE".

           "SvTRUE_nomg"  and  "TRUE_nomg_NN"  do  not perform 'get' magic; the
           others do unless the scalar is already "SvPOK", "SvIOK", or  "SvNOK"
           (the public, not the private flags).

           "SvTRUE_NN"  is  like  "SvTRUE",  but "sv" is assumed to be non-null
           (NN).  If there  is  a  possibility  that  it  is  NULL,  use  plain
           "SvTRUE".

           "SvTRUE_nomg_NN"  is  like  "SvTRUE_nomg", but "sv" is assumed to be
           non-null (NN).  If there is a possibility that it is NULL, use plain
           "SvTRUE_nomg".

            bool  SvTRUE(SV *sv)

       "SvTYPE"
           Returns the type of the SV.  See "svtype".

            svtype  SvTYPE(SV* sv)

       "SvUNLOCK"
           Releases a mutual exclusion lock on "sv" if a  suitable  module  has
           been loaded.

            void  SvUNLOCK(SV* sv)

       "sv_unmagic"
           Removes all magic of type "type" from an SV.

            int  sv_unmagic(SV * const sv, const int type)

       "sv_unmagicext"
           Removes  all  magic of type "type" with the specified "vtbl" from an
           SV.

            int  sv_unmagicext(SV * const sv, const int type,
                               const MGVTBL *vtbl)

       "sv_unref"
           Unsets the RV status of the SV, and decrements the  reference  count
           of  whatever  was  being  referenced  by the RV.  This can almost be
           thought of as a reversal of  "newSVrv".   This  is  "sv_unref_flags"
           with the "flag" being zero.  See "SvROK_off".

            void  sv_unref(SV *sv)

       "sv_unref_flags"
           Unsets  the  RV status of the SV, and decrements the reference count
           of whatever was being referenced by the  RV.   This  can  almost  be
           thought  of  as  a reversal of "newSVrv".  The "cflags" argument can
           contain "SV_IMMEDIATE_UNREF" to force  the  reference  count  to  be
           decremented  (otherwise  the  decrementing  is  conditional  on  the
           reference count being different from one or the  reference  being  a
           readonly SV).  See "SvROK_off".

            void  sv_unref_flags(SV * const ref, const U32 flags)

       "SvUOK"
           Returns a boolean indicating whether the SV contains an integer that
           must be interpreted as unsigned.  A non-negative integer whose value
           is  within the range of both an IV and a UV may be flagged as either
           "SvUOK" or "SvIOK".

            bool  SvUOK(SV* sv)

       "SvUPGRADE"
           Used to upgrade an SV to a more complex form.  Uses "sv_upgrade"  to
           perform the upgrade if necessary.  See "svtype".

            void  SvUPGRADE(SV* sv, svtype type)

       "sv_upgrade"
           Upgrade  an  SV  to  a more complex form.  Generally adds a new body
           type to the SV, then copies across as much information  as  possible
           from the old body.  It croaks if the SV is already in a more complex
           form  than  requested.   You  generally  want to use the "SvUPGRADE"
           macro wrapper, which checks the type  before  calling  "sv_upgrade",
           and hence does not croak.  See also "svtype".

            void  sv_upgrade(SV * const sv, svtype new_type)

       "sv_usepvn"
       "sv_usepvn_flags"
       "sv_usepvn_mg"
           These  tell  an  SV to use "ptr" for its string value.  Normally SVs
           have their string stored inside the SV, but these tell the SV to use
           an external string instead.

           "ptr" should point to memory that was  allocated  by  ""Newx"".   It
           must  be the start of a "Newx"-ed block of memory, and not a pointer
           to the middle of it (beware of "OOK" and copy-on-write), and not  be
           from  a  non-"Newx"  memory  allocator  like  "malloc".   The string
           length, "len", must be supplied.   By  default  this  function  will
           ""Renew""  (i.e.  realloc,  move) the memory pointed to by "ptr", so
           that the pointer should not be freed or used by the programmer after
           giving it to "sv_usepvn",  and  neither  should  any  pointers  from
           "behind" that pointer (e.g., "ptr" + 1) be used.

           In  the  "sv_usepvn_flags"  form,  if  "flags & SV_SMAGIC"  is true,
           "SvSETMAGIC"    is    called    before    returning.      And     if
           "flags & SV_HAS_TRAILING_NUL"  is  true,  then  "ptr[len]"  must  be
           "NUL", and the realloc will be skipped (i.e., the buffer is actually
           at  least  1  byte  longer  than  "len",  and  already   meets   the
           requirements for storing in "SvPVX").

           "sv_usepvn"  is  merely  "sv_usepvn_flags" with "flags" set to 0, so
           'set' magic is skipped.

           "sv_usepvn_mg" is  merely  "sv_usepvn_flags"  with  "flags"  set  to
           "SV_SMAGIC", so 'set' magic is performed.

            void  sv_usepvn      (SV *sv, char *ptr, STRLEN len)
            void  sv_usepvn_flags(SV * const sv, char *ptr, const STRLEN len,
                                  const U32 flags)
            void  sv_usepvn_mg   (SV *sv, char *ptr, STRLEN len)

       "sv_utf8_decode"
           If  the  PV  of the SV is an octet sequence in Perl's extended UTF-8
           and contains a multiple-byte character, the "SvUTF8" flag is  turned
           on  so  that  it  looks  like  a character.  If the PV contains only
           single-byte characters, the "SvUTF8" flag stays off.  Scans  PV  for
           validity and returns FALSE if the PV is invalid UTF-8.

            bool  sv_utf8_decode(SV * const sv)

       "sv_utf8_downgrade"
       "sv_utf8_downgrade_flags"
       "sv_utf8_downgrade_nomg"
           These  attempt  to convert the PV of an SV from characters to bytes.
           If the PV contains a character that  cannot  fit  in  a  byte,  this
           conversion will fail; in this case, "FALSE" is returned if "fail_ok"
           is true; otherwise they croak.

           They  are  not a general purpose Unicode to byte encoding interface:
           use the "Encode" extension for that.

           They differ only in that:

           "sv_utf8_downgrade" processes 'get' magic on "sv".

           "sv_utf8_downgrade_nomg" does not.

           "sv_utf8_downgrade_flags" has an  additional  "flags"  parameter  in
           which  you  can specify "SV_GMAGIC" to process 'get' magic, or leave
           it cleared to not process 'get' magic.

            bool  sv_utf8_downgrade      (SV * const sv, const bool fail_ok)
            bool  sv_utf8_downgrade_flags(SV * const sv, const bool fail_ok,
                                          const U32 flags)
            bool  sv_utf8_downgrade_nomg (SV * const sv, const bool fail_ok)

       "sv_utf8_encode"
           Converts the PV of an SV to UTF-8, but then turns the "SvUTF8"  flag
           off so that it looks like octets again.

            void  sv_utf8_encode(SV * const sv)

       "SvUTF8_off"
           Unsets  the UTF-8 status of an SV (the data is not changed, just the
           flag).  Do not use frivolously.

            void  SvUTF8_off(SV *sv)

       "SvUTF8_on"
           Turn on the UTF-8 status of an SV (the data is not changed, just the
           flag).  Do not use frivolously.

            void  SvUTF8_on(SV *sv)

       "sv_utf8_upgrade"
       "sv_utf8_upgrade_flags"
       "sv_utf8_upgrade_flags_grow"
       "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.  They always set the
           "SvUTF8" flag to avoid future validity  checks  even  if  the  whole
           string is the same in UTF-8 as not.  They return the number of bytes
           in the converted string

           The  forms  differ in just two ways.  The main difference is whether
           or not they perform 'get  magic'  on  "sv".   "sv_utf8_upgrade_nomg"
           skips    'get    magic';    "sv_utf8_upgrade"   performs   it;   and
           "sv_utf8_upgrade_flags"  and   "sv_utf8_upgrade_flags_grow"   either
           perform  it  (if the "SV_GMAGIC" bit is set in "flags") or don't (if
           that bit is cleared).

           The other difference is  that  "sv_utf8_upgrade_flags_grow"  has  an
           additional parameter, "extra", which allows the caller to specify an
           amount  of  space  to be reserved as spare beyond what is needed for
           the actual conversion.  This is used when the caller knows  it  will
           soon  be needing yet more space, and it is more efficient to request
           space from the system in a single  call.   This  form  is  otherwise
           identical to "sv_utf8_upgrade_flags".

           These  are not a general purpose byte encoding to Unicode interface:
           use the Encode extension for that.

           The "SV_FORCE_UTF8_UPGRADE" flag is now ignored.

            STRLEN  sv_utf8_upgrade           (SV *sv)
            STRLEN  sv_utf8_upgrade_flags     (SV * const sv, const I32 flags)
            STRLEN  sv_utf8_upgrade_flags_grow(SV * const sv, const I32 flags,
                                               STRLEN extra)
            STRLEN  sv_utf8_upgrade_nomg      (SV *sv)

       "SvUTF8"
           Returns a U32 value indicating the UTF-8 status of an SV.  If things
           are set-up properly, this indicates whether or not the  SV  contains
           UTF-8  encoded  data.  You should use this after a call to "SvPV" or
           one of its variants, in case any call to string overloading  updates
           the internal flag.

           If  you  want  to  take into account the bytes pragma, use "DO_UTF8"
           instead.

            U32  SvUTF8(SV* sv)

       "SvUV"
       "SvUV_nomg"
       "SvUVx"
           These each coerce the given SV to UV and return  it.   The  returned
           value  in  many circumstances will get stored in "sv"'s UV slot, but
           not in all cases.  (Use "sv_setuv" to make sure it does).

           As of 5.37.1, all are guaranteed to evaluate "sv" only once.

           "SvUVx" is now identical to "SvUV", but prior to 5.37.1, it was  the
           only form guaranteed to evaluate "sv" only once.

            UV  SvUV(SV *sv)

       "sv_2uv_flags"
           Return  the  unsigned  integer  value  of an SV, doing any necessary
           string conversion.  If "flags" has the "SV_GMAGIC" bit set, does  an
           mg_get()  first.   Normally  used  via  the  SvUV(sv)  and SvUVx(sv)
           macros.

            UV  sv_2uv_flags(SV * const sv, const I32 flags)

       "SvUV_set"
           Set the value of the UV pointer in "sv" to val.  See "SvIV_set".

            void  SvUV_set(SV* sv, UV val)

       "SvUVX"
           Returns the raw value  in  the  SV's  UV  slot,  without  checks  or
           conversions.   Only use when you are sure "SvIOK" is true.  See also
           "SvUV".

            UV  SvUVX(SV* sv)

       "SvUVXx"
           "DEPRECATED!"  It is  planned  to  remove  "SvUVXx"  from  a  future
           release  of  Perl.   Do  not  use  it  for  new code; remove it from
           existing code.

           This is an unnecessary synonym for "SvUVX"

            UV  SvUVXx(SV* sv)

       "sv_vcatpvf"
       "sv_vcatpvf_mg"
           These process their arguments like "sv_vcatpvfn" called with a  non-
           null C-style variable argument list, and append the formatted output
           to "sv".

           They  differ  only  in  that  "sv_vcatpvf_mg"  performs 'set' magic;
           "sv_vcatpvf" skips 'set' magic.

           Both perform 'get' magic.

           They are  usually  accessed  via  their  frontends  "sv_catpvf"  and
           "sv_catpvf_mg".

            void  sv_vcatpvf(SV * const sv, const char * const pat,
                             va_list * const args)

       "sv_vcatpvfn"
       "sv_vcatpvfn_flags"
           These  process  their  arguments  like  vsprintf(3)  and  append the
           formatted output to an SV.  They use an array of SVs if the  C-style
           variable  argument  list  is  missing  ("NULL"). Argument reordering
           (using format specifiers like "%2$d" or "%*2$d") is  supported  only
           when  using an array of SVs; using a C-style "va_list" argument list
           with a format string that uses argument  reordering  will  yield  an
           exception.

           When   running   with   taint  checks  enabled,  they  indicate  via
           "maybe_tainted" if results are untrustworthy (often due to  the  use
           of locales).

           They  assume  that  "pat"  has the same utf8-ness as "sv".  It's the
           caller's responsibility to ensure that this is so.

           They differ in that "sv_vcatpvfn_flags" has a "flags"  parameter  in
           which  you  can set or clear the "SV_GMAGIC" and/or SV_SMAGIC flags,
           to specify which magic  to  handle  or  not  handle;  whereas  plain
           "sv_vcatpvfn" always specifies both 'get' and 'set' magic.

           They  are  usually  used via one of the frontends ""sv_vcatpvf"" and
           ""sv_vcatpvf_mg"".

            void  sv_vcatpvfn      (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)
            void  sv_vcatpvfn_flags(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)

       "SvVOK"
           Returns a boolean indicating whether the SV contains a v-string.

            bool  SvVOK(SV* sv)

       "sv_vsetpvf"
       "sv_vsetpvf_mg"
           These work like "sv_vcatpvf" but copy the text into the  SV  instead
           of appending it.

           They  differ  only  in  that  "sv_vsetpvf_mg"  performs 'set' magic;
           "sv_vsetpvf" skips all magic.

           They  are  usually  used  via  their  frontends,   "sv_setpvf"   and
           "sv_setpvf_mg".

           The UTF-8 flag is not changed by these functions.

            void  sv_vsetpvf(SV * const sv, const char * const pat,
                             va_list * const args)

       "sv_vsetpvfn"
           Works  like "sv_vcatpvfn" but copies the text into the SV instead of
           appending it.

           The UTF-8 flag is not changed by this function.

           Usually  used  via  one  of   its   frontends   ""sv_vsetpvf""   and
           ""sv_vsetpvf_mg"".

            void  sv_vsetpvfn(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)

       "SvVSTRING_mg"
           Returns the vstring magic, or NULL if none

            MAGIC*  SvVSTRING_mg(SV * sv)

       "vnewSVpvf"
           Like "newSVpvf" but the arguments are an encapsulated argument list.

            SV *  vnewSVpvf(const char * const pat, va_list * const args)

Tainting
       "SvTAINT"
           Taints  an  SV  if  tainting  is  enabled,  and if some input to the
           current expression is tainted--usually a variable, but possibly also
           implicit inputs such as locale settings.  "SvTAINT" propagates  that
           taintedness  to  the  outputs  of  an  expression  in  a pessimistic
           fashion; i.e., without paying attention to precisely  which  outputs
           are influenced by which inputs.

            void  SvTAINT(SV* sv)

       "SvTAINTED"
           Checks  to see if an SV is tainted.  Returns TRUE if it is, FALSE if
           not.

            bool  SvTAINTED(SV* sv)

       "SvTAINTED_off"
           Untaints an SV.  Be very careful with this  routine,  as  it  short-
           circuits  some  of  Perl's fundamental security features.  XS module
           authors should not use this function unless  they  fully  understand
           all  the  implications  of  unconditionally  untainting  the  value.
           Untainting should be done  in  the  standard  perl  fashion,  via  a
           carefully crafted regexp, rather than directly untainting variables.

            void  SvTAINTED_off(SV* sv)

       "SvTAINTED_on"
           Marks an SV as tainted if tainting is enabled.

            void  SvTAINTED_on(SV* sv)

Time
       "ASCTIME_R_PROTO"
           This  symbol  encodes  the  prototype of "asctime_r".  It is zero if
           "d_asctime_r" is  undef,  and  one  of  the  "REENTRANT_PROTO_T_ABC"
           macros of reentr.h if "d_asctime_r" is defined.

       "CTIME_R_PROTO"
           This  symbol  encodes  the  prototype  of  "ctime_r".  It is zero if
           "d_ctime_r" is undef, and one of the "REENTRANT_PROTO_T_ABC"  macros
           of reentr.h if "d_ctime_r" is defined.

       "GMTIME_MAX"
           This  symbol contains the maximum value for the "time_t" offset that
           the system function gmtime () accepts, and defaults to 0

       "GMTIME_MIN"
           This symbol contains the minimum value for the "time_t" offset  that
           the system function gmtime () accepts, and defaults to 0

       "GMTIME_R_PROTO"
           This  symbol  encodes  the  prototype  of "gmtime_r".  It is zero if
           "d_gmtime_r" is undef, and one of the "REENTRANT_PROTO_T_ABC" macros
           of reentr.h if "d_gmtime_r" is defined.

       "HAS_ASCTIME_R"
           This symbol, if defined, indicates that the "asctime_r"  routine  is
           available to asctime re-entrantly.

       "HAS_ASCTIME64"
           This  symbol,  if defined, indicates that the "asctime64" () routine
           is available to do the 64bit variant of asctime ()

       "HAS_CTIME_R"
           This symbol, if defined, indicates that  the  "ctime_r"  routine  is
           available to ctime re-entrantly.

       "HAS_CTIME64"
           This  symbol, if defined, indicates that the "ctime64" () routine is
           available to do the 64bit variant of ctime ()

       "HAS_DIFFTIME"
           This symbol, if defined, indicates that the  "difftime"  routine  is
           available.

       "HAS_DIFFTIME64"
           This  symbol, if defined, indicates that the "difftime64" () routine
           is available to do the 64bit variant of difftime ()

       "HAS_FUTIMES"
           This symbol, if defined, indicates that  the  "futimes"  routine  is
           available  to  change  file  descriptor  time  stamps  with  "struct
           timevals".

       "HAS_GETITIMER"
           This symbol, if defined, indicates that the "getitimer"  routine  is
           available to return interval timers.

       "HAS_GETTIMEOFDAY"
           This  symbol,  if  defined, indicates that the gettimeofday() system
           call is available for a sub-second accuracy clock. Usually, the file
           sys/resource.h needs to be  included  (see  "I_SYS_RESOURCE").   The
           type "Timeval" should be used to refer to ""struct timeval"".

       "HAS_GMTIME_R"
           This  symbol,  if  defined, indicates that the "gmtime_r" routine is
           available to gmtime re-entrantly.

       "HAS_GMTIME64"
           This symbol, if defined, indicates that the "gmtime64" () routine is
           available to do the 64bit variant of gmtime ()

       "HAS_LOCALTIME_R"
           This symbol, if defined, indicates that the "localtime_r" routine is
           available to localtime re-entrantly.

       "HAS_LOCALTIME64"
           This symbol, if defined, indicates that the "localtime64" () routine
           is available to do the 64bit variant of localtime ()

       "HAS_MKTIME"
           This symbol, if defined, indicates  that  the  "mktime"  routine  is
           available.

       "HAS_MKTIME64"
           This symbol, if defined, indicates that the "mktime64" () routine is
           available to do the 64bit variant of mktime ()

       "HAS_NANOSLEEP"
           This  symbol, if defined, indicates that the "nanosleep" system call
           is available to sleep with 1E-9 sec accuracy.

       "HAS_SETITIMER"
           This symbol, if defined, indicates that the "setitimer"  routine  is
           available to set interval timers.

       "HAS_STRFTIME"
           This  symbol,  if  defined, indicates that the "strftime" routine is
           available to do time formatting.

       "HAS_TIME"
           This symbol, if defined, indicates that the time() routine exists.

       "HAS_TIMEGM"
           This symbol, if defined, indicates  that  the  "timegm"  routine  is
           available to do the opposite of gmtime ()

       "HAS_TIMES"
           This  symbol, if defined, indicates that the times() routine exists.
           Note that this became obsolete on some systems ("SUNOS"), which  now
           use getrusage(). It may be necessary to include sys/times.h.

       "HAS_TM_TM_GMTOFF"
           This symbol, if defined, indicates to the C program that the "struct
           tm" has a "tm_gmtoff" field.

       "HAS_TM_TM_ZONE"
           This symbol, if defined, indicates to the C program that the "struct
           tm" has a "tm_zone" field.

       "HAS_TZNAME"
           This  symbol,  if  defined,  indicates  that the "tzname[]" array is
           available to access timezone names.

       "HAS_USLEEP"
           This symbol, if defined, indicates  that  the  "usleep"  routine  is
           available to let the process sleep on a sub-second accuracy.

       "HAS_USLEEP_PROTO"
           This  symbol,  if  defined,  indicates  that  the  system provides a
           prototype for the usleep() function.  Otherwise, it  is  up  to  the
           program to supply one.  A good guess is

            extern int usleep(useconds_t);

       "I_TIME"
           This  symbol  is always defined, and indicates to the C program that
           it should include time.h.

            #ifdef I_TIME
                #include <time.h>
            #endif

       "I_UTIME"
           This symbol, if defined, indicates to the C program that  it  should
           include utime.h.

            #ifdef I_UTIME
                #include <utime.h>
            #endif

       "LOCALTIME_MAX"
           This  symbol contains the maximum value for the "time_t" offset that
           the system function localtime () accepts, and defaults to 0

       "LOCALTIME_MIN"
           This symbol contains the minimum value for the "time_t" offset  that
           the system function localtime () accepts, and defaults to 0

       "LOCALTIME_R_NEEDS_TZSET"
           Many  libc's "localtime_r" implementations do not call tzset, making
           them differ from localtime(),  and  making  timezone  changes  using
           $"ENV"{TZ}  without explicitly calling tzset impossible. This symbol
           makes us call tzset before "localtime_r"

       "LOCALTIME_R_PROTO"
           This symbol encodes the prototype of "localtime_r".  It is  zero  if
           "d_localtime_r"  is  undef,  and  one of the "REENTRANT_PROTO_T_ABC"
           macros of reentr.h if "d_localtime_r" is defined.

       "L_R_TZSET"
           If localtime_r() needs tzset, it is defined in this define

       "mini_mktime"
           normalise "struct tm" values without the localtime() semantics  (and
           overhead) of mktime().

            void  mini_mktime(struct tm *ptm)

       "sv_strftime_tm"
       "my_strftime"
           These implement the libc strftime().

           On failure, they return NULL, and set "errno" to "EINVAL".

           "sv_strftime_tm"  is  preferred,  as  it  transparently  handles the
           UTF-8ness of the current locale, the input "fmt", and  the  returned
           result.   Only  if  the current "LC_TIME" locale is a UTF-8 one (and
           "use bytes" is not in effect) will the result be marked as UTF-8.

           "sv_strftime_tm"  takes  a  pointer  to  a   filled-in   "struct tm"
           parameter.  It ignores the values of the "wday" and "yday" fields in
           it.    The  other  fields  give  enough  information  to  accurately
           calculate these values, and are used for that purpose.

           The caller assumes ownership of the returned  SV  with  a  reference
           count of 1.

           "my_strftime"  is  kept for backwards compatibility.  Knowing if its
           result should be considered UTF-8 or not requires significant  extra
           logic.

           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, unlike libc strftime().

           The   "wday",   "yday",   and  "isdst"  parameters  are  ignored  by
           "my_strftime".  Daylight savings time is never considered to  exist,
           and  the  values  returned  for  the other two fields (if "fmt" even
           calls for them) are calculated from the  other  parameters,  without
           need for referencing these.

           Note  that  both  functions  are  always  executed in the underlying
           "LC_TIME" locale of  the  program,  giving  results  based  on  that
           locale.

            SV *    sv_strftime_tm(SV *fmt, const struct tm *mytm)
            char *  my_strftime   (const char *fmt, int sec, int min,
                                   int hour, int mday, int mon, int year,
                                   int wday, int yday, int isdst)

Typedef names
       "DB_Hash_t"
           This symbol contains the type of the prefix structure element in the
           db.h  header  file.   In  older versions of DB, it was int, while in
           newer ones it is "size_t".

       "DB_Prefix_t"
           This symbol contains the type of the prefix structure element in the
           db.h header file.  In older versions of DB, it  was  int,  while  in
           newer ones it is "u_int32_t".

       "Direntry_t"
           This  symbol  is  set  to  '"struct  direct"'  or  '"struct dirent"'
           depending on whether dirent is available or not. You should use this
           pseudo type to portably declare your directory entries.

       "Fpos_t"
           This symbol holds the type used to declare file positions  in  libc.
           It  can  be  "fpos_t",  long,  uint,  etc...  It may be necessary to
           include sys/types.h to get any typedef'ed information.

       "Free_t"
           This variable contains the return type of  free().   It  is  usually
           void, but occasionally int.

       "Gid_t"
           This  symbol  holds  the  return  type  of  getgid() and the type of
           argument to setrgid() and related functions.  Typically, it  is  the
           type  of  group  ids  in the kernel. It can be int, ushort, "gid_t",
           etc... It may  be  necessary  to  include  sys/types.h  to  get  any
           typedef'ed information.

       "Gid_t_f"
           This symbol defines the format string used for printing a "Gid_t".

       "Gid_t_sign"
           This  symbol  holds the signedness of a "Gid_t".  1 for unsigned, -1
           for signed.

       "Gid_t_size"
           This symbol holds the size of a "Gid_t" in bytes.

       "Groups_t"
           This  symbol  holds  the  type  used  for  the  second  argument  to
           getgroups()  and  setgroups().  Usually, this is the same as gidtype
           ("gid_t") , but sometimes it isn't.  It can be int, ushort, "gid_t",
           etc...  It may be  necessary  to  include  sys/types.h  to  get  any
           typedef'ed   information.    This  is  only  required  if  you  have
           getgroups() or setgroups()..

       "Malloc_t"
           This symbol is the type of pointer returned by malloc and realloc.

       "Mmap_t"
           This symbol holds the return type of the  mmap()  system  call  (and
           simultaneously  the  type  of  the  first argument).  Usually set to
           'void *' or '"caddr_t"'.

       "Mode_t"
           This symbol holds the type used to declare file  modes  for  systems
           calls.   It  is  usually "mode_t", but may be int or unsigned short.
           It may be necessary to include sys/types.h  to  get  any  typedef'ed
           information.

       "Netdb_hlen_t"
           This   symbol   holds   the  type  used  for  the  2nd  argument  to
           gethostbyaddr().

       "Netdb_host_t"
           This  symbol  holds  the  type  used  for  the   1st   argument   to
           gethostbyaddr().

       "Netdb_name_t"
           This symbol holds the type used for the argument to gethostbyname().

       "Netdb_net_t"
           This   symbol   holds   the  type  used  for  the  1st  argument  to
           getnetbyaddr().

       "Off_t"
           This symbol holds the type used to declare offsets  in  the  kernel.
           It  can be int, long, "off_t", etc... It may be necessary to include
           sys/types.h to get any typedef'ed information.

       "Off_t_size"
           This symbol holds the number of bytes used by the "Off_t".

       "Pid_t"
           This symbol holds the type  used  to  declare  process  ids  in  the
           kernel.  It can be int, uint, "pid_t", etc... It may be necessary to
           include sys/types.h to get any typedef'ed information.

       "Rand_seed_t"
           This  symbol  defines  the  type  of the argument of the random seed
           function.

       "Select_fd_set_t"
           This symbol holds the type used for the 2nd, 3rd, and 4th  arguments
           to  select.   Usually,  this  is  '"fd_set"  *',  if "HAS_FD_SET" is
           defined, and 'int *' otherwise.  This is only  useful  if  you  have
           select(), of course.

       "Shmat_t"
           This  symbol  holds  the  return  type  of  the shmat() system call.
           Usually set to 'void *' or 'char *'.

       "Signal_t"
           This symbol's value is either "void" or "int", corresponding to  the
           appropriate  return type of a signal handler.  Thus, you can declare
           a signal handler using ""Signal_t"  (*handler)()",  and  define  the
           handler using ""Signal_t" handler(sig)".

       "Size_t"
           This  symbol  holds  the  type used to declare length parameters for
           string functions.  It is usually "size_t", but may be unsigned long,
           int, etc.  It may be necessary to include  sys/types.h  to  get  any
           typedef'ed information.

       "Size_t_size"
           This symbol holds the size of a "Size_t" in bytes.

       "Sock_size_t"
           This  symbol  holds  the  type used for the size argument of various
           socket calls (just the base type, not the pointer-to).

       "SSize_t"
           This symbol holds the type used by functions that return a count  of
           bytes  or  an  error  condition.   It  must be a signed type.  It is
           usually "ssize_t", but may be long or int, etc.  It may be necessary
           to  include  sys/types.h  or  unistd.h   to   get   any   typedef'ed
           information.   We  will  pick  a  type  such that sizeof(SSize_t) ==
           sizeof(Size_t).

       "Time_t"
           This symbol holds the type returned by time(). It can  be  long,  or
           "time_t"  on  "BSD"  sites  (in  which  case  sys/types.h  should be
           included).

       "Uid_t"
           This symbol holds the type used to declare user ids in  the  kernel.
           It  can  be  int,  ushort,  "uid_t",  etc...  It may be necessary to
           include sys/types.h to get any typedef'ed information.

       "Uid_t_f"
           This symbol defines the format string used for printing a "Uid_t".

       "Uid_t_sign"
           This symbol holds the signedness of a "Uid_t".  1 for  unsigned,  -1
           for signed.

       "Uid_t_size"
           This symbol holds the size of a "Uid_t" in bytes.

Unicode Support
       "Unicode Support" in perlguts has an introduction to this API.

       See  also  "Character  classification",  "Character  case changing", and
       "String Handling".  Various functions outside  this  section  also  work
       specially with Unicode.  Search for the string "utf8" in this document.

       "BOM_UTF8"
           This  is  a  macro that evaluates to a string constant of the  UTF-8
           bytes that define the Unicode  BYTE  ORDER  MARK  (U+FEFF)  for  the
           platform  that  perl  is  compiled  on.   This  allows code to use a
           mnemonic for this character that works  on  both  ASCII  and  EBCDIC
           platforms.   "sizeof(BOM_UTF8) - 1" can be used to get its length in
           bytes.

       "bytes_cmp_utf8"
           Compares the sequence of  characters  (stored  as  octets)  in  "b",
           "blen"  with  the  sequence  of characters (stored as UTF-8) in "u",
           "ulen".  Returns 0 if they are equal, -1 or -2 if the  first  string
           is  less  than  the  second  string, +1 or +2 if the first string is
           greater than the second string.

           -1 or +1 is returned if the shorter  string  was  identical  to  the
           start  of  the  longer  string.  -2 or +2 is returned if there was a
           difference between characters within the strings.

            int  bytes_cmp_utf8(const U8 *b, STRLEN blen, const U8 *u,
                                STRLEN ulen)

       "bytes_from_utf8"
           NOTE: "bytes_from_utf8" is experimental and may change or be removed
           without notice.

           Converts a potentially UTF-8 encoded string "s" of length *lenp into
           native byte encoding.  On input, the boolean *is_utf8p gives whether
           or not "s" is actually encoded in UTF-8.

           Unlike  "utf8_to_bytes"  but  like  "bytes_to_utf8",  this  is  non-
           destructive of the input string.

           Do  nothing  if  *is_utf8p  is 0, or if there are code points in the
           string not expressible in native byte  encoding.   In  these  cases,
           *is_utf8p  and  *lenp  are  unchanged,  and  the return value is the
           original "s".

           Otherwise, *is_utf8p is set to 0, and the return value is a  pointer
           to  a  newly created string containing a downgraded copy of "s", and
           whose length is returned in  *lenp,  updated.   The  new  string  is
           "NUL"-terminated.   The  caller is responsible for arranging for the
           memory used by this string to get freed.

           Upon successful return, the number of variants in the string can  be
           computed  by  having  saved  the value of *lenp before the call, and
           subtracting the after-call value of *lenp from it.

            U8 *  bytes_from_utf8(const U8 *s, STRLEN *lenp, bool *is_utf8p)

       "bytes_to_utf8"
           NOTE: "bytes_to_utf8" is experimental and may change or  be  removed
           without notice.

           Converts a string "s" of length *lenp bytes from the native encoding
           into UTF-8.  Returns a pointer to the newly-created string, and sets
           *lenp to reflect the new length in bytes.  The caller is responsible
           for arranging for the memory used by this string to get freed.

           Upon  successful return, the number of variants in the string can be
           computed by having saved the value of *lenp  before  the  call,  and
           subtracting it from the after-call value of *lenp.

           A "NUL" character will be written after the end of the string.

           If you want to convert to UTF-8 from encodings other than the native
           (Latin1 or EBCDIC), see "sv_recode_to_utf8"().

            U8 *  bytes_to_utf8(const U8 *s, STRLEN *lenp)

       "DO_UTF8"
           Returns a bool giving whether or not the PV in "sv" is to be treated
           as being encoded in UTF-8.

           You  should  use this after a call to SvPV() or one of its variants,
           in case any call to string overloading updates  the  internal  UTF-8
           encoding flag.

            bool  DO_UTF8(SV* sv)

       "foldEQ_utf8"
           Returns  true  if  the leading portions of the strings "s1" and "s2"
           (either or both of which  may  be  in  UTF-8)  are  the  same  case-
           insensitively; false otherwise.  How far into the strings to compare
           is determined by other input parameters.

           If  "u1"  is true, the string "s1" is assumed to be in UTF-8-encoded
           Unicode; otherwise it is assumed to be  in  native  8-bit  encoding.
           Correspondingly for "u2" with respect to "s2".

           If  the  byte  length "l1" is non-zero, it says how far into "s1" to
           check for fold equality.  In other words, "s1"+"l1" will be used  as
           a  goal  to  reach.   The  scan will not be considered to be a match
           unless the goal is reached, and scanning won't  continue  past  that
           goal.  Correspondingly for "l2" with respect to "s2".

           If  "pe1"  is non-"NULL" and the pointer it points to is not "NULL",
           that pointer is considered an end pointer to  the  position  1  byte
           past  the  maximum  point  in  "s1"  beyond  which scanning will not
           continue under any circumstances.  (This routine assumes that  UTF-8
           encoded  input  strings are not malformed; malformed input can cause
           it to read past "pe1").  This means that if both "l1" and "pe1"  are
           specified, and "pe1" is less than "s1"+"l1", the match will never be
           successful  because it can never get as far as its goal (and in fact
           is asserted against).  Correspondingly for  "pe2"  with  respect  to
           "s2".

           At least one of "s1" and "s2" must have a goal (at least one of "l1"
           and  "l2" must be non-zero), and if both do, both have to be reached
           for a successful match.   Also,  if  the  fold  of  a  character  is
           multiple characters, all of them must be matched (see tr21 reference
           below for 'folding').

           Upon  a  successful match, if "pe1" is non-"NULL", it will be set to
           point to the beginning of the next character of "s1" beyond what was
           matched.  Correspondingly for "pe2" and "s2".

           For case-insensitiveness,  the  "casefolding"  of  Unicode  is  used
           instead    of    upper/lowercasing    both   the   characters,   see
           <https://www.unicode.org/reports/tr21/> (Case Mappings).

            I32  foldEQ_utf8(const char *s1, char **pe1, UV l1, bool u1,
                             const char *s2, char **pe2, UV l2, bool u2)

       "is_ascii_string"
           This is a misleadingly-named synonym for "is_utf8_invariant_string".
           On ASCII-ish platforms, the name isn't misleading:  the  ASCII-range
           characters  are  exactly  the UTF-8 invariants.  But EBCDIC machines
           have  more  invariants  than   just   the   ASCII   characters,   so
           "is_utf8_invariant_string" is preferred.

            bool  is_ascii_string(const U8 * const s, STRLEN len)

       "isC9_STRICT_UTF8_CHAR"
           Evaluates  to non-zero if the first few bytes of the string starting
           at "s" and looking no further than  "e - 1"  are  well-formed  UTF-8
           that  represents some Unicode non-surrogate code point; otherwise it
           evaluates to 0.   If  non-zero,  the  value  gives  how  many  bytes
           starting at "s" comprise the code point's representation.  Any bytes
           remaining  before  "e", but beyond the ones needed to form the first
           code point in "s", are not examined.

           The largest acceptable code point is the Unicode  maximum  0x10FFFF.
           This  differs from "isSTRICT_UTF8_CHAR" only in that it accepts non-
           character code points.  This corresponds to Unicode  Corrigendum  #9
           <http://www.unicode.org/versions/corrigendum9.html>.    which   said
           that non-character code points are merely  discouraged  rather  than
           completely  forbidden  in  open interchange.  See "Noncharacter code
           points" in perlunicode.

           Use  "isUTF8_CHAR"  to  check  for  Perl's   extended   UTF-8;   and
           "isUTF8_CHAR_flags" for a more customized definition.

           Use  "is_c9strict_utf8_string",  "is_c9strict_utf8_string_loc",  and
           "is_c9strict_utf8_string_loclen" to check entire strings.

            Size_t  isC9_STRICT_UTF8_CHAR(const U8 * const s0,
                                          const U8 * const e)

       "is_c9strict_utf8_string"
           Returns TRUE if the first "len" bytes of string  "s"  form  a  valid
           UTF-8-encoded   string  that  conforms  to  Unicode  Corrigendum  #9
           <http://www.unicode.org/versions/corrigendum9.html>;  otherwise   it
           returns FALSE.  If "len" is 0, it will be calculated using strlen(s)
           (which  means  if  you use this option, that "s" can't have embedded
           "NUL" characters and has to have a terminating  "NUL"  byte).   Note
           that all characters being ASCII constitute 'a valid UTF-8 string'.

           This  function  returns FALSE for strings containing any code points
           above the Unicode max of 0x10FFFF  or  surrogate  code  points,  but
           accepts    non-character    code    points    per   Corrigendum   #9
           <http://www.unicode.org/versions/corrigendum9.html>.

           See also "is_utf8_invariant_string", "is_utf8_invariant_string_loc",
           "is_utf8_string",   "is_utf8_string_flags",    "is_utf8_string_loc",
           "is_utf8_string_loc_flags",                 "is_utf8_string_loclen",
           "is_utf8_string_loclen_flags",      "is_utf8_fixed_width_buf_flags",
           "is_utf8_fixed_width_buf_loc_flags",
           "is_utf8_fixed_width_buf_loclen_flags",     "is_strict_utf8_string",
           "is_strict_utf8_string_loc",         "is_strict_utf8_string_loclen",
           "is_c9strict_utf8_string_loc", and "is_c9strict_utf8_string_loclen".

            bool  is_c9strict_utf8_string(const U8 *s, STRLEN len)

       "is_c9strict_utf8_string_loc"
           Like  "is_c9strict_utf8_string"  but  stores  the  location  of  the
           failure  (in  the  case  of  "utf8ness  failure")  or  the  location
           "s"+"len" (in the case of "utf8ness success") in the "ep" pointer.

           See also "is_c9strict_utf8_string_loclen".

            bool  is_c9strict_utf8_string_loc(const U8 *s, STRLEN len,
                                              const U8 **ep)

       "is_c9strict_utf8_string_loclen"
           Like  "is_c9strict_utf8_string"  but  stores  the  location  of  the
           failure  (in  the  case  of  "utf8ness  failure")  or  the  location
           "s"+"len"  (in  the case of "utf8ness success") in the "ep" pointer,
           and the number of UTF-8 encoded characters in the "el" pointer.

           See also "is_c9strict_utf8_string_loc".

            bool  is_c9strict_utf8_string_loclen(const U8 *s, STRLEN len,
                                                 const U8 **ep, STRLEN *el)

       "is_invariant_string"
           This    is    a    somewhat    misleadingly-named    synonym     for
           "is_utf8_invariant_string".       "is_utf8_invariant_string"      is
           preferred, as it indicates  under  what  conditions  the  string  is
           invariant.

            bool  is_invariant_string(const U8 * const s, STRLEN len)

       "isSTRICT_UTF8_CHAR"
           Evaluates  to non-zero if the first few bytes of the string starting
           at "s" and looking no further than  "e - 1"  are  well-formed  UTF-8
           that  represents  some  Unicode code point completely acceptable for
           open interchange between all applications; otherwise it evaluates to
           0.  If non-zero, the value gives how  many  bytes  starting  at  "s"
           comprise  the  code  point's  representation.   Any  bytes remaining
           before "e", but beyond the ones needed to form the first code  point
           in "s", are not examined.

           The  largest  acceptable code point is the Unicode maximum 0x10FFFF,
           and must not be a surrogate nor a non-character  code  point.   Thus
           this excludes any code point from Perl's extended UTF-8.

           This  is  used to efficiently decide if the next few bytes in "s" is
           legal Unicode-acceptable UTF-8 for a single character.

           Use  "isC9_STRICT_UTF8_CHAR"  to  use  the  Unicode  Corrigendum  #9
           <http://www.unicode.org/versions/corrigendum9.html>   definition  of
           allowable code points; "isUTF8_CHAR" to check  for  Perl's  extended
           UTF-8; and "isUTF8_CHAR_flags" for a more customized definition.

           Use    "is_strict_utf8_string",   "is_strict_utf8_string_loc",   and
           "is_strict_utf8_string_loclen" to check entire strings.

            Size_t  isSTRICT_UTF8_CHAR(const U8 * const s0,
                                       const U8 * const e)

       "is_strict_utf8_string"
           Returns TRUE if the first "len" bytes of string  "s"  form  a  valid
           UTF-8-encoded   string   that   is   fully  interchangeable  by  any
           application using Unicode rules; otherwise  it  returns  FALSE.   If
           "len"  is  0,  it will be calculated using strlen(s) (which means if
           you use this option, that "s" can't have embedded  "NUL"  characters
           and has to have a terminating "NUL" byte).  Note that all characters
           being ASCII constitute 'a valid UTF-8 string'.

           This  function  returns FALSE for strings containing any code points
           above the Unicode max of 0x10FFFF, surrogate code  points,  or  non-
           character code points.

           See also "is_utf8_invariant_string", "is_utf8_invariant_string_loc",
           "is_utf8_string",    "is_utf8_string_flags",   "is_utf8_string_loc",
           "is_utf8_string_loc_flags",                 "is_utf8_string_loclen",
           "is_utf8_string_loclen_flags",      "is_utf8_fixed_width_buf_flags",
           "is_utf8_fixed_width_buf_loc_flags",
           "is_utf8_fixed_width_buf_loclen_flags", "is_strict_utf8_string_loc",
           "is_strict_utf8_string_loclen",           "is_c9strict_utf8_string",
           "is_c9strict_utf8_string_loc", and "is_c9strict_utf8_string_loclen".

            bool  is_strict_utf8_string(const U8 *s, STRLEN len)

       "is_strict_utf8_string_loc"
           Like  "is_strict_utf8_string" but stores the location of the failure
           (in the case of "utf8ness failure") or the  location  "s"+"len"  (in
           the case of "utf8ness success") in the "ep" pointer.

           See also "is_strict_utf8_string_loclen".

            bool  is_strict_utf8_string_loc(const U8 *s, STRLEN len,
                                            const U8 **ep)

       "is_strict_utf8_string_loclen"
           Like  "is_strict_utf8_string" but stores the location of the failure
           (in the case of "utf8ness failure") or the  location  "s"+"len"  (in
           the  case of "utf8ness success") in the "ep" pointer, and the number
           of UTF-8 encoded characters in the "el" pointer.

           See also "is_strict_utf8_string_loc".

            bool  is_strict_utf8_string_loclen(const U8 *s, STRLEN len,
                                               const U8 **ep, STRLEN *el)

       "isUTF8_CHAR"
           Evaluates to non-zero if the first few bytes of the string  starting
           at "s" and looking no further than "e - 1" are well-formed UTF-8, as
           extended  by  Perl,  that  represents  some code point; otherwise it
           evaluates to 0.   If  non-zero,  the  value  gives  how  many  bytes
           starting at "s" comprise the code point's representation.  Any bytes
           remaining  before  "e", but beyond the ones needed to form the first
           code point in "s", are not examined.

           The code point can be any that will fit in an IV  on  this  machine,
           using  Perl's  extension to official UTF-8 to represent those higher
           than the Unicode maximum of 0x10FFFF.  That means that this macro is
           used to efficiently decide if the next few bytes  in  "s"  is  legal
           UTF-8 for a single character.

           Use  "isSTRICT_UTF8_CHAR"  to restrict the acceptable code points to
           those  defined  by  Unicode  to  be  fully  interchangeable   across
           applications; "isC9_STRICT_UTF8_CHAR" to use the Unicode Corrigendum
           #9 <http://www.unicode.org/versions/corrigendum9.html> definition of
           allowable code points; and "isUTF8_CHAR_flags" for a more customized
           definition.

           Use        "is_utf8_string",        "is_utf8_string_loc",        and
           "is_utf8_string_loclen" to check entire strings.

           Note also that a UTF-8 "invariant" character  (i.e.  ASCII  on  non-
           EBCDIC machines) is a valid UTF-8 character.

            Size_t  isUTF8_CHAR(const U8 * const s0, const U8 * const e)

       "is_utf8_char_buf"
           This is identical to the macro "isUTF8_CHAR" in perlapi.

            STRLEN  is_utf8_char_buf(const U8 *buf, const U8 *buf_end)

       "isUTF8_CHAR_flags"
           Evaluates  to non-zero if the first few bytes of the string starting
           at "s" and looking no further than "e - 1" are well-formed UTF-8, as
           extended by Perl, that represents some code point,  subject  to  the
           restrictions given by "flags"; otherwise it evaluates to 0.  If non-
           zero,  the  value  gives how many bytes starting at "s" comprise the
           code point's representation.  Any bytes remaining  before  "e",  but
           beyond  the ones needed to form the first code point in "s", are not
           examined.

           If "flags" is 0, this gives the same results  as  "isUTF8_CHAR";  if
           "flags"  is "UTF8_DISALLOW_ILLEGAL_INTERCHANGE", this gives the same
           results    as    "isSTRICT_UTF8_CHAR";    and    if    "flags"    is
           "UTF8_DISALLOW_ILLEGAL_C9_INTERCHANGE",  this gives the same results
           as  "isC9_STRICT_UTF8_CHAR".    Otherwise   "flags"   may   be   any
           combination   of   the   "UTF8_DISALLOW_foo"   flags  understood  by
           "utf8n_to_uvchr", with the same meanings.

           The three alternative  macros  are  for  the  most  commonly  needed
           validations;  they  are likely to run somewhat faster than this more
           general one, as they can be inlined into your code.

           Use    "is_utf8_string_flags",    "is_utf8_string_loc_flags",    and
           "is_utf8_string_loclen_flags" to check entire strings.

            Size_t  isUTF8_CHAR_flags(const U8 * const s0, const U8 * const e,
                                      const U32 flags)

       "is_utf8_fixed_width_buf_flags"
           Returns  TRUE  if the fixed-width buffer starting at "s" with length
           "len" is entirely valid UTF-8, subject to the restrictions given  by
           "flags"; otherwise it returns FALSE.

           If  "flags"  is  0,  any  well-formed UTF-8, as extended by Perl, is
           accepted without restriction.  If the final few bytes of the  buffer
           do  not  form  a  complete code point, this will return TRUE anyway,
           provided that "is_utf8_valid_partial_char_flags"  returns  TRUE  for
           them.

           If   "flags"   in  non-zero,  it  can  be  any  combination  of  the
           "UTF8_DISALLOW_foo" flags accepted by "utf8n_to_uvchr", and with the
           same meanings.

           This function differs from "is_utf8_string_flags" only in  that  the
           latter returns FALSE if the final few bytes of the string don't form
           a complete code point.

            bool  is_utf8_fixed_width_buf_flags(const U8 * const s,
                                                STRLEN len, const U32 flags)

       "is_utf8_fixed_width_buf_loc_flags"
           Like  "is_utf8_fixed_width_buf_flags" but stores the location of the
           failure in the "ep" pointer.  If the function returns TRUE, *ep will
           point to the beginning of any partial character at the  end  of  the
           buffer; if there is no partial character *ep will contain "s"+"len".

           See also "is_utf8_fixed_width_buf_loclen_flags".

            bool  is_utf8_fixed_width_buf_loc_flags(const U8 * const s,
                                                    STRLEN len, const U8 **ep,
                                                    const U32 flags)

       "is_utf8_fixed_width_buf_loclen_flags"
           Like  "is_utf8_fixed_width_buf_loc_flags"  but  stores the number of
           complete, valid characters found in the "el" pointer.

            bool  is_utf8_fixed_width_buf_loclen_flags(const U8 * const s,
                                                       STRLEN len,
                                                       const U8 **ep,
                                                       STRLEN *el,
                                                       const U32 flags)

       "is_utf8_invariant_string"
           Returns TRUE if the first "len" bytes of the string "s" are the same
           regardless of the  UTF-8  encoding  of  the  string  (or  UTF-EBCDIC
           encoding  on EBCDIC machines); otherwise it returns FALSE.  That is,
           it returns TRUE if they are UTF-8 invariant.  On ASCII-ish machines,
           all the ASCII characters and only  the  ASCII  characters  fit  this
           definition.   On  EBCDIC  machines,  the  ASCII-range characters are
           invariant, but so also are the C1 controls.

           If "len" is 0, it will be calculated using strlen(s),  (which  means
           if  you  use  this  option,  that  "s"  can't  have  embedded  "NUL"
           characters and has to have a terminating "NUL" byte).

           See       also       "is_utf8_string",       "is_utf8_string_flags",
           "is_utf8_string_loc",                    "is_utf8_string_loc_flags",
           "is_utf8_string_loclen",              "is_utf8_string_loclen_flags",
           "is_utf8_fixed_width_buf_flags",
           "is_utf8_fixed_width_buf_loc_flags",
           "is_utf8_fixed_width_buf_loclen_flags",     "is_strict_utf8_string",
           "is_strict_utf8_string_loc",         "is_strict_utf8_string_loclen",
           "is_c9strict_utf8_string",     "is_c9strict_utf8_string_loc",    and
           "is_c9strict_utf8_string_loclen".

            bool  is_utf8_invariant_string(const U8 * const s, STRLEN len)

       "is_utf8_invariant_string_loc"
           Like  "is_utf8_invariant_string"  but  upon  failure,   stores   the
           location  of  the first UTF-8 variant character in the "ep" pointer;
           if all characters are UTF-8 invariant, this function does not change
           the contents of *ep.

            bool  is_utf8_invariant_string_loc(const U8 * const s, STRLEN len,
                                               const U8 **ep)

       "is_utf8_string"
           Returns TRUE if the first "len" bytes of string  "s"  form  a  valid
           Perl-extended-UTF-8 string; returns FALSE otherwise.  If "len" is 0,
           it  will  be calculated using strlen(s) (which means if you use this
           option, that "s" can't have embedded "NUL"  characters  and  has  to
           have  a  terminating  "NUL"  byte).   Note that all characters being
           ASCII constitute 'a valid UTF-8 string'.

           This function considers Perl's extended UTF-8  to  be  valid.   That
           means  that code points above Unicode, surrogates, and non-character
           code  points  are  considered   valid   by   this   function.    Use
           "is_strict_utf8_string",        "is_c9strict_utf8_string",        or
           "is_utf8_string_flags" to restrict what code points  are  considered
           valid.

           See also "is_utf8_invariant_string", "is_utf8_invariant_string_loc",
           "is_utf8_string_loc",                       "is_utf8_string_loclen",
           "is_utf8_fixed_width_buf_flags",
           "is_utf8_fixed_width_buf_loc_flags",
           "is_utf8_fixed_width_buf_loclen_flags",

            bool  is_utf8_string(const U8 *s, STRLEN len)

       "is_utf8_string_flags"
           Returns TRUE if the first "len" bytes of string  "s"  form  a  valid
           UTF-8  string,  subject  to  the  restrictions  imposed  by "flags";
           returns FALSE otherwise.  If "len" is 0, it will be calculated using
           strlen(s) (which means if you use this option, that "s"  can't  have
           embedded "NUL" characters and has to have a terminating "NUL" byte).
           Note  that  all  characters  being  ASCII  constitute 'a valid UTF-8
           string'.

           If "flags" is 0, this gives the same results as "is_utf8_string"; if
           "flags" is "UTF8_DISALLOW_ILLEGAL_INTERCHANGE", this gives the  same
           results    as    "is_strict_utf8_string";    and   if   "flags"   is
           "UTF8_DISALLOW_ILLEGAL_C9_INTERCHANGE", this gives the same  results
           as   "is_c9strict_utf8_string".    Otherwise   "flags"  may  be  any
           combination  of  the   "UTF8_DISALLOW_foo"   flags   understood   by
           "utf8n_to_uvchr", with the same meanings.

           See also "is_utf8_invariant_string", "is_utf8_invariant_string_loc",
           "is_utf8_string",  "is_utf8_string_loc", "is_utf8_string_loc_flags",
           "is_utf8_string_loclen",              "is_utf8_string_loclen_flags",
           "is_utf8_fixed_width_buf_flags",
           "is_utf8_fixed_width_buf_loc_flags",
           "is_utf8_fixed_width_buf_loclen_flags",     "is_strict_utf8_string",
           "is_strict_utf8_string_loc",         "is_strict_utf8_string_loclen",
           "is_c9strict_utf8_string",     "is_c9strict_utf8_string_loc",    and
           "is_c9strict_utf8_string_loclen".

            bool  is_utf8_string_flags(const U8 *s, STRLEN len,
                                       const U32 flags)

       "is_utf8_string_loc"
           Like "is_utf8_string" but stores the location of the failure (in the
           case of "utf8ness failure") or the location "s"+"len" (in  the  case
           of "utf8ness success") in the "ep" pointer.

           See also "is_utf8_string_loclen".

            bool  is_utf8_string_loc(const U8 *s, const STRLEN len,
                                     const U8 **ep)

       "is_utf8_string_loc_flags"
           Like  "is_utf8_string_flags"  but stores the location of the failure
           (in the case of "utf8ness failure") or the  location  "s"+"len"  (in
           the case of "utf8ness success") in the "ep" pointer.

           See also "is_utf8_string_loclen_flags".

            bool  is_utf8_string_loc_flags(const U8 *s, STRLEN len,
                                           const U8 **ep, const U32 flags)

       "is_utf8_string_loclen"
           Like "is_utf8_string" but stores the location of the failure (in the
           case  of  "utf8ness failure") or the location "s"+"len" (in the case
           of "utf8ness success") in the "ep" pointer, and the number of  UTF-8
           encoded characters in the "el" pointer.

           See also "is_utf8_string_loc".

            bool  is_utf8_string_loclen(const U8 *s, STRLEN len,
                                        const U8 **ep, STRLEN *el)

       "is_utf8_string_loclen_flags"
           Like  "is_utf8_string_flags"  but stores the location of the failure
           (in the case of "utf8ness failure") or the  location  "s"+"len"  (in
           the  case of "utf8ness success") in the "ep" pointer, and the number
           of UTF-8 encoded characters in the "el" pointer.

           See also "is_utf8_string_loc_flags".

            bool  is_utf8_string_loclen_flags(const U8 *s, STRLEN len,
                                              const U8 **ep, STRLEN *el,
                                              const U32 flags)

       "is_utf8_valid_partial_char"
           Returns 0 if the sequence of bytes starting at "s"  and  looking  no
           further than "e - 1" is the UTF-8 encoding, as extended by Perl, for
           one or more code points.  Otherwise, it returns 1 if there exists at
           least one non-empty sequence of bytes that when appended to sequence
           "s",  starting  at position "e" causes the entire sequence to be the
           well-formed UTF-8 of some code point; otherwise returns 0.

           In other words  this  returns  TRUE  if  "s"  points  to  a  partial
           UTF-8-encoded code point.

           This  is useful when a fixed-length buffer is being tested for being
           well-formed UTF-8, but the final few bytes in it  don't  comprise  a
           full  character; that is, it is split somewhere in the middle of the
           final code  point's  UTF-8  representation.   (Presumably  when  the
           buffer is refreshed with the next chunk of data, the new first bytes
           will  complete  the  partial code point.)   This function is used to
           verify that the final bytes in the current buffer are  in  fact  the
           legal  beginning  of  some  code  point, so that if they aren't, the
           failure can be signalled without having to wait for the next read.

            bool  is_utf8_valid_partial_char(const U8 * const s0,
                                             const U8 * const e)

       "is_utf8_valid_partial_char_flags"
           Like  "is_utf8_valid_partial_char",  it  returns  a  boolean  giving
           whether or not the input is a valid UTF-8 encoded partial character,
           but it takes an extra parameter, "flags", which can further restrict
           which code points are considered valid.

           If     "flags"     is     0,    this    behaves    identically    to
           "is_utf8_valid_partial_char".   Otherwise   "flags"   can   be   any
           combination   of   the   "UTF8_DISALLOW_foo"   flags   accepted   by
           "utf8n_to_uvchr".  If there  is  any  sequence  of  bytes  that  can
           complete  the  input  partial  character  in  such a way that a non-
           prohibited character is formed, the function returns TRUE; otherwise
           FALSE.  Non character code points  cannot  be  determined  based  on
           partial  character  input.  But many  of the other possible excluded
           types can be determined from just the first one or two bytes.

            bool  is_utf8_valid_partial_char_flags(const U8 * const s0,
                                                   const U8 * const e,
                                                   const U32 flags)

       "LATIN1_TO_NATIVE"
           Returns the native  equivalent  of  the  input  Latin-1  code  point
           (including  ASCII  and  control  characters)  given  by "ch".  Thus,
           LATIN1_TO_NATIVE(66) on EBCDIC platforms returns  194.   These  each
           represent the character "B" on their respective platforms.  On ASCII
           platforms no conversion is needed, so this macro expands to just its
           input, adding no time nor space requirements to the implementation.

           For  conversion of code points potentially larger than will fit in a
           character, use "UNI_TO_NATIVE".

            U8  LATIN1_TO_NATIVE(U8 ch)

       "NATIVE_TO_LATIN1"
           Returns  the  Latin-1  (including  ASCII  and  control   characters)
           equivalent  of  the  input  native  code point given by "ch".  Thus,
           NATIVE_TO_LATIN1(193) on EBCDIC platforms returns  65.   These  each
           represent the character "A" on their respective platforms.  On ASCII
           platforms no conversion is needed, so this macro expands to just its
           input, adding no time nor space requirements to the implementation.

           For  conversion of code points potentially larger than will fit in a
           character, use "NATIVE_TO_UNI".

            U8  NATIVE_TO_LATIN1(U8 ch)

       "NATIVE_TO_UNI"
           Returns the Unicode  equivalent of the input native code point given
           by "ch".  Thus, NATIVE_TO_UNI(195) on EBCDIC platforms  returns  67.
           These   each   represent  the  character  "C"  on  their  respective
           platforms.  On ASCII platforms no  conversion  is  needed,  so  this
           macro   expands  to  just  its  input,  adding  no  time  nor  space
           requirements to the implementation.

            UV  NATIVE_TO_UNI(UV ch)

       "pv_uni_display"
           Build to the scalar "dsv" a displayable version of the UTF-8 encoded
           string "spv", length "len", the displayable version  being  at  most
           "pvlim"  bytes long (if longer, the rest is truncated and "..." will
           be appended).

           The "flags" argument can have "UNI_DISPLAY_ISPRINT" set  to  display
           isPRINT()able  characters  as themselves, "UNI_DISPLAY_BACKSLASH" to
           display the "\\[nrfta\\]" as the backslashed  versions  (like  "\n")
           ("UNI_DISPLAY_BACKSLASH" is preferred over "UNI_DISPLAY_ISPRINT" for
           "\\").   "UNI_DISPLAY_QQ"  (and  its alias "UNI_DISPLAY_REGEX") have
           both "UNI_DISPLAY_BACKSLASH" and "UNI_DISPLAY_ISPRINT" turned on.

           Additionally, there is now "UNI_DISPLAY_BACKSPACE" which allows "\b"
           for a backspace, but only when "UNI_DISPLAY_BACKSLASH" also is set.

           The pointer to the PV of the "dsv" is returned.

           See also "sv_uni_display".

            char *  pv_uni_display(SV *dsv, const U8 *spv, STRLEN len,
                                   STRLEN pvlim, UV flags)

       "REPLACEMENT_CHARACTER_UTF8"
           This is a macro that evaluates to a string constant  of  the   UTF-8
           bytes that define the Unicode REPLACEMENT CHARACTER (U+FFFD) for the
           platform  that  perl  is  compiled  on.   This  allows code to use a
           mnemonic for this character that works  on  both  ASCII  and  EBCDIC
           platforms.   "sizeof(REPLACEMENT_CHARACTER_UTF8) - 1" can be used to
           get its length in bytes.

       "sv_cat_decode"
           "encoding" is assumed to be an "Encode" object, the PV of  "ssv"  is
           assumed  to be octets in that encoding and decoding the input starts
           from the position which "(PV + *offset)" pointed to.  "dsv" will  be
           concatenated  with  the  decoded  UTF-8 string from "ssv".  Decoding
           will terminate when the string "tstr" appears in decoding output  or
           the  input ends on the PV of "ssv".  The value which "offset" points
           will be modified to the last input position on "ssv".

           Returns TRUE if the terminator was found, else returns FALSE.

            bool  sv_cat_decode(SV *dsv, SV *encoding, SV *ssv, int *offset,
                                char *tstr, int tlen)

       "sv_recode_to_utf8"
           "encoding" is assumed to be an "Encode" object, on entry the  PV  of
           "sv"  is  assumed  to  be  octets in that encoding, and "sv" will be
           converted into Unicode (and UTF-8).

           If "sv" already is UTF-8 (or if it is not "POK"), or  if  "encoding"
           is  not  a reference, nothing is done to "sv".  If "encoding" is not
           an "Encode::XS" Encoding  object,  bad  things  will  happen.   (See
           encoding and Encode.)

           The PV of "sv" is returned.

            char *  sv_recode_to_utf8(SV *sv, SV *encoding)

       "sv_uni_display"
           Build  to the scalar "dsv" a displayable version of the scalar "sv",
           the displayable version being at most "pvlim" bytes long (if longer,
           the rest is truncated and "..." will be appended).

           The "flags" argument is as in "pv_uni_display"().

           The pointer to the PV of the "dsv" is returned.

            char *  sv_uni_display(SV *dsv, SV *ssv, STRLEN pvlim, UV flags)

       "UNICODE_IS_NONCHAR"
           Returns a boolean as to whether or not "uv" is one  of  the  Unicode
           non-character code points

            bool  UNICODE_IS_NONCHAR(const UV uv)

       "UNICODE_IS_REPLACEMENT"
           Returns  a  boolean  as  to  whether  or  not  "uv"  is  the Unicode
           REPLACEMENT CHARACTER

            bool  UNICODE_IS_REPLACEMENT(const UV uv)

       "UNICODE_IS_SUPER"
           Returns a boolean as to whether or not "uv"  is  above  the  maximum
           legal Unicode code point of U+10FFFF.

            bool  UNICODE_IS_SUPER(const UV uv)

       "UNICODE_IS_SURROGATE"
           Returns  a  boolean  as to whether or not "uv" is one of the Unicode
           surrogate code points

            bool  UNICODE_IS_SURROGATE(const UV uv)

       "UNICODE_REPLACEMENT"
           Evaluates to 0xFFFD, the  code  point  of  the  Unicode  REPLACEMENT
           CHARACTER

       "UNI_TO_NATIVE"
           Returns  the  native   equivalent  of  the  input Unicode code point
           given by "ch".  Thus, UNI_TO_NATIVE(68) on EBCDIC platforms  returns
           196.   These  each  represent  the character "D" on their respective
           platforms.  On ASCII platforms no  conversion  is  needed,  so  this
           macro   expands  to  just  its  input,  adding  no  time  nor  space
           requirements to the implementation.

            UV  UNI_TO_NATIVE(UV ch)

       "UTF8_CHK_SKIP"
           This is a safer version of "UTF8SKIP", but  still  not  as  safe  as
           "UTF8_SAFE_SKIP".   This  version  doesn't  blindly  assume that the
           input string pointed to by "s" is  well-formed,  but  verifies  that
           there  isn't  a NUL terminating character before the expected end of
           the next character in "s".  The length "UTF8_CHK_SKIP" returns stops
           just before any such NUL.

           Perl tends to add NULs, as an insurance policy,  after  the  end  of
           strings  in SV's, so it is likely that using this macro will prevent
           inadvertent reading beyond the end of the input buffer, even  if  it
           is malformed UTF-8.

           This  macro  is  intended  to be used by XS modules where the inputs
           could be malformed, and it isn't feasible to restructure to use  the
           safer  "UTF8_SAFE_SKIP",  for  example  when  interfacing  with  a C
           library.

            STRLEN  UTF8_CHK_SKIP(char* s)

       "utf8_distance"
           Returns the number of UTF-8 characters between  the  UTF-8  pointers
           "a" and "b".

           WARNING:  use  only if you *know* that the pointers point inside the
           same UTF-8 buffer.

            IV  utf8_distance(const U8 *a, const U8 *b)

       "utf8_hop"
           Return the UTF-8 pointer "s" displaced by "off"  characters,  either
           forward  (if "off" is positive) or backward (if negative).  "s" does
           not need to be pointing to the starting byte of a character.  If  it
           isn't, one count of "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 "utf8_hop_safe" to this one.

           Do NOT use this function unless you know "off" is within  the  UTF-8
           data pointed to by "s" and that on entry "s" is aligned on the first
           byte of a character or just after the last byte of a character.

            U8 *  utf8_hop(const U8 *s, SSize_t off)

       "utf8_hop_back"
           Return  the  UTF-8  pointer "s" displaced by up to "off" characters,
           backward.  "s" does not need to be pointing to the starting byte  of
           a character.  If it isn't, one count of "off" will be used up to get
           to that start.

           "off" must be non-positive.

           "s" must be after or equal to "start".

           When moving backward it will not move before "start".

           Will not exceed this limit even if the string is not valid "UTF-8".

            U8 *  utf8_hop_back(const U8 *s, SSize_t off, const U8 *start)

       "utf8_hop_forward"
           Return  the  UTF-8  pointer "s" displaced by up to "off" characters,
           forward.  "s" does not need to be pointing to the starting byte of a
           character.  If it isn't, one count of "off" will be used up  to  get
           to the start of the next character.

           "off" must be non-negative.

           "s" must be before or equal to "end".

           When moving forward it will not move beyond "end".

           Will not exceed this limit even if the string is not valid "UTF-8".

            U8 *  utf8_hop_forward(const U8 *s, SSize_t off, const U8 *end)

       "utf8_hop_safe"
           Return  the  UTF-8  pointer "s" displaced by up to "off" characters,
           either forward or backward.  "s" does not need to be pointing to the
           starting byte of a character.  If it isn't, one count of "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 "start".

           When moving forward it will not move beyond "end".

           Will not exceed those  limits  even  if  the  string  is  not  valid
           "UTF-8".

            U8 *  utf8_hop_safe(const U8 *s, SSize_t off, const U8 *start,
                                const U8 *end)

       "UTF8_IS_INVARIANT"
           Evaluates  to  1  if the byte "c" represents the same character when
           encoded in UTF-8 as when  not;  otherwise  evaluates  to  0.   UTF-8
           invariant  characters  can  be  copied as-is when converting to/from
           UTF-8, saving time.

           In spite of the name, this macro gives the  correct  result  if  the
           input string from which "c" comes is not encoded in UTF-8.

           See "UVCHR_IS_INVARIANT" for checking if a UV is invariant.

            bool  UTF8_IS_INVARIANT(char c)

       "UTF8_IS_NONCHAR"
           Evaluates  to non-zero if the first few bytes of the string starting
           at "s" and looking no further than  "e - 1"  are  well-formed  UTF-8
           that  represents  one  of  the  Unicode  non-character  code points;
           otherwise it evaluates to 0.  If non-zero, the value gives how  many
           bytes starting at "s" comprise the code point's representation.

            bool  UTF8_IS_NONCHAR(const U8 *s, const U8 *e)

       "UTF8_IS_REPLACEMENT"
           Evaluates  to non-zero if the first few bytes of the string starting
           at "s" and looking no further than  "e - 1"  are  well-formed  UTF-8
           that  represents  the  Unicode  REPLACEMENT  CHARACTER; otherwise it
           evaluates to 0.   If  non-zero,  the  value  gives  how  many  bytes
           starting at "s" comprise the code point's representation.

            bool  UTF8_IS_REPLACEMENT(const U8 *s, const U8 *e)

       "UTF8_IS_SUPER"
           Recall  that  Perl  recognizes an extension to UTF-8 that can encode
           code points larger than the  ones  defined  by  Unicode,  which  are
           0..0x10FFFF.

           This  macro  evaluates  to  non-zero  if  the first few bytes of the
           string starting at "s" and looking no further than "e - 1" are  from
           this UTF-8 extension; otherwise it evaluates to 0.  If non-zero, the
           return  is  how many bytes starting at "s" comprise the code point's
           representation.

           0 is returned if the bytes are not well-formed extended UTF-8, or if
           they represent a code point that cannot fit in a UV on  the  current
           platform.  Hence this macro can give different results when run on a
           64-bit word machine than on one with a 32-bit word size.

           Note  that it is illegal in Perl to have code points that are larger
           than what can fit in an IV on the current machine;  and  illegal  in
           Unicode to have any that this macro matches

            bool  UTF8_IS_SUPER(const U8 *s, const U8 *e)

       "UTF8_IS_SURROGATE"
           Evaluates  to non-zero if the first few bytes of the string starting
           at "s" and looking no further than  "e - 1"  are  well-formed  UTF-8
           that  represents one of the Unicode surrogate code points; otherwise
           it evaluates to 0.  If non-zero, the  value  gives  how  many  bytes
           starting at "s" comprise the code point's representation.

            bool  UTF8_IS_SURROGATE(const U8 *s, const U8 *e)

       "utf8_length"
           Returns  the  number  of characters in the sequence of UTF-8-encoded
           bytes starting at "s" and ending at the byte just  before  "e".   If
           <s>  and  <e>  point to the same place, it returns 0 with no warning
           raised.

           If "e < s" or if the scan would end up past "e", it  raises  a  UTF8
           warning and returns the number of valid characters.

            STRLEN  utf8_length(const U8 *s0, const U8 *e)

       "UTF8_MAXBYTES"
           The maximum width of a single UTF-8 encoded character, in bytes.

           NOTE:  Strictly  speaking  Perl's  UTF-8  should not be called UTF-8
           since UTF-8 is an encoding of Unicode, and  Unicode's  upper  limit,
           0x10FFFF,  can  be  expressed with 4 bytes.  However, Perl thinks of
           UTF-8 as a way to encode non-negative integers in a  binary  format,
           even those above Unicode.

       "UTF8_MAXBYTES_CASE"
           The  maximum  number  of  UTF-8 bytes a single Unicode character can
           uppercase/lowercase/titlecase/fold into.

       "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:

           "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
                }

           "UTF8NESS_NO"
               This means the string definitely should be treated as a sequence
               of bytes, not encoded as UTF-8.

           "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.

           "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;
                }

           The following relationships hold between the enum values:

           "0 <= enum value <= UTF8NESS_IMMATERIAL"
               the string may be treated in code as non-UTF8

           "UTF8NESS_IMMATERIAL <= <enum value"
               the string may be treated in code as encoded in UTF-8

       "utf8n_to_uvchr"
           THIS FUNCTION SHOULD BE USED IN ONLY VERY SPECIALIZED CIRCUMSTANCES.
           Most  code  should  use  "utf8_to_uvchr_buf"() rather than call this
           directly.

           Bottom level UTF-8 decode routine.  Returns the  native  code  point
           value  of the first character in the string "s", which is assumed to
           be in UTF-8 (or UTF-EBCDIC) encoding, and no  longer  than  "curlen"
           bytes;  *retlen  (if "retlen" isn't NULL) will be set to the length,
           in bytes, of that character.

           The value of "flags" determines the behavior when "s" does not point
           to a well-formed UTF-8 character.  If "flags" is 0,  encountering  a
           malformation  causes  zero to be returned and *retlen is set so that
           ("s" + *retlen) is the next possible  position  in  "s"  that  could
           begin  a  non-malformed  character.  Also, if UTF-8 warnings haven't
           been lexically disabled, a warning  is  raised.   Some  UTF-8  input
           sequences  may  contain multiple malformations.  This function tries
           to find every possible one in each call, so multiple warnings can be
           raised for the same sequence.

           Various ALLOW flags can be set in "flags" to allow (and not warn on)
           individual types  of  malformations,  such  as  the  sequence  being
           overlong (that is, when there is a shorter sequence that can express
           the  same  code point; overlong sequences are expressly forbidden in
           the UTF-8 standard  due  to  potential  security  issues).   Another
           malformation  example  is  the first byte of a character not being a
           legal first byte.  See utf8.h for the list of such flags.   Even  if
           allowed,  this  function  generally  returns the Unicode REPLACEMENT
           CHARACTER when it encounters a malformation.   There  are  flags  in
           utf8.h to override this behavior for the overlong malformations, but
           don't do that except for very specialized purposes.

           The "UTF8_CHECK_ONLY" flag overrides the behavior when a non-allowed
           (by  other  flags)  malformation is found.  If this flag is set, the
           routine assumes that the caller  will  raise  a  warning,  and  this
           function  will  silently  just set "retlen" to -1 (cast to "STRLEN")
           and return zero.

           Note  that  this  API  requires  disambiguation  between  successful
           decoding  a  "NUL"  character,  and  an  error  return  (unless  the
           "UTF8_CHECK_ONLY" flag is set), as in both  cases,  0  is  returned,
           and,  depending  on  the malformation, "retlen" may be set to 1.  To
           disambiguate, upon a zero return, see if the first byte of "s" is  0
           as  well.   If  so,  the input was a "NUL"; if not, the input had an
           error.  Or you can use "utf8n_to_uvchr_error".

           Certain code points are considered problematic.  These  are  Unicode
           surrogates,  Unicode  non-characters,  and  code  points  above  the
           Unicode maximum  of  0x10FFFF.   By  default  these  are  considered
           regular code points, but certain situations warrant special handling
           for  them,  which  can be specified using the "flags" parameter.  If
           "flags"  contains  "UTF8_DISALLOW_ILLEGAL_INTERCHANGE",  all   three
           classes are treated as malformations and handled as such.  The flags
           "UTF8_DISALLOW_SURROGATE",        "UTF8_DISALLOW_NONCHAR",       and
           "UTF8_DISALLOW_SUPER" (meaning above the legal Unicode maximum)  can
           be     set    to    disallow    these    categories    individually.
           "UTF8_DISALLOW_ILLEGAL_INTERCHANGE" restricts the allowed inputs  to
           the   strict   UTF-8   traditionally   defined   by   Unicode.   Use
           "UTF8_DISALLOW_ILLEGAL_C9_INTERCHANGE"   to   use   the   strictness
           definition       given      by      Unicode      Corrigendum      #9
           <https://www.unicode.org/versions/corrigendum9.html>.            The
           difference  between traditional strictness and C9 strictness is that
           the latter does not forbid non-character  code  points.   (They  are
           still  discouraged, however.)  For more discussion see "Noncharacter
           code points" in perlunicode.

           The              flags              "UTF8_WARN_ILLEGAL_INTERCHANGE",
           "UTF8_WARN_ILLEGAL_C9_INTERCHANGE",           "UTF8_WARN_SURROGATE",
           "UTF8_WARN_NONCHAR",  and  "UTF8_WARN_SUPER"  will   cause   warning
           messages to be raised for their respective categories, but otherwise
           the  code points are considered valid (not malformations).  To get a
           category to both be treated as a malformation and raise  a  warning,
           specify  both  the WARN and DISALLOW flags.  (But note that warnings
           are not raised if lexically disabled  nor  if  "UTF8_CHECK_ONLY"  is
           also specified.)

           Extremely high code points were never specified in any standard, and
           require  an  extension  to UTF-8 to express, which Perl does.  It is
           likely that programs written in something other than Perl would  not
           be  able to read files that contain these; nor would Perl understand
           files written by something that uses  a  different  extension.   For
           these reasons, there is a separate set of flags that can warn and/or
           disallow  these  extremely  high  code  points, even if other above-
           Unicode ones are accepted.  They are  the  "UTF8_WARN_PERL_EXTENDED"
           and  "UTF8_DISALLOW_PERL_EXTENDED"  flags.  For more information see
           "UTF8_GOT_PERL_EXTENDED".   Of  course  "UTF8_DISALLOW_SUPER"   will
           treat   all   above-Unicode   code   points,   including  these,  as
           malformations.  (Note that the Unicode standard  considers  anything
           above  0x10FFFF  to be illegal, but there are standards predating it
           that allow up to 0x7FFF_FFFF (2**31 -1))

           A somewhat misleadingly named synonym for  "UTF8_WARN_PERL_EXTENDED"
           is  retained  for  backward compatibility: "UTF8_WARN_ABOVE_31_BIT".
           Similarly, "UTF8_DISALLOW_ABOVE_31_BIT" is  usable  instead  of  the
           more  accurately named "UTF8_DISALLOW_PERL_EXTENDED".  The names are
           misleading because  these  flags  can  apply  to  code  points  that
           actually  do  fit in 31 bits.  This happens on EBCDIC platforms, and
           sometimes when the overlong malformation is also present.   The  new
           names accurately describe the situation in all cases.

           All other code points corresponding to Unicode characters, including
           private  use  and  those  yet  to  be assigned, are never considered
           malformed and never warn.

            UV  utf8n_to_uvchr(const U8 *s, STRLEN curlen, STRLEN *retlen,
                               const U32 flags)

       "utf8n_to_uvchr_error"
           THIS FUNCTION SHOULD BE USED IN ONLY VERY SPECIALIZED CIRCUMSTANCES.
           Most code should use "utf8_to_uvchr_buf"()  rather  than  call  this
           directly.

           This  function  is  for  code  that  needs  to know what the precise
           malformation(s) are when an error is found.  If  you  also  need  to
           know  the  generated  warning  messages, use "utf8n_to_uvchr_msgs"()
           instead.

           It is like "utf8n_to_uvchr" but it takes an extra  parameter  placed
           after  all  the  others,  "errors".   If  this  parameter is 0, this
           function  behaves  identically  to   "utf8n_to_uvchr".    Otherwise,
           "errors"  should  be  a  pointer  to  a  "U32"  variable, which this
           function sets to indicate any errors found.  Upon return, if *errors
           is 0, there were no errors found.  Otherwise, *errors  is  the  bit-
           wise  "OR"  of  the bits described in the list below.  Some of these
           bits will be set if a malformation  is  found,  even  if  the  input
           "flags"  parameter indicates that the given malformation is allowed;
           those exceptions are noted:

           "UTF8_GOT_PERL_EXTENDED"
               The input sequence is not standard UTF-8, but a Perl  extension.
               This  bit  is  set  only if the input "flags" parameter contains
               either     the     "UTF8_DISALLOW_PERL_EXTENDED"     or      the
               "UTF8_WARN_PERL_EXTENDED" flags.

               Code  points  above 0x7FFF_FFFF (2**31 - 1) were never specified
               in any standard, and so some extension must be used  to  express
               them.   Perl  uses a natural extension to UTF-8 to represent the
               ones  up  to  2**36-1,  and  invented  a  further  extension  to
               represent  even higher ones, so that any code point that fits in
               a 64-bit word can be represented.  Text using  these  extensions
               is  not likely to be portable to non-Perl code.  We lump both of
               these extensions together and refer to  them  as  Perl  extended
               UTF-8.   There exist other extensions that people have invented,
               incompatible with Perl's.

               On EBCDIC platforms starting in Perl v5.24, the  Perl  extension
               for   representing  extremely  high  code  points  kicks  in  at
               0x3FFF_FFFF (2**30 -1), which is lower than on ASCII.  Prior  to
               that,  code points 2**31 and higher were simply unrepresentable,
               and a different, incompatible method was used to represent  code
               points between 2**30 and 2**31 - 1.

               On both platforms, ASCII and EBCDIC, "UTF8_GOT_PERL_EXTENDED" is
               set if Perl extended UTF-8 is used.

               In  earlier  Perls,  this bit was named "UTF8_GOT_ABOVE_31_BIT",
               which you still may use for backward compatibility.   That  name
               is  misleading,  as  this  flag  may  be set when the code point
               actually does fit in 31 bits.  This happens on EBCDIC platforms,
               and sometimes when the overlong malformation  is  also  present.
               The new name accurately describes the situation in all cases.

           "UTF8_GOT_CONTINUATION"
               The  input  sequence  was malformed in that the first byte was a
               UTF-8 continuation byte.

           "UTF8_GOT_EMPTY"
               The input "curlen" parameter was 0.

           "UTF8_GOT_LONG"
               The input sequence was malformed in that  there  is  some  other
               sequence  that  evaluates  to  the  same  code  point,  but that
               sequence is shorter than this one.

               Until Unicode 3.1, it was legal  for  programs  to  accept  this
               malformation,  but  it was discovered that this created security
               issues.

           "UTF8_GOT_NONCHAR"
               The code point represented by the input UTF-8 sequence is for  a
               Unicode  non-character  code point.  This bit is set only if the
               input     "flags"     parameter     contains     either      the
               "UTF8_DISALLOW_NONCHAR" or the "UTF8_WARN_NONCHAR" flags.

           "UTF8_GOT_NON_CONTINUATION"
               The input sequence was malformed in that a non-continuation type
               byte  was found in a position where only a continuation type one
               should be.  See also "UTF8_GOT_SHORT".

           "UTF8_GOT_OVERFLOW"
               The input sequence was malformed in that it is for a code  point
               that  is not representable in the number of bits available in an
               IV on the current platform.

           "UTF8_GOT_SHORT"
               The input sequence was malformed in  that  "curlen"  is  smaller
               than  required  for  a  complete  sequence.  In other words, the
               input is for a partial character sequence.

               "UTF8_GOT_SHORT" and "UTF8_GOT_NON_CONTINUATION" both indicate a
               too    short    sequence.     The     difference     is     that
               "UTF8_GOT_NON_CONTINUATION"  indicates  always  that there is an
               error, while "UTF8_GOT_SHORT" means that an incomplete  sequence
               was  looked  at.    If no other flags are present, it means that
               the sequence was valid as far as  it  went.   Depending  on  the
               application, this could mean one of three things:

               •   The  "curlen"  length parameter passed in was too small, and
                   the function was prevented from examining all the  necessary
                   bytes.

               •   The buffer being looked at is based on reading data, and the
                   data  received  so far stopped in the middle of a character,
                   so that the next  read  will  read  the  remainder  of  this
                   character.   (It  is up to the caller to deal with the split
                   bytes somehow.)

               •   This is a real error, and the partial sequence is all  we're
                   going to get.

           "UTF8_GOT_SUPER"
               The input sequence was malformed in that it is for a non-Unicode
               code  point; that is, one above the legal Unicode maximum.  This
               bit is set only if the input "flags" parameter  contains  either
               the "UTF8_DISALLOW_SUPER" or the "UTF8_WARN_SUPER" flags.

           "UTF8_GOT_SURROGATE"
               The  input  sequence  was malformed in that it is for a -Unicode
               UTF-16 surrogate code point.  This bit is set only if the  input
               "flags"  parameter contains either the "UTF8_DISALLOW_SURROGATE"
               or the "UTF8_WARN_SURROGATE" flags.

           To  do  your  own  error  handling,  call  this  function  with  the
           "UTF8_CHECK_ONLY"  flag  to  suppress any warnings, and then examine
           the *errors return.

            UV  utf8n_to_uvchr_error(const U8 *s, STRLEN curlen,
                                     STRLEN *retlen, const U32 flags,
                                     U32 *errors)

       "utf8n_to_uvchr_msgs"
           THIS FUNCTION SHOULD BE USED IN ONLY VERY SPECIALIZED CIRCUMSTANCES.
           Most code should use "utf8_to_uvchr_buf"()  rather  than  call  this
           directly.

           This  function  is  for  code  that  needs  to know what the precise
           malformation(s)  are  when  an  error  is  found,  and   wants   the
           corresponding  warning  and/or  error messages to be returned to the
           caller rather than be displayed.  All messages that would have  been
           displayed if all lexical warnings are enabled will be returned.

           It  is  just  like  "utf8n_to_uvchr_error"  but  it  takes  an extra
           parameter placed after all the others, "msgs".  If this parameter is
           0, this  function  behaves  identically  to  "utf8n_to_uvchr_error".
           Otherwise,  "msgs"  should  be  a  pointer to an "AV *" variable, in
           which this function creates a new  AV  to  contain  any  appropriate
           messages.   The  elements of the array are ordered so that the first
           message that would have been displayed is in the 0th element, and so
           on.  Each element is a hash with three key-value pairs, as follows:

           "text"
               The text of the message as a "SVpv".

           "warn_categories"
               The warning category (or categories) packed into a "SVuv".

           "flag"
               A single flag bit associated with this  message,  in  a  "SVuv".
               The  bit  corresponds  to  some bit in the *errors return value,
               such as "UTF8_GOT_LONG".

           It's important to note that specifying this  parameter  as  non-null
           will cause any warnings this function would otherwise generate to be
           suppressed,  and  instead  be placed in *msgs.  The caller can check
           the lexical warnings state (or not) when choosing what  to  do  with
           the returned messages.

           If  the flag "UTF8_CHECK_ONLY" is passed, no warnings are generated,
           and hence no AV is created.

           The caller, of course, is responsible for freeing any returned AV.

            UV  utf8n_to_uvchr_msgs(const U8 *s, STRLEN curlen,
                                    STRLEN *retlen, const U32 flags,
                                    U32 *errors, AV **msgs)

       "UTF8_SAFE_SKIP"
           returns 0 if "s >= e"; otherwise returns the number of bytes in  the
           UTF-8 encoded character whose first  byte is pointed to by "s".  But
           it  never  returns beyond "e".  On DEBUGGING builds, it asserts that
           "s <= e".

            STRLEN  UTF8_SAFE_SKIP(char* s, char* e)

       "UTF8SKIP"
           returns the number of bytes a non-malformed UTF-8 encoded  character
           whose first (perhaps only) byte is pointed to by "s".

           If there is a possibility of malformed input, use instead:

           "UTF8_SAFE_SKIP" if you know the maximum ending pointer in the
           buffer pointed to by "s"; or
           "UTF8_CHK_SKIP" if you don't know it.

           It  is  better to restructure your code so the end pointer is passed
           down so that you know what it actually is at the point of this call,
           but if that isn't possible, "UTF8_CHK_SKIP" can minimize the  chance
           of accessing beyond the end of the input buffer.

            STRLEN  UTF8SKIP(char* s)

       "UTF8_SKIP"
           This is a synonym for "UTF8SKIP"

            STRLEN  UTF8_SKIP(char* s)

       "utf8_to_bytes"
           NOTE:  "utf8_to_bytes"  is experimental and may change or be removed
           without notice.

           Converts a string "s" of length *lenp from UTF-8  into  native  byte
           encoding.   Unlike  "bytes_to_utf8",  this  over-writes the original
           string, and updates *lenp to contain the new length.   Returns  zero
           on failure (leaving "s" unchanged) setting *lenp to -1.

           Upon  successful return, the number of variants in the string can be
           computed by having saved the value of *lenp  before  the  call,  and
           subtracting the after-call value of *lenp from it.

           If you need a copy of the string, see "bytes_from_utf8".

            U8 *  utf8_to_bytes(U8 *s, STRLEN *lenp)

       "utf8_to_uvchr"
           "DEPRECATED!"  It is planned to remove "utf8_to_uvchr" from a future
           release  of  Perl.   Do  not  use  it  for  new code; remove it from
           existing code.

           Returns the native code point of the first character in  the  string
           "s"  which  is assumed to be in UTF-8 encoding; "retlen" will be set
           to the length, in bytes, of that character.

           Some, but not all, UTF-8 malformations are detected,  and  in  fact,
           some malformed input could cause reading beyond the end of the input
           buffer,   which   is   why   this   function   is  deprecated.   Use
           "utf8_to_uvchr_buf" instead.

           If "s" points  to  one  of  the  detected  malformations,  and  UTF8
           warnings  are  enabled,  zero  is  returned  and  *retlen is set (if
           "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  *retlen  is  set  (if
           "retlen"  isn't  NULL)  so that ("s" + *retlen) is the next possible
           position in "s" that could begin  a  non-malformed  character.   See
           "utf8n_to_uvchr"  for  details  on when the REPLACEMENT CHARACTER is
           returned.

            UV  utf8_to_uvchr(const U8 *s, STRLEN *retlen)

       "utf8_to_uvchr_buf"
           Returns the native code point of the first character in  the  string
           "s"  which  is  assumed  to be in UTF-8 encoding; "send" points to 1
           beyond the end of "s".  *retlen will be set to the length, in bytes,
           of that character.

           If "s" does not point to a  well-formed  UTF-8  character  and  UTF8
           warnings  are  enabled,  zero  is  returned  and  *retlen is set (if
           "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  *retlen  is  set  (if
           "retlen"  isn't "NULL") so that ("s" + *retlen) is the next possible
           position in "s" that could begin  a  non-malformed  character.   See
           "utf8n_to_uvchr"  for  details  on when the REPLACEMENT CHARACTER is
           returned.

            UV  utf8_to_uvchr_buf(const U8 *s, const U8 *send, STRLEN *retlen)

       "UVCHR_IS_INVARIANT"
           Evaluates to 1 if the representation of code point "cp" is the  same
           whether  or  not  it  is encoded in UTF-8; otherwise evaluates to 0.
           UTF-8 invariant characters  can  be  copied  as-is  when  converting
           to/from UTF-8, saving time.  "cp" is Unicode if above 255; otherwise
           is platform-native.

            bool  UVCHR_IS_INVARIANT(UV cp)

       "UVCHR_SKIP"
           returns  the  number  of  bytes required to represent the code point
           "cp" when encoded as UTF-8.  "cp" is a native (ASCII or EBCDIC) code
           point if less than 255; a Unicode code point otherwise.

            STRLEN  UVCHR_SKIP(UV cp)

       "uvchr_to_utf8_flags"
           Adds the UTF-8 representation of the native code point "uv"  to  the
           end  of  the string "d"; "d" should have at least "UVCHR_SKIP(uv)+1"
           (up to "UTF8_MAXBYTES+1") free bytes available.  The return value is
           the pointer to the byte after the end  of  the  new  character.   In
           other words,

               d = uvchr_to_utf8_flags(d, uv, flags);

           or, in most cases,

               d = uvchr_to_utf8_flags(d, uv, 0);

           This is the Unicode-aware way of saying

               *(d++) = uv;

           If  "flags"  is  0,  this  function  accepts  any  code  point  from
           0.."IV_MAX" as input.  "IV_MAX" is typically 0x7FFF_FFFF in a 32-bit
           word.

           Specifying "flags" can further restrict  what  is  allowed  and  not
           warned on, as follows:

           If    "uv"    is    a    Unicode    surrogate    code    point   and
           "UNICODE_WARN_SURROGATE" is set, the function will raise a  warning,
           provided     UTF8     warnings     are    enabled.     If    instead
           "UNICODE_DISALLOW_SURROGATE" is set,  the  function  will  fail  and
           return NULL.  If both flags are set, the function will both warn and
           return NULL.

           Similarly, the "UNICODE_WARN_NONCHAR" and "UNICODE_DISALLOW_NONCHAR"
           flags affect how the function handles a Unicode non-character.

           And  likewise, the "UNICODE_WARN_SUPER" and "UNICODE_DISALLOW_SUPER"
           flags affect the handling of code points that are above the  Unicode
           maximum  of  0x10FFFF.  Languages other than Perl may not be able to
           accept files that contain these.

           The flag "UNICODE_WARN_ILLEGAL_INTERCHANGE" selects all three of the
           above WARN flags; and "UNICODE_DISALLOW_ILLEGAL_INTERCHANGE" selects
           all three  DISALLOW  flags.   "UNICODE_DISALLOW_ILLEGAL_INTERCHANGE"
           restricts  the  allowed  inputs  to  the  strict UTF-8 traditionally
           defined             by             Unicode.               Similarly,
           "UNICODE_WARN_ILLEGAL_C9_INTERCHANGE"                            and
           "UNICODE_DISALLOW_ILLEGAL_C9_INTERCHANGE" are  shortcuts  to  select
           the  above-Unicode  and  surrogate  flags, but not the non-character
           ones,     as     defined     in     Unicode      Corrigendum      #9
           <https://www.unicode.org/versions/corrigendum9.html>.            See
           "Noncharacter code points" in perlunicode.

           Extremely high code points were never specified in any standard, and
           require an extension to UTF-8 to express, which Perl  does.   It  is
           likely  that programs written in something other than Perl would not
           be able to read files that contain these; nor would Perl  understand
           files  written  by  something  that uses a different extension.  For
           these reasons, there is a separate set of flags that can warn and/or
           disallow these extremely high code  points,  even  if  other  above-
           Unicode      ones      are      accepted.       They     are     the
           "UNICODE_WARN_PERL_EXTENDED"  and   "UNICODE_DISALLOW_PERL_EXTENDED"
           flags.   For  more  information  see  "UTF8_GOT_PERL_EXTENDED".   Of
           course "UNICODE_DISALLOW_SUPER" will treat  all  above-Unicode  code
           points,  including  these, as malformations.  (Note that the Unicode
           standard considers anything above 0x10FFFF to be illegal, but  there
           are standards predating it that allow up to 0x7FFF_FFFF (2**31 -1))

           A       somewhat       misleadingly      named      synonym      for
           "UNICODE_WARN_PERL_EXTENDED" is retained for backward compatibility:
           "UNICODE_WARN_ABOVE_31_BIT".                              Similarly,
           "UNICODE_DISALLOW_ABOVE_31_BIT"   is  usable  instead  of  the  more
           accurately named "UNICODE_DISALLOW_PERL_EXTENDED".   The  names  are
           misleading because on EBCDIC platforms,these flags can apply to code
           points  that  actually  do fit in 31 bits.  The new names accurately
           describe the situation in all cases.

            U8 *  uvchr_to_utf8_flags(U8 *d, UV uv, UV flags)

       "uvchr_to_utf8_flags_msgs"
           THIS FUNCTION SHOULD BE USED IN ONLY VERY SPECIALIZED CIRCUMSTANCES.

           Most code should use ""uvchr_to_utf8_flags"()" rather than call this
           directly.

           This function is for  code  that  wants  any  warning  and/or  error
           messages to be returned to the caller rather than be displayed.  All
           messages  that would have been displayed if all lexical warnings are
           enabled will be returned.

           It  is  just  like  "uvchr_to_utf8_flags"  but  it  takes  an  extra
           parameter placed after all the others, "msgs".  If this parameter is
           0,  this  function  behaves  identically  to  "uvchr_to_utf8_flags".
           Otherwise, "msgs" should be a pointer to  an  "HV  *"  variable,  in
           which  this  function  creates  a  new HV to contain any appropriate
           messages.  The hash has three key-value pairs, as follows:

           "text"
               The text of the message as a "SVpv".

           "warn_categories"
               The warning category (or categories) packed into a "SVuv".

           "flag"
               A single flag bit associated with this  message,  in  a  "SVuv".
               The  bit  corresponds  to  some bit in the *errors return value,
               such as "UNICODE_GOT_SURROGATE".

           It's important to note that specifying this  parameter  as  non-null
           will cause any warnings this function would otherwise generate to be
           suppressed,  and  instead  be placed in *msgs.  The caller can check
           the lexical warnings state (or not) when choosing what  to  do  with
           the returned messages.

           The caller, of course, is responsible for freeing any returned HV.

            U8 *  uvchr_to_utf8_flags_msgs(U8 *d, UV uv, UV flags, HV **msgs)

       "uvchr_to_utf8"
           Adds  the  UTF-8 representation of the native code point "uv" to the
           end of the string "d"; "d" should have at  least  "UVCHR_SKIP(uv)+1"
           (up to "UTF8_MAXBYTES+1") free bytes available.  The return value is
           the  pointer  to  the  byte  after the end of the new character.  In
           other words,

               d = uvchr_to_utf8(d, uv);

           is the recommended wide native character-aware way of saying

               *(d++) = uv;

           This function accepts any code  point  from  0.."IV_MAX"  as  input.
           "IV_MAX" is typically 0x7FFF_FFFF in a 32-bit word.

           It  is  possible  to  forbid  or warn on non-Unicode code points, or
           those that may be problematic by using "uvchr_to_utf8_flags".

            U8 *  uvchr_to_utf8(U8 *d, UV uv)

Utility Functions
       "C_ARRAY_END"
           Returns a pointer to one element past the final element of the input
           C array.

            void *  C_ARRAY_END(void *a)

       "C_ARRAY_LENGTH"
           Returns the number of elements in the input C  array  (so  you  want
           your zero-based indices to be less than but not equal to).

            STRLEN  C_ARRAY_LENGTH(void *a)

       "getcwd_sv"
           Fill "sv" with current working directory

            int  getcwd_sv(SV *sv)

       "IN_PERL_COMPILETIME"
           Returns 1 if this macro is being called during the compilation phase
           of the program; otherwise 0;

            bool  IN_PERL_COMPILETIME

       "IN_PERL_RUNTIME"
           Returns  1  if this macro is being called during the execution phase
           of the program; otherwise 0;

            bool  IN_PERL_RUNTIME

       "IS_SAFE_SYSCALL"
           Same as "is_safe_syscall".

            bool  IS_SAFE_SYSCALL(NN const char *pv, STRLEN len,
                                  NN const char *what, NN const char *op_name)

       "is_safe_syscall"
           Test that the given "pv" (with length  "len")  doesn't  contain  any
           internal  "NUL"  characters.   If  it does, set "errno" to "ENOENT",
           optionally warn using the "syscalls" category, and return FALSE.

           Return TRUE if the name is safe.

           "what" and "op_name" are used in any warning.

           Used by the IS_SAFE_SYSCALL() macro.

            bool  is_safe_syscall(const char *pv, STRLEN len,
                                  const char *what, const char *op_name)

       "my_setenv"
           A wrapper for the C library setenv(3).  Don't use the latter, as the
           perl version has desirable safeguards

            void  my_setenv(const char *nam, const char *val)

       "newPADxVOP"
           Constructs, checks and  returns  an  op  containing  a  pad  offset.
           "type" is the opcode, which should be one of "OP_PADSV", "OP_PADAV",
           "OP_PADHV"  or  "OP_PADCV".  The returned op will have the "op_targ"
           field set by the "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 "op_targ" field as a side-effect. For example

               o = op_append_elem(OP_LINESEQ, o,
                   newPADxVOP(OP_PADSV, 0, padix));

            OP *  newPADxVOP(I32 type, I32 flags, PADOFFSET padix)

       "phase_name"
           Returns the given phase's name as a NUL-terminated string.

           For  example,  to  print  a  stack  trace  that includes the current
           interpreter phase you might do:

               const char* phase_name = phase_name(PL_phase);
               mess("This is weird. (Perl phase: %s)", phase_name);

            const char * const  phase_name(enum perl_phase)

       "Poison"
           PoisonWith(0xEF) for catching access to freed memory.

            void  Poison(void* dest, int nitems, type)

       "PoisonFree"
           PoisonWith(0xEF) for catching access to freed memory.

            void  PoisonFree(void* dest, int nitems, type)

       "PoisonNew"
           PoisonWith(0xAB) for catching access to allocated but  uninitialized
           memory.

            void  PoisonNew(void* dest, int nitems, type)

       "PoisonWith"
           Fill  up  memory  with a byte pattern (a byte repeated over and over
           again) that  hopefully  catches  attempts  to  access  uninitialized
           memory.

            void  PoisonWith(void* dest, int nitems, type, U8 byte)

       "StructCopy"
           This  is  an architecture-independent macro that does a shallow copy
           of one structure to another.

            void  StructCopy(type *src, type *dest, type)

       "sv_destroyable"
           Dummy routine which reports that object can be destroyed when  there
           is  no  sharing  module present.  It ignores its single SV argument,
           and returns 'true'.  Exists to avoid  test  for  a  "NULL"  function
           pointer  and  because  it could potentially warn under some level of
           strict-ness.

            bool  sv_destroyable(SV *sv)

       "sv_nosharing"
           Dummy routine which "shares" an SV when there is no  sharing  module
           present.   Or "locks" it.  Or "unlocks" it.  In other words, ignores
           its single SV argument.  Exists to avoid test for a "NULL"  function
           pointer  and  because  it could potentially warn under some level of
           strict-ness.

            void  sv_nosharing(SV *sv)

Versioning
       "new_version"
           Returns a new version object based on the passed in SV:

               SV *sv = new_version(SV *ver);

           Does not alter the passed in ver SV.  See "upg_version" if you  want
           to upgrade the SV.

            SV *  new_version(SV *ver)

       "PERL_REVISION"
           "DEPRECATED!"  It is planned to remove "PERL_REVISION" from a future
           release  of  Perl.   Do  not  use  it  for  new code; remove it from
           existing code.

           The major number component of the perl interpreter  currently  being
           compiled or executing.  This has been 5 from 1993 into 2020.

           Instead   use   one   of   the   version   comparison  macros.   See
           "PERL_VERSION_EQ".

       "PERL_SUBVERSION"
           "DEPRECATED!"  It is planned  to  remove  "PERL_SUBVERSION"  from  a
           future  release of Perl.  Do not use it for new code; remove it from
           existing code.

           The micro number component of the perl interpreter  currently  being
           compiled  or  executing.   In  stable  releases  this  gives the dot
           release number for maintenance  updates.   In  development  releases
           this  gives  a tag for a snapshot of the status at various points in
           the development cycle.

           Instead  use  one   of   the   version   comparison   macros.    See
           "PERL_VERSION_EQ".

       "PERL_VERSION"
           "DEPRECATED!"   It is planned to remove "PERL_VERSION" from a future
           release of Perl.  Do not  use  it  for  new  code;  remove  it  from
           existing code.

           The  minor  number component of the perl interpreter currently being
           compiled or executing.  Between 1993 into 2020, this has ranged from
           0 to 33.

           Instead  use  one   of   the   version   comparison   macros.    See
           "PERL_VERSION_EQ".

       "PERL_VERSION_EQ"
       "PERL_VERSION_GE"
       "PERL_VERSION_GT"
       "PERL_VERSION_LE"
       "PERL_VERSION_LT"
       "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,

            #if PERL_VERSION_GT(5,24,2)
              code that will only be compiled on perls after v5.24.2
            #else
              fallback code
            #endif

           Note that this is usable in making compile-time decisions

           You  may  use the special value '*' for the final number to mean ALL
           possible values for it.  Thus,

            #if PERL_VERSION_EQ(5,31,'*')

           means all perls in the 5.31 series.  And

            #if PERL_VERSION_NE(5,24,'*')

           means all perls EXCEPT 5.24 ones.  And

            #if PERL_VERSION_LE(5,9,'*')

           is effectively

            #if PERL_VERSION_LT(5,10,0)

           This means you don't have to think so much when converting from  the
           existing deprecated "PERL_VERSION" to using this macro:

            #if PERL_VERSION <= 9

           becomes

            #if PERL_VERSION_LE(5,9,'*')

            bool  PERL_VERSION_EQ(const U8 major, const U8 minor,
                                  const U8 patch)

       "prescan_version"
           Validate  that a given string can be parsed as a version object, but
           doesn't actually perform the parsing.  Can use either strict or  lax
           validation  rules.  Can optionally set a number of hint variables to
           save the parsing code some time when tokenizing.

            const char *  prescan_version(const char *s, bool strict,
                                          const char **errstr, bool *sqv,
                                          int *ssaw_decimal, int *swidth,
                                          bool *salpha)

       "scan_version"
           Returns a pointer to the next character  after  the  parsed  version
           string, as well as upgrading the passed in SV to an RV.

           Function must be called with an already existing SV like

               sv = newSV(0);
               s = scan_version(s, SV *sv, bool qv);

           Performs  some preprocessing to the string to ensure that it has the
           correct characteristics of  a  version.   Flags  the  object  if  it
           contains  an  underscore  (which  denotes this is an alpha version).
           The boolean qv denotes that the version should be interpreted as  if
           it had multiple decimals, even if it doesn't.

            const char *  scan_version(const char *s, SV *rv, bool qv)

       "upg_version"
           In-place upgrade of the supplied SV to a version object.

               SV *sv = upg_version(SV *sv, bool qv);

           Returns  a  pointer  to  the upgraded SV.  Set the boolean qv if you
           want to force this SV to be interpreted as an "extended" version.

            SV *  upg_version(SV *ver, bool qv)

       "vcmp"
           Version object aware cmp.  Both  operands  must  already  have  been
           converted into version objects.

            int  vcmp(SV *lhv, SV *rhv)

       "vnormal"
           Accepts   a   version  object  and  returns  the  normalized  string
           representation.  Call like:

               sv = vnormal(rv);

           NOTE: you can pass either the object directly or  the  SV  contained
           within the RV.

           The SV returned has a refcount of 1.

            SV *  vnormal(SV *vs)

       "vnumify"
           Accepts  a  version object and returns the normalized floating point
           representation.  Call like:

               sv = vnumify(rv);

           NOTE: you can pass either the object directly or  the  SV  contained
           within the RV.

           The SV returned has a refcount of 1.

            SV *  vnumify(SV *vs)

       "vstringify"
           In  order to maintain maximum compatibility with earlier versions of
           Perl, this function will return either the floating  point  notation
           or  the  multiple dotted notation, depending on whether the original
           version contained 1 or more dots, respectively.

           The SV returned has a refcount of 1.

            SV *  vstringify(SV *vs)

       "vverify"
           Validates that the  SV  contains  valid  internal  structure  for  a
           version  object.  It may be passed either the version object (RV) or
           the hash itself (HV).  If the structure is valid, it returns the HV.
           If the structure is invalid, it returns NULL.

               SV *hv = vverify(sv);

           Note that it only confirms the bare minimum structure (so as not  to
           get  confused  by  derived classes which may contain additional hash
           entries):

           •   The SV is an HV or a reference to an HV

           •   The hash contains a "version" key

           •   The "version" key has a reference to an AV as its value

            SV *  vverify(SV *vs)

Warning and Dieing
       In all these  calls,  the  "U32  wn"  parameters  are  warning  category
       constants.   You  can  see  the  ones  currently  available in "Category
       Hierarchy" in warnings, just capitalize all letters  in  the  names  and
       prefix  them by "WARN_".  So, for example, the category "void" used in a
       perl program becomes "WARN_VOID" when used in XS code and passed to  one
       of the calls below.

       "ckWARN"
       "ckWARN2"
       "ckWARN3"
       "ckWARN4"
           These return a boolean as to whether or not warnings are enabled for
           any of the warning category(ies) parameters:  "w", "w1", ....

           Should  any  of  the  categories  by  default be enabled even if not
           within the scope  of  "use warnings",  instead  use  the  "ckWARN_d"
           macros.

           The  categories  must  be  completely  independent,  one  may not be
           subclassed from the other.

            bool  ckWARN (U32 w)
            bool  ckWARN2(U32 w1, U32 w2)
            bool  ckWARN3(U32 w1, U32 w2, U32 w3)
            bool  ckWARN4(U32 w1, U32 w2, U32 w3, U32 w4)

       "ckWARN_d"
       "ckWARN2_d"
       "ckWARN3_d"
       "ckWARN4_d"
           Like "ckWARN", but for use if and only if the warning  category(ies)
           is   by   default   enabled   even   if  not  within  the  scope  of
           "use warnings".

            bool  ckWARN_d (U32 w)
            bool  ckWARN2_d(U32 w1, U32 w2)
            bool  ckWARN3_d(U32 w1, U32 w2, U32 w3)
            bool  ckWARN4_d(U32 w1, U32 w2, U32 w3, U32 w4)

       "ck_warner"
       "ck_warner_d"
           If none of the warning categories given by  "err"  are  enabled,  do
           nothing;  otherwise  call  "warner"   or "warner_nocontext" with the
           passed-in parameters;.

           "err" must be  one  of  the  "packWARN",  "packWARN2",  "packWARN3",
           "packWARN4"  macros populated with the appropriate number of warning
           categories.

           The two forms differ only in that "ck_warner_d" should  be  used  if
           warnings for any of the categories are by default enabled.

           NOTE: "ck_warner" must be explicitly called as "Perl_ck_warner" with
           an "aTHX_" parameter.

           NOTE:  "ck_warner_d" must be explicitly called as "Perl_ck_warner_d"
           with an "aTHX_" parameter.

            void  Perl_ck_warner(pTHX_ U32 err, const char *pat, ...)

       "CLEAR_ERRSV"
           Clear the contents of $@, setting it to the empty string.

           This replaces any read-only SV with  a  fresh  SV  and  removes  any
           magic.

            void  CLEAR_ERRSV()

       "croak"
       "croak_nocontext"
           These are XS interfaces to Perl's "die" function.

           They  take  a  sprintf-style format pattern and argument list, which
           are used to generate a string message.  If the message does not  end
           with a newline, then it will be extended with some indication of the
           current location in the code, as described for "mess_sv".

           The error message will be used as an exception, by default returning
           control to the nearest enclosing "eval", but subject to modification
           by  a  $SIG{__DIE__}  handler.   In  any case, these croak functions
           never return normally.

           For historical reasons, if  "pat"  is  null  then  the  contents  of
           "ERRSV"  ($@)  will be used as an error message or object instead of
           building an error message from arguments.  If you want  to  throw  a
           non-string  object,  or build an error message in an SV yourself, it
           is preferable to use the "croak_sv" function, which does not involve
           clobbering "ERRSV".

           The two forms differ only in that "croak_nocontext" does not take  a
           thread  context  ("aTHX")  parameter.  It is usually preferred as it
           takes up fewer bytes of code than plain "Perl_croak",  and  time  is
           rarely a critical resource when you are about to throw an exception.

           NOTE:  "croak"  must  be  explicitly  called as "Perl_croak" with an
           "aTHX_" parameter.

            void  Perl_croak     (pTHX_ const char *pat, ...)
            void  croak_nocontext(const char *pat, ...)

       "croak_no_modify"
           This encapsulates a  common  reason  for  dying,  generating  terser
           object  code  than  using  the  generic "Perl_croak".  It is exactly
           equivalent to "Perl_croak(aTHX_ "%s", PL_no_modify)" (which  expands
           to something like "Modification of a read-only value attempted").

           Less code used on exception code paths reduces CPU cache pressure.

            void  croak_no_modify()

       "croak_sv"
           This is an XS interface to Perl's "die" function.

           "baseex"  is  the error message or object.  If it is a reference, it
           will be used as-is.  Otherwise it is used as a  string,  and  if  it
           does  not  end  with  a  newline  then it will be extended with some
           indication of the current location in the  code,  as  described  for
           "mess_sv".

           The error message or object will be used as an exception, by default
           returning  control  to  the nearest enclosing "eval", but subject to
           modification  by  a  $SIG{__DIE__}  handler.   In  any   case,   the
           "croak_sv" function never returns normally.

           To  die  with  a  simple string message, the "croak" function may be
           more convenient.

            void  croak_sv(SV *baseex)

       "die"
       "die_nocontext"
           These behave the same as "croak", except for the return type.   They
           should  be used only where the "OP *" return type is required.  They
           never actually return.

           The two forms differ only in that "die_nocontext" does  not  take  a
           thread  context  ("aTHX")  parameter, so is used in situations where
           the caller doesn't already have the thread context.

           NOTE: "die" must be explicitly called as "Perl_die" with an  "aTHX_"
           parameter.

            OP *  Perl_die     (pTHX_ const char *pat, ...)
            OP *  die_nocontext(const char *pat, ...)

       "die_sv"
           This behaves the same as "croak_sv", except for the return type.  It
           should  be  used only where the "OP *" return type is required.  The
           function never actually returns.

            OP *  die_sv(SV *baseex)

       "ERRSV"
           Returns the SV for $@, creating it if needed.

            SV *  ERRSV

       "fatal_warner"
           Like "warner" except that it acts as if fatal warnings  are  enabled
           for the warning.

           If  called  when  there are pending compilation errors this function
           may return.

           This is currently used to generate "used only once"  fatal  warnings
           since the COP where the name being reported is no longer the current
           COP  when  the  warning  is  generated and may be useful for similar
           cases.

           "err" must be  one  of  the  "packWARN",  "packWARN2",  "packWARN3",
           "packWARN4"  macros populated with the appropriate number of warning
           categories.

           NOTE:    "fatal_warner"    must    be    explicitly    called     as
           "Perl_fatal_warner" with an "aTHX_" parameter.

            void  Perl_fatal_warner(pTHX_ U32 err, const char *pat, ...)

       "packWARN"
       "packWARN2"
       "packWARN3"
       "packWARN4"
           These  macros  are used to pack warning categories into a single U32
           to pass to  macros  and  functions  that  take  a  warning  category
           parameter.   The  number of categories to pack is given by the name,
           with a corresponding number of category parameters passed.

            U32  packWARN (U32 w1)
            U32  packWARN2(U32 w1, U32 w2)
            U32  packWARN3(U32 w1, U32 w2, U32 w3)
            U32  packWARN4(U32 w1, U32 w2, U32 w3, U32 w4)

       "SANE_ERRSV"
           Clean up ERRSV so we can safely set it.

           This replaces any read-only  SV  with  a  fresh  writable  copy  and
           removes any magic.

            void  SANE_ERRSV()

       "vcroak"
           This is an XS interface to Perl's "die" function.

           "pat" and "args" are a sprintf-style format pattern and encapsulated
           argument list.  These are used to generate a string message.  If the
           message  does  not end with a newline, then it will be extended with
           some indication of the current location in the  code,  as  described
           for "mess_sv".

           The error message will be used as an exception, by default returning
           control to the nearest enclosing "eval", but subject to modification
           by a $SIG{__DIE__} handler.  In any case, the "croak" function never
           returns normally.

           For  historical  reasons,  if  "pat"  is  null  then the contents of
           "ERRSV" ($@) will be used as an error message or object  instead  of
           building  an  error  message from arguments.  If you want to throw a
           non-string object, or build an error message in an SV  yourself,  it
           is preferable to use the "croak_sv" function, which does not involve
           clobbering "ERRSV".

            void  vcroak(const char *pat, va_list *args)

       "vfatal_warner"
           This  is like "fatal_warner" but "args" are an encapsulated argument
           list.

            void  vfatal_warner(U32 err, const char *pat, va_list *args)

       "vwarn"
           This is an XS interface to Perl's "warn" function.

           This is like "warn", but "args" are an encapsulated argument list.

           Unlike with "vcroak", "pat" is not permitted to be null.

            void  vwarn(const char *pat, va_list *args)

       "vwarner"
           This is like "warner", but "args" are an encapsulated argument list.

            void  vwarner(U32 err, const char *pat, va_list *args)

       "warn"
       "warn_nocontext"
           These are XS interfaces to Perl's "warn" function.

           They take a sprintf-style format pattern and  argument  list,  which
           are  used to generate a string message.  If the message does not end
           with a newline, then it will be extended with some indication of the
           current location in the code, as described for "mess_sv".

           The error message or object will by default be written  to  standard
           error,  but  this  is  subject  to  modification by a $SIG{__WARN__}
           handler.

           Unlike with "croak", "pat" is not permitted to be null.

           The two forms differ only in that "warn_nocontext" does not  take  a
           thread  context  ("aTHX")  parameter, so is used in situations where
           the caller doesn't already have the thread context.

           NOTE: "warn" must  be  explicitly  called  as  "Perl_warn"  with  an
           "aTHX_" parameter.

            void  Perl_warn     (pTHX_ const char *pat, ...)
            void  warn_nocontext(const char *pat, ...)

       "warner"
       "warner_nocontext"
           These  output  a  warning  of the specified category (or categories)
           given by "err", using the sprintf-style format  pattern  "pat",  and
           argument list.

           "err"  must  be  one  of  the  "packWARN", "packWARN2", "packWARN3",
           "packWARN4" macros populated with the appropriate number of  warning
           categories.  If any of the warning categories they specify is fatal,
           a fatal exception is thrown.

           In  any  event  a message is generated by the pattern and arguments.
           If the message does not end with a newline, then it will be extended
           with some indication  of  the  current  location  in  the  code,  as
           described for "mess_sv".

           The  error  message or object will by default be written to standard
           error, but this is  subject  to  modification  by  a  $SIG{__WARN__}
           handler.

           "pat" is not permitted to be null.

           The two forms differ only in that "warner_nocontext" does not take a
           thread  context  ("aTHX")  parameter, so is used in situations where
           the caller doesn't already have the thread context.

           These functions differ from the similarly named "warn" functions, in
           that the latter  are  for  XS  code  to  unconditionally  display  a
           warning,  whereas  these  are  for code that may be compiling a perl
           program, and does extra checking to see if  the  warning  should  be
           fatal.

           NOTE:  "warner"  must  be explicitly called as "Perl_warner" with an
           "aTHX_" parameter.

            void  Perl_warner     (pTHX_ U32 err, const char *pat, ...)
            void  warner_nocontext(U32 err, const char *pat, ...)

       "warn_sv"
           This is an XS interface to Perl's "warn" function.

           "baseex" is the error message or object.  If it is a  reference,  it
           will  be  used  as-is.   Otherwise it is used as a string, and if it
           does not end with a newline then  it  will  be  extended  with  some
           indication  of  the  current  location in the code, as described for
           "mess_sv".

           The error message or object will by default be written  to  standard
           error,  but  this  is  subject  to  modification by a $SIG{__WARN__}
           handler.

           To warn with a simple string message, the  "warn"  function  may  be
           more convenient.

            void  warn_sv(SV *baseex)

XS
       xsubpp compiles XS code into C.  See "xsubpp" in perlutil.

       "aMY_CXT"
           Described in perlxs.

       "_aMY_CXT"
           Described in perlxs.

       "aMY_CXT_"
           Described in perlxs.

       "ax"
           Variable  which  is  setup  by  "xsubpp"  to indicate the stack base
           offset, used by the "ST", "XSprePUSH" and  "XSRETURN"  macros.   The
           "dMARK" macro must be called prior to setup the "MARK" variable.

            Stack_off_t  ax

       "CLASS"
           Variable which is setup by "xsubpp" to indicate the class name for a
           C++ XS constructor.  This is always a "char*".  See "THIS".

            char*  CLASS

       "dAX"
           Sets up the "ax" variable.  This is usually handled automatically by
           "xsubpp" by calling "dXSARGS".

              dAX;

       "dAXMARK"
           Sets up the "ax" variable and stack marker variable "mark".  This is
           usually handled automatically by "xsubpp" by calling "dXSARGS".

              dAXMARK;

       "dITEMS"
           Sets up the "items" variable.  This is usually handled automatically
           by "xsubpp" by calling "dXSARGS".

              dITEMS;

       "dMY_CXT"
           Described in perlxs.

       "dMY_CXT_SV"
           Now a placeholder that declares nothing

              dMY_CXT_SV;

       "dUNDERBAR"
           Sets  up  any  variable  needed by the "UNDERBAR" macro.  It used to
           define "padoff_du", but it is currently  a  noop.   However,  it  is
           strongly  advised  to  still  use  it  for  ensuring past and future
           compatibility.

              dUNDERBAR;

       "dXSARGS"
           Sets up stack and mark pointers  for  an  XSUB,  calling  "dSP"  and
           "dMARK".   Sets  up  the "ax" and "items" variables by calling "dAX"
           and "dITEMS".  This is usually handled automatically by "xsubpp".

              dXSARGS;

       "dXSI32"
           Sets up the "ix" variable for an XSUB which has  aliases.   This  is
           usually handled automatically by "xsubpp".

              dXSI32;

       "items"
           Variable  which is setup by "xsubpp" to indicate the number of items
           on the stack.  See "Variable-length Parameter Lists" in perlxs.

            Stack_off_t  items

       "ix"
           Variable which is setup by "xsubpp" to indicate which of  an  XSUB's
           aliases was used to invoke it.  See "The ALIAS: Keyword" in perlxs.

            I32  ix

       "MY_CXT"
           Described in perlxs.

       "MY_CXT_CLONE"
           Described in perlxs.

       "MY_CXT_INIT"
           Described in perlxs.

       "pMY_CXT"
           Described in perlxs.

       "_pMY_CXT"
           Described in perlxs.

       "pMY_CXT_"
           Described in perlxs.

       "RETVAL"
           Variable  which is setup by "xsubpp" to hold the return value for an
           XSUB.  This is always the proper type for the XSUB.  See "The RETVAL
           Variable" in perlxs.

            type  RETVAL

       "ST"
           Used to access elements on the XSUB's stack.

            SV*  ST(int ix)

       "START_MY_CXT"
           Described in perlxs.

       "THIS"
           Variable which is setup by "xsubpp" to designate the object in a C++
           XSUB.  This is always the proper  type  for  the  C++  object.   See
           "CLASS" and "Using XS With C++" in perlxs.

            type  THIS

       "UNDERBAR"
           The  SV* corresponding to the $_ variable.  Works even if there is a
           lexical $_ in scope.

       "XS"
           Macro to declare an XSUB and its C parameter list.  This is  handled
           by   "xsubpp".    It   is  the  same  as  using  the  more  explicit
           "XS_EXTERNAL" macro; the latter is preferred.

       "XS_EXTERNAL"
           Macro to declare  an  XSUB  and  its  C  parameter  list  explicitly
           exporting the symbols.

       "XS_INTERNAL"
           Macro  to declare an XSUB and its C parameter list without exporting
           the symbols.  This is handled by "xsubpp" and  generally  preferable
           over exporting the XSUB symbols unnecessarily.

       "XSPROTO"
           Macro  used by "XS_INTERNAL" and "XS_EXTERNAL" to declare a function
           prototype.  You probably shouldn't be using this directly yourself.

Undocumented elements
       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
       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.

        clone_params_del  do_open   PERL_BUILD_DATE  sv_dup
        clone_params_new  do_openn  resume_compcv    sv_dup_inc

       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.

        apply_attrs_string        hv_store_flags       thread_locale_init
        gv_fetchmethod_pv_flags   leave_adjust_stacks  thread_locale_term
        gv_fetchmethod_pvn_flags  newXS_flags
        gv_fetchmethod_sv_flags   savetmps

       Finally are deprecated undocumented API elements.  Do not  use  any  for
       new code; remove all occurrences of all of these from existing code.

       There are currently no items of this type

AUTHORS
       Until   May   1997,   this  document  was  maintained  by  Jeff  Okamoto
       <okamoto@corp.hp.com>.  It is now maintained as part of Perl itself.

       With lots of help and suggestions from Dean Roehrich,  Malcolm  Beattie,
       Andreas  Koenig,  Paul  Hudson,  Ilya  Zakharevich,  Paul Marquess, Neil
       Bowers, Matthew Green,  Tim  Bunce,  Spider  Boardman,  Ulrich  Pfeifer,
       Stephen McCamant, and Gurusamy Sarathy.

       API Listing originally by Dean Roehrich <roehrich@cray.com>.

       Updated  to  be  autogenerated  from  comments in the source by Benjamin
       Stuhl.

SEE ALSO
       config.h, perlapio, perlcall, perlclib, perlembed, perlfilter, perlguts,
       perlhacktips, perlintern, perlinterp,  perliol,  perlmroapi,  perlreapi,
       perlreguts, perlxs

perl v5.40.1                       2026-08-30                        PERLAPI(1)

Generated by dwww version 1.16 on Sat Oct 3 06:48:35 CEST 2026.