Algorithm-Line-Lerp
view release on metacpan or search on metacpan
if ($API{$f}{unverified}) {
print "\nThis information is based on inspection of the source code",
" and has not been\n",
"verified by successful compilation.";
}
print "\n";
$info++;
}
if ($API{$f}{provided} || $todo) {
print "\nThis is only supported by $ppport, and NOT by perl versions going forward.\n" unless $base;
if ($todo) {
if (! $base || $todo < $base) {
my $additionally = "";
$additionally .= " additionally" if $base;
print "$ppport$additionally provides support at least back to perl-",
format_version($todo),
".\n";
}
}
elsif (! $base || $base > $int_min_perl) {
if (exists $depends{$f}) {
my $max = 0;
for (@{$depends{$f}}) {
$max = int_parse_version($API{$_}{todo}) if $API{$_}{todo} && $API{$_}{todo} > $max;
# XXX What to assume unspecified values are? This effectively makes them MIN_PERL
}
$todo = $max if $max;
}
print "\n$ppport provides support for this, but ironically, does not",
" currently know,\n",
"for this report, the minimum version it supports for this";
if ($API{$f}{undocumented}) {
print " and many things\n",
"it provides that are implemented as macros and aren't",
" documented. You can\n",
"help by submitting a documentation patch";
}
print ".\n";
if ($todo) {
if ($todo <= $int_min_perl) {
print "It may very well be supported all the way back to ",
format_version(5.003_07), ".\n";
}
else {
print "But given the things $f depends on, it's a good",
" guess that it isn't\n",
"supported prior to ", format_version($todo), ".\n";
}
}
}
}
if ($API{$f}{provided}) {
print "Support needs to be explicitly requested by #define NEED_$f\n",
"(or #define NEED_${f}_GLOBAL).\n" if exists $need{$f};
$info++;
}
if ($base || ! $API{$f}{ppport_fnc}) {
my $email = "Send email to perl5-porters\@perl.org if you need to have this functionality.\n";
if ($API{$f}{inaccessible}) {
print "\nThis is not part of the public API, and may not even be accessible to XS code.\n";
$info++;
}
elsif ($API{$f}{core_only}) {
print "\nThis is not part of the public API, and should not be used by XS code.\n";
$info++;
}
elsif ($API{$f}{deprecated}) {
print "\nThis is deprecated and should not be used. Convert existing uses.\n";
$info++;
}
elsif ($API{$f}{experimental}) {
print "\nThe API for this is unstable and should not be used by XS code.\n", $email;
$info++;
}
elsif ($API{$f}{undocumented}) {
print "\nSince this is undocumented, the API should be considered unstable.\n";
if ($API{$f}{provided}) {
print "Consider bringing this up on the list: perl5-porters\@perl.org.\n";
}
else {
print "It may be that this is not intended for XS use, or it may just be\n",
"that no one has gotten around to documenting it.\n", $email;
}
$info++;
}
unless ($info) {
print "No portability information available. Check your spelling; or",
" this could be\na bug in Devel::PPPort. To report an issue:\n",
"https://github.com/Dual-Life/Devel-PPPort/issues/new\n";
}
}
print "\nDepends on: ", join(', ', @{$depends{$f}}), ".\n"
if exists $depends{$f};
if (exists $hints{$f} || exists $warnings{$f}) {
print "\n$hints{$f}" if exists $hints{$f};
print "\nWARNING:\n$warnings{$f}" if exists $warnings{$f};
$info++;
}
$count++;
}
$count or print "\nFound no API matching '$opt{'api-info'}'.";
print "\n";
exit 0;
}
if (exists $opt{'list-provided'}) {
my $f;
for $f (sort dictionary_order keys %API) {
next unless $API{$f}{provided};
my @flags;
push @flags, 'explicit' if exists $need{$f};
push @flags, 'depend' if exists $depends{$f};
push @flags, 'hint' if exists $hints{$f};
push @flags, 'warning' if exists $warnings{$f};
my $flags = @flags ? ' ['.join(', ', @flags).']' : '';
print "$f$flags\n";
}
exit 0;
}
my @files;
my @srcext = qw( .xs .c .h .cc .cpp -c.inc -xs.inc );
#ifndef __ASSERT_
# define __ASSERT_(statement) assert(statement),
#endif
#else
#ifndef __ASSERT_
# define __ASSERT_(statement)
#endif
#endif
#ifndef __has_builtin
# define __has_builtin(x) 0
#endif
#if __has_builtin(__builtin_unreachable)
# define D_PPP_HAS_BUILTIN_UNREACHABLE
#elif (defined(__GNUC__) && ( __GNUC__ > 4 \
|| __GNUC__ == 4 && __GNUC_MINOR__ >= 5))
# define D_PPP_HAS_BUILTIN_UNREACHABLE
#endif
#ifndef ASSUME
# ifdef DEBUGGING
# define ASSUME(x) assert(x)
# elif defined(_MSC_VER)
# define ASSUME(x) __assume(x)
# elif defined(__ARMCC_VERSION)
# define ASSUME(x) __promise(x)
# elif defined(D_PPP_HAS_BUILTIN_UNREACHABLE)
# define ASSUME(x) ((x) ? (void) 0 : __builtin_unreachable())
# else
# define ASSUME(x) assert(x)
# endif
#endif
#ifndef NOT_REACHED
# ifdef D_PPP_HAS_BUILTIN_UNREACHABLE
# define NOT_REACHED \
STMT_START { \
ASSUME(!"UNREACHABLE"); __builtin_unreachable(); \
} STMT_END
# elif ! defined(__GNUC__) && (defined(__sun) || defined(__hpux))
# define NOT_REACHED
# else
# define NOT_REACHED ASSUME(!"UNREACHABLE")
# endif
#endif
#ifndef WIDEST_UTYPE
# ifdef QUADKIND
# ifdef U64TYPE
# define WIDEST_UTYPE U64TYPE
# else
# define WIDEST_UTYPE unsigned Quad_t
# endif
# else
# define WIDEST_UTYPE U32
# endif
#endif
/* These could become provided if/when they become part of the public API */
#ifndef withinCOUNT
# define withinCOUNT(c, l, n) \
(((WIDEST_UTYPE) (((c)) - ((l) | 0))) <= (((WIDEST_UTYPE) ((n) | 0))))
#endif
#ifndef inRANGE
# define inRANGE(c, l, u) \
( (sizeof(c) == sizeof(U8)) ? withinCOUNT(((U8) (c)), (l), ((u) - (l))) \
: (sizeof(c) == sizeof(U32)) ? withinCOUNT(((U32) (c)), (l), ((u) - (l))) \
: (withinCOUNT(((WIDEST_UTYPE) (c)), (l), ((u) - (l)))))
#endif
/* The '| 0' part ensures a compiler error if c is not integer (like e.g., a
* pointer) */
#undef FITS_IN_8_BITS /* handy.h version uses a core-only constant */
#ifndef FITS_IN_8_BITS
# define FITS_IN_8_BITS(c) ( (sizeof(c) == 1) \
|| !(((WIDEST_UTYPE)((c) | 0)) & ~0xFF))
#endif
/* Create the macro for "is'macro'_utf8_safe(s, e)". For code points below
* 256, it calls the equivalent _L1 macro by converting the UTF-8 to code
* point. That is so that it can automatically get the bug fixes done in this
* file. */
#define D_PPP_IS_GENERIC_UTF8_SAFE(s, e, macro) \
(((e) - (s)) <= 0 \
? 0 \
: UTF8_IS_INVARIANT((s)[0]) \
? is ## macro ## _L1((s)[0]) \
: (((e) - (s)) < UTF8SKIP(s)) \
? 0 \
: UTF8_IS_DOWNGRADEABLE_START((s)[0]) \
/* The cast in the line below is only to silence warnings */ \
? is ## macro ## _L1((WIDEST_UTYPE) LATIN1_TO_NATIVE( \
UTF8_ACCUMULATE(NATIVE_UTF8_TO_I8((s)[0]) \
& UTF_START_MASK(2), \
(s)[1]))) \
: is ## macro ## _utf8(s))
/* Create the macro for "is'macro'_LC_utf8_safe(s, e)". For code points below
* 256, it calls the equivalent _L1 macro by converting the UTF-8 to code
* point. That is so that it can automatically get the bug fixes done in this
* file. */
#define D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, macro) \
(((e) - (s)) <= 0 \
? 0 \
: UTF8_IS_INVARIANT((s)[0]) \
? is ## macro ## _LC((s)[0]) \
: (((e) - (s)) < UTF8SKIP(s)) \
? 0 \
: UTF8_IS_DOWNGRADEABLE_START((s)[0]) \
/* The cast in the line below is only to silence warnings */ \
? is ## macro ## _LC((WIDEST_UTYPE) LATIN1_TO_NATIVE( \
UTF8_ACCUMULATE(NATIVE_UTF8_TO_I8((s)[0]) \
& UTF_START_MASK(2), \
(s)[1]))) \
: is ## macro ## _utf8(s))
/* A few of the early functions are broken. For these and the non-LC case,
* machine generated code is substituted. But that code doesn't work for
( run in 0.759 second using v1.01-cache-2.11-cpan-39bf76dae61 )