Devel::PPPort - Perl/Pollution/Portability
Devel::PPPort::WriteFile(); # defaults to ./ppport.h
Devel::PPPort::WriteFile('someheader.h');
# Same as above but retrieve contents rather than write file
my $contents = Devel::PPPort::GetFileContents();
my $contents = Devel::PPPort::GetFileContents('someheader.h');
$ cpan Devel::PPPort
$ perl -MDevel::PPPort -e'Devel::PPPort::WriteFile'
$ perl ppport.h --compat-version=5.6.1 --patch=diff.patch *.xs
$ patch -p0 < diff.patch
$ echo ppport.h >>MANIFEST
Perl's API has changed over time, gaining new features, new functions, increasing its flexibility, and reducing the impact on the C namespace environment (reduced pollution). The header file written by this module, typically ppport.h, attempts to bring some of the newer Perl API features to older versions of Perl, so that you can worry less about keeping track of old releases, but users can still reap the benefit.
Devel::PPPort
contains two functions, WriteFile
and GetFileContents
. WriteFile
's only purpose is to write the ppport.h C header file. This file contains a series of macros and, if explicitly requested, functions that allow XS modules to be built using older versions of Perl. Currently, Perl versions from 5.003 to 5.30 are supported.
GetFileContents
can be used to retrieve the file contents rather than writing it out.
This module is used by h2xs
to write the file ppport.h.
You should use ppport.h in modern code so that your code will work with the widest range of Perl interpreters possible, without significant additional work.
You should attempt older code to fully use ppport.h, because the reduced pollution of newer Perl versions is an important thing. It's so important that the old polluting ways of original Perl modules will not be supported very far into the future, and your module will almost certainly break! By adapting to it now, you'll gain compatibility and a sense of having done the electronic ecology some good.
Don't direct the users of your module to download Devel::PPPort
. They are most probably no XS writers. Also, don't make ppport.h optional. Rather, just take the most recent copy of ppport.h that you can find (e.g. by generating it with the latest Devel::PPPort
release from CPAN), copy it into your project, adjust your project to use it, and distribute the header along with your module.
But ppport.h is more than just a C header. It's also a Perl script that can check your source code. It will suggest hints and portability notes, and can even make suggestions on how to change your code. You can run it like any other Perl program:
perl ppport.h [options] [files]
It also has embedded documentation, so you can use
perldoc ppport.h
to find out more about how to use it.
WriteFile
takes one optional argument. When called with one argument, it expects to be passed a filename. When called with no arguments, it defaults to the filename ppport.h.
The function returns a true value if the file was written successfully. Otherwise it returns a false value.
GetFileContents
behaves like WriteFile
above, but returns the contents of the would-be file rather than writing it out.
ppport.h supports Perl versions from 5.003 to 5.30 in threaded and non-threaded configurations.
The header file written by this module, typically ppport.h, provides access to the following elements of the Perl API that is not available in older Perl releases:
__ASSERT_
_aMY_CXT
_pMY_CXT
aMY_CXT
aMY_CXT_
aTHX
aTHX_
aTHXR
aTHXR_
av_tindex
av_top_index
AvFILLp
boolSV
C_ARRAY_END
C_ARRAY_LENGTH
call_argv
call_method
call_pv
call_sv
caller_cx
cBOOL
ckWARN
CopFILE
CopFILE_set
CopFILEAV
CopFILEGV
CopFILEGV_set
CopFILESV
CopSTASH
CopSTASH_eq
CopSTASH_set
CopSTASHPV
CopSTASHPV_set
CopyD
CPERLscope
croak_memory_wrap
croak_no_modify
croak_no_modify_sv
croak_nocontext
croak_sv
croak_xs_usage
dAX
dAXMARK
DEFSV
DEFSV_set
die_sv
dITEMS
dMY_CXT
dMY_CXT_SV
dNOOP
dTHR
dTHX
dTHXa
dTHXoa
dTHXR
dUNDERBAR
dVAR
dXCPT
dXSTARG
END_EXTERN_C
ERRSV
eval_pv
eval_sv
EXTERN_C
G_METHOD
get_av
get_cv
get_cvn_flags
get_cvs
get_hv
get_sv
grok_bin
grok_hex
grok_number
GROK_NUMERIC_RADIX
grok_numeric_radix
grok_oct
gv_fetchmethod_flags
gv_fetchpvn
gv_fetchpvn_flags
gv_fetchpvs
gv_fetchsv
gv_init_pv
gv_init_pvn
gv_init_sv
GV_NOADD_MASK
gv_stashpvn
gv_stashpvs
GvSVn
HEf_SVKEY
HeUTF8
hv_fetchs
hv_stores
HvENAME
HvENAMELEN
HvENAMEUTF8
HvNAME_get
HvNAMELEN
HvNAMELEN_get
HvNAMEUTF8
IN_LOCALE
IN_LOCALE_COMPILETIME
IN_LOCALE_RUNTIME
IN_PERL_COMPILETIME
INT2PTR
IS_NUMBER_GREATER_THAN_UV_MAX
IS_NUMBER_IN_UV
IS_NUMBER_INFINITY
IS_NUMBER_NAN
IS_NUMBER_NEG
IS_NUMBER_NOT_INT
isALNUM
isALNUM_A
isALNUMC
isALNUMC_A
isALPHA
isALPHA_A
isALPHANUMERIC
isALPHANUMERIC_A
isASCII
isASCII_A
isBLANK
isBLANK_A
isCNTRL
isCNTRL_A
isDIGIT
isDIGIT_A
isGRAPH
isGRAPH_A
isGV_with_GP
isIDCONT
isIDCONT_A
isIDFIRST
isIDFIRST_A
isLOWER
isLOWER_A
isOCTAL
isOCTAL_A
isPRINT
isPRINT_A
isPSXSPC
isPSXSPC_A
isPUNCT
isPUNCT_A
isSPACE
isSPACE_A
isUPPER
isUPPER_A
isWORDCHAR
isWORDCHAR_A
isXDIGIT
isXDIGIT_A
IVdf
IVSIZE
IVTYPE
LIKELY
load_module
memEQ
memEQs
memNE
memNEs
mess
mess_nocontext
mess_sv
mg_findext
MoveD
mPUSHi
mPUSHn
mPUSHp
mPUSHs
mPUSHu
MUTABLE_PTR
MUTABLE_SV
mXPUSHi
mXPUSHn
mXPUSHp
mXPUSHs
mXPUSHu
MY_CXT
MY_CXT_CLONE
MY_CXT_INIT
my_snprintf
my_sprintf
my_strlcat
my_strlcpy
my_strnlen
newCONSTSUB
newRV_inc
newRV_noinc
newSV_type
newSVpvn
newSVpvn_flags
newSVpvn_share
newSVpvn_utf8
newSVpvs
newSVpvs_flags
newSVpvs_share
newSVuv
Newx
Newxc
Newxz
NOOP
NUM2PTR
NVef
NVff
NVgf
NVTYPE
OpHAS_SIBLING
OpLASTSIB_set
OpMAYBESIB_set
OpMORESIB_set
OpSIBLING
packWARN
PERL_ABS
PERL_ARGS_ASSERT_CROAK_XS_USAGE
PERL_BCDVERSION
Perl_croak_no_modify
PERL_GCC_BRACE_GROUPS_FORBIDDEN
PERL_HASH
PERL_INT_MAX
PERL_INT_MIN
PERL_LONG_MAX
PERL_LONG_MIN
PERL_MAGIC_arylen
PERL_MAGIC_backref
PERL_MAGIC_bm
PERL_MAGIC_collxfrm
PERL_MAGIC_dbfile
PERL_MAGIC_dbline
PERL_MAGIC_defelem
PERL_MAGIC_env
PERL_MAGIC_envelem
PERL_MAGIC_ext
PERL_MAGIC_fm
PERL_MAGIC_glob
PERL_MAGIC_isa
PERL_MAGIC_isaelem
PERL_MAGIC_mutex
PERL_MAGIC_nkeys
PERL_MAGIC_overload
PERL_MAGIC_overload_elem
PERL_MAGIC_overload_table
PERL_MAGIC_pos
PERL_MAGIC_qr
PERL_MAGIC_regdata
PERL_MAGIC_regdatum
PERL_MAGIC_regex_global
PERL_MAGIC_shared
PERL_MAGIC_shared_scalar
PERL_MAGIC_sig
PERL_MAGIC_sigelem
PERL_MAGIC_substr
PERL_MAGIC_sv
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
PERL_PV_ESCAPE_ALL
PERL_PV_ESCAPE_FIRSTCHAR
PERL_PV_ESCAPE_NOBACKSLASH
PERL_PV_ESCAPE_NOCLEAR
PERL_PV_ESCAPE_QUOTE
PERL_PV_ESCAPE_RE
PERL_PV_ESCAPE_UNI
PERL_PV_ESCAPE_UNI_DETECT
PERL_PV_PRETTY_DUMP
PERL_PV_PRETTY_ELLIPSES
PERL_PV_PRETTY_LTGT
PERL_PV_PRETTY_NOCLEAR
PERL_PV_PRETTY_QUOTE
PERL_PV_PRETTY_REGPROP
PERL_QUAD_MAX
PERL_QUAD_MIN
PERL_REVISION
PERL_SCAN_ALLOW_UNDERSCORES
PERL_SCAN_DISALLOW_PREFIX
PERL_SCAN_GREATER_THAN_UV_MAX
PERL_SCAN_SILENT_ILLDIGIT
PERL_SHORT_MAX
PERL_SHORT_MIN
PERL_SIGNALS_UNSAFE_FLAG
PERL_SUBVERSION
PERL_UCHAR_MAX
PERL_UCHAR_MIN
PERL_UINT_MAX
PERL_UINT_MIN
PERL_ULONG_MAX
PERL_ULONG_MIN
PERL_UNUSED_ARG
PERL_UNUSED_CONTEXT
PERL_UNUSED_DECL
PERL_UNUSED_RESULT
PERL_UNUSED_VAR
PERL_UQUAD_MAX
PERL_UQUAD_MIN
PERL_USE_GCC_BRACE_GROUPS
PERL_USHORT_MAX
PERL_USHORT_MIN
PERL_VERSION
Perl_warner
Perl_warner_nocontext
PERLIO_FUNCS_CAST
PERLIO_FUNCS_DECL
PL_bufend
PL_bufptr
PL_compiling
PL_copline
PL_curcop
PL_curstash
PL_DBsignal
PL_DBsingle
PL_DBsub
PL_DBtrace
PL_debstash
PL_defgv
PL_diehook
PL_dirty
PL_dowarn
PL_errgv
PL_error_count
PL_expect
PL_hexdigit
PL_hints
PL_in_class
PL_in_my
PL_in_my_stash
PL_in_pod
PL_in_sub
PL_laststatval
PL_lex_state
PL_lex_stuff
PL_linestr
PL_na
PL_no_modify
PL_parser
PL_perl_destruct_level
PL_perldb
PL_ppaddr
PL_rsfp
PL_rsfp_filters
PL_signals
PL_stack_base
PL_stack_sp
PL_statcache
PL_stdingv
PL_Sv
PL_sv_arenaroot
PL_sv_no
PL_sv_undef
PL_sv_yes
PL_tainted
PL_tainting
PL_tokenbuf
pMY_CXT
pMY_CXT_
Poison
PoisonFree
PoisonNew
PoisonWith
pTHX
pTHX_
PTR2IV
PTR2nat
PTR2NV
PTR2ul
PTR2UV
PTRV
PUSHmortal
PUSHu
pv_display
pv_escape
pv_pretty
SAVE_DEFSV
START_EXTERN_C
START_MY_CXT
STMT_END
STMT_START
STR_WITH_LEN
sv_2pv_flags
sv_2pv_nolen
sv_2pvbyte
sv_2pvbyte_nolen
sv_2uv
sv_catpv_mg
sv_catpvf_mg
sv_catpvf_mg_nocontext
sv_catpvn_mg
sv_catpvn_nomg
sv_catpvs
sv_catsv_mg
sv_catsv_nomg
SV_CONST_RETURN
SV_COW_DROP_PV
SV_COW_SHARED_HASH_KEYS
SV_GMAGIC
SV_HAS_TRAILING_NUL
SV_IMMEDIATE_UNREF
sv_magic_portable
SV_MUTABLE_RETURN
SV_NOSTEAL
sv_pvn_force_flags
sv_pvn_nomg
sv_setiv_mg
sv_setnv_mg
sv_setpv_mg
sv_setpvf_mg
sv_setpvf_mg_nocontext
sv_setpvn_mg
sv_setpvs
sv_setsv_mg
sv_setsv_nomg
sv_setuv
sv_setuv_mg
SV_SMAGIC
sv_unmagicext
sv_usepvn_mg
SV_UTF8_NO_ENCODING
sv_uv
sv_vcatpvf
sv_vcatpvf_mg
sv_vsetpvf
sv_vsetpvf_mg
SVf
SVf_UTF8
SVfARG
SvGETMAGIC
SvIV_nomg
SvMAGIC_set
SvPV_const
SvPV_flags
SvPV_flags_const
SvPV_flags_const_nolen
SvPV_flags_mutable
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
SvPV_mutable
SvPV_nolen
SvPV_nolen_const
SvPV_nomg
SvPV_nomg_const
SvPV_nomg_const_nolen
SvPV_nomg_nolen
SvPV_renew
SvPVbyte
SvPVX_const
SvPVX_mutable
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
SvRV_set
SvRX
SvRXOK
SvSHARED_HASH
SvSTASH_set
SvUOK
SvUV
SvUV_nomg
SvUV_set
SvUVX
SvUVx
SvUVXx
SvVSTRING_mg
UNDERBAR
UNICODE_REPLACEMENT
UNLIKELY
UTF8_ALLOW_ANY
UTF8_ALLOW_ANYUV
UTF8_ALLOW_CONTINUATION
UTF8_ALLOW_EMPTY
UTF8_ALLOW_LONG
UTF8_ALLOW_NON_CONTINUATION
UTF8_ALLOW_OVERFLOW
UTF8_ALLOW_SHORT
UTF8_MAXBYTES
UTF8_SAFE_SKIP
utf8_to_uvchr
utf8_to_uvchr_buf
UVof
UVSIZE
UVTYPE
UVuf
UVXf
UVxf
vload_module
vmess
vnewSVpvf
WARN_ALL
WARN_AMBIGUOUS
WARN_ASSERTIONS
WARN_BAREWORD
WARN_CLOSED
WARN_CLOSURE
WARN_DEBUGGING
WARN_DEPRECATED
WARN_DIGIT
WARN_EXEC
WARN_EXITING
WARN_GLOB
WARN_INPLACE
WARN_INTERNAL
WARN_IO
WARN_LAYER
WARN_MALLOC
WARN_MISC
WARN_NEWLINE
warn_nocontext
WARN_NUMERIC
WARN_ONCE
WARN_OVERFLOW
WARN_PACK
WARN_PARENTHESIS
WARN_PIPE
WARN_PORTABLE
WARN_PRECEDENCE
WARN_PRINTF
WARN_PROTOTYPE
WARN_QW
WARN_RECURSION
WARN_REDEFINE
WARN_REGEXP
WARN_RESERVED
WARN_SEMICOLON
WARN_SEVERE
WARN_SIGNAL
WARN_SUBSTR
warn_sv
WARN_SYNTAX
WARN_TAINT
WARN_THREADS
WARN_UNINITIALIZED
WARN_UNOPENED
WARN_UNPACK
WARN_UNTIE
WARN_UTF8
WARN_VOID
warner
WIDEST_UTYPE
XCPT_CATCH
XCPT_RETHROW
XCPT_TRY_END
XCPT_TRY_START
XPUSHmortal
XPUSHu
XSprePUSH
XSPROTO
XSRETURN
XSRETURN_UV
XST_mUV
ZeroD
There is still a big part of the API not supported by ppport.h. Either because it doesn't make sense to back-port that part of the API, or simply because it hasn't been implemented yet. Patches welcome!
Here's a list of the currently unsupported API, and also the version of Perl below which it is unsupported:
BhkDISABLE
BhkENABLE
BhkENTRY_set
MULTICALL
PERL_SYS_TERM
POP_MULTICALL
PUSH_MULTICALL
PadARRAY
PadMAX
PadlistARRAY
PadlistMAX
PadlistNAMES
PadlistNAMESARRAY
PadlistNAMESMAX
PadnameLEN
PadnamePV
PadnameREFCNT
PadnameREFCNT_dec
PadnameSV
PadnamelistARRAY
PadnamelistMAX
PadnamelistREFCNT
PadnamelistREFCNT_dec
RESTORE_LC_NUMERIC
STORE_LC_NUMERIC_FORCE_TO_UNDERLYING
STORE_LC_NUMERIC_SET_TO_NEEDED
XS_APIVERSION_BOOTCHECK
XS_EXTERNAL
XS_INTERNAL
XS_VERSION_BOOTCHECK
XopDISABLE
XopENABLE
XopENTRY
XopENTRYCUSTOM
XopENTRY_set
cophh_new_empty
my_lstat
my_stat
reentrant_free
reentrant_init
reentrant_retry
reentrant_size
ref
sv_setref_pvs
toFOLD_uvchr
toLOWER_uvchr
toTITLE_uvchr
toUPPER_uvchr
clear_defarray
cx_popblock
cx_popeval
cx_popformat
cx_popgiven
cx_poploop
cx_popsub
cx_popsub_args
cx_popsub_common
cx_popwhen
cx_pushblock
cx_pusheval
cx_pushformat
cx_pushgiven
cx_pushloop_for
cx_pushloop_plain
cx_pushsub
cx_pushwhen
cx_topblock
leave_adjust_stacks
savetmps
UVCHR_SKIP
DECLARATION_FOR_LC_NUMERIC_MANIPULATION
sv_get_backrefs
OpSIBLING_set
PadnameUTF8
is_invariant_string
newPADNAMELIST
newPADNAMEouter
newPADNAMEpvn
newUNOP_AUX
padnamelist_fetch
padnamelist_store
newDEFSVOP
op_convert_list
cv_name
newMETHOP
newMETHOP_named
cv_set_call_checker_flags
grok_infnan
isinfnan
sync_locale
grok_number_flags
op_parent
op_sibling_splice
_is_in_locale_category
_is_utf8_char_slow
_is_utf8_idcont
_is_utf8_idstart
_is_utf8_xidcont
_is_utf8_xidstart
isALNUM_lazy
isIDFIRST_lazy
isUTF8_CHAR
markstack_grow
my_strerror
OP_TYPE_IS_OR_WAS
_to_utf8_fold_flags
_to_utf8_lower_flags
_to_utf8_title_flags
_to_utf8_upper_flags
OP_TYPE_IS
append_utf8_from_native_byte
is_safe_syscall
uvoffuni_to_utf8_flags
sv_pos_b2u_flags
SVt_INVLIST
re_intuit_start
toFOLD
toFOLD_utf8
toLOWER_L1
toTITLE
hv_rand_set
_is_uni_FOO
_is_uni_perl_idcont
_is_utf8_FOO
_is_utf8_mark
_is_utf8_perl_idcont
SvREFCNT_dec_NN
_is_uni_perl_idstart
_is_utf8_perl_idstart
is_uni_alnumc
is_uni_alnumc_lc
is_utf8_alnumc
READ_XDIGIT
PL_comppad_name
PadlistREFCNT
newMYSUB
newSVpadname
is_uni_blank
is_uni_blank_lc
is_utf8_blank
sv_copypv_flags
sv_copypv_nomg
sv_vcatpvfn_flags
utf8_to_uvuni_buf
valid_utf8_to_uvchr
valid_utf8_to_uvuni
is_utf8_char_buf
wrap_op_checker
toLOWER_utf8
toTITLE_utf8
toUPPER_utf8
to_utf8_fold
to_utf8_lower
to_utf8_title
to_utf8_upper
newCONSTSUB_flags
gv_autoload_pv
gv_autoload_pvn
gv_autoload_sv
gv_fetchmeth_pv
gv_fetchmeth_pv_autoload
gv_fetchmeth_pvn
gv_fetchmeth_pvn_autoload
gv_fetchmeth_sv
gv_fetchmeth_sv_autoload
gv_fetchmethod_pv_flags
gv_fetchmethod_pvn_flags
gv_fetchmethod_sv_flags
newGVgen_flags
sv_derived_from_pv
sv_derived_from_pvn
sv_derived_from_sv
sv_does_pv
sv_does_pvn
sv_does_sv
whichsig_pv
whichsig_pvn
whichsig_sv
cop_fetch_label
cop_store_label
pad_add_name_pv
pad_add_name_pvn
pad_add_name_pvs
pad_add_name_sv
pad_findmy_pv
pad_findmy_pvn
pad_findmy_pvs
pad_findmy_sv
_to_uni_fold_flags
foldEQ_utf8_flags
is_utf8_xidcont
is_utf8_xidfirst
foldEQ_latin1
parse_arithexpr
parse_fullexpr
parse_listexpr
parse_termexpr
OP_CLASS
XopFLAGS
amagic_deref_call
bytes_cmp_utf8
cop_hints_2hv
cop_hints_fetch_pv
cop_hints_fetch_pvn
cop_hints_fetch_pvs
cop_hints_fetch_sv
cophh_2hv
cophh_copy
cophh_delete_pv
cophh_delete_pvn
cophh_delete_pvs
cophh_delete_sv
cophh_fetch_pv
cophh_fetch_pvn
cophh_fetch_pvs
cophh_fetch_sv
cophh_free
cophh_store_pv
cophh_store_pvn
cophh_store_pvs
cophh_store_sv
custom_op_register
custom_op_xop
newFOROP
newWHILEOP
op_lvalue
op_scope
parse_barestmt
parse_block
parse_label
LINKLIST
SvTRUE_nomg
ck_entersub_args_list
ck_entersub_args_proto
ck_entersub_args_proto_or_list
cv_get_call_checker
cv_set_call_checker
lex_stuff_pv
mg_free_type
newSVpv_share
op_append_elem
op_append_list
op_contextualize
op_linklist
op_prepend_elem
parse_stmtseq
rv2cv_op_cv
savesharedpvs
savesharedsvpv
sv_2bool_flags
sv_catpv_flags
sv_catpv_nomg
sv_catpvs_flags
sv_catpvs_mg
sv_catpvs_nomg
sv_cmp_flags
sv_cmp_locale_flags
sv_collxfrm_flags
sv_eq_flags
sv_setpvs_mg
PL_rpeepp
lex_stuff_pvs
parse_fullstmt
blockhook_register
SvNV_nomg
find_rundefsv
foldEQ
foldEQ_locale
foldEQ_utf8
hv_fill
sv_dec_nomg
sv_inc_nomg
sv_2nv_flags
sv_pos_u2b_flags
prescan_version
PL_keyword_plugin
lex_bufutf8
lex_discard_to
lex_grow_linestr
lex_next_chunk
lex_peek_unichar
lex_read_space
lex_read_to
lex_read_unichar
lex_stuff_pvn
lex_stuff_sv
lex_unstuff
ck_warner
ck_warner_d
is_utf8_perl_space
is_utf8_perl_word
is_utf8_posix_digit
Gv_AMupdate
PL_opfreehook
SVt_REGEXP
SvOOK_offset
av_iter_p
gv_add_by_type
is_ascii_string
pregfree2
save_adelete
save_aelem_flags
save_hdelete
save_helem_flags
sv_utf8_upgrade_flags_grow
mro_get_from_name
mro_get_private_data
mro_register
mro_set_mro
mro_set_private_data
save_hints
save_padsv_and_mortalize
save_pushi32ptr
save_pushptr
save_pushptrptr
sv_insert_flags
hv_common
hv_common_key_len
sv_destroyable
sys_init
sys_init3
sys_term
Perl_signbit
av_create_and_push
av_create_and_unshift_one
gv_fetchfile_flags
lex_start
mro_get_linear_isa
mro_method_changed_in
my_dirfd
pregcomp
ptr_table_clear
ptr_table_fetch
ptr_table_free
ptr_table_new
ptr_table_split
ptr_table_store
re_compile
reg_named_buff_all
reg_named_buff_exists
reg_named_buff_fetch
reg_named_buff_firstkey
reg_named_buff_nextkey
reg_named_buff_scalar
regfree_internal
savesharedpvn
scan_vstring
upg_version
PerlIO_context_layers
gv_name_set
hv_copy_hints_hv
my_vsnprintf
newXS_flags
regclass_swash
sv_does
sv_usepvn_flags
av_arylen_p
ckwarn
ckwarn_d
csighandler
dMULTICALL
doref
gv_const_sv
hv_eiter_p
hv_eiter_set
hv_name_set
hv_placeholders_get
hv_placeholders_set
hv_riter_p
hv_riter_set
is_utf8_string_loclen
newGIVENOP
newSVhek
newWHENOP
pad_compname_type
savepvs
sortsv_flags
vverify
SvPVbyte_force
find_rundefsvoffset
op_refcnt_lock
op_refcnt_unlock
savesvpv
vnormal
hv_clear_placeholders
hv_scalar
scan_version
sv_2iv_flags
sv_2uv_flags
new_version
save_set_svflags
vcmp
vnumify
vstringify
SvIsCOW
SvIsCOW_shared_hash
CvPADLIST
PL_comppad
SvVOK
doing_taint
find_runcv
is_utf8_string_loc
packlist
pad_add_anon
pad_new
pad_tidy
save_bool
savestack_grow_cnt
seed
sv_cat_decode
sv_setpviv
sv_setpviv_mg
unpackstring
HeUTF8
hv_iternext_flags
hv_store_flags
is_utf8_idcont
nothreadhook
OP_DESC
OP_NAME
PL_peepp
PerlIO_clearerr
PerlIO_close
PerlIO_eof
PerlIO_error
PerlIO_fileno
PerlIO_fill
PerlIO_flush
PerlIO_get_base
PerlIO_get_bufsiz
PerlIO_get_cnt
PerlIO_get_ptr
PerlIO_read
PerlIO_seek
PerlIO_set_cnt
PerlIO_set_ptrcnt
PerlIO_setlinebuf
PerlIO_stderr
PerlIO_stdin
PerlIO_stdout
PerlIO_tell
PerlIO_unread
PerlIO_write
SvLOCK
SvSHARE
SvUNLOCK
atfork_lock
atfork_unlock
custom_op_desc
custom_op_name
deb
debstack
debstackptrs
gv_fetchmeth_autoload
ibcmp_utf8
my_fork
my_socketpair
pack_cat
perl_destruct
pv_uni_display
save_shared_pvref
savesharedpv
sortsv
sv_magicext
sv_nolocking
sv_nosharing
sv_recode_to_utf8
sv_uni_display
to_uni_fold
to_uni_lower
to_uni_title
to_uni_upper
to_utf8_case
unpack_str
uvchr_to_utf8_flags
uvuni_to_utf8_flags
vdeb
calloc
getcwd_sv
init_tm
malloc
mfree
mini_mktime
my_atof2
my_strftime
op_null
realloc
sv_catpvn_flags
sv_catsv_flags
sv_setsv_flags
sv_utf8_upgrade_flags
sv_utf8_upgrade_nomg
swash_fetch
ASCII_TO_NEED
NATIVE_TO_NEED
POPpbytex
bytes_from_utf8
despatch_signals
do_openn
gv_handler
is_lvalue_sub
my_popen_list
save_mortalizesv
scan_num
sv_force_normal_flags
sv_setref_uv
sv_unref_flags
sv_utf8_upgrade
utf8_length
utf8_to_uvuni
utf8n_to_uvchr
utf8n_to_uvuni
uvchr_to_utf8
uvuni_to_utf8
SvGAMAGIC
apply_attrs_string
bytes_to_utf8
gv_efullname4
gv_fullname4
is_utf8_string
save_generic_pvref
utf16_to_utf8
utf16_to_utf8_reversed
utf8_to_bytes
DO_UTF8
PERL_SYS_INIT3
PL_check
POPul
SvIOK_UV
SvIOK_notUV
SvIOK_only_UV
SvPOK_only_UTF8
SvPVbyte_nolen
SvPVbytex
SvPVbytex_force
SvPVutf8
SvPVutf8_force
SvPVutf8_nolen
SvPVutf8x
SvPVutf8x_force
SvUOK
SvUTF8
SvUTF8_off
SvUTF8_on
UTF8SKIP
av_delete
av_exists
call_atexit
caller_cx
cast_i32
cast_iv
cast_ulong
cast_uv
do_gv_dump
do_gvgv_dump
do_hv_dump
do_magic_dump
do_op_dump
do_open9
do_pmop_dump
do_sv_dump
dump_all
dump_eval
dump_form
dump_indent
dump_packsubs
dump_sub
dump_vindent
get_context
get_ppaddr
gv_dump
init_i18nl10n
init_i18nl14n
is_uni_alnum
is_uni_alnum_lc
is_uni_alpha
is_uni_alpha_lc
is_uni_ascii
is_uni_ascii_lc
is_uni_cntrl
is_uni_cntrl_lc
is_uni_digit
is_uni_digit_lc
is_uni_graph
is_uni_graph_lc
is_uni_idfirst
is_uni_idfirst_lc
is_uni_lower
is_uni_lower_lc
is_uni_print
is_uni_print_lc
is_uni_punct
is_uni_punct_lc
is_uni_space
is_uni_space_lc
is_uni_upper
is_uni_upper_lc
is_uni_xdigit
is_uni_xdigit_lc
is_utf8_alnum
is_utf8_alpha
is_utf8_ascii
is_utf8_char
is_utf8_cntrl
is_utf8_digit
is_utf8_graph
is_utf8_idfirst
is_utf8_lower
is_utf8_mark
is_utf8_print
is_utf8_punct
is_utf8_space
is_utf8_upper
is_utf8_xdigit
magic_dump
my_atof
my_fflush_all
newANONATTRSUB
newATTRSUB
newXS
newXSproto
new_collate
new_ctype
new_numeric
op_dump
perl_parse
pmop_dump
re_intuit_string
reginitcolors
require_pv
safesyscalloc
safesysfree
safesysmalloc
safesysrealloc
save_I8
save_alloc
save_destructor
save_destructor_x
save_re_context
save_vptr
scan_bin
set_context
set_numeric_local
set_numeric_radix
set_numeric_standard
str_to_version
sv_2pvutf8
sv_2pvutf8_nolen
sv_force_normal
sv_len_utf8
sv_pos_b2u
sv_pos_u2b
sv_pv
sv_pvbyte
sv_pvbyten
sv_pvbyten_force
sv_pvutf8
sv_pvutf8n
sv_pvutf8n_force
sv_rvweaken
sv_utf8_decode
sv_utf8_downgrade
sv_utf8_encode
swash_init
to_uni_lower_lc
to_uni_title_lc
to_uni_upper_lc
utf8_distance
utf8_hop
vcroak
vform
vwarn
vwarner
POPpx
get_vtbl
save_generic_svref
PL_curpad
PL_modglobal
cx_dump
debop
debprofdump
fbm_compile
fbm_instr
get_op_descs
get_op_names
init_stacks
mg_length
mg_size
newHVhv
new_stackinfo
regdump
regexec_flags
regnext
runops_debug
runops_standard
save_iv
save_op
sv_iv
sv_nv
sv_peek
sv_pvn
sv_pvn_nomg
sv_true
CopyD
MoveD
do_binmode
my_bcopy
save_aelem
save_helem
GIMME_V
G_VOID
HePV
HeSVKEY_set
POPu
SvSetMagicSV
SvSetMagicSV_nosteal
SvSetSV_nosteal
SvTAINTED
SvTAINTED_off
SvTAINTED_on
block_end
block_gimme
block_start
call_list
delimcpy
form
gv_autoload4
gv_fetchmethod_autoload
hv_delayfree_ent
hv_free_ent
ibcmp_locale
intro_my
my_failure_exit
newSVpvf
rsignal
rsignal_state
save_I16
save_gp
share_hek
start_subparse
sv_catpvf
sv_catpvf_mg
sv_cmp_locale
sv_derived_from
sv_magic_portable
sv_setpvf
sv_setpvf_mg
sv_taint
sv_tainted
sv_untaint
sv_vcatpvf
sv_vcatpvf_mg
sv_vcatpvfn
sv_vsetpvf
sv_vsetpvf_mg
sv_vsetpvfn
toLOWER_LC
vnewSVpvf
warner
HeHASH
HeKEY
HeKLEN
HeSVKEY
HeSVKEY_force
HeVAL
cv_const_sv
do_open
gv_efullname3
gv_fullname3
hv_delete_ent
hv_exists_ent
hv_fetch_ent
hv_iterkeysv
hv_ksplit
hv_store_ent
my_pclose
my_popen
sv_gets
unsharepvn
If you find any bugs, Devel::PPPort
doesn't seem to build on your system, or any of its tests fail, please send a bug report to perlbug@perl.org.
Version 1.x of Devel::PPPort was written by Kenneth Albanowski.
Version 2.x was ported to the Perl core by Paul Marquess.
Version 3.x was ported back to CPAN by Marcus Holland-Moritz.
Versions >= 3.22 are maintained with support from Matthew Horsfall (alh).
Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
Copyright (C) 2018, The perl5 porters
Version 2.x, Copyright (C) 2001, Paul Marquess.
Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.