-
Notifications
You must be signed in to change notification settings - Fork 7
/
ppport.h
16945 lines (15631 loc) · 504 KB
/
ppport.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
#if 0
my $void = <<'SKIP';
#endif
/*
----------------------------------------------------------------------
ppport.h -- Perl/Pollution/Portability Version 3.59
Automatically created by Devel::PPPort running under perl 5.030001.
Do NOT edit this file directly! -- Edit PPPort_pm.PL and the
includes in parts/inc/ instead.
Use 'perldoc ppport.h' to view the documentation below.
----------------------------------------------------------------------
SKIP
=pod
=head1 NAME
ppport.h - Perl/Pollution/Portability version 3.59
=head1 SYNOPSIS
perl ppport.h [options] [source files]
Searches current directory for files if no [source files] are given
--help show short help
--version show version
--patch=file write one patch file with changes
--copy=suffix write changed copies with suffix
--diff=program use diff program and options
--compat-version=version provide compatibility with Perl version
--cplusplus accept C++ comments
--quiet don't output anything except fatal errors
--nodiag don't show diagnostics
--nohints don't show hints
--nochanges don't suggest changes
--nofilter don't filter input files
--strip strip all script and doc functionality
from ppport.h
--list-provided list provided API
--list-unsupported list API that isn't supported all the way
back
--api-info=name show Perl API portability information
=head1 COMPATIBILITY
This version of F<ppport.h> is designed to support operation with Perl
installations back to 5.003_07, and has been tested up to 5.33.1.
=head1 OPTIONS
=head2 --help
Display a brief usage summary.
=head2 --version
Display the version of F<ppport.h>.
=head2 --patch=I<file>
If this option is given, a single patch file will be created if
any changes are suggested. This requires a working diff program
to be installed on your system.
=head2 --copy=I<suffix>
If this option is given, a copy of each file will be saved with
the given suffix that contains the suggested changes. This does
not require any external programs. Note that this does not
automagically add a dot between the original filename and the
suffix. If you want the dot, you have to include it in the option
argument.
If neither C<--patch> or C<--copy> are given, the default is to
simply print the diffs for each file. This requires either
C<Text::Diff> or a C<diff> program to be installed.
=head2 --diff=I<program>
Manually set the diff program and options to use. The default
is to use C<Text::Diff>, when installed, and output unified
context diffs.
=head2 --compat-version=I<version>
Tell F<ppport.h> to check for compatibility with the given
Perl version. The default is to check for compatibility with Perl
version 5.003_07. You can use this option to reduce the output
of F<ppport.h> if you intend to be backward compatible only
down to a certain Perl version.
=head2 --cplusplus
Usually, F<ppport.h> will detect C++ style comments and
replace them with C style comments for portability reasons.
Using this option instructs F<ppport.h> to leave C++
comments untouched.
=head2 --quiet
Be quiet. Don't print anything except fatal errors.
=head2 --nodiag
Don't output any diagnostic messages. Only portability
alerts will be printed.
=head2 --nohints
Don't output any hints. Hints often contain useful portability
notes. Warnings will still be displayed.
=head2 --nochanges
Don't suggest any changes. Only give diagnostic output and hints
unless these are also deactivated.
=head2 --nofilter
Don't filter the list of input files. By default, files not looking
like source code (i.e. not *.xs, *.c, *.cc, *.cpp or *.h) are skipped.
=head2 --strip
Strip all script and documentation functionality from F<ppport.h>.
This reduces the size of F<ppport.h> dramatically and may be useful
if you want to include F<ppport.h> in smaller modules without
increasing their distribution size too much.
The stripped F<ppport.h> will have a C<--unstrip> option that allows
you to undo the stripping, but only if an appropriate C<Devel::PPPort>
module is installed.
=head2 --list-provided
Lists the API elements for which compatibility is provided by
F<ppport.h>. Also lists if it must be explicitly requested,
if it has dependencies, and if there are hints or warnings for it.
=head2 --list-unsupported
Lists the API elements that are known not to be FULLY supported by F<ppport.h>,
and below which version of Perl they probably won't be available or work.
By FULLY, we mean that support isn't provided all the way back to the first
version of Perl that F<ppport.h> supports at all.
=head2 --api-info=I<name>
Show portability information for elements matching I<name>.
If I<name> is surrounded by slashes, it is interpreted as a regular
expression.
Normally, only API elements are shown, but if there are no matching API
elements but there are some other matching elements, those are shown. This
allows you to conveniently find when functions internal to the core
implementation were added; only people working on the core are likely to find
this last part useful.
=head1 DESCRIPTION
In order for a Perl extension (XS) module to be as portable as possible
across differing versions of Perl itself, certain steps need to be taken.
=over 4
=item *
Including this header is the first major one. This alone will give you
access to a large part of the Perl API that hasn't been available in
earlier Perl releases. Use
perl ppport.h --list-provided
to see which API elements are provided by ppport.h.
=item *
You should avoid using deprecated parts of the API. For example, using
global Perl variables without the C<PL_> prefix is deprecated. Also,
some API functions used to have a C<perl_> prefix. Using this form is
also deprecated. You can safely use the supported API, as F<ppport.h>
will provide wrappers for older Perl versions.
=item *
Although the purpose of F<ppport.h> is to keep you from having to concern
yourself with what version you are running under, there may arise instances
where you have to do so. These macros, the same ones as in base Perl, are
available to you in all versions, and are what you should use:
=over 4
=item C<PERL_VERSION_I<xx>(major, minor, patch)>
Returns whether or not the perl currently being compiled has the specified
relationship I<xx> to the perl given by the parameters. I<xx> is one of
C<EQ>, C<NE>, C<LT>, C<LE>, C<GT>, C<GE>.
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)
=back
=item *
If you use one of a few functions or variables that were not present in
earlier versions of Perl, and that can't be provided using a macro, you
have to explicitly request support for these functions by adding one or
more C<#define>s in your source code before the inclusion of F<ppport.h>.
These functions or variables will be marked C<explicit> in the list shown
by C<--list-provided>.
Depending on whether you module has a single or multiple files that
use such functions or variables, you want either C<static> or global
variants.
For a C<static> function or variable (used only in a single source
file), use:
#define NEED_function
#define NEED_variable
For a global function or variable (used in multiple source files),
use:
#define NEED_function_GLOBAL
#define NEED_variable_GLOBAL
Note that you mustn't have more than one global request for the
same function or variable in your project.
Function / Variable Static Request Global Request
-----------------------------------------------------------------------------------------
caller_cx() NEED_caller_cx NEED_caller_cx_GLOBAL
croak_xs_usage() NEED_croak_xs_usage NEED_croak_xs_usage_GLOBAL
die_sv() NEED_die_sv NEED_die_sv_GLOBAL
eval_pv() NEED_eval_pv NEED_eval_pv_GLOBAL
grok_bin() NEED_grok_bin NEED_grok_bin_GLOBAL
grok_hex() NEED_grok_hex NEED_grok_hex_GLOBAL
grok_number() NEED_grok_number NEED_grok_number_GLOBAL
grok_numeric_radix() NEED_grok_numeric_radix NEED_grok_numeric_radix_GLOBAL
grok_oct() NEED_grok_oct NEED_grok_oct_GLOBAL
load_module() NEED_load_module NEED_load_module_GLOBAL
mess() NEED_mess NEED_mess_GLOBAL
mess_nocontext() NEED_mess_nocontext NEED_mess_nocontext_GLOBAL
mess_sv() NEED_mess_sv NEED_mess_sv_GLOBAL
mg_findext() NEED_mg_findext NEED_mg_findext_GLOBAL
my_snprintf() NEED_my_snprintf NEED_my_snprintf_GLOBAL
my_sprintf() NEED_my_sprintf NEED_my_sprintf_GLOBAL
my_strlcat() NEED_my_strlcat NEED_my_strlcat_GLOBAL
my_strlcpy() NEED_my_strlcpy NEED_my_strlcpy_GLOBAL
my_strnlen() NEED_my_strnlen NEED_my_strnlen_GLOBAL
newCONSTSUB() NEED_newCONSTSUB NEED_newCONSTSUB_GLOBAL
newSVpvn_share() NEED_newSVpvn_share NEED_newSVpvn_share_GLOBAL
PL_parser NEED_PL_parser NEED_PL_parser_GLOBAL
PL_signals NEED_PL_signals NEED_PL_signals_GLOBAL
pv_display() NEED_pv_display NEED_pv_display_GLOBAL
pv_escape() NEED_pv_escape NEED_pv_escape_GLOBAL
pv_pretty() NEED_pv_pretty NEED_pv_pretty_GLOBAL
sv_catpvf_mg() NEED_sv_catpvf_mg NEED_sv_catpvf_mg_GLOBAL
sv_catpvf_mg_nocontext() NEED_sv_catpvf_mg_nocontext NEED_sv_catpvf_mg_nocontext_GLOBAL
sv_setpvf_mg() NEED_sv_setpvf_mg NEED_sv_setpvf_mg_GLOBAL
sv_setpvf_mg_nocontext() NEED_sv_setpvf_mg_nocontext NEED_sv_setpvf_mg_nocontext_GLOBAL
sv_unmagicext() NEED_sv_unmagicext NEED_sv_unmagicext_GLOBAL
utf8_to_uvchr_buf() NEED_utf8_to_uvchr_buf NEED_utf8_to_uvchr_buf_GLOBAL
vload_module() NEED_vload_module NEED_vload_module_GLOBAL
vmess() NEED_vmess NEED_vmess_GLOBAL
warner() NEED_warner NEED_warner_GLOBAL
To avoid namespace conflicts, you can change the namespace of the
explicitly exported functions / variables using the C<DPPP_NAMESPACE>
macro. Just C<#define> the macro before including C<ppport.h>:
#define DPPP_NAMESPACE MyOwnNamespace_
#include "ppport.h"
The default namespace is C<DPPP_>.
=back
The good thing is that most of the above can be checked by running
F<ppport.h> on your source code. See the next section for
details.
=head1 EXAMPLES
To verify whether F<ppport.h> is needed for your module, whether you
should make any changes to your code, and whether any special defines
should be used, F<ppport.h> can be run as a Perl script to check your
source code. Simply say:
perl ppport.h
The result will usually be a list of patches suggesting changes
that should at least be acceptable, if not necessarily the most
efficient solution, or a fix for all possible problems.
If you know that your XS module uses features only available in
newer Perl releases, if you're aware that it uses C++ comments,
and if you want all suggestions as a single patch file, you could
use something like this:
perl ppport.h --compat-version=5.6.0 --cplusplus --patch=test.diff
If you only want your code to be scanned without any suggestions
for changes, use:
perl ppport.h --nochanges
You can specify a different C<diff> program or options, using
the C<--diff> option:
perl ppport.h --diff='diff -C 10'
This would output context diffs with 10 lines of context.
If you want to create patched copies of your files instead, use:
perl ppport.h --copy=.new
To display portability information for the C<newSVpvn> function,
use:
perl ppport.h --api-info=newSVpvn
Since the argument to C<--api-info> can be a regular expression,
you can use
perl ppport.h --api-info=/_nomg$/
to display portability information for all C<_nomg> functions or
perl ppport.h --api-info=/./
to display information for all known API elements.
=head1 BUGS
Some of the suggested edits and/or generated patches may not compile as-is
without tweaking manually. This is generally due to the need for an extra
parameter to be added to the call to prevent buffer overflow.
If this version of F<ppport.h> is causing failure during
the compilation of this module, please check if newer versions
of either this module or C<Devel::PPPort> are available on CPAN
before sending a bug report.
If F<ppport.h> was generated using the latest version of
C<Devel::PPPort> and is causing failure of this module, please
file a bug report at L<<https://github.com/Dual-Life/Devel-PPPort/issues>
Please include the following information:
=over 4
=item 1.
The complete output from running "perl -V"
=item 2.
This file.
=item 3.
The name and version of the module you were trying to build.
=item 4.
A full log of the build that failed.
=item 5.
Any other information that you think could be relevant.
=back
For the latest version of this code, please get the C<Devel::PPPort>
module from CPAN.
=head1 COPYRIGHT
Version 3.x, Copyright (c) 2004-2013, Marcus Holland-Moritz.
Version 2.x, Copyright (C) 2001, Paul Marquess.
Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
This program is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.
=head1 SEE ALSO
See L<Devel::PPPort>.
=cut
# These are tools that must be included in ppport.h. It doesn't work if given
# a .pl suffix.
#
# WARNING: Use only constructs that are legal as far back as D:P handles, as
# this is run in the perl version being tested.
# What revisions are legal, to be output as-is and converted into a pattern
# that matches them precisely
my $r_pat = "[57]";
sub format_version
{
# Given an input version that is acceptable to parse_version(), return a
# string of the standard representation of it.
my($r,$v,$s) = parse_version(shift);
if ($r < 5 || ($r == 5 && $v < 6)) {
my $ver = sprintf "%d.%03d", $r, $v;
$s > 0 and $ver .= sprintf "_%02d", $s;
return $ver;
}
return sprintf "%d.%d.%d", $r, $v, $s;
}
sub parse_version
{
# Returns a triplet, (revision, major, minor) from the input, treated as a
# string, which can be in any of several typical formats.
my $ver = shift;
$ver = "" unless defined $ver;
my($r,$v,$s);
if ( ($r, $v, $s) = $ver =~ /^([0-9]+)([0-9]{3})([0-9]{3})$/ # 5029010, from the file
# names in our
# parts/base/ and
# parts/todo directories
or ($r, $v, $s) = $ver =~ /^([0-9]+)\.([0-9]+)\.([0-9]+)$/ # 5.25.7
or ($r, $v, $s) = $ver =~ /^([0-9]+)\.([0-9]{3})([0-9]{3})$/ # 5.025008, from the
# output of $]
or ($r, $v, $s) = $ver =~ /^([0-9]+)\.([0-9]{1,3})()$/ # 5.24, 5.004
or ($r, $v, $s) = $ver =~ /^([0-9]+)\.(00[1-5])_?([0-9]{2})$/ # 5.003_07
) {
$s = 0 unless $s;
die "Only Perl $r_pat are supported '$ver'\n" unless $r =~ / ^ $r_pat $ /x;
die "Invalid version number: $ver\n" if $v >= 1000 || $s >= 1000;
return (0 +$r, 0 + $v, 0 + $s);
}
# For some safety, don't assume something is a version number if it has a
# literal dot as one of the three characters. This will have to be fixed
# when we reach x.46 (since 46 is ord('.'))
if ($ver !~ /\./ && (($r, $v, $s) = $ver =~ /^(.)(.)(.)$/)) # vstring 5.25.7
{
$r = ord $r;
$v = ord $v;
$s = ord $s;
die "Only Perl $r_pat are supported '$ver'\n" unless $r =~ / ^ $r_pat $ /x;
return ($r, $v, $s);
}
my $mesg = "";
$mesg = ". (In 5.00x_yz, x must be 1-5.)" if $ver =~ /_/;
die "Invalid version number format: '$ver'$mesg\n";
}
sub int_parse_version
{
# Returns integer 7 digit human-readable version, suitable for use in file
# names in parts/todo parts/base.
return 0 + join "", map { sprintf("%03d", $_) } parse_version(shift);
}
sub ivers # Shorter name for int_parse_version
{
return int_parse_version(shift);
}
sub format_version_line
{
# Returns a floating point representation of the input version
my $version = int_parse_version(shift);
$version =~ s/ ^ ( $r_pat ) \B /$1./x;
return $version;
}
BEGIN {
if ("$]" < "5.006" ) {
# On early perls, the implicit pass by reference doesn't work, so we have
# to use the globals to initialize.
eval q[sub dictionary_order($$) { _dictionary_order($a, $b) } ];
} elsif ("$]" < "5.022" ) {
eval q[sub dictionary_order($$) { _dictionary_order(@_) } ];
} else {
eval q[sub dictionary_order :prototype($$) { _dictionary_order(@_) } ];
}
}
sub _dictionary_order { # Sort caselessly, ignoring punct
my ($valid_a, $valid_b) = @_;
my ($lc_a, $lc_b);
my ($squeezed_a, $squeezed_b);
$valid_a = '' unless defined $valid_a;
$valid_b = '' unless defined $valid_b;
$lc_a = lc $valid_a;
$lc_b = lc $valid_b;
$squeezed_a = $lc_a;
$squeezed_a =~ s/[\W_]//g; # No punct, including no underscore
$squeezed_b = $lc_b;
$squeezed_b =~ s/[\W_]//g;
return( $squeezed_a cmp $squeezed_b
or $lc_a cmp $lc_b
or $valid_a cmp $valid_b);
}
sub sort_api_lines # Sort lines of the form flags|return|name|args...
# by 'name'
{
$a =~ / ^ [^|]* \| [^|]* \| (\w+) /x; # 3rd field '|' is sep
my $a_name = $1;
$b =~ / ^ [^|]* \| [^|]* \| (\w+) /x;
my $b_name = $1;
return dictionary_order($a_name, $b_name);
}
1;
use strict;
BEGIN { require warnings if "$]" > '5.006' }
# Disable broken TRIE-optimization
BEGIN { eval '${^RE_TRIE_MAXBUF} = -1' if "$]" >= "5.009004" && "$]" <= "5.009005"}
my $VERSION = 3.59;
my %opt = (
quiet => 0,
diag => 1,
hints => 1,
changes => 1,
cplusplus => 0,
filter => 1,
strip => 0,
version => 0,
);
my($ppport) = $0 =~ /([\w.]+)$/;
my $LF = '(?:\r\n|[\r\n])'; # line feed
my $HS = "[ \t]"; # horizontal whitespace
# Never use C comments in this file!
my $ccs = '/'.'*';
my $cce = '*'.'/';
my $rccs = quotemeta $ccs;
my $rcce = quotemeta $cce;
eval {
require Getopt::Long;
Getopt::Long::GetOptions(\%opt, qw(
help quiet diag! filter! hints! changes! cplusplus strip version
patch=s copy=s diff=s compat-version=s
list-provided list-unsupported api-info=s
)) or usage();
};
if ($@ and grep /^-/, @ARGV) {
usage() if "@ARGV" =~ /^--?h(?:elp)?$/;
die "Getopt::Long not found. Please don't use any options.\n";
}
if ($opt{version}) {
print "This is $0 $VERSION.\n";
exit 0;
}
usage() if $opt{help};
strip() if $opt{strip};
$opt{'compat-version'} = 5.003_07 unless exists $opt{'compat-version'};
$opt{'compat-version'} = int_parse_version($opt{'compat-version'});
my $int_min_perl = int_parse_version(5.003_07);
# Each element of this hash looks something like:
# 'Poison' => {
# 'base' => '5.008000',
# 'provided' => 1,
# 'todo' => '5.003007'
# },
my %API = map { /^(\w+)\|([^|]*)\|([^|]*)\|(\w*)$/
? ( $1 => {
($2 ? ( base => $2 ) : ()),
($3 ? ( todo => $3 ) : ()),
(index($4, 'v') >= 0 ? ( varargs => 1 ) : ()),
(index($4, 'p') >= 0 ? ( provided => 1 ) : ()),
(index($4, 'n') >= 0 ? ( noTHXarg => 1 ) : ()),
(index($4, 'c') >= 0 ? ( core_only => 1 ) : ()),
(index($4, 'd') >= 0 ? ( deprecated => 1 ) : ()),
(index($4, 'i') >= 0 ? ( inaccessible => 1 ) : ()),
(index($4, 'x') >= 0 ? ( experimental => 1 ) : ()),
(index($4, 'u') >= 0 ? ( undocumented => 1 ) : ()),
(index($4, 'o') >= 0 ? ( ppport_fnc => 1 ) : ()),
(index($4, 'V') >= 0 ? ( unverified => 1 ) : ()),
} )
: die "invalid spec: $_" } qw(
ABDAY_1|5.027010||Viu
ABDAY_2|5.027010||Viu
ABDAY_3|5.027010||Viu
ABDAY_4|5.027010||Viu
ABDAY_5|5.027010||Viu
ABDAY_6|5.027010||Viu
ABDAY_7|5.027010||Viu
ABMON_10|5.027010||Viu
ABMON_11|5.027010||Viu
ABMON_12|5.027010||Viu
ABMON_1|5.027010||Viu
ABMON_2|5.027010||Viu
ABMON_3|5.027010||Viu
ABMON_4|5.027010||Viu
ABMON_5|5.027010||Viu
ABMON_6|5.027010||Viu
ABMON_7|5.027010||Viu
ABMON_8|5.027010||Viu
ABMON_9|5.027010||Viu
ABORT|5.003007||Viu
abort|5.005000||Viu
abort_execution|5.025010||Viu
accept|5.005000||Viu
ACCEPT|5.009005||Viu
access|5.005000||Viu
add_above_Latin1_folds|5.021001||Viu
add_cp_to_invlist|5.013011||Viu
add_data|5.005000||Vniu
add_multi_match|5.021004||Viu
_add_range_to_invlist|5.016000||cViu
add_utf16_textfilter|5.011001||Viu
adjust_size_and_find_bucket|5.019003||Vniu
advance_one_LB|5.023007||Viu
advance_one_SB|5.021009||Viu
advance_one_WB|5.021009||Viu
AHOCORASICK|5.009005||Viu
AHOCORASICKC|5.009005||Viu
alloccopstash|5.017001|5.017001|x
alloc_LOGOP|5.025004||xViu
allocmy|5.008001||Viu
ALLOC_THREAD_KEY|5.005003||Viu
ALT_DIGITS|5.027010||Viu
amagic_call|5.003007|5.003007|u
amagic_cmp|5.009003||Viu
amagic_cmp_desc|5.031010||Viu
amagic_cmp_locale|5.009003||Viu
amagic_cmp_locale_desc|5.031010||Viu
amagic_deref_call|5.013007|5.013007|u
amagic_i_ncmp|5.009003||Viu
amagic_i_ncmp_desc|5.031010||Viu
amagic_is_enabled|5.015008||Viu
amagic_ncmp|5.009003||Viu
amagic_ncmp_desc|5.031010||Viu
AMG_CALLun|5.003007||Viu
AMG_CALLunary|5.013009||Viu
AMGfallNEVER|5.003007||Viu
AMGfallNO|5.003007||Viu
AMGfallYES|5.003007||Viu
AMGf_assign|5.003007||Viu
AMGf_noleft|5.003007||Viu
AMGf_noright|5.003007||Viu
AMGf_numarg|5.021009||Viu
AMGf_numeric|5.013002||Viu
AMGf_unary|5.003007||Viu
AMGf_want_list|5.017002||Viu
AM_STR|5.027010||Viu
AMT_AMAGIC|5.004000||Viu
AMT_AMAGIC_off|5.004000||Viu
AMT_AMAGIC_on|5.004000||Viu
AMTf_AMAGIC|5.004000||Viu
_aMY_CXT|5.009000|5.009000|p
aMY_CXT_|5.009000|5.009000|p
aMY_CXT|5.009000|5.009000|p
anchored_end_shift|5.009005||Viu
anchored_offset|5.005000||Viu
anchored_substr|5.005000||Viu
anchored_utf8|5.008000||Viu
ANGSTROM_SIGN|5.017003||Viu
anonymise_cv_maybe|5.013003||Viu
any_dup|5.006000||Vu
ANYOF|5.003007||Viu
ANYOF_ALNUM|5.006000||Viu
ANYOF_ALNUML|5.004000||Viu
ANYOF_ALPHA|5.006000||Viu
ANYOF_ALPHANUMERIC|5.017008||Viu
ANYOF_ASCII|5.006000||Viu
ANYOF_BIT|5.004005||Viu
ANYOF_BITMAP|5.006000||Viu
ANYOF_BITMAP_BYTE|5.006000||Viu
ANYOF_BITMAP_CLEAR|5.006000||Viu
ANYOF_BITMAP_CLEARALL|5.007003||Viu
ANYOF_BITMAP_SET|5.006000||Viu
ANYOF_BITMAP_SETALL|5.007003||Viu
ANYOF_BITMAP_SIZE|5.006000||Viu
ANYOF_BITMAP_TEST|5.006000||Viu
ANYOF_BITMAP_ZERO|5.006000||Viu
ANYOF_BLANK|5.006001||Viu
ANYOF_CASED|5.017008||Viu
ANYOF_CLASS_OR|5.017007||Viu
ANYOF_CLASS_SETALL|5.013011||Viu
ANYOF_CLASS_TEST_ANY_SET|5.013008||Viu
ANYOF_CNTRL|5.006000||Viu
ANYOF_COMMON_FLAGS|5.019008||Viu
ANYOFD|5.023003||Viu
ANYOF_DIGIT|5.006000||Viu
ANYOF_FLAGS|5.006000||Viu
ANYOF_FLAGS_ALL|5.006000||Viu
ANYOF_FOLD_SHARP_S|5.007003||Viu
ANYOF_GRAPH|5.006000||Viu
ANYOFH|5.029007||Viu
ANYOFHb|5.031001||Viu
ANYOF_HORIZWS|5.009005||Viu
ANYOFHr|5.031002||Viu
ANYOFHs|5.031007||Viu
ANYOF_INVERT|5.004000||Viu
ANYOFL|5.021008||Viu
ANYOFL_FOLD|5.023007||Viu
ANYOF_LOCALE_FLAGS|5.019005||Viu
ANYOF_LOWER|5.006000||Viu
ANYOFL_SHARED_UTF8_LOCALE_fold_HAS_MATCHES_nonfold_REQD|5.023007||Viu
ANYOFL_SOME_FOLDS_ONLY_IN_UTF8_LOCALE|5.023007||Viu
ANYOFL_UTF8_LOCALE_REQD|5.023007||Viu
ANYOFM|5.027009||Viu
ANYOF_MATCHES_ALL_ABOVE_BITMAP|5.021004||Viu
ANYOF_MATCHES_POSIXL|5.021004||Viu
ANYOF_MAX|5.006000||Viu
ANYOF_NALNUM|5.006000||Viu
ANYOF_NALNUML|5.004000||Viu
ANYOF_NALPHA|5.006000||Viu
ANYOF_NALPHANUMERIC|5.017008||Viu
ANYOF_NASCII|5.006000||Viu
ANYOF_NBLANK|5.006001||Viu
ANYOF_NCASED|5.017008||Viu
ANYOF_NCNTRL|5.006000||Viu
ANYOF_NDIGIT|5.006000||Viu
ANYOF_NGRAPH|5.006000||Viu
ANYOF_NHORIZWS|5.009005||Viu
ANYOF_NLOWER|5.006000||Viu
ANYOF_NPRINT|5.006000||Viu
ANYOF_NPUNCT|5.006000||Viu
ANYOF_NSPACE|5.006000||Viu
ANYOF_NSPACEL|5.004000||Viu
ANYOF_NUPPER|5.006000||Viu
ANYOF_NVERTWS|5.009005||Viu
ANYOF_NWORDCHAR|5.017005||Viu
ANYOF_NXDIGIT|5.006000||Viu
ANYOF_ONLY_HAS_BITMAP|5.021004||Viu
ANYOFPOSIXL|5.029004||Viu
ANYOF_POSIXL_AND|5.019005||Viu
ANYOF_POSIXL_CLEAR|5.019005||Viu
ANYOF_POSIXL_MAX|5.019005||Viu
ANYOF_POSIXL_OR|5.019005||Viu
ANYOF_POSIXL_SET|5.019005||Viu
ANYOF_POSIXL_SETALL|5.019005||Viu
ANYOF_POSIXL_SET_TO_BITMAP|5.029004||Viu
ANYOF_POSIXL_SSC_TEST_ALL_SET|5.019009||Viu
ANYOF_POSIXL_SSC_TEST_ANY_SET|5.019009||Viu
ANYOF_POSIXL_TEST|5.019005||Viu
ANYOF_POSIXL_TEST_ALL_SET|5.019005||Viu
ANYOF_POSIXL_TEST_ANY_SET|5.019005||Viu
ANYOF_POSIXL_ZERO|5.019005||Viu
ANYOF_PRINT|5.006000||Viu
ANYOF_PUNCT|5.006000||Viu
ANYOFR|5.031007||Viu
ANYOFRb|5.031007||Viu
ANYOFRbase|5.031007||Viu
ANYOFR_BASE_BITS|5.031007||Viu
ANYOFRdelta|5.031007||Viu
ANYOF_SHARED_d_MATCHES_ALL_NON_UTF8_NON_ASCII_non_d_WARN_SUPER|5.023003||Viu
ANYOF_SHARED_d_UPPER_LATIN1_UTF8_STRING_MATCHES_non_d_RUNTIME_USER_PROP|5.023006||Viu
ANYOF_SPACE|5.006000||Viu
ANYOF_SPACEL|5.004000||Viu
ANYOF_UNIPROP|5.017006||Viu
ANYOF_UPPER|5.006000||Viu
ANYOF_VERTWS|5.009005||Viu
ANYOF_WORDCHAR|5.017005||Viu
ANYOF_XDIGIT|5.006000||Viu
ao|5.005000||Viu
_append_range_to_invlist|5.013010||Viu
append_utf8_from_native_byte|5.019004||cVniu
apply|5.003007||Viu
apply_attrs|5.006000||Viu
apply_attrs_my|5.007003||Viu
apply_attrs_string|5.006001|5.006001|xu
ARCHLIB|5.003007|5.003007|Vn
ARCHLIB_EXP|5.003007|5.003007|Vn
ARCHNAME|5.004000|5.004000|Vn
ARG1|5.003007||Viu
ARG1_LOC|5.005000||Viu
ARG1_SET|5.005000||Viu
ARG2|5.003007||Viu
ARG2L|5.009005||Viu
ARG2L_LOC|5.009005||Viu
ARG2_LOC|5.005000||Viu
ARG2L_SET|5.009005||Viu
ARG2_SET|5.005000||Viu
ARG|5.005000||Viu
ARG_LOC|5.005000||Viu
ARGp|5.031009||Viu
ARGp_LOC|5.031009||Viu
ARGp_SET|5.031009||Viu
ARG__SET|5.005000||Viu
ARG_SET|5.005000||Viu
ARGTARG|5.003007||Viu
ARG_VALUE|5.005000||Viu
argvout_final|5.029006||Viu
ASCIIish|5.005003||Viu
ASCII_MORE_RESTRICT_PAT_MODS|5.013010||Viu
ASCII_RESTRICT_PAT_MOD|5.013009||Viu
ASCII_RESTRICT_PAT_MODS|5.013009||Viu
ASCII_TO_NATIVE|5.007001||Viu
ASCII_TO_NEED|5.019004||dcVnu
asctime|5.009000||Viu
ASCTIME_R_PROTO|5.008000|5.008000|Vn
assert|5.003007||Viu
__ASSERT_|5.019007|5.008008|p
ASSERT_CURPAD_ACTIVE|5.008001||Viu
ASSERT_CURPAD_LEGAL|5.008001||Viu
assert_not_glob|5.009004||Viu
assert_not_ROK|5.008001||Viu
assert_uft8_cache_coherent|5.013003||Viu
assignment_type|5.021005||Viu
ASSUME|5.019006||Viu
atfork_lock|5.007002|5.007002|nu
atfork_unlock|5.007002|5.007002|nu
aTHX_|5.006000|5.003007|p
aTHX|5.006000|5.003007|p
aTHXa|5.017006||Viu
aTHXo|5.006000||Viu
aTHXR_||5.003007|pou
aTHXR||5.003007|pou
aTHXx|5.006000||Viu
Atof|5.006000||Viu
Atol|5.006000||Viu
atoll|5.008000||Viu
Atoul|5.006000||Viu
AvALLOC|5.003007||Viu
AvARRAY|5.003007||Viu
AvARYLEN|5.003007||Viu
av_arylen_p|||cu
av_clear|5.003007|5.003007|
av_count|5.033001|5.003007|p
av_create_and_push|5.009005|5.009005|x
av_create_and_unshift_one|5.009005|5.009005|x
av_delete|5.006000|5.006000|
av_exists|5.006000|5.006000|
av_extend|5.003007|5.003007|
av_extend_guts|5.017004||Viu
av_fetch|5.003007|5.003007|
av_fill|5.003007|5.003007|
AvFILL|5.003007|5.003007|
AvFILLp|5.004005|5.003007|poV
av_iter_p|||cu
av_len|5.003007|5.003007|
av_make|5.003007|5.003007|
AvMAX|5.003007||Viu
av_nonelem|5.027009||Viu
av_pop|5.003007|5.003007|
av_push|5.003007|5.003007|
AvREAL|5.003007||Viu
AvREALISH|5.003007||Viu
AvREAL_off|5.003007||Viu
AvREAL_on|5.003007||Viu
AvREAL_only|5.009003||Viu
AvREIFY|5.003007||Viu
av_reify|5.004004||cViu
AvREIFY_off|5.003007||Viu
AvREIFY_on|5.003007||Viu
AvREIFY_only|5.009003||Viu
av_shift|5.003007|5.003007|
av_store|5.003007|5.003007|
av_tindex|5.017009|5.003007|p
av_tindex_skip_len_mg|5.025010||Viu
av_top_index|5.017009|5.003007|p
av_top_index_skip_len_mg|5.025010||Viu
av_undef|5.003007|5.003007|
av_unshift|5.003007|5.003007|
ax|5.003007|5.003007|
backup_one_GCB|5.025003||Viu
backup_one_LB|5.023007||Viu
backup_one_SB|5.021009||Viu
backup_one_WB|5.021009||Viu
bad_type_gv|5.019002||Viu
bad_type_pv|5.016000||Viu
BADVERSION|5.011004||Viu
BASEOP|5.003007||Viu
BhkDISABLE|5.013003||xV
BhkENABLE|5.013003||xV
BhkENTRY|5.013003||xVi
BhkENTRY_set|5.013003||xV
BHKf_bhk_eval|5.013006||Viu
BHKf_bhk_post_end|5.013006||Viu
BHKf_bhk_pre_end|5.013006||Viu
BHKf_bhk_start|5.013006||Viu
BhkFLAGS|5.013003||xVi
BIN|5.003007|5.003007|Vn
bind|5.005000||Viu
bind_match|5.003007||Viu
BIN_EXP|5.004000|5.004000|Vn
Bit|5.006000||Viu
BIT_BUCKET|5.003007||Viu
BIT_DIGITS|5.004000||Viu
BITMAP_BYTE|5.009005||Viu
BITMAP_TEST|5.009005||Viu
blk_eval|5.003007||Viu
blk_format|5.011000||Viu
blk_gimme|5.003007||Viu
blk_givwhen|5.027008||Viu
blk_loop|5.003007||Viu
blk_oldcop|5.003007||Viu
blk_oldmarksp|5.003007||Viu
blk_oldpm|5.003007||Viu
blk_oldsaveix|5.023008||Viu
blk_oldscopesp|5.003007||Viu
blk_oldsp|5.003007||Viu
blk_old_tmpsfloor|5.023008||Viu
blk_sub|5.003007||Viu
blk_u16|5.011000||Viu
block_end|5.004000|5.004000|
block_gimme|5.004000|5.004000|u
blockhook_register|5.013003|5.013003|x
block_start|5.004000|5.004000|
BmFLAGS|5.009005||Viu
BmPREVIOUS|5.003007||Viu
BmRARE|5.003007||Viu
BmUSEFUL|5.003007||Viu
BOL|5.003007||Viu
BOM_UTF8|5.025005|5.003007|p
BOM_UTF8_FIRST_BYTE|5.019004||Viu
BOM_UTF8_TAIL|5.019004||Viu
bool|5.003007||Viu
boolSV|5.004000|5.003007|p
boot_core_mro|5.009005||Viu
boot_core_PerlIO|5.007002||Viu
boot_core_UNIVERSAL|5.003007||Viu
BOUND|5.003007||Viu
BOUNDA|5.013009||Viu
BOUNDL|5.004000||Viu
BOUNDU|5.013009||Viu
BRANCH|5.003007||Viu
BRANCHJ|5.005000||Viu
BRANCH_next|5.009005||Viu
BRANCH_next_fail|5.009005||Viu
BSD_GETPGRP|5.003007||Viu
BSDish|5.008001||Viu