This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Update all copyrights to 2003, from Jarkko
[perl5.git] / embed.pl
CommitLineData
5f05dabc 1#!/usr/bin/perl -w
e50aee73 2
954c1994
GS
3require 5.003; # keep this compatible, an old perl is all we may have before
4 # we build the new one
5f05dabc 5
36bb303b
NC
6BEGIN {
7 # Get function prototypes
8 require 'regen.pl';
9}
10
cea2e8a9 11#
346f75ff 12# See database of global and static function prototypes in embed.fnc
cea2e8a9
GS
13# This is used to generate prototype headers under various configurations,
14# export symbols lists for different platforms, and macros to provide an
15# implicit interpreter context argument.
16#
17
7f1be197
MB
18sub do_not_edit ($)
19{
20 my $file = shift;
21 my $warning = <<EOW;
22
23 $file
24
4c79ee7a 25 Copyright (c) 1997-2003, Larry Wall
7f1be197
MB
26
27 You may distribute under the terms of either the GNU General Public
28 License or the Artistic License, as specified in the README file.
29
30!!!!!!! DO NOT EDIT THIS FILE !!!!!!!
31This file is built by embed.pl from data in embed.fnc, embed.pl,
32pp.sym, intrpvar.h, perlvars.h and thrdvar.h.
33Any changes made here will be lost!
34
35Edit those files and run 'make regen_headers' to effect changes.
36
37EOW
38
39 if ($file =~ m:\.[ch]$:) {
0ea9712b
MB
40 $warning =~ s:^: * :gm;
41 $warning =~ s: +$::gm;
42 $warning =~ s: :/:;
43 $warning =~ s:$:/:;
7f1be197
MB
44 }
45 else {
0ea9712b
MB
46 $warning =~ s:^:# :gm;
47 $warning =~ s: +$::gm;
7f1be197
MB
48 }
49 $warning;
50} # do_not_edit
51
94bdecf9 52open IN, "embed.fnc" or die $!;
cea2e8a9
GS
53
54# walk table providing an array of components in each line to
55# subroutine, printing the result
56sub walk_table (&@) {
57 my $function = shift;
58 my $filename = shift || '-';
0ea9712b
MB
59 my $leader = shift;
60 defined $leader or $leader = do_not_edit ($filename);
cea2e8a9
GS
61 my $trailer = shift;
62 my $F;
63 local *F;
64 if (ref $filename) { # filehandle
65 $F = $filename;
66 }
67 else {
36bb303b 68 safer_unlink $filename;
cea2e8a9
GS
69 open F, ">$filename" or die "Can't open $filename: $!";
70 $F = \*F;
71 }
72 print $F $leader if $leader;
94bdecf9
JH
73 seek IN, 0, 0; # so we may restart
74 while (<IN>) {
cea2e8a9 75 chomp;
1d7c1841 76 next if /^:/;
cea2e8a9 77 while (s|\\$||) {
94bdecf9 78 $_ .= <IN>;
cea2e8a9
GS
79 chomp;
80 }
81 my @args;
82 if (/^\s*(#|$)/) {
83 @args = $_;
84 }
85 else {
86 @args = split /\s*\|\s*/, $_;
87 }
4543f4c0
PP
88 my @outs = &{$function}(@args);
89 print $F @outs; # $function->(@args) is not 5.003
cea2e8a9
GS
90 }
91 print $F $trailer if $trailer;
36bb303b
NC
92 unless (ref $filename) {
93 close $F or die "Error closing $filename: $!";
94 }
cea2e8a9
GS
95}
96
97sub munge_c_files () {
98 my $functions = {};
99 unless (@ARGV) {
100 warn "\@ARGV empty, nothing to do\n";
101 return;
102 }
103 walk_table {
104 if (@_ > 1) {
105 $functions->{$_[2]} = \@_ if $_[@_-1] =~ /\.\.\./;
106 }
0ea9712b 107 } '/dev/null', '';
cea2e8a9
GS
108 local $^I = '.bak';
109 while (<>) {
110# if (/^#\s*include\s+"perl.h"/) {
111# my $file = uc $ARGV;
112# $file =~ s/\./_/g;
113# print "#define PERL_IN_$file\n";
114# }
115# s{^(\w+)\s*\(}
116# {
117# my $f = $1;
118# my $repl = "$f(";
119# if (exists $functions->{$f}) {
120# my $flags = $functions->{$f}[0];
121# $repl = "Perl_$repl" if $flags =~ /p/;
122# unless ($flags =~ /n/) {
123# $repl .= "pTHX";
124# $repl .= "_ " if @{$functions->{$f}} > 3;
125# }
126# warn("$ARGV:$.:$repl\n");
127# }
128# $repl;
129# }e;
130 s{(\b(\w+)[ \t]*\([ \t]*(?!aTHX))}
131 {
132 my $repl = $1;
133 my $f = $2;
134 if (exists $functions->{$f}) {
135 $repl .= "aTHX_ ";
136 warn("$ARGV:$.:$`#$repl#$'");
137 }
138 $repl;
139 }eg;
140 print;
141 close ARGV if eof; # restart $.
142 }
143 exit;
144}
145
146#munge_c_files();
147
148# generate proto.h
0cb96387
GS
149my $wrote_protected = 0;
150
cea2e8a9
GS
151sub write_protos {
152 my $ret = "";
153 if (@_ == 1) {
154 my $arg = shift;
1d7c1841 155 $ret .= "$arg\n";
cea2e8a9
GS
156 }
157 else {
158 my ($flags,$retval,$func,@args) = @_;
af3c7592 159 $ret .= '/* ' if $flags =~ /m/;
cea2e8a9
GS
160 if ($flags =~ /s/) {
161 $retval = "STATIC $retval";
162 $func = "S_$func";
163 }
0cb96387 164 else {
1d7c1841 165 $retval = "PERL_CALLCONV $retval";
0cb96387
GS
166 if ($flags =~ /p/) {
167 $func = "Perl_$func";
168 }
cea2e8a9
GS
169 }
170 $ret .= "$retval\t$func(";
171 unless ($flags =~ /n/) {
172 $ret .= "pTHX";
173 $ret .= "_ " if @args;
174 }
175 if (@args) {
176 $ret .= join ", ", @args;
177 }
178 else {
179 $ret .= "void" if $flags =~ /n/;
180 }
181 $ret .= ")";
182 $ret .= " __attribute__((noreturn))" if $flags =~ /r/;
1c846c1f 183 if( $flags =~ /f/ ) {
894356b3 184 my $prefix = $flags =~ /n/ ? '' : 'pTHX_';
1c846c1f 185 my $args = scalar @args;
d5b3b440 186 $ret .= "\n#ifdef CHECK_FORMAT\n";
894356b3 187 $ret .= sprintf " __attribute__((format(printf,%s%d,%s%d)))",
1c846c1f 188 $prefix, $args - 1, $prefix, $args;
894356b3
GS
189 $ret .= "\n#endif\n";
190 }
af3c7592
NIS
191 $ret .= ";";
192 $ret .= ' */' if $flags =~ /m/;
193 $ret .= "\n";
cea2e8a9
GS
194 }
195 $ret;
196}
197
954c1994 198# generates global.sym (API export list), and populates %global with global symbols
cea2e8a9
GS
199sub write_global_sym {
200 my $ret = "";
201 if (@_ > 1) {
202 my ($flags,$retval,$func,@args) = @_;
af3c7592 203 if ($flags =~ /A/ && $flags !~ /[xm]/) { # public API, so export
cea2e8a9
GS
204 $func = "Perl_$func" if $flags =~ /p/;
205 $ret = "$func\n";
206 }
207 }
208 $ret;
209}
210
b445a7d9
SR
211walk_table(\&write_protos, "proto.h", undef);
212walk_table(\&write_global_sym, "global.sym", undef);
cea2e8a9 213
709f4e38
GS
214# XXX others that may need adding
215# warnhook
216# hints
217# copline
84fee439 218my @extvars = qw(sv_undef sv_yes sv_no na dowarn
1c846c1f 219 curcop compiling
84fee439 220 tainting tainted stack_base stack_sp sv_arenaroot
256a4781 221 no_modify
06492da6 222 curstash DBsub DBsingle DBassertion debstash
1c846c1f 223 rsfp
84fee439 224 stdingv
6b88bc9c
GS
225 defgv
226 errgv
3070f6ec
GS
227 rsfp_filters
228 perldb
709f4e38
GS
229 diehook
230 dirty
231 perl_destruct_level
ac634a9a 232 ppaddr
84fee439
NIS
233 );
234
5f05dabc 235sub readsyms (\%$) {
236 my ($syms, $file) = @_;
5f05dabc 237 local (*FILE, $_);
238 open(FILE, "< $file")
239 or die "embed.pl: Can't open $file: $!\n";
240 while (<FILE>) {
241 s/[ \t]*#.*//; # Delete comments.
242 if (/^\s*(\S+)\s*$/) {
22c35a8c
GS
243 my $sym = $1;
244 warn "duplicate symbol $sym while processing $file\n"
245 if exists $$syms{$sym};
246 $$syms{$sym} = 1;
5f05dabc 247 }
248 }
249 close(FILE);
250}
251
cea2e8a9
GS
252# Perl_pp_* and Perl_ck_* are in pp.sym
253readsyms my %ppsym, 'pp.sym';
5f05dabc 254
c6af7a1a
GS
255sub readvars(\%$$@) {
256 my ($syms, $file,$pre,$keep_pre) = @_;
d4cce5f1
NIS
257 local (*FILE, $_);
258 open(FILE, "< $file")
259 or die "embed.pl: Can't open $file: $!\n";
260 while (<FILE>) {
261 s/[ \t]*#.*//; # Delete comments.
51371543 262 if (/PERLVARA?I?C?\($pre(\w+)/) {
22c35a8c 263 my $sym = $1;
c6af7a1a 264 $sym = $pre . $sym if $keep_pre;
22c35a8c
GS
265 warn "duplicate symbol $sym while processing $file\n"
266 if exists $$syms{$sym};
51371543 267 $$syms{$sym} = $pre || 1;
d4cce5f1
NIS
268 }
269 }
270 close(FILE);
271}
272
273my %intrp;
274my %thread;
275
276readvars %intrp, 'intrpvar.h','I';
277readvars %thread, 'thrdvar.h','T';
22239a37 278readvars %globvar, 'perlvars.h','G';
d4cce5f1 279
4543f4c0
PP
280my $sym;
281foreach $sym (sort keys %thread) {
34b58025 282 warn "$sym in intrpvar.h as well as thrdvar.h\n" if exists $intrp{$sym};
51371543 283}
d4cce5f1 284
c6af7a1a
GS
285sub undefine ($) {
286 my ($sym) = @_;
287 "#undef $sym\n";
288}
289
5f05dabc 290sub hide ($$) {
291 my ($from, $to) = @_;
292 my $t = int(length($from) / 8);
293 "#define $from" . "\t" x ($t < 3 ? 3 - $t : 1) . "$to\n";
294}
c6af7a1a 295
6f4183fe 296sub bincompat_var ($$) {
51371543 297 my ($pfx, $sym) = @_;
acfe0abc 298 my $arg = ($pfx eq 'G' ? 'NULL' : 'aTHX');
c5be433b 299 undefine("PL_$sym") . hide("PL_$sym", "(*Perl_${pfx}${sym}_ptr($arg))");
c6af7a1a
GS
300}
301
d4cce5f1
NIS
302sub multon ($$$) {
303 my ($sym,$pre,$ptr) = @_;
3280af22 304 hide("PL_$sym", "($ptr$pre$sym)");
5f05dabc 305}
54aff467 306
d4cce5f1
NIS
307sub multoff ($$) {
308 my ($sym,$pre) = @_;
533c011a 309 return hide("PL_$pre$sym", "PL_$sym");
5f05dabc 310}
311
36bb303b 312safer_unlink 'embed.h';
cea2e8a9 313open(EM, '> embed.h') or die "Can't create embed.h: $!\n";
e50aee73 314
7f1be197 315print EM do_not_edit ("embed.h"), <<'END';
e50aee73
AD
316
317/* (Doing namespace management portably in C is really gross.) */
318
d51482e4
JH
319/* By defining PERL_NO_SHORT_NAMES (not done by default) the short forms
320 * (like warn instead of Perl_warn) for the API are not defined.
321 * Not defining the short forms is a good thing for cleaner embedding. */
322
323#ifndef PERL_NO_SHORT_NAMES
820c3be9 324
22c35a8c 325/* Hide global symbols */
5f05dabc 326
cea2e8a9 327#if !defined(PERL_IMPLICIT_CONTEXT)
e50aee73 328
e50aee73
AD
329END
330
cea2e8a9
GS
331walk_table {
332 my $ret = "";
333 if (@_ == 1) {
334 my $arg = shift;
12a98ad5 335 $ret .= "$arg\n" if $arg =~ /^#\s*(if|ifn?def|else|endif)\b/;
cea2e8a9
GS
336 }
337 else {
338 my ($flags,$retval,$func,@args) = @_;
af3c7592 339 unless ($flags =~ /[om]/) {
cea2e8a9
GS
340 if ($flags =~ /s/) {
341 $ret .= hide($func,"S_$func");
342 }
343 elsif ($flags =~ /p/) {
344 $ret .= hide($func,"Perl_$func");
345 }
346 }
47e67c64 347 if ($ret ne '' && $flags !~ /A/) {
de37762f
HS
348 if ($flags =~ /E/) {
349 $ret = "#if defined(PERL_CORE) || defined(PERL_EXT)\n$ret#endif\n";
350 } else {
351 $ret = "#ifdef PERL_CORE\n$ret#endif\n";
352 }
353 }
cea2e8a9
GS
354 }
355 $ret;
0ea9712b 356} \*EM, "";
cea2e8a9
GS
357
358for $sym (sort keys %ppsym) {
359 $sym =~ s/^Perl_//;
360 print EM hide($sym, "Perl_$sym");
361}
362
363print EM <<'END';
364
365#else /* PERL_IMPLICIT_CONTEXT */
366
367END
368
369my @az = ('a'..'z');
370
371walk_table {
372 my $ret = "";
373 if (@_ == 1) {
374 my $arg = shift;
12a98ad5 375 $ret .= "$arg\n" if $arg =~ /^#\s*(if|ifn?def|else|endif)\b/;
cea2e8a9
GS
376 }
377 else {
378 my ($flags,$retval,$func,@args) = @_;
af3c7592 379 unless ($flags =~ /[om]/) {
cea2e8a9
GS
380 my $args = scalar @args;
381 if ($args and $args[$args-1] =~ /\.\.\./) {
382 # we're out of luck for varargs functions under CPP
383 }
384 elsif ($flags =~ /n/) {
385 if ($flags =~ /s/) {
386 $ret .= hide($func,"S_$func");
387 }
388 elsif ($flags =~ /p/) {
389 $ret .= hide($func,"Perl_$func");
390 }
391 }
392 else {
393 my $alist = join(",", @az[0..$args-1]);
394 $ret = "#define $func($alist)";
395 my $t = int(length($ret) / 8);
396 $ret .= "\t" x ($t < 4 ? 4 - $t : 1);
397 if ($flags =~ /s/) {
398 $ret .= "S_$func(aTHX";
399 }
400 elsif ($flags =~ /p/) {
401 $ret .= "Perl_$func(aTHX";
402 }
403 $ret .= "_ " if $alist;
404 $ret .= $alist . ")\n";
405 }
406 }
de37762f
HS
407 unless ($flags =~ /A/) {
408 if ($flags =~ /E/) {
409 $ret = "#if defined(PERL_CORE) || defined(PERL_EXT)\n$ret#endif\n";
410 } else {
411 $ret = "#ifdef PERL_CORE\n$ret#endif\n";
412 }
413 }
cea2e8a9
GS
414 }
415 $ret;
0ea9712b 416} \*EM, "";
cea2e8a9
GS
417
418for $sym (sort keys %ppsym) {
419 $sym =~ s/^Perl_//;
420 if ($sym =~ /^ck_/) {
421 print EM hide("$sym(a)", "Perl_$sym(aTHX_ a)");
422 }
423 elsif ($sym =~ /^pp_/) {
424 print EM hide("$sym()", "Perl_$sym(aTHX)");
425 }
426 else {
427 warn "Illegal symbol '$sym' in pp.sym";
428 }
e50aee73
AD
429}
430
e50aee73
AD
431print EM <<'END';
432
cea2e8a9 433#endif /* PERL_IMPLICIT_CONTEXT */
22c35a8c 434
d51482e4 435#endif /* #ifndef PERL_NO_SHORT_NAMES */
35209cc8 436
22c35a8c
GS
437END
438
22c35a8c
GS
439print EM <<'END';
440
cea2e8a9
GS
441/* Compatibility stubs. Compile extensions with -DPERL_NOCOMPAT to
442 disable them.
443 */
444
538feb02 445#if !defined(PERL_CORE)
5bc28da9
NIS
446# define sv_setptrobj(rv,ptr,name) sv_setref_iv(rv,name,PTR2IV(ptr))
447# define sv_setptrref(rv,ptr) sv_setref_iv(rv,Nullch,PTR2IV(ptr))
538feb02 448#endif
cea2e8a9 449
08e5223a 450#if !defined(PERL_CORE) && !defined(PERL_NOCOMPAT)
cea2e8a9
GS
451
452/* Compatibility for various misnamed functions. All functions
453 in the API that begin with "perl_" (not "Perl_") take an explicit
454 interpreter context pointer.
455 The following are not like that, but since they had a "perl_"
456 prefix in previous versions, we provide compatibility macros.
457 */
65cec589
GS
458# define perl_atexit(a,b) call_atexit(a,b)
459# define perl_call_argv(a,b,c) call_argv(a,b,c)
460# define perl_call_pv(a,b) call_pv(a,b)
461# define perl_call_method(a,b) call_method(a,b)
462# define perl_call_sv(a,b) call_sv(a,b)
463# define perl_eval_sv(a,b) eval_sv(a,b)
464# define perl_eval_pv(a,b) eval_pv(a,b)
465# define perl_require_pv(a) require_pv(a)
466# define perl_get_sv(a,b) get_sv(a,b)
467# define perl_get_av(a,b) get_av(a,b)
468# define perl_get_hv(a,b) get_hv(a,b)
469# define perl_get_cv(a,b) get_cv(a,b)
470# define perl_init_i18nl10n(a) init_i18nl10n(a)
471# define perl_init_i18nl14n(a) init_i18nl14n(a)
472# define perl_new_ctype(a) new_ctype(a)
473# define perl_new_collate(a) new_collate(a)
474# define perl_new_numeric(a) new_numeric(a)
cea2e8a9
GS
475
476/* varargs functions can't be handled with CPP macros. :-(
477 This provides a set of compatibility functions that don't take
478 an extra argument but grab the context pointer using the macro
479 dTHX.
480 */
d51482e4 481#if defined(PERL_IMPLICIT_CONTEXT) && !defined(PERL_NO_SHORT_NAMES)
cea2e8a9 482# define croak Perl_croak_nocontext
c5be433b 483# define deb Perl_deb_nocontext
cea2e8a9
GS
484# define die Perl_die_nocontext
485# define form Perl_form_nocontext
e4783991 486# define load_module Perl_load_module_nocontext
5a844595 487# define mess Perl_mess_nocontext
cea2e8a9
GS
488# define newSVpvf Perl_newSVpvf_nocontext
489# define sv_catpvf Perl_sv_catpvf_nocontext
490# define sv_setpvf Perl_sv_setpvf_nocontext
491# define warn Perl_warn_nocontext
c5be433b 492# define warner Perl_warner_nocontext
cea2e8a9
GS
493# define sv_catpvf_mg Perl_sv_catpvf_mg_nocontext
494# define sv_setpvf_mg Perl_sv_setpvf_mg_nocontext
495#endif
496
497#endif /* !defined(PERL_CORE) && !defined(PERL_NOCOMPAT) */
498
499#if !defined(PERL_IMPLICIT_CONTEXT)
500/* undefined symbols, point them back at the usual ones */
501# define Perl_croak_nocontext Perl_croak
502# define Perl_die_nocontext Perl_die
c5be433b 503# define Perl_deb_nocontext Perl_deb
cea2e8a9 504# define Perl_form_nocontext Perl_form
e4783991 505# define Perl_load_module_nocontext Perl_load_module
5a844595 506# define Perl_mess_nocontext Perl_mess
c5be433b
GS
507# define Perl_newSVpvf_nocontext Perl_newSVpvf
508# define Perl_sv_catpvf_nocontext Perl_sv_catpvf
509# define Perl_sv_setpvf_nocontext Perl_sv_setpvf
cea2e8a9 510# define Perl_warn_nocontext Perl_warn
c5be433b 511# define Perl_warner_nocontext Perl_warner
cea2e8a9
GS
512# define Perl_sv_catpvf_mg_nocontext Perl_sv_catpvf_mg
513# define Perl_sv_setpvf_mg_nocontext Perl_sv_setpvf_mg
514#endif
db5cf5a9 515
d4cce5f1
NIS
516END
517
36bb303b 518close(EM) or die "Error closing EM: $!";
d4cce5f1 519
36bb303b 520safer_unlink 'embedvar.h';
d4cce5f1
NIS
521open(EM, '> embedvar.h')
522 or die "Can't create embedvar.h: $!\n";
523
7f1be197 524print EM do_not_edit ("embedvar.h"), <<'END';
d4cce5f1
NIS
525
526/* (Doing namespace management portably in C is really gross.) */
527
54aff467 528/*
3db8f154
MB
529 The following combinations of MULTIPLICITY and PERL_IMPLICIT_CONTEXT
530 are supported:
54aff467
GS
531 1) none
532 2) MULTIPLICITY # supported for compatibility
533 3) MULTIPLICITY && PERL_IMPLICIT_CONTEXT
54aff467
GS
534
535 All other combinations of these flags are errors.
536
3db8f154 537 only #3 is supported directly, while #2 is a special
54aff467
GS
538 case of #3 (supported by redefining vTHX appropriately).
539*/
cea2e8a9 540
54aff467 541#if defined(MULTIPLICITY)
3db8f154 542/* cases 2 and 3 above */
cea2e8a9 543
54aff467
GS
544# if defined(PERL_IMPLICIT_CONTEXT)
545# define vTHX aTHX
546# else
547# define vTHX PERL_GET_INTERP
548# endif
cea2e8a9 549
e50aee73
AD
550END
551
d4cce5f1 552for $sym (sort keys %thread) {
54aff467 553 print EM multon($sym,'T','vTHX->');
d4cce5f1
NIS
554}
555
556print EM <<'END';
557
54aff467 558/* cases 2 and 3 above */
55497cff 559
560END
760ac839 561
d4cce5f1 562for $sym (sort keys %intrp) {
54aff467 563 print EM multon($sym,'I','vTHX->');
d4cce5f1
NIS
564}
565
566print EM <<'END';
567
54aff467 568#else /* !MULTIPLICITY */
1d7c1841 569
3db8f154 570/* case 1 above */
5f05dabc 571
56d28764 572END
e50aee73 573
d4cce5f1 574for $sym (sort keys %intrp) {
54aff467 575 print EM multoff($sym,'I');
d4cce5f1
NIS
576}
577
578print EM <<'END';
579
d4cce5f1
NIS
580END
581
582for $sym (sort keys %thread) {
54aff467 583 print EM multoff($sym,'T');
d4cce5f1
NIS
584}
585
586print EM <<'END';
587
54aff467 588#endif /* MULTIPLICITY */
d4cce5f1 589
54aff467 590#if defined(PERL_GLOBAL_STRUCT)
22239a37
NIS
591
592END
593
594for $sym (sort keys %globvar) {
533c011a 595 print EM multon($sym,'G','PL_Vars.');
22239a37
NIS
596}
597
598print EM <<'END';
599
600#else /* !PERL_GLOBAL_STRUCT */
601
602END
603
604for $sym (sort keys %globvar) {
605 print EM multoff($sym,'G');
606}
607
608print EM <<'END';
609
22239a37
NIS
610#endif /* PERL_GLOBAL_STRUCT */
611
85add8c2 612#ifdef PERL_POLLUTE /* disabled by default in 5.6.0 */
84fee439
NIS
613
614END
615
616for $sym (sort @extvars) {
617 print EM hide($sym,"PL_$sym");
618}
619
620print EM <<'END';
621
db5cf5a9 622#endif /* PERL_POLLUTE */
84fee439
NIS
623END
624
36bb303b 625close(EM) or die "Error closing EM: $!";
c6af7a1a 626
36bb303b
NC
627safer_unlink 'perlapi.h';
628safer_unlink 'perlapi.c';
51371543
GS
629open(CAPI, '> perlapi.c') or die "Can't create perlapi.c: $!\n";
630open(CAPIH, '> perlapi.h') or die "Can't create perlapi.h: $!\n";
631
7f1be197 632print CAPIH do_not_edit ("perlapi.h"), <<'EOT';
51371543 633
51371543 634/* declare accessor functions for Perl variables */
6f4183fe
GS
635#ifndef __perlapi_h__
636#define __perlapi_h__
51371543 637
acfe0abc 638#if defined (MULTIPLICITY)
c5be433b 639
51371543
GS
640START_EXTERN_C
641
642#undef PERLVAR
643#undef PERLVARA
644#undef PERLVARI
645#undef PERLVARIC
acfe0abc 646#define PERLVAR(v,t) EXTERN_C t* Perl_##v##_ptr(pTHX);
51371543 647#define PERLVARA(v,n,t) typedef t PL_##v##_t[n]; \
acfe0abc 648 EXTERN_C PL_##v##_t* Perl_##v##_ptr(pTHX);
51371543 649#define PERLVARI(v,t,i) PERLVAR(v,t)
c5be433b 650#define PERLVARIC(v,t,i) PERLVAR(v, const t)
51371543
GS
651
652#include "thrdvar.h"
653#include "intrpvar.h"
654#include "perlvars.h"
655
656#undef PERLVAR
657#undef PERLVARA
658#undef PERLVARI
659#undef PERLVARIC
660
661END_EXTERN_C
662
682fc664 663#if defined(PERL_CORE)
6f4183fe 664
682fc664
GS
665/* accessor functions for Perl variables (provide binary compatibility) */
666
667/* these need to be mentioned here, or most linkers won't put them in
668 the perl executable */
669
670#ifndef PERL_NO_FORCE_LINK
671
672START_EXTERN_C
673
674#ifndef DOINIT
675EXT void *PL_force_link_funcs[];
676#else
677EXT void *PL_force_link_funcs[] = {
678#undef PERLVAR
679#undef PERLVARA
680#undef PERLVARI
681#undef PERLVARIC
ea1f607c 682#define PERLVAR(v,t) (void*)Perl_##v##_ptr,
682fc664
GS
683#define PERLVARA(v,n,t) PERLVAR(v,t)
684#define PERLVARI(v,t,i) PERLVAR(v,t)
685#define PERLVARIC(v,t,i) PERLVAR(v,t)
686
687#include "thrdvar.h"
688#include "intrpvar.h"
689#include "perlvars.h"
690
691#undef PERLVAR
692#undef PERLVARA
693#undef PERLVARI
694#undef PERLVARIC
695};
696#endif /* DOINIT */
697
acfe0abc 698END_EXTERN_C
682fc664
GS
699
700#endif /* PERL_NO_FORCE_LINK */
701
702#else /* !PERL_CORE */
51371543
GS
703
704EOT
705
4543f4c0 706foreach $sym (sort keys %intrp) {
6f4183fe
GS
707 print CAPIH bincompat_var('I',$sym);
708}
709
4543f4c0 710foreach $sym (sort keys %thread) {
6f4183fe
GS
711 print CAPIH bincompat_var('T',$sym);
712}
713
4543f4c0 714foreach $sym (sort keys %globvar) {
6f4183fe
GS
715 print CAPIH bincompat_var('G',$sym);
716}
717
718print CAPIH <<'EOT';
719
720#endif /* !PERL_CORE */
acfe0abc 721#endif /* MULTIPLICITY */
6f4183fe
GS
722
723#endif /* __perlapi_h__ */
724
725EOT
36bb303b 726close CAPIH or die "Error closing CAPIH: $!";
51371543 727
7f1be197 728print CAPI do_not_edit ("perlapi.c"), <<'EOT';
51371543
GS
729
730#include "EXTERN.h"
731#include "perl.h"
732#include "perlapi.h"
733
acfe0abc 734#if defined (MULTIPLICITY)
51371543
GS
735
736/* accessor functions for Perl variables (provides binary compatibility) */
737START_EXTERN_C
738
739#undef PERLVAR
740#undef PERLVARA
741#undef PERLVARI
742#undef PERLVARIC
6f4183fe 743
6f4183fe
GS
744#define PERLVAR(v,t) t* Perl_##v##_ptr(pTHX) \
745 { return &(aTHX->v); }
746#define PERLVARA(v,n,t) PL_##v##_t* Perl_##v##_ptr(pTHX) \
747 { return &(aTHX->v); }
6f4183fe 748
51371543 749#define PERLVARI(v,t,i) PERLVAR(v,t)
c5be433b 750#define PERLVARIC(v,t,i) PERLVAR(v, const t)
51371543
GS
751
752#include "thrdvar.h"
753#include "intrpvar.h"
c5be433b
GS
754
755#undef PERLVAR
756#undef PERLVARA
acfe0abc 757#define PERLVAR(v,t) t* Perl_##v##_ptr(pTHX) \
c5be433b 758 { return &(PL_##v); }
acfe0abc 759#define PERLVARA(v,n,t) PL_##v##_t* Perl_##v##_ptr(pTHX) \
c5be433b 760 { return &(PL_##v); }
34f7a5fe 761#undef PERLVARIC
acfe0abc 762#define PERLVARIC(v,t,i) const t* Perl_##v##_ptr(pTHX) \
34f7a5fe 763 { return (const t *)&(PL_##v); }
51371543
GS
764#include "perlvars.h"
765
766#undef PERLVAR
767#undef PERLVARA
768#undef PERLVARI
769#undef PERLVARIC
770
acfe0abc 771END_EXTERN_C
6f4183fe 772
acfe0abc 773#endif /* MULTIPLICITY */
51371543
GS
774EOT
775
36bb303b 776close(CAPI) or die "Error closing CAPI: $!";
acfe0abc 777
c5be433b 778# functions that take va_list* for implementing vararg functions
08cd8952 779# NOTE: makedef.pl must be updated if you add symbols to %vfuncs
acfe0abc 780# XXX %vfuncs currently unused
c5be433b
GS
781my %vfuncs = qw(
782 Perl_croak Perl_vcroak
783 Perl_warn Perl_vwarn
784 Perl_warner Perl_vwarner
785 Perl_die Perl_vdie
786 Perl_form Perl_vform
e4783991 787 Perl_load_module Perl_vload_module
5a844595 788 Perl_mess Perl_vmess
c5be433b
GS
789 Perl_deb Perl_vdeb
790 Perl_newSVpvf Perl_vnewSVpvf
791 Perl_sv_setpvf Perl_sv_vsetpvf
792 Perl_sv_setpvf_mg Perl_sv_vsetpvf_mg
793 Perl_sv_catpvf Perl_sv_vcatpvf
794 Perl_sv_catpvf_mg Perl_sv_vcatpvf_mg
795 Perl_dump_indent Perl_dump_vindent
796 Perl_default_protect Perl_vdefault_protect
797);