COMMENT: Convert test to Autotest framework.
[pspp-builds.git] / perl-module / ppport.h
1 #if 0
2 <<'SKIP';
3 #endif
4 /*
5 ----------------------------------------------------------------------
6
7     ppport.h -- Perl/Pollution/Portability Version 3.06_01
8
9     Automatically created by Devel::PPPort running under
10     perl 5.008008 on Fri Apr  6 14:13:45 2007.
11
12     Do NOT edit this file directly! -- Edit PPPort_pm.PL and the
13     includes in parts/inc/ instead.
14
15     Use 'perldoc ppport.h' to view the documentation below.
16
17 ----------------------------------------------------------------------
18
19 SKIP
20
21 =pod
22
23 =head1 NAME
24
25 ppport.h - Perl/Pollution/Portability version 3.06_01
26
27 =head1 SYNOPSIS
28
29   perl ppport.h [options] [source files]
30
31   Searches current directory for files if no [source files] are given
32
33   --help                      show short help
34
35   --patch=file                write one patch file with changes
36   --copy=suffix               write changed copies with suffix
37   --diff=program              use diff program and options
38
39   --compat-version=version    provide compatibility with Perl version
40   --cplusplus                 accept C++ comments
41
42   --quiet                     don't output anything except fatal errors
43   --nodiag                    don't show diagnostics
44   --nohints                   don't show hints
45   --nochanges                 don't suggest changes
46   --nofilter                  don't filter input files
47
48   --list-provided             list provided API
49   --list-unsupported          list unsupported API
50   --api-info=name             show Perl API portability information
51
52 =head1 COMPATIBILITY
53
54 This version of F<ppport.h> is designed to support operation with Perl
55 installations back to 5.003, and has been tested up to 5.9.3.
56
57 =head1 OPTIONS
58
59 =head2 --help
60
61 Display a brief usage summary.
62
63 =head2 --patch=I<file>
64
65 If this option is given, a single patch file will be created if
66 any changes are suggested. This requires a working diff program
67 to be installed on your system.
68
69 =head2 --copy=I<suffix>
70
71 If this option is given, a copy of each file will be saved with
72 the given suffix that contains the suggested changes. This does
73 not require any external programs.
74
75 If neither C<--patch> or C<--copy> are given, the default is to
76 simply print the diffs for each file. This requires either
77 C<Text::Diff> or a C<diff> program to be installed.
78
79 =head2 --diff=I<program>
80
81 Manually set the diff program and options to use. The default
82 is to use C<Text::Diff>, when installed, and output unified
83 context diffs.
84
85 =head2 --compat-version=I<version>
86
87 Tell F<ppport.h> to check for compatibility with the given
88 Perl version. The default is to check for compatibility with Perl
89 version 5.003. You can use this option to reduce the output
90 of F<ppport.h> if you intend to be backward compatible only
91 up to a certain Perl version.
92
93 =head2 --cplusplus
94
95 Usually, F<ppport.h> will detect C++ style comments and
96 replace them with C style comments for portability reasons.
97 Using this option instructs F<ppport.h> to leave C++
98 comments untouched.
99
100 =head2 --quiet
101
102 Be quiet. Don't print anything except fatal errors.
103
104 =head2 --nodiag
105
106 Don't output any diagnostic messages. Only portability
107 alerts will be printed.
108
109 =head2 --nohints
110
111 Don't output any hints. Hints often contain useful portability
112 notes.
113
114 =head2 --nochanges
115
116 Don't suggest any changes. Only give diagnostic output and hints
117 unless these are also deactivated.
118
119 =head2 --nofilter
120
121 Don't filter the list of input files. By default, files not looking
122 like source code (i.e. not *.xs, *.c, *.cc, *.cpp or *.h) are skipped.
123
124 =head2 --list-provided
125
126 Lists the API elements for which compatibility is provided by
127 F<ppport.h>. Also lists if it must be explicitly requested,
128 if it has dependencies, and if there are hints for it.
129
130 =head2 --list-unsupported
131
132 Lists the API elements that are known not to be supported by
133 F<ppport.h> and below which version of Perl they probably
134 won't be available or work.
135
136 =head2 --api-info=I<name>
137
138 Show portability information for API elements matching I<name>.
139 If I<name> is surrounded by slashes, it is interpreted as a regular
140 expression.
141
142 =head1 DESCRIPTION
143
144 In order for a Perl extension (XS) module to be as portable as possible
145 across differing versions of Perl itself, certain steps need to be taken.
146
147 =over 4
148
149 =item *
150
151 Including this header is the first major one. This alone will give you
152 access to a large part of the Perl API that hasn't been available in
153 earlier Perl releases. Use
154
155     perl ppport.h --list-provided
156
157 to see which API elements are provided by ppport.h.
158
159 =item *
160
161 You should avoid using deprecated parts of the API. For example, using
162 global Perl variables without the C<PL_> prefix is deprecated. Also,
163 some API functions used to have a C<perl_> prefix. Using this form is
164 also deprecated. You can safely use the supported API, as F<ppport.h>
165 will provide wrappers for older Perl versions.
166
167 =item *
168
169 If you use one of a few functions that were not present in earlier
170 versions of Perl, and that can't be provided using a macro, you have
171 to explicitly request support for these functions by adding one or
172 more C<#define>s in your source code before the inclusion of F<ppport.h>.
173
174 These functions will be marked C<explicit> in the list shown by
175 C<--list-provided>.
176
177 Depending on whether you module has a single or multiple files that
178 use such functions, you want either C<static> or global variants.
179
180 For a C<static> function, use:
181
182     #define NEED_function
183
184 For a global function, use:
185
186     #define NEED_function_GLOBAL
187
188 Note that you mustn't have more than one global request for one
189 function in your project.
190
191     Function                  Static Request               Global Request
192     -----------------------------------------------------------------------------------------
193     eval_pv()                 NEED_eval_pv                 NEED_eval_pv_GLOBAL
194     grok_bin()                NEED_grok_bin                NEED_grok_bin_GLOBAL
195     grok_hex()                NEED_grok_hex                NEED_grok_hex_GLOBAL
196     grok_number()             NEED_grok_number             NEED_grok_number_GLOBAL
197     grok_numeric_radix()      NEED_grok_numeric_radix      NEED_grok_numeric_radix_GLOBAL
198     grok_oct()                NEED_grok_oct                NEED_grok_oct_GLOBAL
199     newCONSTSUB()             NEED_newCONSTSUB             NEED_newCONSTSUB_GLOBAL
200     newRV_noinc()             NEED_newRV_noinc             NEED_newRV_noinc_GLOBAL
201     sv_2pv_nolen()            NEED_sv_2pv_nolen            NEED_sv_2pv_nolen_GLOBAL
202     sv_2pvbyte()              NEED_sv_2pvbyte              NEED_sv_2pvbyte_GLOBAL
203     sv_catpvf_mg()            NEED_sv_catpvf_mg            NEED_sv_catpvf_mg_GLOBAL
204     sv_catpvf_mg_nocontext()  NEED_sv_catpvf_mg_nocontext  NEED_sv_catpvf_mg_nocontext_GLOBAL
205     sv_setpvf_mg()            NEED_sv_setpvf_mg            NEED_sv_setpvf_mg_GLOBAL
206     sv_setpvf_mg_nocontext()  NEED_sv_setpvf_mg_nocontext  NEED_sv_setpvf_mg_nocontext_GLOBAL
207     vnewSVpvf()               NEED_vnewSVpvf               NEED_vnewSVpvf_GLOBAL
208
209 To avoid namespace conflicts, you can change the namespace of the
210 explicitly exported functions using the C<DPPP_NAMESPACE> macro.
211 Just C<#define> the macro before including C<ppport.h>:
212
213     #define DPPP_NAMESPACE MyOwnNamespace_
214     #include "ppport.h"
215
216 The default namespace is C<DPPP_>.
217
218 =back
219
220 The good thing is that most of the above can be checked by running
221 F<ppport.h> on your source code. See the next section for
222 details.
223
224 =head1 EXAMPLES
225
226 To verify whether F<ppport.h> is needed for your module, whether you
227 should make any changes to your code, and whether any special defines
228 should be used, F<ppport.h> can be run as a Perl script to check your
229 source code. Simply say:
230
231     perl ppport.h
232
233 The result will usually be a list of patches suggesting changes
234 that should at least be acceptable, if not necessarily the most
235 efficient solution, or a fix for all possible problems.
236
237 If you know that your XS module uses features only available in
238 newer Perl releases, if you're aware that it uses C++ comments,
239 and if you want all suggestions as a single patch file, you could
240 use something like this:
241
242     perl ppport.h --compat-version=5.6.0 --cplusplus --patch=test.diff
243
244 If you only want your code to be scanned without any suggestions
245 for changes, use:
246
247     perl ppport.h --nochanges
248
249 You can specify a different C<diff> program or options, using
250 the C<--diff> option:
251
252     perl ppport.h --diff='diff -C 10'
253
254 This would output context diffs with 10 lines of context.
255
256 To display portability information for the C<newSVpvn> function,
257 use:
258
259     perl ppport.h --api-info=newSVpvn
260
261 Since the argument to C<--api-info> can be a regular expression,
262 you can use
263
264     perl ppport.h --api-info=/_nomg$/
265
266 to display portability information for all C<_nomg> functions or
267
268     perl ppport.h --api-info=/./
269
270 to display information for all known API elements.
271
272 =head1 BUGS
273
274 If this version of F<ppport.h> is causing failure during
275 the compilation of this module, please check if newer versions
276 of either this module or C<Devel::PPPort> are available on CPAN
277 before sending a bug report.
278
279 If F<ppport.h> was generated using the latest version of
280 C<Devel::PPPort> and is causing failure of this module, please
281 file a bug report using the CPAN Request Tracker at L<http://rt.cpan.org/>.
282
283 Please include the following information:
284
285 =over 4
286
287 =item 1.
288
289 The complete output from running "perl -V"
290
291 =item 2.
292
293 This file.
294
295 =item 3.
296
297 The name and version of the module you were trying to build.
298
299 =item 4.
300
301 A full log of the build that failed.
302
303 =item 5.
304
305 Any other information that you think could be relevant.
306
307 =back
308
309 For the latest version of this code, please get the C<Devel::PPPort>
310 module from CPAN.
311
312 =head1 COPYRIGHT
313
314 Version 3.x, Copyright (c) 2004-2005, Marcus Holland-Moritz.
315
316 Version 2.x, Copyright (C) 2001, Paul Marquess.
317
318 Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
319
320 This program is free software; you can redistribute it and/or
321 modify it under the same terms as Perl itself.
322
323 =head1 SEE ALSO
324
325 See L<Devel::PPPort>.
326
327 =cut
328
329 use strict;
330
331 my %opt = (
332   quiet     => 0,
333   diag      => 1,
334   hints     => 1,
335   changes   => 1,
336   cplusplus => 0,
337   filter    => 1,
338 );
339
340 my($ppport) = $0 =~ /([\w.]+)$/;
341 my $LF = '(?:\r\n|[\r\n])';   # line feed
342 my $HS = "[ \t]";             # horizontal whitespace
343
344 eval {
345   require Getopt::Long;
346   Getopt::Long::GetOptions(\%opt, qw(
347     help quiet diag! filter! hints! changes! cplusplus
348     patch=s copy=s diff=s compat-version=s
349     list-provided list-unsupported api-info=s
350   )) or usage();
351 };
352
353 if ($@ and grep /^-/, @ARGV) {
354   usage() if "@ARGV" =~ /^--?h(?:elp)?$/;
355   die "Getopt::Long not found. Please don't use any options.\n";
356 }
357
358 usage() if $opt{help};
359
360 if (exists $opt{'compat-version'}) {
361   my($r,$v,$s) = eval { parse_version($opt{'compat-version'}) };
362   if ($@) {
363     die "Invalid version number format: '$opt{'compat-version'}'\n";
364   }
365   die "Only Perl 5 is supported\n" if $r != 5;
366   die "Invalid version number: $opt{'compat-version'}\n" if $v >= 1000 || $s >= 1000;
367   $opt{'compat-version'} = sprintf "%d.%03d%03d", $r, $v, $s;
368 }
369 else {
370   $opt{'compat-version'} = 5;
371 }
372
373 # Never use C comments in this file!!!!!
374 my $ccs  = '/'.'*';
375 my $cce  = '*'.'/';
376 my $rccs = quotemeta $ccs;
377 my $rcce = quotemeta $cce;
378
379 my %API = map { /^(\w+)\|([^|]*)\|([^|]*)\|(\w*)$/
380                 ? ( $1 => {
381                       ($2                  ? ( base     => $2 ) : ()),
382                       ($3                  ? ( todo     => $3 ) : ()),
383                       (index($4, 'v') >= 0 ? ( varargs  => 1  ) : ()),
384                       (index($4, 'p') >= 0 ? ( provided => 1  ) : ()),
385                       (index($4, 'n') >= 0 ? ( nothxarg => 1  ) : ()),
386                     } )
387                 : die "invalid spec: $_" } qw(
388 AvFILLp|5.004050||p
389 AvFILL|||
390 CLASS|||n
391 CX_CURPAD_SAVE|||
392 CX_CURPAD_SV|||
393 CopFILEAV|5.006000||p
394 CopFILEGV_set|5.006000||p
395 CopFILEGV|5.006000||p
396 CopFILESV|5.006000||p
397 CopFILE_set|5.006000||p
398 CopFILE|5.006000||p
399 CopSTASHPV_set|5.006000||p
400 CopSTASHPV|5.006000||p
401 CopSTASH_eq|5.006000||p
402 CopSTASH_set|5.006000||p
403 CopSTASH|5.006000||p
404 CopyD|5.009002||p
405 Copy|||
406 CvPADLIST|||
407 CvSTASH|||
408 CvWEAKOUTSIDE|||
409 DEFSV|5.004050||p
410 END_EXTERN_C|5.005000||p
411 ENTER|||
412 ERRSV|5.004050||p
413 EXTEND|||
414 EXTERN_C|5.005000||p
415 FREETMPS|||
416 GIMME_V||5.004000|n
417 GIMME|||n
418 GROK_NUMERIC_RADIX|5.007002||p
419 G_ARRAY|||
420 G_DISCARD|||
421 G_EVAL|||
422 G_NOARGS|||
423 G_SCALAR|||
424 G_VOID||5.004000|
425 GetVars|||
426 GvSV|||
427 Gv_AMupdate|||
428 HEf_SVKEY||5.004000|
429 HeHASH||5.004000|
430 HeKEY||5.004000|
431 HeKLEN||5.004000|
432 HePV||5.004000|
433 HeSVKEY_force||5.004000|
434 HeSVKEY_set||5.004000|
435 HeSVKEY||5.004000|
436 HeVAL||5.004000|
437 HvNAME|||
438 INT2PTR|5.006000||p
439 IN_LOCALE_COMPILETIME|5.007002||p
440 IN_LOCALE_RUNTIME|5.007002||p
441 IN_LOCALE|5.007002||p
442 IN_PERL_COMPILETIME|5.008001||p
443 IS_NUMBER_GREATER_THAN_UV_MAX|5.007002||p
444 IS_NUMBER_INFINITY|5.007002||p
445 IS_NUMBER_IN_UV|5.007002||p
446 IS_NUMBER_NAN|5.007003||p
447 IS_NUMBER_NEG|5.007002||p
448 IS_NUMBER_NOT_INT|5.007002||p
449 IVSIZE|5.006000||p
450 IVTYPE|5.006000||p
451 IVdf|5.006000||p
452 LEAVE|||
453 LVRET|||
454 MARK|||
455 MY_CXT_CLONE|5.009002||p
456 MY_CXT_INIT|5.007003||p
457 MY_CXT|5.007003||p
458 MoveD|5.009002||p
459 Move|||
460 NEWSV|||
461 NOOP|5.005000||p
462 NUM2PTR|5.006000||p
463 NVTYPE|5.006000||p
464 NVef|5.006001||p
465 NVff|5.006001||p
466 NVgf|5.006001||p
467 Newc|||
468 Newz|||
469 New|||
470 Nullav|||
471 Nullch|||
472 Nullcv|||
473 Nullhv|||
474 Nullsv|||
475 ORIGMARK|||
476 PAD_BASE_SV|||
477 PAD_CLONE_VARS|||
478 PAD_COMPNAME_FLAGS|||
479 PAD_COMPNAME_GEN_set|||
480 PAD_COMPNAME_GEN|||
481 PAD_COMPNAME_OURSTASH|||
482 PAD_COMPNAME_PV|||
483 PAD_COMPNAME_TYPE|||
484 PAD_RESTORE_LOCAL|||
485 PAD_SAVE_LOCAL|||
486 PAD_SAVE_SETNULLPAD|||
487 PAD_SETSV|||
488 PAD_SET_CUR_NOSAVE|||
489 PAD_SET_CUR|||
490 PAD_SVl|||
491 PAD_SV|||
492 PERL_BCDVERSION|5.009003||p
493 PERL_GCC_BRACE_GROUPS_FORBIDDEN|5.008001||p
494 PERL_INT_MAX|5.004000||p
495 PERL_INT_MIN|5.004000||p
496 PERL_LONG_MAX|5.004000||p
497 PERL_LONG_MIN|5.004000||p
498 PERL_MAGIC_arylen|5.007002||p
499 PERL_MAGIC_backref|5.007002||p
500 PERL_MAGIC_bm|5.007002||p
501 PERL_MAGIC_collxfrm|5.007002||p
502 PERL_MAGIC_dbfile|5.007002||p
503 PERL_MAGIC_dbline|5.007002||p
504 PERL_MAGIC_defelem|5.007002||p
505 PERL_MAGIC_envelem|5.007002||p
506 PERL_MAGIC_env|5.007002||p
507 PERL_MAGIC_ext|5.007002||p
508 PERL_MAGIC_fm|5.007002||p
509 PERL_MAGIC_glob|5.007002||p
510 PERL_MAGIC_isaelem|5.007002||p
511 PERL_MAGIC_isa|5.007002||p
512 PERL_MAGIC_mutex|5.007002||p
513 PERL_MAGIC_nkeys|5.007002||p
514 PERL_MAGIC_overload_elem|5.007002||p
515 PERL_MAGIC_overload_table|5.007002||p
516 PERL_MAGIC_overload|5.007002||p
517 PERL_MAGIC_pos|5.007002||p
518 PERL_MAGIC_qr|5.007002||p
519 PERL_MAGIC_regdata|5.007002||p
520 PERL_MAGIC_regdatum|5.007002||p
521 PERL_MAGIC_regex_global|5.007002||p
522 PERL_MAGIC_shared_scalar|5.007003||p
523 PERL_MAGIC_shared|5.007003||p
524 PERL_MAGIC_sigelem|5.007002||p
525 PERL_MAGIC_sig|5.007002||p
526 PERL_MAGIC_substr|5.007002||p
527 PERL_MAGIC_sv|5.007002||p
528 PERL_MAGIC_taint|5.007002||p
529 PERL_MAGIC_tiedelem|5.007002||p
530 PERL_MAGIC_tiedscalar|5.007002||p
531 PERL_MAGIC_tied|5.007002||p
532 PERL_MAGIC_utf8|5.008001||p
533 PERL_MAGIC_uvar_elem|5.007003||p
534 PERL_MAGIC_uvar|5.007002||p
535 PERL_MAGIC_vec|5.007002||p
536 PERL_MAGIC_vstring|5.008001||p
537 PERL_QUAD_MAX|5.004000||p
538 PERL_QUAD_MIN|5.004000||p
539 PERL_REVISION|5.006000||p
540 PERL_SCAN_ALLOW_UNDERSCORES|5.007003||p
541 PERL_SCAN_DISALLOW_PREFIX|5.007003||p
542 PERL_SCAN_GREATER_THAN_UV_MAX|5.007003||p
543 PERL_SCAN_SILENT_ILLDIGIT|5.008001||p
544 PERL_SHORT_MAX|5.004000||p
545 PERL_SHORT_MIN|5.004000||p
546 PERL_SUBVERSION|5.006000||p
547 PERL_UCHAR_MAX|5.004000||p
548 PERL_UCHAR_MIN|5.004000||p
549 PERL_UINT_MAX|5.004000||p
550 PERL_UINT_MIN|5.004000||p
551 PERL_ULONG_MAX|5.004000||p
552 PERL_ULONG_MIN|5.004000||p
553 PERL_UNUSED_DECL|5.007002||p
554 PERL_UQUAD_MAX|5.004000||p
555 PERL_UQUAD_MIN|5.004000||p
556 PERL_USHORT_MAX|5.004000||p
557 PERL_USHORT_MIN|5.004000||p
558 PERL_VERSION|5.006000||p
559 PL_DBsingle|||pn
560 PL_DBsub|||pn
561 PL_DBtrace|||n
562 PL_Sv|5.005000||p
563 PL_compiling|5.004050||p
564 PL_copline|5.005000||p
565 PL_curcop|5.004050||p
566 PL_curstash|5.004050||p
567 PL_debstash|5.004050||p
568 PL_defgv|5.004050||p
569 PL_diehook|5.004050||p
570 PL_dirty|5.004050||p
571 PL_dowarn|||pn
572 PL_errgv|5.004050||p
573 PL_hexdigit|5.005000||p
574 PL_hints|5.005000||p
575 PL_last_in_gv|||n
576 PL_modglobal||5.005000|n
577 PL_na|5.004050||pn
578 PL_no_modify|5.006000||p
579 PL_ofs_sv|||n
580 PL_perl_destruct_level|5.004050||p
581 PL_perldb|5.004050||p
582 PL_ppaddr|5.006000||p
583 PL_rsfp_filters|5.004050||p
584 PL_rsfp|5.004050||p
585 PL_rs|||n
586 PL_stack_base|5.004050||p
587 PL_stack_sp|5.004050||p
588 PL_stdingv|5.004050||p
589 PL_sv_arenaroot|5.004050||p
590 PL_sv_no|5.004050||pn
591 PL_sv_undef|5.004050||pn
592 PL_sv_yes|5.004050||pn
593 PL_tainted|5.004050||p
594 PL_tainting|5.004050||p
595 POPi|||n
596 POPl|||n
597 POPn|||n
598 POPpbytex||5.007001|n
599 POPpx||5.005030|n
600 POPp|||n
601 POPs|||n
602 PTR2IV|5.006000||p
603 PTR2NV|5.006000||p
604 PTR2UV|5.006000||p
605 PTR2ul|5.007001||p
606 PTRV|5.006000||p
607 PUSHMARK|||
608 PUSHi|||
609 PUSHmortal|5.009002||p
610 PUSHn|||
611 PUSHp|||
612 PUSHs|||
613 PUSHu|5.004000||p
614 PUTBACK|||
615 PerlIO_clearerr||5.007003|
616 PerlIO_close||5.007003|
617 PerlIO_eof||5.007003|
618 PerlIO_error||5.007003|
619 PerlIO_fileno||5.007003|
620 PerlIO_fill||5.007003|
621 PerlIO_flush||5.007003|
622 PerlIO_get_base||5.007003|
623 PerlIO_get_bufsiz||5.007003|
624 PerlIO_get_cnt||5.007003|
625 PerlIO_get_ptr||5.007003|
626 PerlIO_read||5.007003|
627 PerlIO_seek||5.007003|
628 PerlIO_set_cnt||5.007003|
629 PerlIO_set_ptrcnt||5.007003|
630 PerlIO_setlinebuf||5.007003|
631 PerlIO_stderr||5.007003|
632 PerlIO_stdin||5.007003|
633 PerlIO_stdout||5.007003|
634 PerlIO_tell||5.007003|
635 PerlIO_unread||5.007003|
636 PerlIO_write||5.007003|
637 Poison|5.008000||p
638 RETVAL|||n
639 Renewc|||
640 Renew|||
641 SAVECLEARSV|||
642 SAVECOMPPAD|||
643 SAVEPADSV|||
644 SAVETMPS|||
645 SAVE_DEFSV|5.004050||p
646 SPAGAIN|||
647 SP|||
648 START_EXTERN_C|5.005000||p
649 START_MY_CXT|5.007003||p
650 STMT_END|||p
651 STMT_START|||p
652 ST|||
653 SVt_IV|||
654 SVt_NV|||
655 SVt_PVAV|||
656 SVt_PVCV|||
657 SVt_PVHV|||
658 SVt_PVMG|||
659 SVt_PV|||
660 Safefree|||
661 Slab_Alloc|||
662 Slab_Free|||
663 StructCopy|||
664 SvCUR_set|||
665 SvCUR|||
666 SvEND|||
667 SvGETMAGIC|5.004050||p
668 SvGROW|||
669 SvIOK_UV||5.006000|
670 SvIOK_notUV||5.006000|
671 SvIOK_off|||
672 SvIOK_only_UV||5.006000|
673 SvIOK_only|||
674 SvIOK_on|||
675 SvIOKp|||
676 SvIOK|||
677 SvIVX|||
678 SvIV_nomg|5.009001||p
679 SvIV_set|||
680 SvIVx|||
681 SvIV|||
682 SvIsCOW_shared_hash||5.008003|
683 SvIsCOW||5.008003|
684 SvLEN_set|||
685 SvLEN|||
686 SvLOCK||5.007003|
687 SvMAGIC_set||5.009003|
688 SvNIOK_off|||
689 SvNIOKp|||
690 SvNIOK|||
691 SvNOK_off|||
692 SvNOK_only|||
693 SvNOK_on|||
694 SvNOKp|||
695 SvNOK|||
696 SvNVX|||
697 SvNV_set|||
698 SvNVx|||
699 SvNV|||
700 SvOK|||
701 SvOOK|||
702 SvPOK_off|||
703 SvPOK_only_UTF8||5.006000|
704 SvPOK_only|||
705 SvPOK_on|||
706 SvPOKp|||
707 SvPOK|||
708 SvPVX|||
709 SvPV_force_nomg|5.007002||p
710 SvPV_force|||
711 SvPV_nolen|5.006000||p
712 SvPV_nomg|5.007002||p
713 SvPV_set|||
714 SvPVbyte_force||5.009002|
715 SvPVbyte_nolen||5.006000|
716 SvPVbytex_force||5.006000|
717 SvPVbytex||5.006000|
718 SvPVbyte|5.006000||p
719 SvPVutf8_force||5.006000|
720 SvPVutf8_nolen||5.006000|
721 SvPVutf8x_force||5.006000|
722 SvPVutf8x||5.006000|
723 SvPVutf8||5.006000|
724 SvPVx|||
725 SvPV|||
726 SvREFCNT_dec|||
727 SvREFCNT_inc|||
728 SvREFCNT|||
729 SvROK_off|||
730 SvROK_on|||
731 SvROK|||
732 SvRV_set||5.009003|
733 SvRV|||
734 SvSETMAGIC|||
735 SvSHARE||5.007003|
736 SvSTASH_set||5.009003|
737 SvSTASH|||
738 SvSetMagicSV_nosteal||5.004000|
739 SvSetMagicSV||5.004000|
740 SvSetSV_nosteal||5.004000|
741 SvSetSV|||
742 SvTAINTED_off||5.004000|
743 SvTAINTED_on||5.004000|
744 SvTAINTED||5.004000|
745 SvTAINT|||
746 SvTRUE|||
747 SvTYPE|||
748 SvUNLOCK||5.007003|
749 SvUOK||5.007001|
750 SvUPGRADE|||
751 SvUTF8_off||5.006000|
752 SvUTF8_on||5.006000|
753 SvUTF8||5.006000|
754 SvUVXx|5.004000||p
755 SvUVX|5.004000||p
756 SvUV_nomg|5.009001||p
757 SvUV_set||5.009003|
758 SvUVx|5.004000||p
759 SvUV|5.004000||p
760 SvVOK||5.008001|
761 THIS|||n
762 UNDERBAR|5.009002||p
763 UVSIZE|5.006000||p
764 UVTYPE|5.006000||p
765 UVXf|5.007001||p
766 UVof|5.006000||p
767 UVuf|5.006000||p
768 UVxf|5.006000||p
769 XCPT_CATCH|5.009002||p
770 XCPT_RETHROW|5.009002||p
771 XCPT_TRY_END|5.009002||p
772 XCPT_TRY_START|5.009002||p
773 XPUSHi|||
774 XPUSHmortal|5.009002||p
775 XPUSHn|||
776 XPUSHp|||
777 XPUSHs|||
778 XPUSHu|5.004000||p
779 XSRETURN_EMPTY|||
780 XSRETURN_IV|||
781 XSRETURN_NO|||
782 XSRETURN_NV|||
783 XSRETURN_PV|||
784 XSRETURN_UNDEF|||
785 XSRETURN_UV|5.008001||p
786 XSRETURN_YES|||
787 XSRETURN|||
788 XST_mIV|||
789 XST_mNO|||
790 XST_mNV|||
791 XST_mPV|||
792 XST_mUNDEF|||
793 XST_mUV|5.008001||p
794 XST_mYES|||
795 XS_VERSION_BOOTCHECK|||
796 XS_VERSION|||
797 XS|||
798 ZeroD|5.009002||p
799 Zero|||
800 _aMY_CXT|5.007003||p
801 _pMY_CXT|5.007003||p
802 aMY_CXT_|5.007003||p
803 aMY_CXT|5.007003||p
804 aTHX_|5.006000||p
805 aTHX|5.006000||p
806 add_data|||
807 allocmy|||
808 amagic_call|||
809 any_dup|||
810 ao|||
811 append_elem|||
812 append_list|||
813 apply_attrs_my|||
814 apply_attrs_string||5.006001|
815 apply_attrs|||
816 apply|||
817 asIV|||
818 asUV|||
819 atfork_lock||5.007003|n
820 atfork_unlock||5.007003|n
821 av_arylen_p||5.009003|
822 av_clear|||
823 av_delete||5.006000|
824 av_exists||5.006000|
825 av_extend|||
826 av_fake|||
827 av_fetch|||
828 av_fill|||
829 av_len|||
830 av_make|||
831 av_pop|||
832 av_push|||
833 av_reify|||
834 av_shift|||
835 av_store|||
836 av_undef|||
837 av_unshift|||
838 ax|||n
839 bad_type|||
840 bind_match|||
841 block_end|||
842 block_gimme||5.004000|
843 block_start|||
844 boolSV|5.004000||p
845 boot_core_PerlIO|||
846 boot_core_UNIVERSAL|||
847 boot_core_xsutils|||
848 bytes_from_utf8||5.007001|
849 bytes_to_utf8||5.006001|
850 cache_re|||
851 call_argv|5.006000||p
852 call_atexit||5.006000|
853 call_body|||
854 call_list_body|||
855 call_list||5.004000|
856 call_method|5.006000||p
857 call_pv|5.006000||p
858 call_sv|5.006000||p
859 calloc||5.007002|n
860 cando|||
861 cast_i32||5.006000|
862 cast_iv||5.006000|
863 cast_ulong||5.006000|
864 cast_uv||5.006000|
865 check_uni|||
866 checkcomma|||
867 checkposixcc|||
868 ck_anoncode|||
869 ck_bitop|||
870 ck_concat|||
871 ck_defined|||
872 ck_delete|||
873 ck_die|||
874 ck_eof|||
875 ck_eval|||
876 ck_exec|||
877 ck_exists|||
878 ck_exit|||
879 ck_ftst|||
880 ck_fun|||
881 ck_glob|||
882 ck_grep|||
883 ck_index|||
884 ck_join|||
885 ck_lengthconst|||
886 ck_lfun|||
887 ck_listiob|||
888 ck_match|||
889 ck_method|||
890 ck_null|||
891 ck_open|||
892 ck_repeat|||
893 ck_require|||
894 ck_retarget|||
895 ck_return|||
896 ck_rfun|||
897 ck_rvconst|||
898 ck_sassign|||
899 ck_select|||
900 ck_shift|||
901 ck_sort|||
902 ck_spair|||
903 ck_split|||
904 ck_subr|||
905 ck_substr|||
906 ck_svconst|||
907 ck_trunc|||
908 ck_unpack|||
909 cl_and|||
910 cl_anything|||
911 cl_init_zero|||
912 cl_init|||
913 cl_is_anything|||
914 cl_or|||
915 closest_cop|||
916 convert|||
917 cop_free|||
918 cr_textfilter|||
919 croak_nocontext|||vn
920 croak|||v
921 csighandler||5.007001|n
922 custom_op_desc||5.007003|
923 custom_op_name||5.007003|
924 cv_ckproto|||
925 cv_clone|||
926 cv_const_sv||5.004000|
927 cv_dump|||
928 cv_undef|||
929 cx_dump||5.005000|
930 cx_dup|||
931 cxinc|||
932 dAXMARK||5.009003|
933 dAX|5.007002||p
934 dITEMS|5.007002||p
935 dMARK|||
936 dMY_CXT_SV|5.007003||p
937 dMY_CXT|5.007003||p
938 dNOOP|5.006000||p
939 dORIGMARK|||
940 dSP|||
941 dTHR|5.004050||p
942 dTHXa|5.006000||p
943 dTHXoa|5.006000||p
944 dTHX|5.006000||p
945 dUNDERBAR|5.009002||p
946 dXCPT|5.009002||p
947 dXSARGS|||
948 dXSI32|||
949 dXSTARG|5.006000||p
950 deb_curcv|||
951 deb_nocontext|||vn
952 deb_stack_all|||
953 deb_stack_n|||
954 debop||5.005000|
955 debprofdump||5.005000|
956 debprof|||
957 debstackptrs||5.007003|
958 debstack||5.007003|
959 deb||5.007003|v
960 del_he|||
961 del_sv|||
962 delimcpy||5.004000|
963 depcom|||
964 deprecate_old|||
965 deprecate|||
966 despatch_signals||5.007001|
967 die_nocontext|||vn
968 die_where|||
969 die|||v
970 dirp_dup|||
971 div128|||
972 djSP|||
973 do_aexec5|||
974 do_aexec|||
975 do_aspawn|||
976 do_binmode||5.004050|
977 do_chomp|||
978 do_chop|||
979 do_close|||
980 do_dump_pad|||
981 do_eof|||
982 do_exec3|||
983 do_execfree|||
984 do_exec|||
985 do_gv_dump||5.006000|
986 do_gvgv_dump||5.006000|
987 do_hv_dump||5.006000|
988 do_ipcctl|||
989 do_ipcget|||
990 do_join|||
991 do_kv|||
992 do_magic_dump||5.006000|
993 do_msgrcv|||
994 do_msgsnd|||
995 do_oddball|||
996 do_op_dump||5.006000|
997 do_open9||5.006000|
998 do_openn||5.007001|
999 do_open||5.004000|
1000 do_pipe|||
1001 do_pmop_dump||5.006000|
1002 do_print|||
1003 do_readline|||
1004 do_seek|||
1005 do_semop|||
1006 do_shmio|||
1007 do_spawn_nowait|||
1008 do_spawn|||
1009 do_sprintf|||
1010 do_sv_dump||5.006000|
1011 do_sysseek|||
1012 do_tell|||
1013 do_trans_complex_utf8|||
1014 do_trans_complex|||
1015 do_trans_count_utf8|||
1016 do_trans_count|||
1017 do_trans_simple_utf8|||
1018 do_trans_simple|||
1019 do_trans|||
1020 do_vecget|||
1021 do_vecset|||
1022 do_vop|||
1023 docatch_body|||
1024 docatch|||
1025 doeval|||
1026 dofile|||
1027 dofindlabel|||
1028 doform|||
1029 doing_taint||5.008001|n
1030 dooneliner|||
1031 doopen_pm|||
1032 doparseform|||
1033 dopoptoeval|||
1034 dopoptolabel|||
1035 dopoptoloop|||
1036 dopoptosub_at|||
1037 dopoptosub|||
1038 dounwind|||
1039 dowantarray|||
1040 dump_all||5.006000|
1041 dump_eval||5.006000|
1042 dump_fds|||
1043 dump_form||5.006000|
1044 dump_indent||5.006000|v
1045 dump_mstats|||
1046 dump_packsubs||5.006000|
1047 dump_sub||5.006000|
1048 dump_vindent||5.006000|
1049 dumpuntil|||
1050 dup_attrlist|||
1051 emulate_eaccess|||
1052 eval_pv|5.006000||p
1053 eval_sv|5.006000||p
1054 expect_number|||
1055 fbm_compile||5.005000|
1056 fbm_instr||5.005000|
1057 fd_on_nosuid_fs|||
1058 filter_add|||
1059 filter_del|||
1060 filter_gets|||
1061 filter_read|||
1062 find_beginning|||
1063 find_byclass|||
1064 find_in_my_stash|||
1065 find_runcv|||
1066 find_rundefsvoffset||5.009002|
1067 find_script|||
1068 find_uninit_var|||
1069 fold_constants|||
1070 forbid_setid|||
1071 force_ident|||
1072 force_list|||
1073 force_next|||
1074 force_version|||
1075 force_word|||
1076 form_nocontext|||vn
1077 form||5.004000|v
1078 fp_dup|||
1079 fprintf_nocontext|||vn
1080 free_global_struct|||
1081 free_tied_hv_pool|||
1082 free_tmps|||
1083 gen_constant_list|||
1084 get_av|5.006000||p
1085 get_context||5.006000|n
1086 get_cv|5.006000||p
1087 get_db_sub|||
1088 get_debug_opts|||
1089 get_hash_seed|||
1090 get_hv|5.006000||p
1091 get_mstats|||
1092 get_no_modify|||
1093 get_num|||
1094 get_op_descs||5.005000|
1095 get_op_names||5.005000|
1096 get_opargs|||
1097 get_ppaddr||5.006000|
1098 get_sv|5.006000||p
1099 get_vtbl||5.005030|
1100 getcwd_sv||5.007002|
1101 getenv_len|||
1102 gp_dup|||
1103 gp_free|||
1104 gp_ref|||
1105 grok_bin|5.007003||p
1106 grok_hex|5.007003||p
1107 grok_number|5.007002||p
1108 grok_numeric_radix|5.007002||p
1109 grok_oct|5.007003||p
1110 group_end|||
1111 gv_AVadd|||
1112 gv_HVadd|||
1113 gv_IOadd|||
1114 gv_autoload4||5.004000|
1115 gv_check|||
1116 gv_dump||5.006000|
1117 gv_efullname3||5.004000|
1118 gv_efullname4||5.006001|
1119 gv_efullname|||
1120 gv_ename|||
1121 gv_fetchfile|||
1122 gv_fetchmeth_autoload||5.007003|
1123 gv_fetchmethod_autoload||5.004000|
1124 gv_fetchmethod|||
1125 gv_fetchmeth|||
1126 gv_fetchpvn_flags||5.009002|
1127 gv_fetchpv|||
1128 gv_fetchsv||5.009002|
1129 gv_fullname3||5.004000|
1130 gv_fullname4||5.006001|
1131 gv_fullname|||
1132 gv_handler||5.007001|
1133 gv_init_sv|||
1134 gv_init|||
1135 gv_share|||
1136 gv_stashpvn|5.006000||p
1137 gv_stashpv|||
1138 gv_stashsv|||
1139 he_dup|||
1140 hek_dup|||
1141 hfreeentries|||
1142 hsplit|||
1143 hv_assert||5.009001|
1144 hv_auxinit|||
1145 hv_clear_placeholders||5.009001|
1146 hv_clear|||
1147 hv_delayfree_ent||5.004000|
1148 hv_delete_common|||
1149 hv_delete_ent||5.004000|
1150 hv_delete|||
1151 hv_eiter_p||5.009003|
1152 hv_eiter_set||5.009003|
1153 hv_exists_ent||5.004000|
1154 hv_exists|||
1155 hv_fetch_common|||
1156 hv_fetch_ent||5.004000|
1157 hv_fetch|||
1158 hv_free_ent||5.004000|
1159 hv_iterinit|||
1160 hv_iterkeysv||5.004000|
1161 hv_iterkey|||
1162 hv_iternext_flags||5.008000|
1163 hv_iternextsv|||
1164 hv_iternext|||
1165 hv_iterval|||
1166 hv_ksplit||5.004000|
1167 hv_magic_check|||
1168 hv_magic|||
1169 hv_name_set||5.009003|
1170 hv_notallowed|||
1171 hv_placeholders_get||5.009003|
1172 hv_placeholders_p||5.009003|
1173 hv_placeholders_set||5.009003|
1174 hv_riter_p||5.009003|
1175 hv_riter_set||5.009003|
1176 hv_scalar||5.009001|
1177 hv_store_ent||5.004000|
1178 hv_store_flags||5.008000|
1179 hv_store|||
1180 hv_undef|||
1181 ibcmp_locale||5.004000|
1182 ibcmp_utf8||5.007003|
1183 ibcmp|||
1184 incl_perldb|||
1185 incline|||
1186 incpush|||
1187 ingroup|||
1188 init_argv_symbols|||
1189 init_debugger|||
1190 init_global_struct|||
1191 init_i18nl10n||5.006000|
1192 init_i18nl14n||5.006000|
1193 init_ids|||
1194 init_interp|||
1195 init_lexer|||
1196 init_main_stash|||
1197 init_perllib|||
1198 init_postdump_symbols|||
1199 init_predump_symbols|||
1200 init_stacks||5.005000|
1201 init_tm||5.007002|
1202 instr|||
1203 intro_my|||
1204 intuit_method|||
1205 intuit_more|||
1206 invert|||
1207 io_close|||
1208 isALNUM|||
1209 isALPHA|||
1210 isDIGIT|||
1211 isLOWER|||
1212 isSPACE|||
1213 isUPPER|||
1214 is_an_int|||
1215 is_gv_magical_sv|||
1216 is_gv_magical|||
1217 is_handle_constructor|||
1218 is_list_assignment|||
1219 is_lvalue_sub||5.007001|
1220 is_uni_alnum_lc||5.006000|
1221 is_uni_alnumc_lc||5.006000|
1222 is_uni_alnumc||5.006000|
1223 is_uni_alnum||5.006000|
1224 is_uni_alpha_lc||5.006000|
1225 is_uni_alpha||5.006000|
1226 is_uni_ascii_lc||5.006000|
1227 is_uni_ascii||5.006000|
1228 is_uni_cntrl_lc||5.006000|
1229 is_uni_cntrl||5.006000|
1230 is_uni_digit_lc||5.006000|
1231 is_uni_digit||5.006000|
1232 is_uni_graph_lc||5.006000|
1233 is_uni_graph||5.006000|
1234 is_uni_idfirst_lc||5.006000|
1235 is_uni_idfirst||5.006000|
1236 is_uni_lower_lc||5.006000|
1237 is_uni_lower||5.006000|
1238 is_uni_print_lc||5.006000|
1239 is_uni_print||5.006000|
1240 is_uni_punct_lc||5.006000|
1241 is_uni_punct||5.006000|
1242 is_uni_space_lc||5.006000|
1243 is_uni_space||5.006000|
1244 is_uni_upper_lc||5.006000|
1245 is_uni_upper||5.006000|
1246 is_uni_xdigit_lc||5.006000|
1247 is_uni_xdigit||5.006000|
1248 is_utf8_alnumc||5.006000|
1249 is_utf8_alnum||5.006000|
1250 is_utf8_alpha||5.006000|
1251 is_utf8_ascii||5.006000|
1252 is_utf8_char_slow|||
1253 is_utf8_char||5.006000|
1254 is_utf8_cntrl||5.006000|
1255 is_utf8_digit||5.006000|
1256 is_utf8_graph||5.006000|
1257 is_utf8_idcont||5.008000|
1258 is_utf8_idfirst||5.006000|
1259 is_utf8_lower||5.006000|
1260 is_utf8_mark||5.006000|
1261 is_utf8_print||5.006000|
1262 is_utf8_punct||5.006000|
1263 is_utf8_space||5.006000|
1264 is_utf8_string_loclen||5.009003|
1265 is_utf8_string_loc||5.008001|
1266 is_utf8_string||5.006001|
1267 is_utf8_upper||5.006000|
1268 is_utf8_xdigit||5.006000|
1269 isa_lookup|||
1270 items|||n
1271 ix|||n
1272 jmaybe|||
1273 keyword|||
1274 leave_scope|||
1275 lex_end|||
1276 lex_start|||
1277 linklist|||
1278 listkids|||
1279 list|||
1280 load_module_nocontext|||vn
1281 load_module||5.006000|v
1282 localize|||
1283 looks_like_number|||
1284 lop|||
1285 mPUSHi|5.009002||p
1286 mPUSHn|5.009002||p
1287 mPUSHp|5.009002||p
1288 mPUSHu|5.009002||p
1289 mXPUSHi|5.009002||p
1290 mXPUSHn|5.009002||p
1291 mXPUSHp|5.009002||p
1292 mXPUSHu|5.009002||p
1293 magic_clear_all_env|||
1294 magic_clearenv|||
1295 magic_clearpack|||
1296 magic_clearsig|||
1297 magic_dump||5.006000|
1298 magic_existspack|||
1299 magic_freearylen_p|||
1300 magic_freeovrld|||
1301 magic_freeregexp|||
1302 magic_getarylen|||
1303 magic_getdefelem|||
1304 magic_getglob|||
1305 magic_getnkeys|||
1306 magic_getpack|||
1307 magic_getpos|||
1308 magic_getsig|||
1309 magic_getsubstr|||
1310 magic_gettaint|||
1311 magic_getuvar|||
1312 magic_getvec|||
1313 magic_get|||
1314 magic_killbackrefs|||
1315 magic_len|||
1316 magic_methcall|||
1317 magic_methpack|||
1318 magic_nextpack|||
1319 magic_regdata_cnt|||
1320 magic_regdatum_get|||
1321 magic_regdatum_set|||
1322 magic_scalarpack|||
1323 magic_set_all_env|||
1324 magic_setamagic|||
1325 magic_setarylen|||
1326 magic_setbm|||
1327 magic_setcollxfrm|||
1328 magic_setdbline|||
1329 magic_setdefelem|||
1330 magic_setenv|||
1331 magic_setfm|||
1332 magic_setglob|||
1333 magic_setisa|||
1334 magic_setmglob|||
1335 magic_setnkeys|||
1336 magic_setpack|||
1337 magic_setpos|||
1338 magic_setregexp|||
1339 magic_setsig|||
1340 magic_setsubstr|||
1341 magic_settaint|||
1342 magic_setutf8|||
1343 magic_setuvar|||
1344 magic_setvec|||
1345 magic_set|||
1346 magic_sizepack|||
1347 magic_wipepack|||
1348 magicname|||
1349 make_trie|||
1350 malloced_size|||n
1351 malloc||5.007002|n
1352 markstack_grow|||
1353 measure_struct|||
1354 memEQ|5.004000||p
1355 memNE|5.004000||p
1356 mem_collxfrm|||
1357 mess_alloc|||
1358 mess_nocontext|||vn
1359 mess||5.006000|v
1360 method_common|||
1361 mfree||5.007002|n
1362 mg_clear|||
1363 mg_copy|||
1364 mg_dup|||
1365 mg_find|||
1366 mg_free|||
1367 mg_get|||
1368 mg_length||5.005000|
1369 mg_localize|||
1370 mg_magical|||
1371 mg_set|||
1372 mg_size||5.005000|
1373 mini_mktime||5.007002|
1374 missingterm|||
1375 mode_from_discipline|||
1376 modkids|||
1377 mod|||
1378 moreswitches|||
1379 mul128|||
1380 mulexp10|||n
1381 my_atof2||5.007002|
1382 my_atof||5.006000|
1383 my_attrs|||
1384 my_bcopy|||n
1385 my_betoh16|||n
1386 my_betoh32|||n
1387 my_betoh64|||n
1388 my_betohi|||n
1389 my_betohl|||n
1390 my_betohs|||n
1391 my_bzero|||n
1392 my_chsize|||
1393 my_exit_jump|||
1394 my_exit|||
1395 my_failure_exit||5.004000|
1396 my_fflush_all||5.006000|
1397 my_fork||5.007003|n
1398 my_htobe16|||n
1399 my_htobe32|||n
1400 my_htobe64|||n
1401 my_htobei|||n
1402 my_htobel|||n
1403 my_htobes|||n
1404 my_htole16|||n
1405 my_htole32|||n
1406 my_htole64|||n
1407 my_htolei|||n
1408 my_htolel|||n
1409 my_htoles|||n
1410 my_htonl|||
1411 my_kid|||
1412 my_letoh16|||n
1413 my_letoh32|||n
1414 my_letoh64|||n
1415 my_letohi|||n
1416 my_letohl|||n
1417 my_letohs|||n
1418 my_lstat|||
1419 my_memcmp||5.004000|n
1420 my_memset|||n
1421 my_ntohl|||
1422 my_pclose||5.004000|
1423 my_popen_list||5.007001|
1424 my_popen||5.004000|
1425 my_setenv|||
1426 my_socketpair||5.007003|n
1427 my_stat|||
1428 my_strftime||5.007002|
1429 my_swabn|||n
1430 my_swap|||
1431 my_unexec|||
1432 my|||
1433 newANONATTRSUB||5.006000|
1434 newANONHASH|||
1435 newANONLIST|||
1436 newANONSUB|||
1437 newASSIGNOP|||
1438 newATTRSUB||5.006000|
1439 newAVREF|||
1440 newAV|||
1441 newBINOP|||
1442 newCONDOP|||
1443 newCONSTSUB|5.006000||p
1444 newCVREF|||
1445 newDEFSVOP|||
1446 newFORM|||
1447 newFOROP|||
1448 newGVOP|||
1449 newGVREF|||
1450 newGVgen|||
1451 newHVREF|||
1452 newHVhv||5.005000|
1453 newHV|||
1454 newIO|||
1455 newLISTOP|||
1456 newLOGOP|||
1457 newLOOPEX|||
1458 newLOOPOP|||
1459 newMYSUB||5.006000|
1460 newNULLLIST|||
1461 newOP|||
1462 newPADOP||5.006000|
1463 newPMOP|||
1464 newPROG|||
1465 newPVOP|||
1466 newRANGE|||
1467 newRV_inc|5.004000||p
1468 newRV_noinc|5.006000||p
1469 newRV|||
1470 newSLICEOP|||
1471 newSTATEOP|||
1472 newSUB|||
1473 newSVOP|||
1474 newSVREF|||
1475 newSVhek||5.009003|
1476 newSViv|||
1477 newSVnv|||
1478 newSVpvf_nocontext|||vn
1479 newSVpvf||5.004000|v
1480 newSVpvn_share||5.007001|
1481 newSVpvn|5.006000||p
1482 newSVpv|||
1483 newSVrv|||
1484 newSVsv|||
1485 newSVuv|5.006000||p
1486 newSV|||
1487 newUNOP|||
1488 newWHILEOP||5.009003|
1489 newXSproto||5.006000|
1490 newXS||5.006000|
1491 new_collate||5.006000|
1492 new_constant|||
1493 new_ctype||5.006000|
1494 new_he|||
1495 new_logop|||
1496 new_numeric||5.006000|
1497 new_stackinfo||5.005000|
1498 new_version||5.009000|
1499 next_symbol|||
1500 nextargv|||
1501 nextchar|||
1502 ninstr|||
1503 no_bareword_allowed|||
1504 no_fh_allowed|||
1505 no_op|||
1506 not_a_number|||
1507 nothreadhook||5.008000|
1508 nuke_stacks|||
1509 num_overflow|||n
1510 oopsAV|||
1511 oopsCV|||
1512 oopsHV|||
1513 op_clear|||
1514 op_const_sv|||
1515 op_dump||5.006000|
1516 op_free|||
1517 op_null||5.007002|
1518 op_refcnt_lock||5.009002|
1519 op_refcnt_unlock||5.009002|
1520 open_script|||
1521 pMY_CXT_|5.007003||p
1522 pMY_CXT|5.007003||p
1523 pTHX_|5.006000||p
1524 pTHX|5.006000||p
1525 pack_cat||5.007003|
1526 pack_rec|||
1527 package|||
1528 packlist||5.008001|
1529 pad_add_anon|||
1530 pad_add_name|||
1531 pad_alloc|||
1532 pad_block_start|||
1533 pad_check_dup|||
1534 pad_compname_type|||
1535 pad_findlex|||
1536 pad_findmy|||
1537 pad_fixup_inner_anons|||
1538 pad_free|||
1539 pad_leavemy|||
1540 pad_new|||
1541 pad_push|||
1542 pad_reset|||
1543 pad_setsv|||
1544 pad_sv|||
1545 pad_swipe|||
1546 pad_tidy|||
1547 pad_undef|||
1548 parse_body|||
1549 parse_unicode_opts|||
1550 path_is_absolute|||
1551 peep|||
1552 pending_ident|||
1553 perl_alloc_using|||n
1554 perl_alloc|||n
1555 perl_clone_using|||n
1556 perl_clone|||n
1557 perl_construct|||n
1558 perl_destruct||5.007003|n
1559 perl_free|||n
1560 perl_parse||5.006000|n
1561 perl_run|||n
1562 pidgone|||
1563 pmflag|||
1564 pmop_dump||5.006000|
1565 pmruntime|||
1566 pmtrans|||
1567 pop_scope|||
1568 pregcomp|||
1569 pregexec|||
1570 pregfree|||
1571 prepend_elem|||
1572 printf_nocontext|||vn
1573 ptr_table_clear|||
1574 ptr_table_fetch|||
1575 ptr_table_free|||
1576 ptr_table_new|||
1577 ptr_table_split|||
1578 ptr_table_store|||
1579 push_scope|||
1580 put_byte|||
1581 pv_display||5.006000|
1582 pv_uni_display||5.007003|
1583 qerror|||
1584 re_croak2|||
1585 re_dup|||
1586 re_intuit_start||5.006000|
1587 re_intuit_string||5.006000|
1588 realloc||5.007002|n
1589 reentrant_free|||
1590 reentrant_init|||
1591 reentrant_retry|||vn
1592 reentrant_size|||
1593 refkids|||
1594 refto|||
1595 ref|||
1596 reg_node|||
1597 reganode|||
1598 regatom|||
1599 regbranch|||
1600 regclass_swash||5.007003|
1601 regclass|||
1602 regcp_set_to|||
1603 regcppop|||
1604 regcppush|||
1605 regcurly|||
1606 regdump||5.005000|
1607 regexec_flags||5.005000|
1608 reghop3|||
1609 reghopmaybe3|||
1610 reghopmaybe|||
1611 reghop|||
1612 reginclass|||
1613 reginitcolors||5.006000|
1614 reginsert|||
1615 regmatch|||
1616 regnext||5.005000|
1617 regoptail|||
1618 regpiece|||
1619 regpposixcc|||
1620 regprop|||
1621 regrepeat_hard|||
1622 regrepeat|||
1623 regtail|||
1624 regtry|||
1625 reguni|||
1626 regwhite|||
1627 reg|||
1628 repeatcpy|||
1629 report_evil_fh|||
1630 report_uninit|||
1631 require_errno|||
1632 require_pv||5.006000|
1633 rninstr|||
1634 rsignal_restore|||
1635 rsignal_save|||
1636 rsignal_state||5.004000|
1637 rsignal||5.004000|
1638 run_body|||
1639 runops_debug||5.005000|
1640 runops_standard||5.005000|
1641 rvpv_dup|||
1642 rxres_free|||
1643 rxres_restore|||
1644 rxres_save|||
1645 safesyscalloc||5.006000|n
1646 safesysfree||5.006000|n
1647 safesysmalloc||5.006000|n
1648 safesysrealloc||5.006000|n
1649 same_dirent|||
1650 save_I16||5.004000|
1651 save_I32|||
1652 save_I8||5.006000|
1653 save_aelem||5.004050|
1654 save_alloc||5.006000|
1655 save_aptr|||
1656 save_ary|||
1657 save_bool||5.008001|
1658 save_clearsv|||
1659 save_delete|||
1660 save_destructor_x||5.006000|
1661 save_destructor||5.006000|
1662 save_freeop|||
1663 save_freepv|||
1664 save_freesv|||
1665 save_generic_pvref||5.006001|
1666 save_generic_svref||5.005030|
1667 save_gp||5.004000|
1668 save_hash|||
1669 save_hek_flags|||
1670 save_helem||5.004050|
1671 save_hints||5.005000|
1672 save_hptr|||
1673 save_int|||
1674 save_item|||
1675 save_iv||5.005000|
1676 save_lines|||
1677 save_list|||
1678 save_long|||
1679 save_magic|||
1680 save_mortalizesv||5.007001|
1681 save_nogv|||
1682 save_op|||
1683 save_padsv||5.007001|
1684 save_pptr|||
1685 save_re_context||5.006000|
1686 save_scalar_at|||
1687 save_scalar|||
1688 save_set_svflags||5.009000|
1689 save_shared_pvref||5.007003|
1690 save_sptr|||
1691 save_svref|||
1692 save_threadsv||5.005000|
1693 save_vptr||5.006000|
1694 savepvn|||
1695 savepv|||
1696 savesharedpv||5.007003|
1697 savestack_grow_cnt||5.008001|
1698 savestack_grow|||
1699 savesvpv||5.009002|
1700 sawparens|||
1701 scalar_mod_type|||
1702 scalarboolean|||
1703 scalarkids|||
1704 scalarseq|||
1705 scalarvoid|||
1706 scalar|||
1707 scan_bin||5.006000|
1708 scan_commit|||
1709 scan_const|||
1710 scan_formline|||
1711 scan_heredoc|||
1712 scan_hex|||
1713 scan_ident|||
1714 scan_inputsymbol|||
1715 scan_num||5.007001|
1716 scan_oct|||
1717 scan_pat|||
1718 scan_str|||
1719 scan_subst|||
1720 scan_trans|||
1721 scan_version||5.009001|
1722 scan_vstring||5.008001|
1723 scan_word|||
1724 scope|||
1725 screaminstr||5.005000|
1726 seed|||
1727 set_context||5.006000|n
1728 set_csh|||
1729 set_numeric_local||5.006000|
1730 set_numeric_radix||5.006000|
1731 set_numeric_standard||5.006000|
1732 setdefout|||
1733 setenv_getix|||
1734 share_hek_flags|||
1735 share_hek|||
1736 si_dup|||
1737 sighandler|||n
1738 simplify_sort|||
1739 skipspace|||
1740 sortsv||5.007003|
1741 ss_dup|||
1742 stack_grow|||
1743 start_glob|||
1744 start_subparse||5.004000|
1745 stashpv_hvname_match||5.009003|
1746 stdize_locale|||
1747 strEQ|||
1748 strGE|||
1749 strGT|||
1750 strLE|||
1751 strLT|||
1752 strNE|||
1753 str_to_version||5.006000|
1754 strnEQ|||
1755 strnNE|||
1756 study_chunk|||
1757 sub_crush_depth|||
1758 sublex_done|||
1759 sublex_push|||
1760 sublex_start|||
1761 sv_2bool|||
1762 sv_2cv|||
1763 sv_2io|||
1764 sv_2iuv_non_preserve|||
1765 sv_2iv_flags||5.009001|
1766 sv_2iv|||
1767 sv_2mortal|||
1768 sv_2nv|||
1769 sv_2pv_flags||5.007002|
1770 sv_2pv_nolen|5.006000||p
1771 sv_2pvbyte_nolen|||
1772 sv_2pvbyte|5.006000||p
1773 sv_2pvutf8_nolen||5.006000|
1774 sv_2pvutf8||5.006000|
1775 sv_2pv|||
1776 sv_2uv_flags||5.009001|
1777 sv_2uv|5.004000||p
1778 sv_add_arena|||
1779 sv_add_backref|||
1780 sv_backoff|||
1781 sv_bless|||
1782 sv_cat_decode||5.008001|
1783 sv_catpv_mg|5.006000||p
1784 sv_catpvf_mg_nocontext|||pvn
1785 sv_catpvf_mg|5.006000|5.004000|pv
1786 sv_catpvf_nocontext|||vn
1787 sv_catpvf||5.004000|v
1788 sv_catpvn_flags||5.007002|
1789 sv_catpvn_mg|5.006000||p
1790 sv_catpvn_nomg|5.007002||p
1791 sv_catpvn|||
1792 sv_catpv|||
1793 sv_catsv_flags||5.007002|
1794 sv_catsv_mg|5.006000||p
1795 sv_catsv_nomg|5.007002||p
1796 sv_catsv|||
1797 sv_chop|||
1798 sv_clean_all|||
1799 sv_clean_objs|||
1800 sv_clear|||
1801 sv_cmp_locale||5.004000|
1802 sv_cmp|||
1803 sv_collxfrm|||
1804 sv_compile_2op||5.008001|
1805 sv_copypv||5.007003|
1806 sv_dec|||
1807 sv_del_backref|||
1808 sv_derived_from||5.004000|
1809 sv_dump|||
1810 sv_dup|||
1811 sv_eq|||
1812 sv_force_normal_flags||5.007001|
1813 sv_force_normal||5.006000|
1814 sv_free2|||
1815 sv_free_arenas|||
1816 sv_free|||
1817 sv_gets||5.004000|
1818 sv_grow|||
1819 sv_inc|||
1820 sv_insert|||
1821 sv_isa|||
1822 sv_isobject|||
1823 sv_iv||5.005000|
1824 sv_len_utf8||5.006000|
1825 sv_len|||
1826 sv_magicext||5.007003|
1827 sv_magic|||
1828 sv_mortalcopy|||
1829 sv_newmortal|||
1830 sv_newref|||
1831 sv_nolocking||5.007003|
1832 sv_nosharing||5.007003|
1833 sv_nounlocking||5.007003|
1834 sv_nv||5.005000|
1835 sv_peek||5.005000|
1836 sv_pos_b2u||5.006000|
1837 sv_pos_u2b||5.006000|
1838 sv_pvbyten_force||5.006000|
1839 sv_pvbyten||5.006000|
1840 sv_pvbyte||5.006000|
1841 sv_pvn_force_flags||5.007002|
1842 sv_pvn_force|||p
1843 sv_pvn_nomg|5.007003||p
1844 sv_pvn|5.006000||p
1845 sv_pvutf8n_force||5.006000|
1846 sv_pvutf8n||5.006000|
1847 sv_pvutf8||5.006000|
1848 sv_pv||5.006000|
1849 sv_recode_to_utf8||5.007003|
1850 sv_reftype|||
1851 sv_release_COW|||
1852 sv_release_IVX|||
1853 sv_replace|||
1854 sv_report_used|||
1855 sv_reset|||
1856 sv_rvweaken||5.006000|
1857 sv_setiv_mg|5.006000||p
1858 sv_setiv|||
1859 sv_setnv_mg|5.006000||p
1860 sv_setnv|||
1861 sv_setpv_mg|5.006000||p
1862 sv_setpvf_mg_nocontext|||pvn
1863 sv_setpvf_mg|5.006000|5.004000|pv
1864 sv_setpvf_nocontext|||vn
1865 sv_setpvf||5.004000|v
1866 sv_setpviv_mg||5.008001|
1867 sv_setpviv||5.008001|
1868 sv_setpvn_mg|5.006000||p
1869 sv_setpvn|||
1870 sv_setpv|||
1871 sv_setref_iv|||
1872 sv_setref_nv|||
1873 sv_setref_pvn|||
1874 sv_setref_pv|||
1875 sv_setref_uv||5.007001|
1876 sv_setsv_cow|||
1877 sv_setsv_flags||5.007002|
1878 sv_setsv_mg|5.006000||p
1879 sv_setsv_nomg|5.007002||p
1880 sv_setsv|||
1881 sv_setuv_mg|5.006000||p
1882 sv_setuv|5.006000||p
1883 sv_tainted||5.004000|
1884 sv_taint||5.004000|
1885 sv_true||5.005000|
1886 sv_unglob|||
1887 sv_uni_display||5.007003|
1888 sv_unmagic|||
1889 sv_unref_flags||5.007001|
1890 sv_unref|||
1891 sv_untaint||5.004000|
1892 sv_upgrade|||
1893 sv_usepvn_mg|5.006000||p
1894 sv_usepvn|||
1895 sv_utf8_decode||5.006000|
1896 sv_utf8_downgrade||5.006000|
1897 sv_utf8_encode||5.006000|
1898 sv_utf8_upgrade_flags||5.007002|
1899 sv_utf8_upgrade||5.007001|
1900 sv_uv|5.006000||p
1901 sv_vcatpvf_mg|5.006000|5.004000|p
1902 sv_vcatpvfn||5.004000|
1903 sv_vcatpvf|5.006000|5.004000|p
1904 sv_vsetpvf_mg|5.006000|5.004000|p
1905 sv_vsetpvfn||5.004000|
1906 sv_vsetpvf|5.006000|5.004000|p
1907 svtype|||
1908 swallow_bom|||
1909 swash_fetch||5.007002|
1910 swash_init||5.006000|
1911 sys_intern_clear|||
1912 sys_intern_dup|||
1913 sys_intern_init|||
1914 taint_env|||
1915 taint_proper|||
1916 tmps_grow||5.006000|
1917 toLOWER|||
1918 toUPPER|||
1919 to_byte_substr|||
1920 to_uni_fold||5.007003|
1921 to_uni_lower_lc||5.006000|
1922 to_uni_lower||5.007003|
1923 to_uni_title_lc||5.006000|
1924 to_uni_title||5.007003|
1925 to_uni_upper_lc||5.006000|
1926 to_uni_upper||5.007003|
1927 to_utf8_case||5.007003|
1928 to_utf8_fold||5.007003|
1929 to_utf8_lower||5.007003|
1930 to_utf8_substr|||
1931 to_utf8_title||5.007003|
1932 to_utf8_upper||5.007003|
1933 tokeq|||
1934 tokereport|||
1935 too_few_arguments|||
1936 too_many_arguments|||
1937 unlnk|||
1938 unpack_rec|||
1939 unpack_str||5.007003|
1940 unpackstring||5.008001|
1941 unshare_hek_or_pvn|||
1942 unshare_hek|||
1943 unsharepvn||5.004000|
1944 upg_version||5.009000|
1945 usage|||
1946 utf16_textfilter|||
1947 utf16_to_utf8_reversed||5.006001|
1948 utf16_to_utf8||5.006001|
1949 utf16rev_textfilter|||
1950 utf8_distance||5.006000|
1951 utf8_hop||5.006000|
1952 utf8_length||5.007001|
1953 utf8_mg_pos_init|||
1954 utf8_mg_pos|||
1955 utf8_to_bytes||5.006001|
1956 utf8_to_uvchr||5.007001|
1957 utf8_to_uvuni||5.007001|
1958 utf8n_to_uvchr||5.007001|
1959 utf8n_to_uvuni||5.007001|
1960 utilize|||
1961 uvchr_to_utf8_flags||5.007003|
1962 uvchr_to_utf8||5.007001|
1963 uvuni_to_utf8_flags||5.007003|
1964 uvuni_to_utf8||5.007001|
1965 validate_suid|||
1966 varname|||
1967 vcmp||5.009000|
1968 vcroak||5.006000|
1969 vdeb||5.007003|
1970 vdie|||
1971 vform||5.006000|
1972 visit|||
1973 vivify_defelem|||
1974 vivify_ref|||
1975 vload_module||5.006000|
1976 vmess||5.006000|
1977 vnewSVpvf|5.006000|5.004000|p
1978 vnormal||5.009002|
1979 vnumify||5.009000|
1980 vstringify||5.009000|
1981 vwarner||5.006000|
1982 vwarn||5.006000|
1983 wait4pid|||
1984 warn_nocontext|||vn
1985 warner_nocontext|||vn
1986 warner||5.006000|v
1987 warn|||v
1988 watch|||
1989 whichsig|||
1990 write_to_stderr|||
1991 yyerror|||
1992 yylex|||
1993 yyparse|||
1994 yywarn|||
1995 );
1996
1997 if (exists $opt{'list-unsupported'}) {
1998   my $f;
1999   for $f (sort { lc $a cmp lc $b } keys %API) {
2000     next unless $API{$f}{todo};
2001     print "$f ", '.'x(40-length($f)), " ", format_version($API{$f}{todo}), "\n";
2002   }
2003   exit 0;
2004 }
2005
2006 # Scan for possible replacement candidates
2007
2008 my(%replace, %need, %hints, %depends);
2009 my $replace = 0;
2010 my $hint = '';
2011
2012 while (<DATA>) {
2013   if ($hint) {
2014     if (m{^\s*\*\s(.*?)\s*$}) {
2015       $hints{$hint} ||= '';  # suppress warning with older perls
2016       $hints{$hint} .= "$1\n";
2017     }
2018     else {
2019       $hint = '';
2020     }
2021   }
2022   $hint = $1 if m{^\s*$rccs\sHint:\s+(\w+)\s*$};
2023
2024   $replace     = $1 if m{^\s*$rccs\s+Replace:\s+(\d+)\s+$rcce\s*$};
2025   $replace{$2} = $1 if $replace and m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+)};
2026   $replace{$2} = $1 if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+).*$rccs\s+Replace\s+$rcce};
2027   $replace{$1} = $2 if m{^\s*$rccs\s+Replace (\w+) with (\w+)\s+$rcce\s*$};
2028
2029   if (m{^\s*$rccs\s+(\w+)\s+depends\s+on\s+(\w+(\s*,\s*\w+)*)\s+$rcce\s*$}) {
2030     push @{$depends{$1}}, map { s/\s+//g; $_ } split /,/, $2;
2031   }
2032
2033   $need{$1} = 1 if m{^#if\s+defined\(NEED_(\w+)(?:_GLOBAL)?\)};
2034 }
2035
2036 if (exists $opt{'api-info'}) {
2037   my $f;
2038   my $count = 0;
2039   my $match = $opt{'api-info'} =~ m!^/(.*)/$! ? $1 : "^\Q$opt{'api-info'}\E\$";
2040   for $f (sort { lc $a cmp lc $b } keys %API) {
2041     next unless $f =~ /$match/;
2042     print "\n=== $f ===\n\n";
2043     my $info = 0;
2044     if ($API{$f}{base} || $API{$f}{todo}) {
2045       my $base = format_version($API{$f}{base} || $API{$f}{todo});
2046       print "Supported at least starting from perl-$base.\n";
2047       $info++;
2048     }
2049     if ($API{$f}{provided}) {
2050       my $todo = $API{$f}{todo} ? format_version($API{$f}{todo}) : "5.003";
2051       print "Support by $ppport provided back to perl-$todo.\n";
2052       print "Support needs to be explicitly requested by NEED_$f.\n" if exists $need{$f};
2053       print "Depends on: ", join(', ', @{$depends{$f}}), ".\n" if exists $depends{$f};
2054       print "$hints{$f}" if exists $hints{$f};
2055       $info++;
2056     }
2057     unless ($info) {
2058       print "No portability information available.\n";
2059     }
2060     $count++;
2061   }
2062   if ($count > 0) {
2063     print "\n";
2064   }
2065   else {
2066     print "Found no API matching '$opt{'api-info'}'.\n";
2067   }
2068   exit 0;
2069 }
2070
2071 if (exists $opt{'list-provided'}) {
2072   my $f;
2073   for $f (sort { lc $a cmp lc $b } keys %API) {
2074     next unless $API{$f}{provided};
2075     my @flags;
2076     push @flags, 'explicit' if exists $need{$f};
2077     push @flags, 'depend'   if exists $depends{$f};
2078     push @flags, 'hint'     if exists $hints{$f};
2079     my $flags = @flags ? '  ['.join(', ', @flags).']' : '';
2080     print "$f$flags\n";
2081   }
2082   exit 0;
2083 }
2084
2085 my @files;
2086 my @srcext = qw( xs c h cc cpp );
2087 my $srcext = join '|', @srcext;
2088
2089 if (@ARGV) {
2090   my %seen;
2091   @files = grep { -f && !exists $seen{$_} } map { glob $_ } @ARGV;
2092 }
2093 else {
2094   eval {
2095     require File::Find;
2096     File::Find::find(sub {
2097       $File::Find::name =~ /\.($srcext)$/i
2098           and push @files, $File::Find::name;
2099     }, '.');
2100   };
2101   if ($@) {
2102     @files = map { glob "*.$_" } @srcext;
2103   }
2104 }
2105
2106 if (!@ARGV || $opt{filter}) {
2107   my(@in, @out);
2108   my %xsc = map { /(.*)\.xs$/ ? ("$1.c" => 1, "$1.cc" => 1) : () } @files;
2109   for (@files) {
2110     my $out = exists $xsc{$_} || /\b\Q$ppport\E$/i || !/\.($srcext)$/i;
2111     push @{ $out ? \@out : \@in }, $_;
2112   }
2113   if (@ARGV && @out) {
2114     warning("Skipping the following files (use --nofilter to avoid this):\n| ", join "\n| ", @out);
2115   }
2116   @files = @in;
2117 }
2118
2119 unless (@files) {
2120   die "No input files given!\n";
2121 }
2122
2123 my(%files, %global, %revreplace);
2124 %revreplace = reverse %replace;
2125 my $filename;
2126 my $patch_opened = 0;
2127
2128 for $filename (@files) {
2129   unless (open IN, "<$filename") {
2130     warn "Unable to read from $filename: $!\n";
2131     next;
2132   }
2133
2134   info("Scanning $filename ...");
2135
2136   my $c = do { local $/; <IN> };
2137   close IN;
2138
2139   my %file = (orig => $c, changes => 0);
2140
2141   # temporarily remove C comments from the code
2142   my @ccom;
2143   $c =~ s{
2144     (
2145         [^"'/]+
2146       |
2147         (?:"[^"\\]*(?:\\.[^"\\]*)*" [^"'/]*)+
2148       |
2149         (?:'[^'\\]*(?:\\.[^'\\]*)*' [^"'/]*)+
2150     )
2151   |
2152     (/ (?:
2153         \*[^*]*\*+(?:[^$ccs][^*]*\*+)* /
2154         |
2155         /[^\r\n]*
2156       ))
2157   }{
2158     defined $2 and push @ccom, $2;
2159     defined $1 ? $1 : "$ccs$#ccom$cce";
2160   }egsx;
2161
2162   $file{ccom} = \@ccom;
2163   $file{code} = $c;
2164   $file{has_inc_ppport} = ($c =~ /#.*include.*\Q$ppport\E/);
2165
2166   my $func;
2167
2168   for $func (keys %API) {
2169     my $match = $func;
2170     $match .= "|$revreplace{$func}" if exists $revreplace{$func};
2171     if ($c =~ /\b(?:Perl_)?($match)\b/) {
2172       $file{uses_replace}{$1}++ if exists $revreplace{$func} && $1 eq $revreplace{$func};
2173       $file{uses_Perl}{$func}++ if $c =~ /\bPerl_$func\b/;
2174       if (exists $API{$func}{provided}) {
2175         if (!exists $API{$func}{base} || $API{$func}{base} > $opt{'compat-version'}) {
2176           $file{uses}{$func}++;
2177           my @deps = rec_depend($func);
2178           if (@deps) {
2179             $file{uses_deps}{$func} = \@deps;
2180             for (@deps) {
2181               $file{uses}{$_} = 0 unless exists $file{uses}{$_};
2182             }
2183           }
2184           for ($func, @deps) {
2185             if (exists $need{$_}) {
2186               $file{needs}{$_} = 'static';
2187             }
2188           }
2189         }
2190       }
2191       if (exists $API{$func}{todo} && $API{$func}{todo} > $opt{'compat-version'}) {
2192         if ($c =~ /\b$func\b/) {
2193           $file{uses_todo}{$func}++;
2194         }
2195       }
2196     }
2197   }
2198
2199   while ($c =~ /^$HS*#$HS*define$HS+(NEED_(\w+?)(_GLOBAL)?)\b/mg) {
2200     if (exists $need{$2}) {
2201       $file{defined $3 ? 'needed_global' : 'needed_static'}{$2}++;
2202     }
2203     else {
2204       warning("Possibly wrong #define $1 in $filename");
2205     }
2206   }
2207
2208   for (qw(uses needs uses_todo needed_global needed_static)) {
2209     for $func (keys %{$file{$_}}) {
2210       push @{$global{$_}{$func}}, $filename;
2211     }
2212   }
2213
2214   $files{$filename} = \%file;
2215 }
2216
2217 # Globally resolve NEED_'s
2218 my $need;
2219 for $need (keys %{$global{needs}}) {
2220   if (@{$global{needs}{$need}} > 1) {
2221     my @targets = @{$global{needs}{$need}};
2222     my @t = grep $files{$_}{needed_global}{$need}, @targets;
2223     @targets = @t if @t;
2224     @t = grep /\.xs$/i, @targets;
2225     @targets = @t if @t;
2226     my $target = shift @targets;
2227     $files{$target}{needs}{$need} = 'global';
2228     for (@{$global{needs}{$need}}) {
2229       $files{$_}{needs}{$need} = 'extern' if $_ ne $target;
2230     }
2231   }
2232 }
2233
2234 for $filename (@files) {
2235   exists $files{$filename} or next;
2236
2237   info("=== Analyzing $filename ===");
2238
2239   my %file = %{$files{$filename}};
2240   my $func;
2241   my $c = $file{code};
2242
2243   for $func (sort keys %{$file{uses_Perl}}) {
2244     if ($API{$func}{varargs}) {
2245       my $changes = ($c =~ s{\b(Perl_$func\s*\(\s*)(?!aTHX_?)(\)|[^\s)]*\))}
2246                             { $1 . ($2 eq ')' ? 'aTHX' : 'aTHX_ ') . $2 }ge);
2247       if ($changes) {
2248         warning("Doesn't pass interpreter argument aTHX to Perl_$func");
2249         $file{changes} += $changes;
2250       }
2251     }
2252     else {
2253       warning("Uses Perl_$func instead of $func");
2254       $file{changes} += ($c =~ s{\bPerl_$func(\s*)\((\s*aTHX_?)?\s*}
2255                                 {$func$1(}g);
2256     }
2257   }
2258
2259   for $func (sort keys %{$file{uses_replace}}) {
2260     warning("Uses $func instead of $replace{$func}");
2261     $file{changes} += ($c =~ s/\b$func\b/$replace{$func}/g);
2262   }
2263
2264   for $func (sort keys %{$file{uses}}) {
2265     next unless $file{uses}{$func};   # if it's only a dependency
2266     if (exists $file{uses_deps}{$func}) {
2267       diag("Uses $func, which depends on ", join(', ', @{$file{uses_deps}{$func}}));
2268     }
2269     elsif (exists $replace{$func}) {
2270       warning("Uses $func instead of $replace{$func}");
2271       $file{changes} += ($c =~ s/\b$func\b/$replace{$func}/g);
2272     }
2273     else {
2274       diag("Uses $func");
2275     }
2276     hint($func);
2277   }
2278
2279   for $func (sort keys %{$file{uses_todo}}) {
2280     warning("Uses $func, which may not be portable below perl ",
2281             format_version($API{$func}{todo}));
2282   }
2283
2284   for $func (sort keys %{$file{needed_static}}) {
2285     my $message = '';
2286     if (not exists $file{uses}{$func}) {
2287       $message = "No need to define NEED_$func if $func is never used";
2288     }
2289     elsif (exists $file{needs}{$func} && $file{needs}{$func} ne 'static') {
2290       $message = "No need to define NEED_$func when already needed globally";
2291     }
2292     if ($message) {
2293       diag($message);
2294       $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_$func\b.*$LF//mg);
2295     }
2296   }
2297
2298   for $func (sort keys %{$file{needed_global}}) {
2299     my $message = '';
2300     if (not exists $global{uses}{$func}) {
2301       $message = "No need to define NEED_${func}_GLOBAL if $func is never used";
2302     }
2303     elsif (exists $file{needs}{$func}) {
2304       if ($file{needs}{$func} eq 'extern') {
2305         $message = "No need to define NEED_${func}_GLOBAL when already needed globally";
2306       }
2307       elsif ($file{needs}{$func} eq 'static') {
2308         $message = "No need to define NEED_${func}_GLOBAL when only used in this file";
2309       }
2310     }
2311     if ($message) {
2312       diag($message);
2313       $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_${func}_GLOBAL\b.*$LF//mg);
2314     }
2315   }
2316
2317   $file{needs_inc_ppport} = keys %{$file{uses}};
2318
2319   if ($file{needs_inc_ppport}) {
2320     my $pp = '';
2321
2322     for $func (sort keys %{$file{needs}}) {
2323       my $type = $file{needs}{$func};
2324       next if $type eq 'extern';
2325       my $suffix = $type eq 'global' ? '_GLOBAL' : '';
2326       unless (exists $file{"needed_$type"}{$func}) {
2327         if ($type eq 'global') {
2328           diag("Files [@{$global{needs}{$func}}] need $func, adding global request");
2329         }
2330         else {
2331           diag("File needs $func, adding static request");
2332         }
2333         $pp .= "#define NEED_$func$suffix\n";
2334       }
2335     }
2336
2337     if ($pp && ($c =~ s/^(?=$HS*#$HS*define$HS+NEED_\w+)/$pp/m)) {
2338       $pp = '';
2339       $file{changes}++;
2340     }
2341
2342     unless ($file{has_inc_ppport}) {
2343       diag("Needs to include '$ppport'");
2344       $pp .= qq(#include "$ppport"\n)
2345     }
2346
2347     if ($pp) {
2348       $file{changes} += ($c =~ s/^($HS*#$HS*define$HS+NEED_\w+.*?)^/$1$pp/ms)
2349                      || ($c =~ s/^(?=$HS*#$HS*include.*\Q$ppport\E)/$pp/m)
2350                      || ($c =~ s/^($HS*#$HS*include.*XSUB.*\s*?)^/$1$pp/m)
2351                      || ($c =~ s/^/$pp/);
2352     }
2353   }
2354   else {
2355     if ($file{has_inc_ppport}) {
2356       diag("No need to include '$ppport'");
2357       $file{changes} += ($c =~ s/^$HS*?#$HS*include.*\Q$ppport\E.*?$LF//m);
2358     }
2359   }
2360
2361   # put back in our C comments
2362   my $ix;
2363   my $cppc = 0;
2364   my @ccom = @{$file{ccom}};
2365   for $ix (0 .. $#ccom) {
2366     if (!$opt{cplusplus} && $ccom[$ix] =~ s!^//!!) {
2367       $cppc++;
2368       $file{changes} += $c =~ s/$rccs$ix$rcce/$ccs$ccom[$ix] $cce/;
2369     }
2370     else {
2371       $c =~ s/$rccs$ix$rcce/$ccom[$ix]/;
2372     }
2373   }
2374
2375   if ($cppc) {
2376     my $s = $cppc != 1 ? 's' : '';
2377     warning("Uses $cppc C++ style comment$s, which is not portable");
2378   }
2379
2380   if ($file{changes}) {
2381     if (exists $opt{copy}) {
2382       my $newfile = "$filename$opt{copy}";
2383       if (-e $newfile) {
2384         error("'$newfile' already exists, refusing to write copy of '$filename'");
2385       }
2386       else {
2387         local *F;
2388         if (open F, ">$newfile") {
2389           info("Writing copy of '$filename' with changes to '$newfile'");
2390           print F $c;
2391           close F;
2392         }
2393         else {
2394           error("Cannot open '$newfile' for writing: $!");
2395         }
2396       }
2397     }
2398     elsif (exists $opt{patch} || $opt{changes}) {
2399       if (exists $opt{patch}) {
2400         unless ($patch_opened) {
2401           if (open PATCH, ">$opt{patch}") {
2402             $patch_opened = 1;
2403           }
2404           else {
2405             error("Cannot open '$opt{patch}' for writing: $!");
2406             delete $opt{patch};
2407             $opt{changes} = 1;
2408             goto fallback;
2409           }
2410         }
2411         mydiff(\*PATCH, $filename, $c);
2412       }
2413       else {
2414 fallback:
2415         info("Suggested changes:");
2416         mydiff(\*STDOUT, $filename, $c);
2417       }
2418     }
2419     else {
2420       my $s = $file{changes} == 1 ? '' : 's';
2421       info("$file{changes} potentially required change$s detected");
2422     }
2423   }
2424   else {
2425     info("Looks good");
2426   }
2427 }
2428
2429 close PATCH if $patch_opened;
2430
2431 exit 0;
2432
2433
2434 sub mydiff
2435 {
2436   local *F = shift;
2437   my($file, $str) = @_;
2438   my $diff;
2439
2440   if (exists $opt{diff}) {
2441     $diff = run_diff($opt{diff}, $file, $str);
2442   }
2443
2444   if (!defined $diff and can_use('Text::Diff')) {
2445     $diff = Text::Diff::diff($file, \$str, { STYLE => 'Unified' });
2446     $diff = <<HEADER . $diff;
2447 --- $file
2448 +++ $file.patched
2449 HEADER
2450   }
2451
2452   if (!defined $diff) {
2453     $diff = run_diff('diff -u', $file, $str);
2454   }
2455
2456   if (!defined $diff) {
2457     $diff = run_diff('diff', $file, $str);
2458   }
2459
2460   if (!defined $diff) {
2461     error("Cannot generate a diff. Please install Text::Diff or use --copy.");
2462     return;
2463   }
2464
2465   print F $diff;
2466
2467 }
2468
2469 sub run_diff
2470 {
2471   my($prog, $file, $str) = @_;
2472   my $tmp = 'dppptemp';
2473   my $suf = 'aaa';
2474   my $diff = '';
2475   local *F;
2476
2477   while (-e "$tmp.$suf") { $suf++ }
2478   $tmp = "$tmp.$suf";
2479
2480   if (open F, ">$tmp") {
2481     print F $str;
2482     close F;
2483
2484     if (open F, "$prog $file $tmp |") {
2485       while (<F>) {
2486         s/\Q$tmp\E/$file.patched/;
2487         $diff .= $_;
2488       }
2489       close F;
2490       unlink $tmp;
2491       return $diff;
2492     }
2493
2494     unlink $tmp;
2495   }
2496   else {
2497     error("Cannot open '$tmp' for writing: $!");
2498   }
2499
2500   return undef;
2501 }
2502
2503 sub can_use
2504 {
2505   eval "use @_;";
2506   return $@ eq '';
2507 }
2508
2509 sub rec_depend
2510 {
2511   my $func = shift;
2512   my %seen;
2513   return () unless exists $depends{$func};
2514   grep !$seen{$_}++, map { ($_, rec_depend($_)) } @{$depends{$func}};
2515 }
2516
2517 sub parse_version
2518 {
2519   my $ver = shift;
2520
2521   if ($ver =~ /^(\d+)\.(\d+)\.(\d+)$/) {
2522     return ($1, $2, $3);
2523   }
2524   elsif ($ver !~ /^\d+\.[\d_]+$/) {
2525     die "cannot parse version '$ver'\n";
2526   }
2527
2528   $ver =~ s/_//g;
2529   $ver =~ s/$/000000/;
2530
2531   my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/;
2532
2533   $v = int $v;
2534   $s = int $s;
2535
2536   if ($r < 5 || ($r == 5 && $v < 6)) {
2537     if ($s % 10) {
2538       die "cannot parse version '$ver'\n";
2539     }
2540   }
2541
2542   return ($r, $v, $s);
2543 }
2544
2545 sub format_version
2546 {
2547   my $ver = shift;
2548
2549   $ver =~ s/$/000000/;
2550   my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/;
2551
2552   $v = int $v;
2553   $s = int $s;
2554
2555   if ($r < 5 || ($r == 5 && $v < 6)) {
2556     if ($s % 10) {
2557       die "invalid version '$ver'\n";
2558     }
2559     $s /= 10;
2560
2561     $ver = sprintf "%d.%03d", $r, $v;
2562     $s > 0 and $ver .= sprintf "_%02d", $s;
2563
2564     return $ver;
2565   }
2566
2567   return sprintf "%d.%d.%d", $r, $v, $s;
2568 }
2569
2570 sub info
2571 {
2572   $opt{quiet} and return;
2573   print @_, "\n";
2574 }
2575
2576 sub diag
2577 {
2578   $opt{quiet} and return;
2579   $opt{diag} and print @_, "\n";
2580 }
2581
2582 sub warning
2583 {
2584   $opt{quiet} and return;
2585   print "*** ", @_, "\n";
2586 }
2587
2588 sub error
2589 {
2590   print "*** ERROR: ", @_, "\n";
2591 }
2592
2593 my %given_hints;
2594 sub hint
2595 {
2596   $opt{quiet} and return;
2597   $opt{hints} or return;
2598   my $func = shift;
2599   exists $hints{$func} or return;
2600   $given_hints{$func}++ and return;
2601   my $hint = $hints{$func};
2602   $hint =~ s/^/   /mg;
2603   print "   --- hint for $func ---\n", $hint;
2604 }
2605
2606 sub usage
2607 {
2608   my($usage) = do { local(@ARGV,$/)=($0); <> } =~ /^=head\d$HS+SYNOPSIS\s*^(.*?)\s*^=/ms;
2609   my %M = ( 'I' => '*' );
2610   $usage =~ s/^\s*perl\s+\S+/$^X $0/;
2611   $usage =~ s/([A-Z])<([^>]+)>/$M{$1}$2$M{$1}/g;
2612
2613   print <<ENDUSAGE;
2614
2615 Usage: $usage
2616
2617 See perldoc $0 for details.
2618
2619 ENDUSAGE
2620
2621   exit 2;
2622 }
2623
2624 __DATA__
2625 */
2626
2627 #ifndef _P_P_PORTABILITY_H_
2628 #define _P_P_PORTABILITY_H_
2629
2630 #ifndef DPPP_NAMESPACE
2631 #  define DPPP_NAMESPACE DPPP_
2632 #endif
2633
2634 #define DPPP_CAT2(x,y) CAT2(x,y)
2635 #define DPPP_(name) DPPP_CAT2(DPPP_NAMESPACE, name)
2636
2637 #ifndef PERL_REVISION
2638 #  if !defined(__PATCHLEVEL_H_INCLUDED__) && !(defined(PATCHLEVEL) && defined(SUBVERSION))
2639 #    define PERL_PATCHLEVEL_H_IMPLICIT
2640 #    include <patchlevel.h>
2641 #  endif
2642 #  if !(defined(PERL_VERSION) || (defined(SUBVERSION) && defined(PATCHLEVEL)))
2643 #    include <could_not_find_Perl_patchlevel.h>
2644 #  endif
2645 #  ifndef PERL_REVISION
2646 #    define PERL_REVISION       (5)
2647      /* Replace: 1 */
2648 #    define PERL_VERSION        PATCHLEVEL
2649 #    define PERL_SUBVERSION     SUBVERSION
2650      /* Replace PERL_PATCHLEVEL with PERL_VERSION */
2651      /* Replace: 0 */
2652 #  endif
2653 #endif
2654
2655 #define PERL_BCDVERSION ((PERL_REVISION * 0x1000000L) + (PERL_VERSION * 0x1000L) + PERL_SUBVERSION)
2656
2657 /* It is very unlikely that anyone will try to use this with Perl 6
2658    (or greater), but who knows.
2659  */
2660 #if PERL_REVISION != 5
2661 #  error ppport.h only works with Perl version 5
2662 #endif /* PERL_REVISION != 5 */
2663
2664 #ifdef I_LIMITS
2665 #  include <limits.h>
2666 #endif
2667
2668 #ifndef PERL_UCHAR_MIN
2669 #  define PERL_UCHAR_MIN ((unsigned char)0)
2670 #endif
2671
2672 #ifndef PERL_UCHAR_MAX
2673 #  ifdef UCHAR_MAX
2674 #    define PERL_UCHAR_MAX ((unsigned char)UCHAR_MAX)
2675 #  else
2676 #    ifdef MAXUCHAR
2677 #      define PERL_UCHAR_MAX ((unsigned char)MAXUCHAR)
2678 #    else
2679 #      define PERL_UCHAR_MAX ((unsigned char)~(unsigned)0)
2680 #    endif
2681 #  endif
2682 #endif
2683
2684 #ifndef PERL_USHORT_MIN
2685 #  define PERL_USHORT_MIN ((unsigned short)0)
2686 #endif
2687
2688 #ifndef PERL_USHORT_MAX
2689 #  ifdef USHORT_MAX
2690 #    define PERL_USHORT_MAX ((unsigned short)USHORT_MAX)
2691 #  else
2692 #    ifdef MAXUSHORT
2693 #      define PERL_USHORT_MAX ((unsigned short)MAXUSHORT)
2694 #    else
2695 #      ifdef USHRT_MAX
2696 #        define PERL_USHORT_MAX ((unsigned short)USHRT_MAX)
2697 #      else
2698 #        define PERL_USHORT_MAX ((unsigned short)~(unsigned)0)
2699 #      endif
2700 #    endif
2701 #  endif
2702 #endif
2703
2704 #ifndef PERL_SHORT_MAX
2705 #  ifdef SHORT_MAX
2706 #    define PERL_SHORT_MAX ((short)SHORT_MAX)
2707 #  else
2708 #    ifdef MAXSHORT    /* Often used in <values.h> */
2709 #      define PERL_SHORT_MAX ((short)MAXSHORT)
2710 #    else
2711 #      ifdef SHRT_MAX
2712 #        define PERL_SHORT_MAX ((short)SHRT_MAX)
2713 #      else
2714 #        define PERL_SHORT_MAX ((short) (PERL_USHORT_MAX >> 1))
2715 #      endif
2716 #    endif
2717 #  endif
2718 #endif
2719
2720 #ifndef PERL_SHORT_MIN
2721 #  ifdef SHORT_MIN
2722 #    define PERL_SHORT_MIN ((short)SHORT_MIN)
2723 #  else
2724 #    ifdef MINSHORT
2725 #      define PERL_SHORT_MIN ((short)MINSHORT)
2726 #    else
2727 #      ifdef SHRT_MIN
2728 #        define PERL_SHORT_MIN ((short)SHRT_MIN)
2729 #      else
2730 #        define PERL_SHORT_MIN (-PERL_SHORT_MAX - ((3 & -1) == 3))
2731 #      endif
2732 #    endif
2733 #  endif
2734 #endif
2735
2736 #ifndef PERL_UINT_MAX
2737 #  ifdef UINT_MAX
2738 #    define PERL_UINT_MAX ((unsigned int)UINT_MAX)
2739 #  else
2740 #    ifdef MAXUINT
2741 #      define PERL_UINT_MAX ((unsigned int)MAXUINT)
2742 #    else
2743 #      define PERL_UINT_MAX (~(unsigned int)0)
2744 #    endif
2745 #  endif
2746 #endif
2747
2748 #ifndef PERL_UINT_MIN
2749 #  define PERL_UINT_MIN ((unsigned int)0)
2750 #endif
2751
2752 #ifndef PERL_INT_MAX
2753 #  ifdef INT_MAX
2754 #    define PERL_INT_MAX ((int)INT_MAX)
2755 #  else
2756 #    ifdef MAXINT    /* Often used in <values.h> */
2757 #      define PERL_INT_MAX ((int)MAXINT)
2758 #    else
2759 #      define PERL_INT_MAX ((int)(PERL_UINT_MAX >> 1))
2760 #    endif
2761 #  endif
2762 #endif
2763
2764 #ifndef PERL_INT_MIN
2765 #  ifdef INT_MIN
2766 #    define PERL_INT_MIN ((int)INT_MIN)
2767 #  else
2768 #    ifdef MININT
2769 #      define PERL_INT_MIN ((int)MININT)
2770 #    else
2771 #      define PERL_INT_MIN (-PERL_INT_MAX - ((3 & -1) == 3))
2772 #    endif
2773 #  endif
2774 #endif
2775
2776 #ifndef PERL_ULONG_MAX
2777 #  ifdef ULONG_MAX
2778 #    define PERL_ULONG_MAX ((unsigned long)ULONG_MAX)
2779 #  else
2780 #    ifdef MAXULONG
2781 #      define PERL_ULONG_MAX ((unsigned long)MAXULONG)
2782 #    else
2783 #      define PERL_ULONG_MAX (~(unsigned long)0)
2784 #    endif
2785 #  endif
2786 #endif
2787
2788 #ifndef PERL_ULONG_MIN
2789 #  define PERL_ULONG_MIN ((unsigned long)0L)
2790 #endif
2791
2792 #ifndef PERL_LONG_MAX
2793 #  ifdef LONG_MAX
2794 #    define PERL_LONG_MAX ((long)LONG_MAX)
2795 #  else
2796 #    ifdef MAXLONG
2797 #      define PERL_LONG_MAX ((long)MAXLONG)
2798 #    else
2799 #      define PERL_LONG_MAX ((long) (PERL_ULONG_MAX >> 1))
2800 #    endif
2801 #  endif
2802 #endif
2803
2804 #ifndef PERL_LONG_MIN
2805 #  ifdef LONG_MIN
2806 #    define PERL_LONG_MIN ((long)LONG_MIN)
2807 #  else
2808 #    ifdef MINLONG
2809 #      define PERL_LONG_MIN ((long)MINLONG)
2810 #    else
2811 #      define PERL_LONG_MIN (-PERL_LONG_MAX - ((3 & -1) == 3))
2812 #    endif
2813 #  endif
2814 #endif
2815
2816 #if defined(HAS_QUAD) && (defined(convex) || defined(uts))
2817 #  ifndef PERL_UQUAD_MAX
2818 #    ifdef ULONGLONG_MAX
2819 #      define PERL_UQUAD_MAX ((unsigned long long)ULONGLONG_MAX)
2820 #    else
2821 #      ifdef MAXULONGLONG
2822 #        define PERL_UQUAD_MAX ((unsigned long long)MAXULONGLONG)
2823 #      else
2824 #        define PERL_UQUAD_MAX (~(unsigned long long)0)
2825 #      endif
2826 #    endif
2827 #  endif
2828
2829 #  ifndef PERL_UQUAD_MIN
2830 #    define PERL_UQUAD_MIN ((unsigned long long)0L)
2831 #  endif
2832
2833 #  ifndef PERL_QUAD_MAX
2834 #    ifdef LONGLONG_MAX
2835 #      define PERL_QUAD_MAX ((long long)LONGLONG_MAX)
2836 #    else
2837 #      ifdef MAXLONGLONG
2838 #        define PERL_QUAD_MAX ((long long)MAXLONGLONG)
2839 #      else
2840 #        define PERL_QUAD_MAX ((long long) (PERL_UQUAD_MAX >> 1))
2841 #      endif
2842 #    endif
2843 #  endif
2844
2845 #  ifndef PERL_QUAD_MIN
2846 #    ifdef LONGLONG_MIN
2847 #      define PERL_QUAD_MIN ((long long)LONGLONG_MIN)
2848 #    else
2849 #      ifdef MINLONGLONG
2850 #        define PERL_QUAD_MIN ((long long)MINLONGLONG)
2851 #      else
2852 #        define PERL_QUAD_MIN (-PERL_QUAD_MAX - ((3 & -1) == 3))
2853 #      endif
2854 #    endif
2855 #  endif
2856 #endif
2857
2858 /* This is based on code from 5.003 perl.h */
2859 #ifdef HAS_QUAD
2860 #  ifdef cray
2861 #ifndef IVTYPE
2862 #  define IVTYPE                         int
2863 #endif
2864
2865 #ifndef IV_MIN
2866 #  define IV_MIN                         PERL_INT_MIN
2867 #endif
2868
2869 #ifndef IV_MAX
2870 #  define IV_MAX                         PERL_INT_MAX
2871 #endif
2872
2873 #ifndef UV_MIN
2874 #  define UV_MIN                         PERL_UINT_MIN
2875 #endif
2876
2877 #ifndef UV_MAX
2878 #  define UV_MAX                         PERL_UINT_MAX
2879 #endif
2880
2881 #    ifdef INTSIZE
2882 #ifndef IVSIZE
2883 #  define IVSIZE                         INTSIZE
2884 #endif
2885
2886 #    endif
2887 #  else
2888 #    if defined(convex) || defined(uts)
2889 #ifndef IVTYPE
2890 #  define IVTYPE                         long long
2891 #endif
2892
2893 #ifndef IV_MIN
2894 #  define IV_MIN                         PERL_QUAD_MIN
2895 #endif
2896
2897 #ifndef IV_MAX
2898 #  define IV_MAX                         PERL_QUAD_MAX
2899 #endif
2900
2901 #ifndef UV_MIN
2902 #  define UV_MIN                         PERL_UQUAD_MIN
2903 #endif
2904
2905 #ifndef UV_MAX
2906 #  define UV_MAX                         PERL_UQUAD_MAX
2907 #endif
2908
2909 #      ifdef LONGLONGSIZE
2910 #ifndef IVSIZE
2911 #  define IVSIZE                         LONGLONGSIZE
2912 #endif
2913
2914 #      endif
2915 #    else
2916 #ifndef IVTYPE
2917 #  define IVTYPE                         long
2918 #endif
2919
2920 #ifndef IV_MIN
2921 #  define IV_MIN                         PERL_LONG_MIN
2922 #endif
2923
2924 #ifndef IV_MAX
2925 #  define IV_MAX                         PERL_LONG_MAX
2926 #endif
2927
2928 #ifndef UV_MIN
2929 #  define UV_MIN                         PERL_ULONG_MIN
2930 #endif
2931
2932 #ifndef UV_MAX
2933 #  define UV_MAX                         PERL_ULONG_MAX
2934 #endif
2935
2936 #      ifdef LONGSIZE
2937 #ifndef IVSIZE
2938 #  define IVSIZE                         LONGSIZE
2939 #endif
2940
2941 #      endif
2942 #    endif
2943 #  endif
2944 #ifndef IVSIZE
2945 #  define IVSIZE                         8
2946 #endif
2947
2948 #ifndef PERL_QUAD_MIN
2949 #  define PERL_QUAD_MIN                  IV_MIN
2950 #endif
2951
2952 #ifndef PERL_QUAD_MAX
2953 #  define PERL_QUAD_MAX                  IV_MAX
2954 #endif
2955
2956 #ifndef PERL_UQUAD_MIN
2957 #  define PERL_UQUAD_MIN                 UV_MIN
2958 #endif
2959
2960 #ifndef PERL_UQUAD_MAX
2961 #  define PERL_UQUAD_MAX                 UV_MAX
2962 #endif
2963
2964 #else
2965 #ifndef IVTYPE
2966 #  define IVTYPE                         long
2967 #endif
2968
2969 #ifndef IV_MIN
2970 #  define IV_MIN                         PERL_LONG_MIN
2971 #endif
2972
2973 #ifndef IV_MAX
2974 #  define IV_MAX                         PERL_LONG_MAX
2975 #endif
2976
2977 #ifndef UV_MIN
2978 #  define UV_MIN                         PERL_ULONG_MIN
2979 #endif
2980
2981 #ifndef UV_MAX
2982 #  define UV_MAX                         PERL_ULONG_MAX
2983 #endif
2984
2985 #endif
2986
2987 #ifndef IVSIZE
2988 #  ifdef LONGSIZE
2989 #    define IVSIZE LONGSIZE
2990 #  else
2991 #    define IVSIZE 4 /* A bold guess, but the best we can make. */
2992 #  endif
2993 #endif
2994 #ifndef UVTYPE
2995 #  define UVTYPE                         unsigned IVTYPE
2996 #endif
2997
2998 #ifndef UVSIZE
2999 #  define UVSIZE                         IVSIZE
3000 #endif
3001
3002 #ifndef sv_setuv
3003 #  define sv_setuv(sv, uv)                  \
3004    STMT_START {                             \
3005        UV TeMpUv = uv;                      \
3006        if (TeMpUv <= IV_MAX)                \
3007            sv_setiv(sv, TeMpUv);            \
3008        else                                 \
3009            sv_setnv(sv, (double)TeMpUv);    \
3010    } STMT_END
3011 #endif
3012
3013 #ifndef newSVuv
3014 #  define newSVuv(uv) ((uv) <= IV_MAX ? newSViv((IV)uv) : newSVnv((NV)uv))
3015 #endif
3016 #ifndef sv_2uv
3017 #  define sv_2uv(sv)                     ((PL_Sv = (sv)), (UV) (SvNOK(PL_Sv) ? SvNV(PL_Sv) : sv_2nv(PL_Sv)))
3018 #endif
3019
3020 #ifndef SvUVX
3021 #  define SvUVX(sv)                      ((UV)SvIVX(sv))
3022 #endif
3023
3024 #ifndef SvUVXx
3025 #  define SvUVXx(sv)                     SvUVX(sv)
3026 #endif
3027
3028 #ifndef SvUV
3029 #  define SvUV(sv)                       (SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv))
3030 #endif
3031
3032 #ifndef SvUVx
3033 #  define SvUVx(sv)                      ((PL_Sv = (sv)), SvUV(PL_Sv))
3034 #endif
3035
3036 /* Hint: sv_uv
3037  * Always use the SvUVx() macro instead of sv_uv().
3038  */
3039 #ifndef sv_uv
3040 #  define sv_uv(sv)                      SvUVx(sv)
3041 #endif
3042 #ifndef XST_mUV
3043 #  define XST_mUV(i,v)                   (ST(i) = sv_2mortal(newSVuv(v))  )
3044 #endif
3045
3046 #ifndef XSRETURN_UV
3047 #  define XSRETURN_UV(v)                 STMT_START { XST_mUV(0,v);  XSRETURN(1); } STMT_END
3048 #endif
3049 #ifndef PUSHu
3050 #  define PUSHu(u)                       STMT_START { sv_setuv(TARG, (UV)(u)); PUSHTARG;  } STMT_END
3051 #endif
3052
3053 #ifndef XPUSHu
3054 #  define XPUSHu(u)                      STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG; } STMT_END
3055 #endif
3056
3057 #if (PERL_VERSION < 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION <= 5))
3058 /* Replace: 1 */
3059 #  define PL_DBsingle               DBsingle
3060 #  define PL_DBsub                  DBsub
3061 #  define PL_Sv                     Sv
3062 #  define PL_compiling              compiling
3063 #  define PL_copline                copline
3064 #  define PL_curcop                 curcop
3065 #  define PL_curstash               curstash
3066 #  define PL_debstash               debstash
3067 #  define PL_defgv                  defgv
3068 #  define PL_diehook                diehook
3069 #  define PL_dirty                  dirty
3070 #  define PL_dowarn                 dowarn
3071 #  define PL_errgv                  errgv
3072 #  define PL_hexdigit               hexdigit
3073 #  define PL_hints                  hints
3074 #  define PL_na                     na
3075 #  define PL_no_modify              no_modify
3076 #  define PL_perl_destruct_level    perl_destruct_level
3077 #  define PL_perldb                 perldb
3078 #  define PL_ppaddr                 ppaddr
3079 #  define PL_rsfp_filters           rsfp_filters
3080 #  define PL_rsfp                   rsfp
3081 #  define PL_stack_base             stack_base
3082 #  define PL_stack_sp               stack_sp
3083 #  define PL_stdingv                stdingv
3084 #  define PL_sv_arenaroot           sv_arenaroot
3085 #  define PL_sv_no                  sv_no
3086 #  define PL_sv_undef               sv_undef
3087 #  define PL_sv_yes                 sv_yes
3088 #  define PL_tainted                tainted
3089 #  define PL_tainting               tainting
3090 /* Replace: 0 */
3091 #endif
3092
3093 #ifndef PERL_UNUSED_DECL
3094 #  ifdef HASATTRIBUTE
3095 #    if (defined(__GNUC__) && defined(__cplusplus)) || defined(__INTEL_COMPILER)
3096 #      define PERL_UNUSED_DECL
3097 #    else
3098 #      define PERL_UNUSED_DECL __attribute__((unused))
3099 #    endif
3100 #  else
3101 #    define PERL_UNUSED_DECL
3102 #  endif
3103 #endif
3104 #ifndef NOOP
3105 #  define NOOP                           (void)0
3106 #endif
3107
3108 #ifndef dNOOP
3109 #  define dNOOP                          extern int Perl___notused PERL_UNUSED_DECL
3110 #endif
3111
3112 #ifndef NVTYPE
3113 #  if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE)
3114 #    define NVTYPE long double
3115 #  else
3116 #    define NVTYPE double
3117 #  endif
3118 typedef NVTYPE NV;
3119 #endif
3120
3121 #ifndef INT2PTR
3122
3123 #  if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE)
3124 #    define PTRV                  UV
3125 #    define INT2PTR(any,d)        (any)(d)
3126 #  else
3127 #    if PTRSIZE == LONGSIZE
3128 #      define PTRV                unsigned long
3129 #    else
3130 #      define PTRV                unsigned
3131 #    endif
3132 #    define INT2PTR(any,d)        (any)(PTRV)(d)
3133 #  endif
3134
3135 #  define NUM2PTR(any,d)  (any)(PTRV)(d)
3136 #  define PTR2IV(p)       INT2PTR(IV,p)
3137 #  define PTR2UV(p)       INT2PTR(UV,p)
3138 #  define PTR2NV(p)       NUM2PTR(NV,p)
3139
3140 #  if PTRSIZE == LONGSIZE
3141 #    define PTR2ul(p)     (unsigned long)(p)
3142 #  else
3143 #    define PTR2ul(p)     INT2PTR(unsigned long,p)
3144 #  endif
3145
3146 #endif /* !INT2PTR */
3147
3148 #undef START_EXTERN_C
3149 #undef END_EXTERN_C
3150 #undef EXTERN_C
3151 #ifdef __cplusplus
3152 #  define START_EXTERN_C extern "C" {
3153 #  define END_EXTERN_C }
3154 #  define EXTERN_C extern "C"
3155 #else
3156 #  define START_EXTERN_C
3157 #  define END_EXTERN_C
3158 #  define EXTERN_C extern
3159 #endif
3160
3161 #ifndef PERL_GCC_BRACE_GROUPS_FORBIDDEN
3162 #  if defined(__STRICT_ANSI__) && defined(PERL_GCC_PEDANTIC)
3163 #    define PERL_GCC_BRACE_GROUPS_FORBIDDEN
3164 #  endif
3165 #endif
3166
3167 #undef STMT_START
3168 #undef STMT_END
3169 #if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) && !defined(__cplusplus)
3170 #  define STMT_START    (void)( /* gcc supports ``({ STATEMENTS; })'' */
3171 #  define STMT_END      )
3172 #else
3173 #  if defined(VOIDFLAGS) && (VOIDFLAGS) && (defined(sun) || defined(__sun__)) && !defined(__GNUC__)
3174 #    define STMT_START  if (1)
3175 #    define STMT_END    else (void)0
3176 #  else
3177 #    define STMT_START  do
3178 #    define STMT_END    while (0)
3179 #  endif
3180 #endif
3181 #ifndef boolSV
3182 #  define boolSV(b)                      ((b) ? &PL_sv_yes : &PL_sv_no)
3183 #endif
3184
3185 /* DEFSV appears first in 5.004_56 */
3186 #ifndef DEFSV
3187 #  define DEFSV                          GvSV(PL_defgv)
3188 #endif
3189
3190 #ifndef SAVE_DEFSV
3191 #  define SAVE_DEFSV                     SAVESPTR(GvSV(PL_defgv))
3192 #endif
3193
3194 /* Older perls (<=5.003) lack AvFILLp */
3195 #ifndef AvFILLp
3196 #  define AvFILLp                        AvFILL
3197 #endif
3198 #ifndef ERRSV
3199 #  define ERRSV                          get_sv("@",FALSE)
3200 #endif
3201 #ifndef newSVpvn
3202 #  define newSVpvn(data,len)             ((data)                                              \
3203                                     ? ((len) ? newSVpv((data), (len)) : newSVpv("", 0)) \
3204                                     : newSV(0))
3205 #endif
3206
3207 /* Hint: gv_stashpvn
3208  * This function's backport doesn't support the length parameter, but
3209  * rather ignores it. Portability can only be ensured if the length
3210  * parameter is used for speed reasons, but the length can always be
3211  * correctly computed from the string argument.
3212  */
3213 #ifndef gv_stashpvn
3214 #  define gv_stashpvn(str,len,create)    gv_stashpv(str,create)
3215 #endif
3216
3217 /* Replace: 1 */
3218 #ifndef get_cv
3219 #  define get_cv                         perl_get_cv
3220 #endif
3221
3222 #ifndef get_sv
3223 #  define get_sv                         perl_get_sv
3224 #endif
3225
3226 #ifndef get_av
3227 #  define get_av                         perl_get_av
3228 #endif
3229
3230 #ifndef get_hv
3231 #  define get_hv                         perl_get_hv
3232 #endif
3233
3234 /* Replace: 0 */
3235
3236 #ifdef HAS_MEMCMP
3237 #ifndef memNE
3238 #  define memNE(s1,s2,l)                 (memcmp(s1,s2,l))
3239 #endif
3240
3241 #ifndef memEQ
3242 #  define memEQ(s1,s2,l)                 (!memcmp(s1,s2,l))
3243 #endif
3244
3245 #else
3246 #ifndef memNE
3247 #  define memNE(s1,s2,l)                 (bcmp(s1,s2,l))
3248 #endif
3249
3250 #ifndef memEQ
3251 #  define memEQ(s1,s2,l)                 (!bcmp(s1,s2,l))
3252 #endif
3253
3254 #endif
3255 #ifndef MoveD
3256 #  define MoveD(s,d,n,t)                 memmove((char*)(d),(char*)(s), (n) * sizeof(t))
3257 #endif
3258
3259 #ifndef CopyD
3260 #  define CopyD(s,d,n,t)                 memcpy((char*)(d),(char*)(s), (n) * sizeof(t))
3261 #endif
3262
3263 #ifdef HAS_MEMSET
3264 #ifndef ZeroD
3265 #  define ZeroD(d,n,t)                   memzero((char*)(d), (n) * sizeof(t))
3266 #endif
3267
3268 #else
3269 #ifndef ZeroD
3270 #  define ZeroD(d,n,t)                   ((void)memzero((char*)(d), (n) * sizeof(t)),d)
3271 #endif
3272
3273 #endif
3274 #ifndef Poison
3275 #  define Poison(d,n,t)                  (void)memset((char*)(d), 0xAB, (n) * sizeof(t))
3276 #endif
3277 #ifndef dUNDERBAR
3278 #  define dUNDERBAR                      dNOOP
3279 #endif
3280
3281 #ifndef UNDERBAR
3282 #  define UNDERBAR                       DEFSV
3283 #endif
3284 #ifndef dAX
3285 #  define dAX                            I32 ax = MARK - PL_stack_base + 1
3286 #endif
3287
3288 #ifndef dITEMS
3289 #  define dITEMS                         I32 items = SP - MARK
3290 #endif
3291 #ifndef dXSTARG
3292 #  define dXSTARG                        SV * targ = sv_newmortal()
3293 #endif
3294 #ifndef dTHR
3295 #  define dTHR                           dNOOP
3296 #endif
3297 #ifndef dTHX
3298 #  define dTHX                           dNOOP
3299 #endif
3300
3301 #ifndef dTHXa
3302 #  define dTHXa(x)                       dNOOP
3303 #endif
3304 #ifndef pTHX
3305 #  define pTHX                           void
3306 #endif
3307
3308 #ifndef pTHX_
3309 #  define pTHX_
3310 #endif
3311
3312 #ifndef aTHX
3313 #  define aTHX
3314 #endif
3315
3316 #ifndef aTHX_
3317 #  define aTHX_
3318 #endif
3319 #ifndef dTHXoa
3320 #  define dTHXoa(x)                      dTHXa(x)
3321 #endif
3322 #ifndef PUSHmortal
3323 #  define PUSHmortal                     PUSHs(sv_newmortal())
3324 #endif
3325
3326 #ifndef mPUSHp
3327 #  define mPUSHp(p,l)                    sv_setpvn_mg(PUSHmortal, (p), (l))
3328 #endif
3329
3330 #ifndef mPUSHn
3331 #  define mPUSHn(n)                      sv_setnv_mg(PUSHmortal, (NV)(n))
3332 #endif
3333
3334 #ifndef mPUSHi
3335 #  define mPUSHi(i)                      sv_setiv_mg(PUSHmortal, (IV)(i))
3336 #endif
3337
3338 #ifndef mPUSHu
3339 #  define mPUSHu(u)                      sv_setuv_mg(PUSHmortal, (UV)(u))
3340 #endif
3341 #ifndef XPUSHmortal
3342 #  define XPUSHmortal                    XPUSHs(sv_newmortal())
3343 #endif
3344
3345 #ifndef mXPUSHp
3346 #  define mXPUSHp(p,l)                   STMT_START { EXTEND(sp,1); sv_setpvn_mg(PUSHmortal, (p), (l)); } STMT_END
3347 #endif
3348
3349 #ifndef mXPUSHn
3350 #  define mXPUSHn(n)                     STMT_START { EXTEND(sp,1); sv_setnv_mg(PUSHmortal, (NV)(n)); } STMT_END
3351 #endif
3352
3353 #ifndef mXPUSHi
3354 #  define mXPUSHi(i)                     STMT_START { EXTEND(sp,1); sv_setiv_mg(PUSHmortal, (IV)(i)); } STMT_END
3355 #endif
3356
3357 #ifndef mXPUSHu
3358 #  define mXPUSHu(u)                     STMT_START { EXTEND(sp,1); sv_setuv_mg(PUSHmortal, (UV)(u)); } STMT_END
3359 #endif
3360
3361 /* Replace: 1 */
3362 #ifndef call_sv
3363 #  define call_sv                        perl_call_sv
3364 #endif
3365
3366 #ifndef call_pv
3367 #  define call_pv                        perl_call_pv
3368 #endif
3369
3370 #ifndef call_argv
3371 #  define call_argv                      perl_call_argv
3372 #endif
3373
3374 #ifndef call_method
3375 #  define call_method                    perl_call_method
3376 #endif
3377 #ifndef eval_sv
3378 #  define eval_sv                        perl_eval_sv
3379 #endif
3380
3381 /* Replace: 0 */
3382
3383 /* Replace perl_eval_pv with eval_pv */
3384 /* eval_pv depends on eval_sv */
3385
3386 #ifndef eval_pv
3387 #if defined(NEED_eval_pv)
3388 static SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error);
3389 static
3390 #else
3391 extern SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error);
3392 #endif
3393
3394 #ifdef eval_pv
3395 #  undef eval_pv
3396 #endif
3397 #define eval_pv(a,b) DPPP_(my_eval_pv)(aTHX_ a,b)
3398 #define Perl_eval_pv DPPP_(my_eval_pv)
3399
3400 #if defined(NEED_eval_pv) || defined(NEED_eval_pv_GLOBAL)
3401
3402 SV*
3403 DPPP_(my_eval_pv)(char *p, I32 croak_on_error)
3404 {
3405     dSP;
3406     SV* sv = newSVpv(p, 0);
3407
3408     PUSHMARK(sp);
3409     eval_sv(sv, G_SCALAR);
3410     SvREFCNT_dec(sv);
3411
3412     SPAGAIN;
3413     sv = POPs;
3414     PUTBACK;
3415
3416     if (croak_on_error && SvTRUE(GvSV(errgv)))
3417         croak(SvPVx(GvSV(errgv), na));
3418
3419     return sv;
3420 }
3421
3422 #endif
3423 #endif
3424 #ifndef newRV_inc
3425 #  define newRV_inc(sv)                  newRV(sv)   /* Replace */
3426 #endif
3427
3428 #ifndef newRV_noinc
3429 #if defined(NEED_newRV_noinc)
3430 static SV * DPPP_(my_newRV_noinc)(SV *sv);
3431 static
3432 #else
3433 extern SV * DPPP_(my_newRV_noinc)(SV *sv);
3434 #endif
3435
3436 #ifdef newRV_noinc
3437 #  undef newRV_noinc
3438 #endif
3439 #define newRV_noinc(a) DPPP_(my_newRV_noinc)(aTHX_ a)
3440 #define Perl_newRV_noinc DPPP_(my_newRV_noinc)
3441
3442 #if defined(NEED_newRV_noinc) || defined(NEED_newRV_noinc_GLOBAL)
3443 SV *
3444 DPPP_(my_newRV_noinc)(SV *sv)
3445 {
3446   SV *rv = (SV *)newRV(sv);
3447   SvREFCNT_dec(sv);
3448   return rv;
3449 }
3450 #endif
3451 #endif
3452
3453 /* Hint: newCONSTSUB
3454  * Returns a CV* as of perl-5.7.1. This return value is not supported
3455  * by Devel::PPPort.
3456  */
3457
3458 /* newCONSTSUB from IO.xs is in the core starting with 5.004_63 */
3459 #if ((PERL_VERSION < 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION < 63))) && ((PERL_VERSION != 4) || (PERL_SUBVERSION != 5))
3460 #if defined(NEED_newCONSTSUB)
3461 static void DPPP_(my_newCONSTSUB)(HV *stash, char *name, SV *sv);
3462 static
3463 #else
3464 extern void DPPP_(my_newCONSTSUB)(HV *stash, char *name, SV *sv);
3465 #endif
3466
3467 #ifdef newCONSTSUB
3468 #  undef newCONSTSUB
3469 #endif
3470 #define newCONSTSUB(a,b,c) DPPP_(my_newCONSTSUB)(aTHX_ a,b,c)
3471 #define Perl_newCONSTSUB DPPP_(my_newCONSTSUB)
3472
3473 #if defined(NEED_newCONSTSUB) || defined(NEED_newCONSTSUB_GLOBAL)
3474
3475 void
3476 DPPP_(my_newCONSTSUB)(HV *stash, char *name, SV *sv)
3477 {
3478         U32 oldhints = PL_hints;
3479         HV *old_cop_stash = PL_curcop->cop_stash;
3480         HV *old_curstash = PL_curstash;
3481         line_t oldline = PL_curcop->cop_line;
3482         PL_curcop->cop_line = PL_copline;
3483
3484         PL_hints &= ~HINT_BLOCK_SCOPE;
3485         if (stash)
3486                 PL_curstash = PL_curcop->cop_stash = stash;
3487
3488         newSUB(
3489
3490 #if   ((PERL_VERSION < 3) || ((PERL_VERSION == 3) && (PERL_SUBVERSION < 22)))
3491                 start_subparse(),
3492 #elif ((PERL_VERSION == 3) && (PERL_SUBVERSION == 22))
3493                 start_subparse(0),
3494 #else  /* 5.003_23  onwards */
3495                 start_subparse(FALSE, 0),
3496 #endif
3497
3498                 newSVOP(OP_CONST, 0, newSVpv(name,0)),
3499                 newSVOP(OP_CONST, 0, &PL_sv_no),   /* SvPV(&PL_sv_no) == "" -- GMB */
3500                 newSTATEOP(0, Nullch, newSVOP(OP_CONST, 0, sv))
3501         );
3502
3503         PL_hints = oldhints;
3504         PL_curcop->cop_stash = old_cop_stash;
3505         PL_curstash = old_curstash;
3506         PL_curcop->cop_line = oldline;
3507 }
3508 #endif
3509 #endif
3510
3511 /*
3512  * Boilerplate macros for initializing and accessing interpreter-local
3513  * data from C.  All statics in extensions should be reworked to use
3514  * this, if you want to make the extension thread-safe.  See ext/re/re.xs
3515  * for an example of the use of these macros.
3516  *
3517  * Code that uses these macros is responsible for the following:
3518  * 1. #define MY_CXT_KEY to a unique string, e.g. "DynaLoader_guts"
3519  * 2. Declare a typedef named my_cxt_t that is a structure that contains
3520  *    all the data that needs to be interpreter-local.
3521  * 3. Use the START_MY_CXT macro after the declaration of my_cxt_t.
3522  * 4. Use the MY_CXT_INIT macro such that it is called exactly once
3523  *    (typically put in the BOOT: section).
3524  * 5. Use the members of the my_cxt_t structure everywhere as
3525  *    MY_CXT.member.
3526  * 6. Use the dMY_CXT macro (a declaration) in all the functions that
3527  *    access MY_CXT.
3528  */
3529
3530 #if defined(MULTIPLICITY) || defined(PERL_OBJECT) || \
3531     defined(PERL_CAPI)    || defined(PERL_IMPLICIT_CONTEXT)
3532
3533 #ifndef START_MY_CXT
3534
3535 /* This must appear in all extensions that define a my_cxt_t structure,
3536  * right after the definition (i.e. at file scope).  The non-threads
3537  * case below uses it to declare the data as static. */
3538 #define START_MY_CXT
3539
3540 #if (PERL_VERSION < 4 || (PERL_VERSION == 4 && PERL_SUBVERSION < 68 ))
3541 /* Fetches the SV that keeps the per-interpreter data. */
3542 #define dMY_CXT_SV \
3543         SV *my_cxt_sv = get_sv(MY_CXT_KEY, FALSE)
3544 #else /* >= perl5.004_68 */
3545 #define dMY_CXT_SV \
3546         SV *my_cxt_sv = *hv_fetch(PL_modglobal, MY_CXT_KEY,             \
3547                                   sizeof(MY_CXT_KEY)-1, TRUE)
3548 #endif /* < perl5.004_68 */
3549
3550 /* This declaration should be used within all functions that use the
3551  * interpreter-local data. */
3552 #define dMY_CXT \
3553         dMY_CXT_SV;                                                     \
3554         my_cxt_t *my_cxtp = INT2PTR(my_cxt_t*,SvUV(my_cxt_sv))
3555
3556 /* Creates and zeroes the per-interpreter data.
3557  * (We allocate my_cxtp in a Perl SV so that it will be released when
3558  * the interpreter goes away.) */
3559 #define MY_CXT_INIT \
3560         dMY_CXT_SV;                                                     \
3561         /* newSV() allocates one more than needed */                    \
3562         my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\
3563         Zero(my_cxtp, 1, my_cxt_t);                                     \
3564         sv_setuv(my_cxt_sv, PTR2UV(my_cxtp))
3565
3566 /* This macro must be used to access members of the my_cxt_t structure.
3567  * e.g. MYCXT.some_data */
3568 #define MY_CXT          (*my_cxtp)
3569
3570 /* Judicious use of these macros can reduce the number of times dMY_CXT
3571  * is used.  Use is similar to pTHX, aTHX etc. */
3572 #define pMY_CXT         my_cxt_t *my_cxtp
3573 #define pMY_CXT_        pMY_CXT,
3574 #define _pMY_CXT        ,pMY_CXT
3575 #define aMY_CXT         my_cxtp
3576 #define aMY_CXT_        aMY_CXT,
3577 #define _aMY_CXT        ,aMY_CXT
3578
3579 #endif /* START_MY_CXT */
3580
3581 #ifndef MY_CXT_CLONE
3582 /* Clones the per-interpreter data. */
3583 #define MY_CXT_CLONE \
3584         dMY_CXT_SV;                                                     \
3585         my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\
3586         Copy(INT2PTR(my_cxt_t*, SvUV(my_cxt_sv)), my_cxtp, 1, my_cxt_t);\
3587         sv_setuv(my_cxt_sv, PTR2UV(my_cxtp))
3588 #endif
3589
3590 #else /* single interpreter */
3591
3592 #ifndef START_MY_CXT
3593
3594 #define START_MY_CXT    static my_cxt_t my_cxt;
3595 #define dMY_CXT_SV      dNOOP
3596 #define dMY_CXT         dNOOP
3597 #define MY_CXT_INIT     NOOP
3598 #define MY_CXT          my_cxt
3599
3600 #define pMY_CXT         void
3601 #define pMY_CXT_
3602 #define _pMY_CXT
3603 #define aMY_CXT
3604 #define aMY_CXT_
3605 #define _aMY_CXT
3606
3607 #endif /* START_MY_CXT */
3608
3609 #ifndef MY_CXT_CLONE
3610 #define MY_CXT_CLONE    NOOP
3611 #endif
3612
3613 #endif
3614
3615 #ifndef IVdf
3616 #  if IVSIZE == LONGSIZE
3617 #    define     IVdf      "ld"
3618 #    define     UVuf      "lu"
3619 #    define     UVof      "lo"
3620 #    define     UVxf      "lx"
3621 #    define     UVXf      "lX"
3622 #  else
3623 #    if IVSIZE == INTSIZE
3624 #      define   IVdf      "d"
3625 #      define   UVuf      "u"
3626 #      define   UVof      "o"
3627 #      define   UVxf      "x"
3628 #      define   UVXf      "X"
3629 #    endif
3630 #  endif
3631 #endif
3632
3633 #ifndef NVef
3634 #  if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) && \
3635       defined(PERL_PRIfldbl) /* Not very likely, but let's try anyway. */
3636 #    define NVef          PERL_PRIeldbl
3637 #    define NVff          PERL_PRIfldbl
3638 #    define NVgf          PERL_PRIgldbl
3639 #  else
3640 #    define NVef          "e"
3641 #    define NVff          "f"
3642 #    define NVgf          "g"
3643 #  endif
3644 #endif
3645
3646 #ifndef SvPV_nolen
3647
3648 #if defined(NEED_sv_2pv_nolen)
3649 static char * DPPP_(my_sv_2pv_nolen)(pTHX_ register SV *sv);
3650 static
3651 #else
3652 extern char * DPPP_(my_sv_2pv_nolen)(pTHX_ register SV *sv);
3653 #endif
3654
3655 #ifdef sv_2pv_nolen
3656 #  undef sv_2pv_nolen
3657 #endif
3658 #define sv_2pv_nolen(a) DPPP_(my_sv_2pv_nolen)(aTHX_ a)
3659 #define Perl_sv_2pv_nolen DPPP_(my_sv_2pv_nolen)
3660
3661 #if defined(NEED_sv_2pv_nolen) || defined(NEED_sv_2pv_nolen_GLOBAL)
3662
3663 char *
3664 DPPP_(my_sv_2pv_nolen)(pTHX_ register SV *sv)
3665 {
3666   STRLEN n_a;
3667   return sv_2pv(sv, &n_a);
3668 }
3669
3670 #endif
3671
3672 /* Hint: sv_2pv_nolen
3673  * Use the SvPV_nolen() macro instead of sv_2pv_nolen().
3674  */
3675
3676 /* SvPV_nolen depends on sv_2pv_nolen */
3677 #define SvPV_nolen(sv) \
3678           ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
3679            ? SvPVX(sv) : sv_2pv_nolen(sv))
3680
3681 #endif
3682
3683 #ifdef SvPVbyte
3684
3685 /* Hint: SvPVbyte
3686  * Does not work in perl-5.6.1, ppport.h implements a version
3687  * borrowed from perl-5.7.3.
3688  */
3689
3690 #if ((PERL_VERSION < 7) || ((PERL_VERSION == 7) && (PERL_SUBVERSION < 0)))
3691
3692 #if defined(NEED_sv_2pvbyte)
3693 static char * DPPP_(my_sv_2pvbyte)(pTHX_ register SV *sv, STRLEN *lp);
3694 static
3695 #else
3696 extern char * DPPP_(my_sv_2pvbyte)(pTHX_ register SV *sv, STRLEN *lp);
3697 #endif
3698
3699 #ifdef sv_2pvbyte
3700 #  undef sv_2pvbyte
3701 #endif
3702 #define sv_2pvbyte(a,b) DPPP_(my_sv_2pvbyte)(aTHX_ a,b)
3703 #define Perl_sv_2pvbyte DPPP_(my_sv_2pvbyte)
3704
3705 #if defined(NEED_sv_2pvbyte) || defined(NEED_sv_2pvbyte_GLOBAL)
3706
3707 char *
3708 DPPP_(my_sv_2pvbyte)(pTHX_ register SV *sv, STRLEN *lp)
3709 {
3710   sv_utf8_downgrade(sv,0);
3711   return SvPV(sv,*lp);
3712 }
3713
3714 #endif
3715
3716 /* Hint: sv_2pvbyte
3717  * Use the SvPVbyte() macro instead of sv_2pvbyte().
3718  */
3719
3720 #undef SvPVbyte
3721
3722 /* SvPVbyte depends on sv_2pvbyte */
3723 #define SvPVbyte(sv, lp)                                                \
3724         ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK)                \
3725          ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte(sv, &lp))
3726
3727 #endif
3728
3729 #else
3730
3731 #  define SvPVbyte          SvPV
3732 #  define sv_2pvbyte        sv_2pv
3733
3734 #endif
3735
3736 /* sv_2pvbyte_nolen depends on sv_2pv_nolen */
3737 #ifndef sv_2pvbyte_nolen
3738 #  define sv_2pvbyte_nolen               sv_2pv_nolen
3739 #endif
3740
3741 /* Hint: sv_pvn
3742  * Always use the SvPV() macro instead of sv_pvn().
3743  */
3744 #ifndef sv_pvn
3745 #  define sv_pvn(sv, len)                SvPV(sv, len)
3746 #endif
3747
3748 /* Hint: sv_pvn_force
3749  * Always use the SvPV_force() macro instead of sv_pvn_force().
3750  */
3751 #ifndef sv_pvn_force
3752 #  define sv_pvn_force(sv, len)          SvPV_force(sv, len)
3753 #endif
3754
3755 #if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(vnewSVpvf)
3756 #if defined(NEED_vnewSVpvf)
3757 static SV * DPPP_(my_vnewSVpvf)(pTHX_ const char * pat, va_list * args);
3758 static
3759 #else
3760 extern SV * DPPP_(my_vnewSVpvf)(pTHX_ const char * pat, va_list * args);
3761 #endif
3762
3763 #ifdef vnewSVpvf
3764 #  undef vnewSVpvf
3765 #endif
3766 #define vnewSVpvf(a,b) DPPP_(my_vnewSVpvf)(aTHX_ a,b)
3767 #define Perl_vnewSVpvf DPPP_(my_vnewSVpvf)
3768
3769 #if defined(NEED_vnewSVpvf) || defined(NEED_vnewSVpvf_GLOBAL)
3770
3771 SV *
3772 DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args)
3773 {
3774   register SV *sv = newSV(0);
3775   sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
3776   return sv;
3777 }
3778
3779 #endif
3780 #endif
3781
3782 /* sv_vcatpvf depends on sv_vcatpvfn */
3783 #if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_vcatpvf)
3784 #  define sv_vcatpvf(sv, pat, args)  sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*))
3785 #endif
3786
3787 /* sv_vsetpvf depends on sv_vsetpvfn */
3788 #if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_vsetpvf)
3789 #  define sv_vsetpvf(sv, pat, args)  sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*))
3790 #endif
3791
3792 /* sv_catpvf_mg depends on sv_vcatpvfn, sv_catpvf_mg_nocontext */
3793 #if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_catpvf_mg)
3794 #if defined(NEED_sv_catpvf_mg)
3795 static void DPPP_(my_sv_catpvf_mg)(pTHX_ SV * sv, const char * pat, ...);
3796 static
3797 #else
3798 extern void DPPP_(my_sv_catpvf_mg)(pTHX_ SV * sv, const char * pat, ...);
3799 #endif
3800
3801 #define Perl_sv_catpvf_mg DPPP_(my_sv_catpvf_mg)
3802
3803 #if defined(NEED_sv_catpvf_mg) || defined(NEED_sv_catpvf_mg_GLOBAL)
3804
3805 void
3806 DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...)
3807 {
3808   va_list args;
3809   va_start(args, pat);
3810   sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
3811   SvSETMAGIC(sv);
3812   va_end(args);
3813 }
3814
3815 #endif
3816 #endif
3817
3818 /* sv_catpvf_mg_nocontext depends on sv_vcatpvfn */
3819 #ifdef PERL_IMPLICIT_CONTEXT
3820 #if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_catpvf_mg_nocontext)
3821 #if defined(NEED_sv_catpvf_mg_nocontext)
3822 static void DPPP_(my_sv_catpvf_mg_nocontext)(SV * sv, const char * pat, ...);
3823 static
3824 #else
3825 extern void DPPP_(my_sv_catpvf_mg_nocontext)(SV * sv, const char * pat, ...);
3826 #endif
3827
3828 #define sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext)
3829 #define Perl_sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext)
3830
3831 #if defined(NEED_sv_catpvf_mg_nocontext) || defined(NEED_sv_catpvf_mg_nocontext_GLOBAL)
3832
3833 void
3834 DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...)
3835 {
3836   dTHX;
3837   va_list args;
3838   va_start(args, pat);
3839   sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
3840   SvSETMAGIC(sv);
3841   va_end(args);
3842 }
3843
3844 #endif
3845 #endif
3846 #endif
3847
3848 #ifndef sv_catpvf_mg
3849 #  ifdef PERL_IMPLICIT_CONTEXT
3850 #    define sv_catpvf_mg   Perl_sv_catpvf_mg_nocontext
3851 #  else
3852 #    define sv_catpvf_mg   Perl_sv_catpvf_mg
3853 #  endif
3854 #endif
3855
3856 /* sv_vcatpvf_mg depends on sv_vcatpvfn */
3857 #if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_vcatpvf_mg)
3858 #  define sv_vcatpvf_mg(sv, pat, args)                                     \
3859    STMT_START {                                                            \
3860      sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));  \
3861      SvSETMAGIC(sv);                                                       \
3862    } STMT_END
3863 #endif
3864
3865 /* sv_setpvf_mg depends on sv_vsetpvfn, sv_setpvf_mg_nocontext */
3866 #if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_setpvf_mg)
3867 #if defined(NEED_sv_setpvf_mg)
3868 static void DPPP_(my_sv_setpvf_mg)(pTHX_ SV * sv, const char * pat, ...);
3869 static
3870 #else
3871 extern void DPPP_(my_sv_setpvf_mg)(pTHX_ SV * sv, const char * pat, ...);
3872 #endif
3873
3874 #define Perl_sv_setpvf_mg DPPP_(my_sv_setpvf_mg)
3875
3876 #if defined(NEED_sv_setpvf_mg) || defined(NEED_sv_setpvf_mg_GLOBAL)
3877
3878 void
3879 DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...)
3880 {
3881   va_list args;
3882   va_start(args, pat);
3883   sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
3884   SvSETMAGIC(sv);
3885   va_end(args);
3886 }
3887
3888 #endif
3889 #endif
3890
3891 /* sv_setpvf_mg_nocontext depends on sv_vsetpvfn */
3892 #ifdef PERL_IMPLICIT_CONTEXT
3893 #if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_setpvf_mg_nocontext)
3894 #if defined(NEED_sv_setpvf_mg_nocontext)
3895 static void DPPP_(my_sv_setpvf_mg_nocontext)(SV * sv, const char * pat, ...);
3896 static
3897 #else
3898 extern void DPPP_(my_sv_setpvf_mg_nocontext)(SV * sv, const char * pat, ...);
3899 #endif
3900
3901 #define sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext)
3902 #define Perl_sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext)
3903
3904 #if defined(NEED_sv_setpvf_mg_nocontext) || defined(NEED_sv_setpvf_mg_nocontext_GLOBAL)
3905
3906 void
3907 DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...)
3908 {
3909   dTHX;
3910   va_list args;
3911   va_start(args, pat);
3912   sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
3913   SvSETMAGIC(sv);
3914   va_end(args);
3915 }
3916
3917 #endif
3918 #endif
3919 #endif
3920
3921 #ifndef sv_setpvf_mg
3922 #  ifdef PERL_IMPLICIT_CONTEXT
3923 #    define sv_setpvf_mg   Perl_sv_setpvf_mg_nocontext
3924 #  else
3925 #    define sv_setpvf_mg   Perl_sv_setpvf_mg
3926 #  endif
3927 #endif
3928
3929 /* sv_vsetpvf_mg depends on sv_vsetpvfn */
3930 #if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_vsetpvf_mg)
3931 #  define sv_vsetpvf_mg(sv, pat, args)                                     \
3932    STMT_START {                                                            \
3933      sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));  \
3934      SvSETMAGIC(sv);                                                       \
3935    } STMT_END
3936 #endif
3937 #ifndef SvGETMAGIC
3938 #  define SvGETMAGIC(x)                  STMT_START { if (SvGMAGICAL(x)) mg_get(x); } STMT_END
3939 #endif
3940 #ifndef PERL_MAGIC_sv
3941 #  define PERL_MAGIC_sv                  '\0'
3942 #endif
3943
3944 #ifndef PERL_MAGIC_overload
3945 #  define PERL_MAGIC_overload            'A'
3946 #endif
3947
3948 #ifndef PERL_MAGIC_overload_elem
3949 #  define PERL_MAGIC_overload_elem       'a'
3950 #endif
3951
3952 #ifndef PERL_MAGIC_overload_table
3953 #  define PERL_MAGIC_overload_table      'c'
3954 #endif
3955
3956 #ifndef PERL_MAGIC_bm
3957 #  define PERL_MAGIC_bm                  'B'
3958 #endif
3959
3960 #ifndef PERL_MAGIC_regdata
3961 #  define PERL_MAGIC_regdata             'D'
3962 #endif
3963
3964 #ifndef PERL_MAGIC_regdatum
3965 #  define PERL_MAGIC_regdatum            'd'
3966 #endif
3967
3968 #ifndef PERL_MAGIC_env
3969 #  define PERL_MAGIC_env                 'E'
3970 #endif
3971
3972 #ifndef PERL_MAGIC_envelem
3973 #  define PERL_MAGIC_envelem             'e'
3974 #endif
3975
3976 #ifndef PERL_MAGIC_fm
3977 #  define PERL_MAGIC_fm                  'f'
3978 #endif
3979
3980 #ifndef PERL_MAGIC_regex_global
3981 #  define PERL_MAGIC_regex_global        'g'
3982 #endif
3983
3984 #ifndef PERL_MAGIC_isa
3985 #  define PERL_MAGIC_isa                 'I'
3986 #endif
3987
3988 #ifndef PERL_MAGIC_isaelem
3989 #  define PERL_MAGIC_isaelem             'i'
3990 #endif
3991
3992 #ifndef PERL_MAGIC_nkeys
3993 #  define PERL_MAGIC_nkeys               'k'
3994 #endif
3995
3996 #ifndef PERL_MAGIC_dbfile
3997 #  define PERL_MAGIC_dbfile              'L'
3998 #endif
3999
4000 #ifndef PERL_MAGIC_dbline
4001 #  define PERL_MAGIC_dbline              'l'
4002 #endif
4003
4004 #ifndef PERL_MAGIC_mutex
4005 #  define PERL_MAGIC_mutex               'm'
4006 #endif
4007
4008 #ifndef PERL_MAGIC_shared
4009 #  define PERL_MAGIC_shared              'N'
4010 #endif
4011
4012 #ifndef PERL_MAGIC_shared_scalar
4013 #  define PERL_MAGIC_shared_scalar       'n'
4014 #endif
4015
4016 #ifndef PERL_MAGIC_collxfrm
4017 #  define PERL_MAGIC_collxfrm            'o'
4018 #endif
4019
4020 #ifndef PERL_MAGIC_tied
4021 #  define PERL_MAGIC_tied                'P'
4022 #endif
4023
4024 #ifndef PERL_MAGIC_tiedelem
4025 #  define PERL_MAGIC_tiedelem            'p'
4026 #endif
4027
4028 #ifndef PERL_MAGIC_tiedscalar
4029 #  define PERL_MAGIC_tiedscalar          'q'
4030 #endif
4031
4032 #ifndef PERL_MAGIC_qr
4033 #  define PERL_MAGIC_qr                  'r'
4034 #endif
4035
4036 #ifndef PERL_MAGIC_sig
4037 #  define PERL_MAGIC_sig                 'S'
4038 #endif
4039
4040 #ifndef PERL_MAGIC_sigelem
4041 #  define PERL_MAGIC_sigelem             's'
4042 #endif
4043
4044 #ifndef PERL_MAGIC_taint
4045 #  define PERL_MAGIC_taint               't'
4046 #endif
4047
4048 #ifndef PERL_MAGIC_uvar
4049 #  define PERL_MAGIC_uvar                'U'
4050 #endif
4051
4052 #ifndef PERL_MAGIC_uvar_elem
4053 #  define PERL_MAGIC_uvar_elem           'u'
4054 #endif
4055
4056 #ifndef PERL_MAGIC_vstring
4057 #  define PERL_MAGIC_vstring             'V'
4058 #endif
4059
4060 #ifndef PERL_MAGIC_vec
4061 #  define PERL_MAGIC_vec                 'v'
4062 #endif
4063
4064 #ifndef PERL_MAGIC_utf8
4065 #  define PERL_MAGIC_utf8                'w'
4066 #endif
4067
4068 #ifndef PERL_MAGIC_substr
4069 #  define PERL_MAGIC_substr              'x'
4070 #endif
4071
4072 #ifndef PERL_MAGIC_defelem
4073 #  define PERL_MAGIC_defelem             'y'
4074 #endif
4075
4076 #ifndef PERL_MAGIC_glob
4077 #  define PERL_MAGIC_glob                '*'
4078 #endif
4079
4080 #ifndef PERL_MAGIC_arylen
4081 #  define PERL_MAGIC_arylen              '#'
4082 #endif
4083
4084 #ifndef PERL_MAGIC_pos
4085 #  define PERL_MAGIC_pos                 '.'
4086 #endif
4087
4088 #ifndef PERL_MAGIC_backref
4089 #  define PERL_MAGIC_backref             '<'
4090 #endif
4091
4092 #ifndef PERL_MAGIC_ext
4093 #  define PERL_MAGIC_ext                 '~'
4094 #endif
4095
4096 /* That's the best we can do... */
4097 #ifndef SvPV_force_nomg
4098 #  define SvPV_force_nomg                SvPV_force
4099 #endif
4100
4101 #ifndef SvPV_nomg
4102 #  define SvPV_nomg                      SvPV
4103 #endif
4104
4105 #ifndef sv_catpvn_nomg
4106 #  define sv_catpvn_nomg                 sv_catpvn
4107 #endif
4108
4109 #ifndef sv_catsv_nomg
4110 #  define sv_catsv_nomg                  sv_catsv
4111 #endif
4112
4113 #ifndef sv_setsv_nomg
4114 #  define sv_setsv_nomg                  sv_setsv
4115 #endif
4116
4117 #ifndef sv_pvn_nomg
4118 #  define sv_pvn_nomg                    sv_pvn
4119 #endif
4120
4121 #ifndef SvIV_nomg
4122 #  define SvIV_nomg                      SvIV
4123 #endif
4124
4125 #ifndef SvUV_nomg
4126 #  define SvUV_nomg                      SvUV
4127 #endif
4128
4129 #ifndef sv_catpv_mg
4130 #  define sv_catpv_mg(sv, ptr)          \
4131    STMT_START {                         \
4132      SV *TeMpSv = sv;                   \
4133      sv_catpv(TeMpSv,ptr);              \
4134      SvSETMAGIC(TeMpSv);                \
4135    } STMT_END
4136 #endif
4137
4138 #ifndef sv_catpvn_mg
4139 #  define sv_catpvn_mg(sv, ptr, len)    \
4140    STMT_START {                         \
4141      SV *TeMpSv = sv;                   \
4142      sv_catpvn(TeMpSv,ptr,len);         \
4143      SvSETMAGIC(TeMpSv);                \
4144    } STMT_END
4145 #endif
4146
4147 #ifndef sv_catsv_mg
4148 #  define sv_catsv_mg(dsv, ssv)         \
4149    STMT_START {                         \
4150      SV *TeMpSv = dsv;                  \
4151      sv_catsv(TeMpSv,ssv);              \
4152      SvSETMAGIC(TeMpSv);                \
4153    } STMT_END
4154 #endif
4155
4156 #ifndef sv_setiv_mg
4157 #  define sv_setiv_mg(sv, i)            \
4158    STMT_START {                         \
4159      SV *TeMpSv = sv;                   \
4160      sv_setiv(TeMpSv,i);                \
4161      SvSETMAGIC(TeMpSv);                \
4162    } STMT_END
4163 #endif
4164
4165 #ifndef sv_setnv_mg
4166 #  define sv_setnv_mg(sv, num)          \
4167    STMT_START {                         \
4168      SV *TeMpSv = sv;                   \
4169      sv_setnv(TeMpSv,num);              \
4170      SvSETMAGIC(TeMpSv);                \
4171    } STMT_END
4172 #endif
4173
4174 #ifndef sv_setpv_mg
4175 #  define sv_setpv_mg(sv, ptr)          \
4176    STMT_START {                         \
4177      SV *TeMpSv = sv;                   \
4178      sv_setpv(TeMpSv,ptr);              \
4179      SvSETMAGIC(TeMpSv);                \
4180    } STMT_END
4181 #endif
4182
4183 #ifndef sv_setpvn_mg
4184 #  define sv_setpvn_mg(sv, ptr, len)    \
4185    STMT_START {                         \
4186      SV *TeMpSv = sv;                   \
4187      sv_setpvn(TeMpSv,ptr,len);         \
4188      SvSETMAGIC(TeMpSv);                \
4189    } STMT_END
4190 #endif
4191
4192 #ifndef sv_setsv_mg
4193 #  define sv_setsv_mg(dsv, ssv)         \
4194    STMT_START {                         \
4195      SV *TeMpSv = dsv;                  \
4196      sv_setsv(TeMpSv,ssv);              \
4197      SvSETMAGIC(TeMpSv);                \
4198    } STMT_END
4199 #endif
4200
4201 #ifndef sv_setuv_mg
4202 #  define sv_setuv_mg(sv, i)            \
4203    STMT_START {                         \
4204      SV *TeMpSv = sv;                   \
4205      sv_setuv(TeMpSv,i);                \
4206      SvSETMAGIC(TeMpSv);                \
4207    } STMT_END
4208 #endif
4209
4210 #ifndef sv_usepvn_mg
4211 #  define sv_usepvn_mg(sv, ptr, len)    \
4212    STMT_START {                         \
4213      SV *TeMpSv = sv;                   \
4214      sv_usepvn(TeMpSv,ptr,len);         \
4215      SvSETMAGIC(TeMpSv);                \
4216    } STMT_END
4217 #endif
4218
4219 #ifdef USE_ITHREADS
4220 #ifndef CopFILE
4221 #  define CopFILE(c)                     ((c)->cop_file)
4222 #endif
4223
4224 #ifndef CopFILEGV
4225 #  define CopFILEGV(c)                   (CopFILE(c) ? gv_fetchfile(CopFILE(c)) : Nullgv)
4226 #endif
4227
4228 #ifndef CopFILE_set
4229 #  define CopFILE_set(c,pv)              ((c)->cop_file = savepv(pv))
4230 #endif
4231
4232 #ifndef CopFILESV
4233 #  define CopFILESV(c)                   (CopFILE(c) ? GvSV(gv_fetchfile(CopFILE(c))) : Nullsv)
4234 #endif
4235
4236 #ifndef CopFILEAV
4237 #  define CopFILEAV(c)                   (CopFILE(c) ? GvAV(gv_fetchfile(CopFILE(c))) : Nullav)
4238 #endif
4239
4240 #ifndef CopSTASHPV
4241 #  define CopSTASHPV(c)                  ((c)->cop_stashpv)
4242 #endif
4243
4244 #ifndef CopSTASHPV_set
4245 #  define CopSTASHPV_set(c,pv)           ((c)->cop_stashpv = ((pv) ? savepv(pv) : Nullch))
4246 #endif
4247
4248 #ifndef CopSTASH
4249 #  define CopSTASH(c)                    (CopSTASHPV(c) ? gv_stashpv(CopSTASHPV(c),GV_ADD) : Nullhv)
4250 #endif
4251
4252 #ifndef CopSTASH_set
4253 #  define CopSTASH_set(c,hv)             CopSTASHPV_set(c, (hv) ? HvNAME(hv) : Nullch)
4254 #endif
4255
4256 #ifndef CopSTASH_eq
4257 #  define CopSTASH_eq(c,hv)              ((hv) && (CopSTASHPV(c) == HvNAME(hv) \
4258                                         || (CopSTASHPV(c) && HvNAME(hv) \
4259                                         && strEQ(CopSTASHPV(c), HvNAME(hv)))))
4260 #endif
4261
4262 #else
4263 #ifndef CopFILEGV
4264 #  define CopFILEGV(c)                   ((c)->cop_filegv)
4265 #endif
4266
4267 #ifndef CopFILEGV_set
4268 #  define CopFILEGV_set(c,gv)            ((c)->cop_filegv = (GV*)SvREFCNT_inc(gv))
4269 #endif
4270
4271 #ifndef CopFILE_set
4272 #  define CopFILE_set(c,pv)              CopFILEGV_set((c), gv_fetchfile(pv))
4273 #endif
4274
4275 #ifndef CopFILESV
4276 #  define CopFILESV(c)                   (CopFILEGV(c) ? GvSV(CopFILEGV(c)) : Nullsv)
4277 #endif
4278
4279 #ifndef CopFILEAV
4280 #  define CopFILEAV(c)                   (CopFILEGV(c) ? GvAV(CopFILEGV(c)) : Nullav)
4281 #endif
4282
4283 #ifndef CopFILE
4284 #  define CopFILE(c)                     (CopFILESV(c) ? SvPVX(CopFILESV(c)) : Nullch)
4285 #endif
4286
4287 #ifndef CopSTASH
4288 #  define CopSTASH(c)                    ((c)->cop_stash)
4289 #endif
4290
4291 #ifndef CopSTASH_set
4292 #  define CopSTASH_set(c,hv)             ((c)->cop_stash = (hv))
4293 #endif
4294
4295 #ifndef CopSTASHPV
4296 #  define CopSTASHPV(c)                  (CopSTASH(c) ? HvNAME(CopSTASH(c)) : Nullch)
4297 #endif
4298
4299 #ifndef CopSTASHPV_set
4300 #  define CopSTASHPV_set(c,pv)           CopSTASH_set((c), gv_stashpv(pv,GV_ADD))
4301 #endif
4302
4303 #ifndef CopSTASH_eq
4304 #  define CopSTASH_eq(c,hv)              (CopSTASH(c) == (hv))
4305 #endif
4306
4307 #endif /* USE_ITHREADS */
4308 #ifndef IN_PERL_COMPILETIME
4309 #  define IN_PERL_COMPILETIME            (PL_curcop == &PL_compiling)
4310 #endif
4311
4312 #ifndef IN_LOCALE_RUNTIME
4313 #  define IN_LOCALE_RUNTIME              (PL_curcop->op_private & HINT_LOCALE)
4314 #endif
4315
4316 #ifndef IN_LOCALE_COMPILETIME
4317 #  define IN_LOCALE_COMPILETIME          (PL_hints & HINT_LOCALE)
4318 #endif
4319
4320 #ifndef IN_LOCALE
4321 #  define IN_LOCALE                      (IN_PERL_COMPILETIME ? IN_LOCALE_COMPILETIME : IN_LOCALE_RUNTIME)
4322 #endif
4323 #ifndef IS_NUMBER_IN_UV
4324 #  define IS_NUMBER_IN_UV                0x01
4325 #endif
4326
4327 #ifndef IS_NUMBER_GREATER_THAN_UV_MAX
4328 #  define IS_NUMBER_GREATER_THAN_UV_MAX  0x02
4329 #endif
4330
4331 #ifndef IS_NUMBER_NOT_INT
4332 #  define IS_NUMBER_NOT_INT              0x04
4333 #endif
4334
4335 #ifndef IS_NUMBER_NEG
4336 #  define IS_NUMBER_NEG                  0x08
4337 #endif
4338
4339 #ifndef IS_NUMBER_INFINITY
4340 #  define IS_NUMBER_INFINITY             0x10
4341 #endif
4342
4343 #ifndef IS_NUMBER_NAN
4344 #  define IS_NUMBER_NAN                  0x20
4345 #endif
4346
4347 /* GROK_NUMERIC_RADIX depends on grok_numeric_radix */
4348 #ifndef GROK_NUMERIC_RADIX
4349 #  define GROK_NUMERIC_RADIX(sp, send)   grok_numeric_radix(sp, send)
4350 #endif
4351 #ifndef PERL_SCAN_GREATER_THAN_UV_MAX
4352 #  define PERL_SCAN_GREATER_THAN_UV_MAX  0x02
4353 #endif
4354
4355 #ifndef PERL_SCAN_SILENT_ILLDIGIT
4356 #  define PERL_SCAN_SILENT_ILLDIGIT      0x04
4357 #endif
4358
4359 #ifndef PERL_SCAN_ALLOW_UNDERSCORES
4360 #  define PERL_SCAN_ALLOW_UNDERSCORES    0x01
4361 #endif
4362
4363 #ifndef PERL_SCAN_DISALLOW_PREFIX
4364 #  define PERL_SCAN_DISALLOW_PREFIX      0x02
4365 #endif
4366
4367 #ifndef grok_numeric_radix
4368 #if defined(NEED_grok_numeric_radix)
4369 static bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send);
4370 static
4371 #else
4372 extern bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send);
4373 #endif
4374
4375 #ifdef grok_numeric_radix
4376 #  undef grok_numeric_radix
4377 #endif
4378 #define grok_numeric_radix(a,b) DPPP_(my_grok_numeric_radix)(aTHX_ a,b)
4379 #define Perl_grok_numeric_radix DPPP_(my_grok_numeric_radix)
4380
4381 #if defined(NEED_grok_numeric_radix) || defined(NEED_grok_numeric_radix_GLOBAL)
4382 bool
4383 DPPP_(my_grok_numeric_radix)(pTHX_ const char **sp, const char *send)
4384 {
4385 #ifdef USE_LOCALE_NUMERIC
4386 #ifdef PL_numeric_radix_sv
4387     if (PL_numeric_radix_sv && IN_LOCALE) {
4388         STRLEN len;
4389         char* radix = SvPV(PL_numeric_radix_sv, len);
4390         if (*sp + len <= send && memEQ(*sp, radix, len)) {
4391             *sp += len;
4392             return TRUE;
4393         }
4394     }
4395 #else
4396     /* older perls don't have PL_numeric_radix_sv so the radix
4397      * must manually be requested from locale.h
4398      */
4399 #include <locale.h>
4400     dTHR;  /* needed for older threaded perls */
4401     struct lconv *lc = localeconv();
4402     char *radix = lc->decimal_point;
4403     if (radix && IN_LOCALE) {
4404         STRLEN len = strlen(radix);
4405         if (*sp + len <= send && memEQ(*sp, radix, len)) {
4406             *sp += len;
4407             return TRUE;
4408         }
4409     }
4410 #endif /* PERL_VERSION */
4411 #endif /* USE_LOCALE_NUMERIC */
4412     /* always try "." if numeric radix didn't match because
4413      * we may have data from different locales mixed */
4414     if (*sp < send && **sp == '.') {
4415         ++*sp;
4416         return TRUE;
4417     }
4418     return FALSE;
4419 }
4420 #endif
4421 #endif
4422
4423 /* grok_number depends on grok_numeric_radix */
4424
4425 #ifndef grok_number
4426 #if defined(NEED_grok_number)
4427 static int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep);
4428 static
4429 #else
4430 extern int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep);
4431 #endif
4432
4433 #ifdef grok_number
4434 #  undef grok_number
4435 #endif
4436 #define grok_number(a,b,c) DPPP_(my_grok_number)(aTHX_ a,b,c)
4437 #define Perl_grok_number DPPP_(my_grok_number)
4438
4439 #if defined(NEED_grok_number) || defined(NEED_grok_number_GLOBAL)
4440 int
4441 DPPP_(my_grok_number)(pTHX_ const char *pv, STRLEN len, UV *valuep)
4442 {
4443   const char *s = pv;
4444   const char *send = pv + len;
4445   const UV max_div_10 = UV_MAX / 10;
4446   const char max_mod_10 = UV_MAX % 10;
4447   int numtype = 0;
4448   int sawinf = 0;
4449   int sawnan = 0;
4450
4451   while (s < send && isSPACE(*s))
4452     s++;
4453   if (s == send) {
4454     return 0;
4455   } else if (*s == '-') {
4456     s++;
4457     numtype = IS_NUMBER_NEG;
4458   }
4459   else if (*s == '+')
4460   s++;
4461
4462   if (s == send)
4463     return 0;
4464
4465   /* next must be digit or the radix separator or beginning of infinity */
4466   if (isDIGIT(*s)) {
4467     /* UVs are at least 32 bits, so the first 9 decimal digits cannot
4468        overflow.  */
4469     UV value = *s - '0';
4470     /* This construction seems to be more optimiser friendly.
4471        (without it gcc does the isDIGIT test and the *s - '0' separately)
4472        With it gcc on arm is managing 6 instructions (6 cycles) per digit.
4473        In theory the optimiser could deduce how far to unroll the loop
4474        before checking for overflow.  */
4475     if (++s < send) {
4476       int digit = *s - '0';
4477       if (digit >= 0 && digit <= 9) {
4478         value = value * 10 + digit;
4479         if (++s < send) {
4480           digit = *s - '0';
4481           if (digit >= 0 && digit <= 9) {
4482             value = value * 10 + digit;
4483             if (++s < send) {
4484               digit = *s - '0';
4485               if (digit >= 0 && digit <= 9) {
4486                 value = value * 10 + digit;
4487                 if (++s < send) {
4488                   digit = *s - '0';
4489                   if (digit >= 0 && digit <= 9) {
4490                     value = value * 10 + digit;
4491                     if (++s < send) {
4492                       digit = *s - '0';
4493                       if (digit >= 0 && digit <= 9) {
4494                         value = value * 10 + digit;
4495                         if (++s < send) {
4496                           digit = *s - '0';
4497                           if (digit >= 0 && digit <= 9) {
4498                             value = value * 10 + digit;
4499                             if (++s < send) {
4500                               digit = *s - '0';
4501                               if (digit >= 0 && digit <= 9) {
4502                                 value = value * 10 + digit;
4503                                 if (++s < send) {
4504                                   digit = *s - '0';
4505                                   if (digit >= 0 && digit <= 9) {
4506                                     value = value * 10 + digit;
4507                                     if (++s < send) {
4508                                       /* Now got 9 digits, so need to check
4509                                          each time for overflow.  */
4510                                       digit = *s - '0';
4511                                       while (digit >= 0 && digit <= 9
4512                                              && (value < max_div_10
4513                                                  || (value == max_div_10
4514                                                      && digit <= max_mod_10))) {
4515                                         value = value * 10 + digit;
4516                                         if (++s < send)
4517                                           digit = *s - '0';
4518                                         else
4519                                           break;
4520                                       }
4521                                       if (digit >= 0 && digit <= 9
4522                                           && (s < send)) {
4523                                         /* value overflowed.
4524                                            skip the remaining digits, don't
4525                                            worry about setting *valuep.  */
4526                                         do {
4527                                           s++;
4528                                         } while (s < send && isDIGIT(*s));
4529                                         numtype |=
4530                                           IS_NUMBER_GREATER_THAN_UV_MAX;
4531                                         goto skip_value;
4532                                       }
4533                                     }
4534                                   }
4535                                 }
4536                               }
4537                             }
4538                           }
4539                         }
4540                       }
4541                     }
4542                   }
4543                 }
4544               }
4545             }
4546           }
4547         }
4548       }
4549     }
4550     numtype |= IS_NUMBER_IN_UV;
4551     if (valuep)
4552       *valuep = value;
4553
4554   skip_value:
4555     if (GROK_NUMERIC_RADIX(&s, send)) {
4556       numtype |= IS_NUMBER_NOT_INT;
4557       while (s < send && isDIGIT(*s))  /* optional digits after the radix */
4558         s++;
4559     }
4560   }
4561   else if (GROK_NUMERIC_RADIX(&s, send)) {
4562     numtype |= IS_NUMBER_NOT_INT | IS_NUMBER_IN_UV; /* valuep assigned below */
4563     /* no digits before the radix means we need digits after it */
4564     if (s < send && isDIGIT(*s)) {
4565       do {
4566         s++;
4567       } while (s < send && isDIGIT(*s));
4568       if (valuep) {
4569         /* integer approximation is valid - it's 0.  */
4570         *valuep = 0;
4571       }
4572     }
4573     else
4574       return 0;
4575   } else if (*s == 'I' || *s == 'i') {
4576     s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
4577     s++; if (s == send || (*s != 'F' && *s != 'f')) return 0;
4578     s++; if (s < send && (*s == 'I' || *s == 'i')) {
4579       s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
4580       s++; if (s == send || (*s != 'I' && *s != 'i')) return 0;
4581       s++; if (s == send || (*s != 'T' && *s != 't')) return 0;
4582       s++; if (s == send || (*s != 'Y' && *s != 'y')) return 0;
4583       s++;
4584     }
4585     sawinf = 1;
4586   } else if (*s == 'N' || *s == 'n') {
4587     /* XXX TODO: There are signaling NaNs and quiet NaNs. */
4588     s++; if (s == send || (*s != 'A' && *s != 'a')) return 0;
4589     s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
4590     s++;
4591     sawnan = 1;
4592   } else
4593     return 0;
4594
4595   if (sawinf) {
4596     numtype &= IS_NUMBER_NEG; /* Keep track of sign  */
4597     numtype |= IS_NUMBER_INFINITY | IS_NUMBER_NOT_INT;
4598   } else if (sawnan) {
4599     numtype &= IS_NUMBER_NEG; /* Keep track of sign  */
4600     numtype |= IS_NUMBER_NAN | IS_NUMBER_NOT_INT;
4601   } else if (s < send) {
4602     /* we can have an optional exponent part */
4603     if (*s == 'e' || *s == 'E') {
4604       /* The only flag we keep is sign.  Blow away any "it's UV"  */
4605       numtype &= IS_NUMBER_NEG;
4606       numtype |= IS_NUMBER_NOT_INT;
4607       s++;
4608       if (s < send && (*s == '-' || *s == '+'))
4609         s++;
4610       if (s < send && isDIGIT(*s)) {
4611         do {
4612           s++;
4613         } while (s < send && isDIGIT(*s));
4614       }
4615       else
4616       return 0;
4617     }
4618   }
4619   while (s < send && isSPACE(*s))
4620     s++;
4621   if (s >= send)
4622     return numtype;
4623   if (len == 10 && memEQ(pv, "0 but true", 10)) {
4624     if (valuep)
4625       *valuep = 0;
4626     return IS_NUMBER_IN_UV;
4627   }
4628   return 0;
4629 }
4630 #endif
4631 #endif
4632
4633 /*
4634  * The grok_* routines have been modified to use warn() instead of
4635  * Perl_warner(). Also, 'hexdigit' was the former name of PL_hexdigit,
4636  * which is why the stack variable has been renamed to 'xdigit'.
4637  */
4638
4639 #ifndef grok_bin
4640 #if defined(NEED_grok_bin)
4641 static UV DPPP_(my_grok_bin)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result);
4642 static
4643 #else
4644 extern UV DPPP_(my_grok_bin)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result);
4645 #endif
4646
4647 #ifdef grok_bin
4648 #  undef grok_bin
4649 #endif
4650 #define grok_bin(a,b,c,d) DPPP_(my_grok_bin)(aTHX_ a,b,c,d)
4651 #define Perl_grok_bin DPPP_(my_grok_bin)
4652
4653 #if defined(NEED_grok_bin) || defined(NEED_grok_bin_GLOBAL)
4654 UV
4655 DPPP_(my_grok_bin)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result)
4656 {
4657     const char *s = start;
4658     STRLEN len = *len_p;
4659     UV value = 0;
4660     NV value_nv = 0;
4661
4662     const UV max_div_2 = UV_MAX / 2;
4663     bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES;
4664     bool overflowed = FALSE;
4665
4666     if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) {
4667         /* strip off leading b or 0b.
4668            for compatibility silently suffer "b" and "0b" as valid binary
4669            numbers. */
4670         if (len >= 1) {
4671             if (s[0] == 'b') {
4672                 s++;
4673                 len--;
4674             }
4675             else if (len >= 2 && s[0] == '0' && s[1] == 'b') {
4676                 s+=2;
4677                 len-=2;
4678             }
4679         }
4680     }
4681
4682     for (; len-- && *s; s++) {
4683         char bit = *s;
4684         if (bit == '0' || bit == '1') {
4685             /* Write it in this wonky order with a goto to attempt to get the
4686                compiler to make the common case integer-only loop pretty tight.
4687                With gcc seems to be much straighter code than old scan_bin.  */
4688           redo:
4689             if (!overflowed) {
4690                 if (value <= max_div_2) {
4691                     value = (value << 1) | (bit - '0');
4692                     continue;
4693                 }
4694                 /* Bah. We're just overflowed.  */
4695                 warn("Integer overflow in binary number");
4696                 overflowed = TRUE;
4697                 value_nv = (NV) value;
4698             }
4699             value_nv *= 2.0;
4700             /* If an NV has not enough bits in its mantissa to
4701              * represent a UV this summing of small low-order numbers
4702              * is a waste of time (because the NV cannot preserve
4703              * the low-order bits anyway): we could just remember when
4704              * did we overflow and in the end just multiply value_nv by the
4705              * right amount. */
4706             value_nv += (NV)(bit - '0');
4707             continue;
4708         }
4709         if (bit == '_' && len && allow_underscores && (bit = s[1])
4710             && (bit == '0' || bit == '1'))
4711             {
4712                 --len;
4713                 ++s;
4714                 goto redo;
4715             }
4716         if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT))
4717             warn("Illegal binary digit '%c' ignored", *s);
4718         break;
4719     }
4720
4721     if (   ( overflowed && value_nv > 4294967295.0)
4722 #if UVSIZE > 4
4723         || (!overflowed && value > 0xffffffff  )
4724 #endif
4725         ) {
4726         warn("Binary number > 0b11111111111111111111111111111111 non-portable");
4727     }
4728     *len_p = s - start;
4729     if (!overflowed) {
4730         *flags = 0;
4731         return value;
4732     }
4733     *flags = PERL_SCAN_GREATER_THAN_UV_MAX;
4734     if (result)
4735         *result = value_nv;
4736     return UV_MAX;
4737 }
4738 #endif
4739 #endif
4740
4741 #ifndef grok_hex
4742 #if defined(NEED_grok_hex)
4743 static UV DPPP_(my_grok_hex)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result);
4744 static
4745 #else
4746 extern UV DPPP_(my_grok_hex)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result);
4747 #endif
4748
4749 #ifdef grok_hex
4750 #  undef grok_hex
4751 #endif
4752 #define grok_hex(a,b,c,d) DPPP_(my_grok_hex)(aTHX_ a,b,c,d)
4753 #define Perl_grok_hex DPPP_(my_grok_hex)
4754
4755 #if defined(NEED_grok_hex) || defined(NEED_grok_hex_GLOBAL)
4756 UV
4757 DPPP_(my_grok_hex)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result)
4758 {
4759     const char *s = start;
4760     STRLEN len = *len_p;
4761     UV value = 0;
4762     NV value_nv = 0;
4763
4764     const UV max_div_16 = UV_MAX / 16;
4765     bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES;
4766     bool overflowed = FALSE;
4767     const char *xdigit;
4768
4769     if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) {
4770         /* strip off leading x or 0x.
4771            for compatibility silently suffer "x" and "0x" as valid hex numbers.
4772         */
4773         if (len >= 1) {
4774             if (s[0] == 'x') {
4775                 s++;
4776                 len--;
4777             }
4778             else if (len >= 2 && s[0] == '0' && s[1] == 'x') {
4779                 s+=2;
4780                 len-=2;
4781             }
4782         }
4783     }
4784
4785     for (; len-- && *s; s++) {
4786         xdigit = strchr((char *) PL_hexdigit, *s);
4787         if (xdigit) {
4788             /* Write it in this wonky order with a goto to attempt to get the
4789                compiler to make the common case integer-only loop pretty tight.
4790                With gcc seems to be much straighter code than old scan_hex.  */
4791           redo:
4792             if (!overflowed) {
4793                 if (value <= max_div_16) {
4794                     value = (value << 4) | ((xdigit - PL_hexdigit) & 15);
4795                     continue;
4796                 }
4797                 warn("Integer overflow in hexadecimal number");
4798                 overflowed = TRUE;
4799                 value_nv = (NV) value;
4800             }
4801             value_nv *= 16.0;
4802             /* If an NV has not enough bits in its mantissa to
4803              * represent a UV this summing of small low-order numbers
4804              * is a waste of time (because the NV cannot preserve
4805              * the low-order bits anyway): we could just remember when
4806              * did we overflow and in the end just multiply value_nv by the
4807              * right amount of 16-tuples. */
4808             value_nv += (NV)((xdigit - PL_hexdigit) & 15);
4809             continue;
4810         }
4811         if (*s == '_' && len && allow_underscores && s[1]
4812                 && (xdigit = strchr((char *) PL_hexdigit, s[1])))
4813             {
4814                 --len;
4815                 ++s;
4816                 goto redo;
4817             }
4818         if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT))
4819             warn("Illegal hexadecimal digit '%c' ignored", *s);
4820         break;
4821     }
4822
4823     if (   ( overflowed && value_nv > 4294967295.0)
4824 #if UVSIZE > 4
4825         || (!overflowed && value > 0xffffffff  )
4826 #endif
4827         ) {
4828         warn("Hexadecimal number > 0xffffffff non-portable");
4829     }
4830     *len_p = s - start;
4831     if (!overflowed) {
4832         *flags = 0;
4833         return value;
4834     }
4835     *flags = PERL_SCAN_GREATER_THAN_UV_MAX;
4836     if (result)
4837         *result = value_nv;
4838     return UV_MAX;
4839 }
4840 #endif
4841 #endif
4842
4843 #ifndef grok_oct
4844 #if defined(NEED_grok_oct)
4845 static UV DPPP_(my_grok_oct)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result);
4846 static
4847 #else
4848 extern UV DPPP_(my_grok_oct)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result);
4849 #endif
4850
4851 #ifdef grok_oct
4852 #  undef grok_oct
4853 #endif
4854 #define grok_oct(a,b,c,d) DPPP_(my_grok_oct)(aTHX_ a,b,c,d)
4855 #define Perl_grok_oct DPPP_(my_grok_oct)
4856
4857 #if defined(NEED_grok_oct) || defined(NEED_grok_oct_GLOBAL)
4858 UV
4859 DPPP_(my_grok_oct)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result)
4860 {
4861     const char *s = start;
4862     STRLEN len = *len_p;
4863     UV value = 0;
4864     NV value_nv = 0;
4865
4866     const UV max_div_8 = UV_MAX / 8;
4867     bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES;
4868     bool overflowed = FALSE;
4869
4870     for (; len-- && *s; s++) {
4871          /* gcc 2.95 optimiser not smart enough to figure that this subtraction
4872             out front allows slicker code.  */
4873         int digit = *s - '0';
4874         if (digit >= 0 && digit <= 7) {
4875             /* Write it in this wonky order with a goto to attempt to get the
4876                compiler to make the common case integer-only loop pretty tight.
4877             */
4878           redo:
4879             if (!overflowed) {
4880                 if (value <= max_div_8) {
4881                     value = (value << 3) | digit;
4882                     continue;
4883                 }
4884                 /* Bah. We're just overflowed.  */
4885                 warn("Integer overflow in octal number");
4886                 overflowed = TRUE;
4887                 value_nv = (NV) value;
4888             }
4889             value_nv *= 8.0;
4890             /* If an NV has not enough bits in its mantissa to
4891              * represent a UV this summing of small low-order numbers
4892              * is a waste of time (because the NV cannot preserve
4893              * the low-order bits anyway): we could just remember when
4894              * did we overflow and in the end just multiply value_nv by the
4895              * right amount of 8-tuples. */
4896             value_nv += (NV)digit;
4897             continue;
4898         }
4899         if (digit == ('_' - '0') && len && allow_underscores
4900             && (digit = s[1] - '0') && (digit >= 0 && digit <= 7))
4901             {
4902                 --len;
4903                 ++s;
4904                 goto redo;
4905             }
4906         /* Allow \octal to work the DWIM way (that is, stop scanning
4907          * as soon as non-octal characters are seen, complain only iff
4908          * someone seems to want to use the digits eight and nine). */
4909         if (digit == 8 || digit == 9) {
4910             if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT))
4911                 warn("Illegal octal digit '%c' ignored", *s);
4912         }
4913         break;
4914     }
4915
4916     if (   ( overflowed && value_nv > 4294967295.0)
4917 #if UVSIZE > 4
4918         || (!overflowed && value > 0xffffffff  )
4919 #endif
4920         ) {
4921         warn("Octal number > 037777777777 non-portable");
4922     }
4923     *len_p = s - start;
4924     if (!overflowed) {
4925         *flags = 0;
4926         return value;
4927     }
4928     *flags = PERL_SCAN_GREATER_THAN_UV_MAX;
4929     if (result)
4930         *result = value_nv;
4931     return UV_MAX;
4932 }
4933 #endif
4934 #endif
4935
4936 #ifdef NO_XSLOCKS
4937 #  ifdef dJMPENV
4938 #    define dXCPT             dJMPENV; int rEtV = 0
4939 #    define XCPT_TRY_START    JMPENV_PUSH(rEtV); if (rEtV == 0)
4940 #    define XCPT_TRY_END      JMPENV_POP;
4941 #    define XCPT_CATCH        if (rEtV != 0)
4942 #    define XCPT_RETHROW      JMPENV_JUMP(rEtV)
4943 #  else
4944 #    define dXCPT             Sigjmp_buf oldTOP; int rEtV = 0
4945 #    define XCPT_TRY_START    Copy(top_env, oldTOP, 1, Sigjmp_buf); rEtV = Sigsetjmp(top_env, 1); if (rEtV == 0)
4946 #    define XCPT_TRY_END      Copy(oldTOP, top_env, 1, Sigjmp_buf);
4947 #    define XCPT_CATCH        if (rEtV != 0)
4948 #    define XCPT_RETHROW      Siglongjmp(top_env, rEtV)
4949 #  endif
4950 #endif
4951
4952 #endif /* _P_P_PORTABILITY_H_ */
4953
4954 /* End of File ppport.h */