2
/* ppport.h -- Perl/Pollution/Portability Version 2.011
4
* Automatically Created by Devel::PPPort on Sun Jul 4 09:11:52 2004
6
* Do NOT edit this file directly! -- Edit PPPort.pm instead.
8
* Version 2.x, Copyright (C) 2001, Paul Marquess.
9
* Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
10
* This code may be used and distributed under the same license as any
13
* This version of ppport.h is designed to support operation with Perl
14
* installations back to 5.004, and has been tested up to 5.8.1.
16
* If this version of ppport.h is failing during the compilation of this
17
* module, please check if a newer version of Devel::PPPort is available
18
* on CPAN before sending a bug report.
20
* If you are using the latest version of Devel::PPPort and it is failing
21
* during compilation of this module, please send a report to perlbug@perl.com
23
* Include all following information:
25
* 1. The complete output from running "perl -V"
29
* 3. The name & version of the module you were trying to build.
31
* 4. A full log of the build that failed.
33
* 5. Any other information that you think could be relevant.
36
* For the latest version of this code, please retreive the Devel::PPPort
42
* In order for a Perl extension module to be as portable as possible
43
* across differing versions of Perl itself, certain steps need to be taken.
44
* Including this header is the first major one, then using dTHR is all the
45
* appropriate places and using a PL_ prefix to refer to global Perl
46
* variables is the second.
51
/* If you use one of a few functions that were not present in earlier
52
* versions of Perl, please add a define before the inclusion of ppport.h
53
* for a static include, or use the GLOBAL request in a single module to
54
* produce a global definition that can be referenced from the other
57
* Function: Static define: Extern define:
58
* newCONSTSUB() NEED_newCONSTSUB NEED_newCONSTSUB_GLOBAL
63
/* To verify whether ppport.h is needed for your module, and whether any
64
* special defines should be used, ppport.h can be run through Perl to check
65
* your source code. Simply say:
67
* perl -x ppport.h *.c *.h *.xs foo/bar*.c [etc]
69
* The result will be a list of patches suggesting changes that should at
70
* least be acceptable, if not necessarily the most efficient solution, or a
71
* fix for all possible problems. It won't catch where dTHR is needed, and
72
* doesn't attempt to account for global macro or function definitions,
73
* nested includes, typemaps, etc.
75
* In order to test for the need of dTHR, please try your module under a
76
* recent version of Perl that has threading compiled-in.
83
@ARGV = ("*.xs") if !@ARGV;
84
%badmacros = %funcs = %macros = (); $replace = 0;
86
$funcs{$1} = 1 if /Provide:\s+(\S+)/;
87
$macros{$1} = 1 if /^#\s*define\s+([a-zA-Z0-9_]+)/;
88
$replace = $1 if /Replace:\s+(\d+)/;
89
$badmacros{$2}=$1 if $replace and /^#\s*define\s+([a-zA-Z0-9_]+).*?\s+([a-zA-Z0-9_]+)/;
90
$badmacros{$1}=$2 if /Replace (\S+) with (\S+)/;
92
foreach $filename (map(glob($_),@ARGV)) {
93
unless (open(IN, "<$filename")) {
94
warn "Unable to read from $file: $!\n";
97
print "Scanning $filename...\n";
98
$c = ""; while (<IN>) { $c .= $_; } close(IN);
99
$need_include = 0; %add_func = (); $changes = 0;
100
$has_include = ($c =~ /#.*include.*ppport/m);
102
foreach $func (keys %funcs) {
103
if ($c =~ /#.*define.*\bNEED_$func(_GLOBAL)?\b/m) {
104
if ($c !~ /\b$func\b/m) {
105
print "If $func isn't needed, you don't need to request it.\n" if
106
$changes += ($c =~ s/^.*#.*define.*\bNEED_$func\b.*\n//m);
108
print "Uses $func\n";
112
if ($c =~ /\b$func\b/m) {
113
$add_func{$func} =1 ;
114
print "Uses $func\n";
120
if (not $need_include) {
121
foreach $macro (keys %macros) {
122
if ($c =~ /\b$macro\b/m) {
123
print "Uses $macro\n";
129
foreach $badmacro (keys %badmacros) {
130
if ($c =~ /\b$badmacro\b/m) {
131
$changes += ($c =~ s/\b$badmacro\b/$badmacros{$badmacro}/gm);
132
print "Uses $badmacros{$badmacro} (instead of $badmacro)\n";
137
if (scalar(keys %add_func) or $need_include != $has_include) {
139
$inc = join('',map("#define NEED_$_\n", sort keys %add_func)).
140
"#include \"ppport.h\"\n";
141
$c = "$inc$c" unless $c =~ s/#.*include.*XSUB.*\n/$&$inc/m;
142
} elsif (keys %add_func) {
143
$inc = join('',map("#define NEED_$_\n", sort keys %add_func));
144
$c = "$inc$c" unless $c =~ s/^.*#.*include.*ppport.*$/$inc$&/m;
146
if (!$need_include) {
147
print "Doesn't seem to need ppport.h.\n";
148
$c =~ s/^.*#.*include.*ppport.*\n//m;
154
open(OUT,">/tmp/ppport.h.$$");
157
open(DIFF, "diff -u $filename /tmp/ppport.h.$$|");
158
while (<DIFF>) { s!/tmp/ppport\.h\.$$!$filename.patched!; print STDOUT; }
160
unlink("/tmp/ppport.h.$$");
168
#ifndef _P_P_PORTABILITY_H_
169
#define _P_P_PORTABILITY_H_
171
#ifndef PERL_REVISION
172
#ifndef __PATCHLEVEL_H_INCLUDED__
173
#define PERL_PATCHLEVEL_H_IMPLICIT
174
#include <patchlevel.h>
176
#if !(defined(PERL_VERSION) || (defined(SUBVERSION) && defined(PATCHLEVEL)))
177
#include <could_not_find_Perl_patchlevel.h>
179
#ifndef PERL_REVISION
180
#define PERL_REVISION (5)
182
#define PERL_VERSION PATCHLEVEL
183
#define PERL_SUBVERSION SUBVERSION
184
/* Replace PERL_PATCHLEVEL with PERL_VERSION */
189
#define PERL_BCDVERSION ((PERL_REVISION * 0x1000000L) + (PERL_VERSION * 0x1000L) + PERL_SUBVERSION)
191
/* It is very unlikely that anyone will try to use this with Perl 6
192
(or greater), but who knows.
194
#if PERL_REVISION != 5
195
#error ppport.h only works with Perl version 5
196
#endif /* PERL_REVISION != 5 */
199
#define ERRSV perl_get_sv("@",FALSE)
202
#if (PERL_VERSION < 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION <= 5))
205
#define PL_compiling compiling
206
#define PL_copline copline
207
#define PL_curcop curcop
208
#define PL_curstash curstash
209
#define PL_defgv defgv
210
#define PL_dirty dirty
211
#define PL_dowarn dowarn
212
#define PL_hints hints
214
#define PL_perldb perldb
215
#define PL_rsfp_filters rsfp_filters
216
#define PL_rsfpv rsfp
217
#define PL_stdingv stdingv
218
#define PL_sv_no sv_no
219
#define PL_sv_undef sv_undef
220
#define PL_sv_yes sv_yes
224
#ifndef PERL_UNUSED_DECL
226
#if (defined(__GNUC__) && defined(__cplusplus)) || defined(__INTEL_COMPILER)
227
#define PERL_UNUSED_DECL
229
#define PERL_UNUSED_DECL __attribute__((unused))
232
#define PERL_UNUSED_DECL
238
#define dNOOP extern int Perl___notused PERL_UNUSED_DECL
247
#define dTHXa(x) dNOOP
248
#define dTHXoa(x) dNOOP
259
#define dAX I32 ax = MARK - PL_stack_base + 1
262
#define dITEMS I32 items = SP - MARK
265
/* IV could also be a quad (say, a long long), but Perls
266
* capable of those should have IVSIZE already. */
267
#if !defined(IVSIZE) && defined(LONGSIZE)
268
#define IVSIZE LONGSIZE
271
#define IVSIZE 4 /* A bold guess, but the best we can make. */
275
#define UVSIZE IVSIZE
279
#if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE)
280
#define NVTYPE long double
282
#define NVTYPE double
289
#if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE)
291
#define INT2PTR(any,d) (any)(d)
293
#if PTRSIZE == LONGSIZE
294
#define PTRV unsigned long
296
#define PTRV unsigned
298
#define INT2PTR(any,d) (any)(PTRV)(d)
300
#define NUM2PTR(any,d) (any)(PTRV)(d)
301
#define PTR2IV(p) INT2PTR(IV,p)
302
#define PTR2UV(p) INT2PTR(UV,p)
303
#define PTR2NV(p) NUM2PTR(NV,p)
304
#if PTRSIZE == LONGSIZE
305
#define PTR2ul(p) (unsigned long)(p)
307
#define PTR2ul(p) INT2PTR(unsigned long,p)
309
#endif /* !INT2PTR */
312
#define boolSV(b) ((b) ? &PL_sv_yes : &PL_sv_no)
316
#define gv_stashpvn(str,len,flags) gv_stashpv(str,flags)
320
#define newSVpvn(data,len) ((len) ? newSVpv ((data), (len)) : newSVpv ("", 0))
325
#define newRV_inc(sv) newRV(sv)
329
/* DEFSV appears first in 5.004_56 */
331
#define DEFSV GvSV(PL_defgv)
335
#define SAVE_DEFSV SAVESPTR(GvSV(PL_defgv))
340
#define newRV_noinc(sv) \
342
SV *nsv = (SV*)newRV(sv); \
347
#if defined(USE_THREADS)
351
SV *nsv = (SV *) newRV(sv);
357
#define newRV_noinc(sv) \
358
(PL_Sv=(SV*)newRV(sv), SvREFCNT_dec(sv), (SV*)PL_Sv)
363
/* Provide: newCONSTSUB */
365
/* newCONSTSUB from IO.xs is in the core starting with 5.004_63 */
366
#if (PERL_VERSION < 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION < 63))
368
#if defined(NEED_newCONSTSUB)
371
extern void newCONSTSUB(HV *stash, char *name, SV *sv);
374
#if defined(NEED_newCONSTSUB) || defined(NEED_newCONSTSUB_GLOBAL)
376
newCONSTSUB(stash, name, sv)
381
U32 oldhints = PL_hints;
382
HV *old_cop_stash = PL_curcop->cop_stash;
383
HV *old_curstash = PL_curstash;
384
line_t oldline = PL_curcop->cop_line;
386
PL_curcop->cop_line = PL_copline;
388
PL_hints &= ~HINT_BLOCK_SCOPE;
390
PL_curstash = PL_curcop->cop_stash = stash;
394
#if (PERL_VERSION < 3) || ((PERL_VERSION == 3) && (PERL_SUBVERSION < 22))
395
/* before 5.003_22 */
398
#if (PERL_VERSION == 3) && (PERL_SUBVERSION == 22)
402
/* 5.003_23 onwards */
403
start_subparse(FALSE, 0),
407
newSVOP(OP_CONST, 0, newSVpv(name, 0)),
408
newSVOP(OP_CONST, 0, &PL_sv_no), /* SvPV(&PL_sv_no) == "" --
410
newSTATEOP(0, Nullch, newSVOP(OP_CONST, 0, sv))
414
PL_curcop->cop_stash = old_cop_stash;
415
PL_curstash = old_curstash;
416
PL_curcop->cop_line = oldline;
419
#endif /* newCONSTSUB */
424
* Boilerplate macros for initializing and accessing interpreter-local
425
* data from C. All statics in extensions should be reworked to use
426
* this, if you want to make the extension thread-safe. See ext/re/re.xs
427
* for an example of the use of these macros.
429
* Code that uses these macros is responsible for the following:
430
* 1. #define MY_CXT_KEY to a unique string, e.g. "DynaLoader_guts"
431
* 2. Declare a typedef named my_cxt_t that is a structure that contains
432
* all the data that needs to be interpreter-local.
433
* 3. Use the START_MY_CXT macro after the declaration of my_cxt_t.
434
* 4. Use the MY_CXT_INIT macro such that it is called exactly once
435
* (typically put in the BOOT: section).
436
* 5. Use the members of the my_cxt_t structure everywhere as
438
* 6. Use the dMY_CXT macro (a declaration) in all the functions that
442
#if defined(MULTIPLICITY) || defined(PERL_OBJECT) || \
443
defined(PERL_CAPI) || defined(PERL_IMPLICIT_CONTEXT)
445
/* This must appear in all extensions that define a my_cxt_t structure,
446
* right after the definition (i.e. at file scope). The non-threads
447
* case below uses it to declare the data as static. */
450
#if (PERL_VERSION < 4 || (PERL_VERSION == 4 && PERL_SUBVERSION < 68 ))
451
/* Fetches the SV that keeps the per-interpreter data. */
453
SV *my_cxt_sv = perl_get_sv(MY_CXT_KEY, FALSE)
454
#else /* >= perl5.004_68 */
456
SV *my_cxt_sv = *hv_fetch(PL_modglobal, MY_CXT_KEY, \
457
sizeof(MY_CXT_KEY)-1, TRUE)
458
#endif /* < perl5.004_68 */
460
/* This declaration should be used within all functions that use the
461
* interpreter-local data. */
464
my_cxt_t *my_cxtp = INT2PTR(my_cxt_t*,SvUV(my_cxt_sv))
466
/* Creates and zeroes the per-interpreter data.
467
* (We allocate my_cxtp in a Perl SV so that it will be released when
468
* the interpreter goes away.) */
469
#define MY_CXT_INIT \
471
/* newSV() allocates one more than needed */ \
472
my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\
473
Zero(my_cxtp, 1, my_cxt_t); \
474
sv_setuv(my_cxt_sv, PTR2UV(my_cxtp))
476
/* This macro must be used to access members of the my_cxt_t structure.
477
* e.g. MYCXT.some_data */
478
#define MY_CXT (*my_cxtp)
480
/* Judicious use of these macros can reduce the number of times dMY_CXT
481
* is used. Use is similar to pTHX, aTHX etc. */
482
#define pMY_CXT my_cxt_t *my_cxtp
483
#define pMY_CXT_ pMY_CXT,
484
#define _pMY_CXT ,pMY_CXT
485
#define aMY_CXT my_cxtp
486
#define aMY_CXT_ aMY_CXT,
487
#define _aMY_CXT ,aMY_CXT
488
#else /* single interpreter */
490
#define START_MY_CXT static my_cxt_t my_cxt;
491
#define dMY_CXT_SV dNOOP
492
#define dMY_CXT dNOOP
493
#define MY_CXT_INIT NOOP
494
#define MY_CXT my_cxt
503
#endif /* START_MY_CXT */
506
#if IVSIZE == LONGSIZE
513
#if IVSIZE == INTSIZE
524
#if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) && \
525
defined(PERL_PRIfldbl) /* Not very likely, but let's try anyway. */
526
#define NVef PERL_PRIeldbl
527
#define NVff PERL_PRIfldbl
528
#define NVgf PERL_PRIgldbl
536
#ifndef AvFILLp /* Older perls (<=5.003) lack AvFILLp */
537
#define AvFILLp AvFILL
541
#if PERL_REVISION == 5 && PERL_VERSION < 7
542
/* SvPVbyte does not work in perl-5.6.1, borrowed version for 5.7.3 */
544
#define SvPVbyte(sv, lp) \
545
((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK) \
546
? ((lp = SvCUR(sv)), SvPVX(sv)) : my_sv_2pvbyte(aTHX_ sv, &lp))
548
my_sv_2pvbyte(pTHX_ register SV *sv, STRLEN *lp)
550
sv_utf8_downgrade(sv, 0);
551
return SvPV(sv, *lp);
555
#define SvPVbyte SvPV
559
#define SvPV_nolen(sv) \
560
((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
561
? SvPVX(sv) : sv_2pv_nolen(sv))
563
sv_2pv_nolen(pTHX_ register SV *sv)
567
return sv_2pv(sv, &n_a);
572
#define get_cv(name,create) perl_get_cv(name,create)
576
#define get_sv(name,create) perl_get_sv(name,create)
580
#define get_av(name,create) perl_get_av(name,create)
584
#define get_hv(name,create) perl_get_hv(name,create)
588
#define call_argv perl_call_argv
592
#define call_method perl_call_method
596
#define call_pv perl_call_pv
600
#define call_sv perl_call_sv
604
#define eval_pv perl_eval_pv
608
#define eval_sv perl_eval_sv
611
#ifndef PERL_SCAN_GREATER_THAN_UV_MAX
612
#define PERL_SCAN_GREATER_THAN_UV_MAX 0x02
615
#ifndef PERL_SCAN_SILENT_ILLDIGIT
616
#define PERL_SCAN_SILENT_ILLDIGIT 0x04
619
#ifndef PERL_SCAN_ALLOW_UNDERSCORES
620
#define PERL_SCAN_ALLOW_UNDERSCORES 0x01
623
#ifndef PERL_SCAN_DISALLOW_PREFIX
624
#define PERL_SCAN_DISALLOW_PREFIX 0x02
627
#if (PERL_VERSION > 6) || ((PERL_VERSION == 6) && (PERL_SUBVERSION >= 1))
630
#define I32_CAST (I32*)
636
(PL_curcop == &PL_compiling ? IN_LOCALE_COMPILETIME : IN_LOCALE_RUNTIME)
639
#ifndef IN_LOCALE_RUNTIME
640
#define IN_LOCALE_RUNTIME (PL_curcop->op_private & HINT_LOCALE)
643
#ifndef IN_LOCALE_COMPILETIME
644
#define IN_LOCALE_COMPILETIME (PL_hints & HINT_LOCALE)
648
#ifndef IS_NUMBER_IN_UV
649
#define IS_NUMBER_IN_UV 0x01
650
#define IS_NUMBER_GREATER_THAN_UV_MAX 0x02
651
#define IS_NUMBER_NOT_INT 0x04
652
#define IS_NUMBER_NEG 0x08
653
#define IS_NUMBER_INFINITY 0x10
654
#define IS_NUMBER_NAN 0x20
657
#ifndef PERL_MAGIC_sv
658
#define PERL_MAGIC_sv '\0'
661
#ifndef PERL_MAGIC_overload
662
#define PERL_MAGIC_overload 'A'
665
#ifndef PERL_MAGIC_overload_elem
666
#define PERL_MAGIC_overload_elem 'a'
669
#ifndef PERL_MAGIC_overload_table
670
#define PERL_MAGIC_overload_table 'c'
673
#ifndef PERL_MAGIC_bm
674
#define PERL_MAGIC_bm 'B'
677
#ifndef PERL_MAGIC_regdata
678
#define PERL_MAGIC_regdata 'D'
681
#ifndef PERL_MAGIC_regdatum
682
#define PERL_MAGIC_regdatum 'd'
685
#ifndef PERL_MAGIC_env
686
#define PERL_MAGIC_env 'E'
689
#ifndef PERL_MAGIC_envelem
690
#define PERL_MAGIC_envelem 'e'
693
#ifndef PERL_MAGIC_fm
694
#define PERL_MAGIC_fm 'f'
697
#ifndef PERL_MAGIC_regex_global
698
#define PERL_MAGIC_regex_global 'g'
701
#ifndef PERL_MAGIC_isa
702
#define PERL_MAGIC_isa 'I'
705
#ifndef PERL_MAGIC_isaelem
706
#define PERL_MAGIC_isaelem 'i'
709
#ifndef PERL_MAGIC_nkeys
710
#define PERL_MAGIC_nkeys 'k'
713
#ifndef PERL_MAGIC_dbfile
714
#define PERL_MAGIC_dbfile 'L'
717
#ifndef PERL_MAGIC_dbline
718
#define PERL_MAGIC_dbline 'l'
721
#ifndef PERL_MAGIC_mutex
722
#define PERL_MAGIC_mutex 'm'
725
#ifndef PERL_MAGIC_shared
726
#define PERL_MAGIC_shared 'N'
729
#ifndef PERL_MAGIC_shared_scalar
730
#define PERL_MAGIC_shared_scalar 'n'
733
#ifndef PERL_MAGIC_collxfrm
734
#define PERL_MAGIC_collxfrm 'o'
737
#ifndef PERL_MAGIC_tied
738
#define PERL_MAGIC_tied 'P'
741
#ifndef PERL_MAGIC_tiedelem
742
#define PERL_MAGIC_tiedelem 'p'
745
#ifndef PERL_MAGIC_tiedscalar
746
#define PERL_MAGIC_tiedscalar 'q'
749
#ifndef PERL_MAGIC_qr
750
#define PERL_MAGIC_qr 'r'
753
#ifndef PERL_MAGIC_sig
754
#define PERL_MAGIC_sig 'S'
757
#ifndef PERL_MAGIC_sigelem
758
#define PERL_MAGIC_sigelem 's'
761
#ifndef PERL_MAGIC_taint
762
#define PERL_MAGIC_taint 't'
765
#ifndef PERL_MAGIC_uvar
766
#define PERL_MAGIC_uvar 'U'
769
#ifndef PERL_MAGIC_uvar_elem
770
#define PERL_MAGIC_uvar_elem 'u'
773
#ifndef PERL_MAGIC_vstring
774
#define PERL_MAGIC_vstring 'V'
777
#ifndef PERL_MAGIC_vec
778
#define PERL_MAGIC_vec 'v'
781
#ifndef PERL_MAGIC_utf8
782
#define PERL_MAGIC_utf8 'w'
785
#ifndef PERL_MAGIC_substr
786
#define PERL_MAGIC_substr 'x'
789
#ifndef PERL_MAGIC_defelem
790
#define PERL_MAGIC_defelem 'y'
793
#ifndef PERL_MAGIC_glob
794
#define PERL_MAGIC_glob '*'
797
#ifndef PERL_MAGIC_arylen
798
#define PERL_MAGIC_arylen '#'
801
#ifndef PERL_MAGIC_pos
802
#define PERL_MAGIC_pos '.'
805
#ifndef PERL_MAGIC_backref
806
#define PERL_MAGIC_backref '<'
809
#ifndef PERL_MAGIC_ext
810
#define PERL_MAGIC_ext '~'
812
#endif /* _P_P_PORTABILITY_H_ */
814
/* End of File ppport.h */