require 5.003; # keep this compatible, an old perl is all we may have before
# we build the new one
+BEGIN {
+ # Get function prototypes
+ require 'regen_lib.pl';
+}
+
#
# See database of global and static function prototypes in embed.fnc
# This is used to generate prototype headers under various configurations,
# implicit interpreter context argument.
#
+sub do_not_edit ($)
+{
+ my $file = shift;
+
+ my $years;
+
+ if ($file eq 'embed.h') {
+ $years = '1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004';
+ } elsif ($file eq 'embedvar.h') {
+ $years = '1999, 2000, 2001, 2002, 2003, 2004';
+ } elsif ($file eq 'global.sym') {
+ $years = '1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004';
+ } elsif ($file eq 'perlapi.c') {
+ $years = '1999, 2000, 2001';
+ } elsif ($file eq 'perlapi.h') {
+ $years = '1999, 2000, 2001, 2002, 2003, 2004';
+ } elsif ($file eq 'proto.h') {
+ $years = '1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004';
+ }
+
+ $years =~ s/1999,/1999,\n / if length $years > 40;
+
+ my $warning = <<EOW;
+
+ $file
+
+ Copyright (C) $years, by Larry Wall and others
+
+ You may distribute under the terms of either the GNU General Public
+ License or the Artistic License, as specified in the README file.
+
+!!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+This file is built by embed.pl from data in embed.fnc, embed.pl,
+pp.sym, intrpvar.h, perlvars.h and thrdvar.h.
+Any changes made here will be lost!
+
+Edit those files and run 'make regen_headers' to effect changes.
+
+EOW
+
+ $warning .= <<EOW if $file eq 'perlapi.c';
+
+Up to the threshold of the door there mounted a flight of twenty-seven
+broad stairs, hewn by some unknown art of the same black stone. This
+was the only entrance to the tower.
+
+
+EOW
+
+ if ($file =~ m:\.[ch]$:) {
+ $warning =~ s:^: * :gm;
+ $warning =~ s: +$::gm;
+ $warning =~ s: :/:;
+ $warning =~ s:$:/:;
+ }
+ else {
+ $warning =~ s:^:# :gm;
+ $warning =~ s: +$::gm;
+ }
+ $warning;
+} # do_not_edit
+
open IN, "embed.fnc" or die $!;
# walk table providing an array of components in each line to
my $function = shift;
my $filename = shift || '-';
my $leader = shift;
+ defined $leader or $leader = do_not_edit ($filename);
my $trailer = shift;
my $F;
local *F;
$F = $filename;
}
else {
- unlink $filename;
+ safer_unlink $filename;
open F, ">$filename" or die "Can't open $filename: $!";
+ binmode F;
$F = \*F;
}
print $F $leader if $leader;
$_ .= <IN>;
chomp;
}
+ s/\s+$//;
my @args;
if (/^\s*(#|$)/) {
@args = $_;
print $F @outs; # $function->(@args) is not 5.003
}
print $F $trailer if $trailer;
- close $F unless ref $filename;
+ unless (ref $filename) {
+ close $F or die "Error closing $filename: $!";
+ }
}
sub munge_c_files () {
if (@_ > 1) {
$functions->{$_[2]} = \@_ if $_[@_-1] =~ /\.\.\./;
}
- } '/dev/null';
+ } '/dev/null', '';
local $^I = '.bak';
while (<>) {
# if (/^#\s*include\s+"perl.h"/) {
if( $flags =~ /f/ ) {
my $prefix = $flags =~ /n/ ? '' : 'pTHX_';
my $args = scalar @args;
- $ret .= "\n#ifdef CHECK_FORMAT\n";
- $ret .= sprintf " __attribute__((format(printf,%s%d,%s%d)))",
+ $ret .= sprintf "\n\t__attribute__format__(__printf__,%s%d,%s%d)",
$prefix, $args - 1, $prefix, $args;
- $ret .= "\n#endif\n";
}
$ret .= ";";
$ret .= ' */' if $flags =~ /m/;
my $ret = "";
if (@_ > 1) {
my ($flags,$retval,$func,@args) = @_;
- if ($flags =~ /A/ && $flags !~ /[xm]/) { # public API, so export
- $func = "Perl_$func" if $flags =~ /p/;
+ if ($flags =~ /[AX]/ && $flags !~ /[xm]/
+ || $flags =~ /b/) { # public API, so export
+ $func = "Perl_$func" if $flags =~ /[pbX]/;
$ret = "$func\n";
}
}
$ret;
}
-
-walk_table(\&write_protos, 'proto.h', <<'EOT');
-/*
- * proto.h
- *
- * Copyright (c) 1997-2002, Larry Wall
- *
- * You may distribute under the terms of either the GNU General Public
- * License or the Artistic License, as specified in the README file.
- *
- * !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
- * This file is autogenerated from data in embed.pl. Edit that file
- * and run 'make regen_headers' to effect changes.
- */
-
-EOT
-
-walk_table(\&write_global_sym, 'global.sym', <<'EOT');
-#
-# global.sym
-#
-# Copyright (c) 1997-2002, Larry Wall
-#
-# You may distribute under the terms of either the GNU General Public
-# License or the Artistic License, as specified in the README file.
-#
-# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is autogenerated from data in embed.pl. Edit that file
-# and run 'make regen_headers' to effect changes.
-#
-
-EOT
+walk_table(\&write_protos, "proto.h", undef);
+walk_table(\&write_global_sym, "global.sym", undef);
# XXX others that may need adding
# warnhook
curcop compiling
tainting tainted stack_base stack_sp sv_arenaroot
no_modify
- curstash DBsub DBsingle debstash
+ curstash DBsub DBsingle DBassertion debstash
rsfp
stdingv
defgv
return hide("PL_$pre$sym", "PL_$sym");
}
-unlink 'embed.h';
+safer_unlink 'embed.h';
open(EM, '> embed.h') or die "Can't create embed.h: $!\n";
+binmode EM;
-print EM <<'END';
-/*
- * embed.h
- *
- * Copyright (c) 1997-2002, Larry Wall
- *
- * You may distribute under the terms of either the GNU General Public
- * License or the Artistic License, as specified in the README file.
- *
- * !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
- * This file is built by embed.pl from data in embed.pl, pp.sym, intrpvar.h,
- * perlvars.h and thrdvar.h. Any changes made here will be lost!
- */
+print EM do_not_edit ("embed.h"), <<'END';
/* (Doing namespace management portably in C is really gross.) */
-/* NO_EMBED is no longer supported. i.e. EMBED is always active. */
+/* By defining PERL_NO_SHORT_NAMES (not done by default) the short forms
+ * (like warn instead of Perl_warn) for the API are not defined.
+ * Not defining the short forms is a good thing for cleaner embedding. */
+
+#ifndef PERL_NO_SHORT_NAMES
/* Hide global symbols */
$ret .= hide($func,"Perl_$func");
}
}
+ if ($ret ne '' && $flags !~ /A/) {
+ if ($flags =~ /E/) {
+ $ret = "#if defined(PERL_CORE) || defined(PERL_EXT)\n$ret#endif\n";
+ } else {
+ $ret = "#ifdef PERL_CORE\n$ret#endif\n";
+ }
+ }
}
$ret;
-} \*EM;
+} \*EM, "";
for $sym (sort keys %ppsym) {
$sym =~ s/^Perl_//;
$ret .= $alist . ")\n";
}
}
+ unless ($flags =~ /A/) {
+ if ($flags =~ /E/) {
+ $ret = "#if defined(PERL_CORE) || defined(PERL_EXT)\n$ret#endif\n";
+ } else {
+ $ret = "#ifdef PERL_CORE\n$ret#endif\n";
+ }
+ }
}
$ret;
-} \*EM;
+} \*EM, "";
for $sym (sort keys %ppsym) {
$sym =~ s/^Perl_//;
#endif /* PERL_IMPLICIT_CONTEXT */
+#endif /* #ifndef PERL_NO_SHORT_NAMES */
+
END
print EM <<'END';
an extra argument but grab the context pointer using the macro
dTHX.
*/
-#if defined(PERL_IMPLICIT_CONTEXT)
+#if defined(PERL_IMPLICIT_CONTEXT) && !defined(PERL_NO_SHORT_NAMES)
# define croak Perl_croak_nocontext
# define deb Perl_deb_nocontext
# define die Perl_die_nocontext
END
-close(EM);
+close(EM) or die "Error closing EM: $!";
-unlink 'embedvar.h';
+safer_unlink 'embedvar.h';
open(EM, '> embedvar.h')
or die "Can't create embedvar.h: $!\n";
+binmode EM;
-print EM <<'END';
-/*
- * embedvar.h
- *
- * Copyright (c) 1997-2002, Larry Wall
- *
- * You may distribute under the terms of either the GNU General Public
- * License or the Artistic License, as specified in the README file.
- *
- *
- * !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
- * This file is built by embed.pl from data in embed.pl, pp.sym, intrpvar.h,
- * perlvars.h and thrdvar.h. Any changes made here will be lost!
- */
+print EM do_not_edit ("embedvar.h"), <<'END';
/* (Doing namespace management portably in C is really gross.) */
#endif /* PERL_POLLUTE */
END
-close(EM);
+close(EM) or die "Error closing EM: $!";
-unlink 'perlapi.h';
-unlink 'perlapi.c';
+safer_unlink 'perlapi.h';
+safer_unlink 'perlapi.c';
open(CAPI, '> perlapi.c') or die "Can't create perlapi.c: $!\n";
+binmode CAPI;
open(CAPIH, '> perlapi.h') or die "Can't create perlapi.h: $!\n";
+binmode CAPIH;
-print CAPIH <<'EOT';
-/*
- * perlapi.h
- *
- * Copyright (c) 1997-2002, Larry Wall
- *
- * You may distribute under the terms of either the GNU General Public
- * License or the Artistic License, as specified in the README file.
- *
- *
- * !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
- * This file is built by embed.pl from data in embed.pl, pp.sym, intrpvar.h,
- * perlvars.h and thrdvar.h. Any changes made here will be lost!
- */
+print CAPIH do_not_edit ("perlapi.h"), <<'EOT';
/* declare accessor functions for Perl variables */
#ifndef __perlapi_h__
#endif /* __perlapi_h__ */
EOT
-close CAPIH;
+close CAPIH or die "Error closing CAPIH: $!";
-print CAPI <<'EOT';
-/*
- * perlapi.c
- *
- * Copyright (c) 1997-2002, Larry Wall
- *
- * You may distribute under the terms of either the GNU General Public
- * License or the Artistic License, as specified in the README file.
- *
- *
- * !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
- * This file is built by embed.pl from data in embed.pl, pp.sym, intrpvar.h,
- * perlvars.h and thrdvar.h. Any changes made here will be lost!
- */
+print CAPI do_not_edit ("perlapi.c"), <<'EOT';
#include "EXTERN.h"
#include "perl.h"
#endif /* MULTIPLICITY */
EOT
-close(CAPI);
+close(CAPI) or die "Error closing CAPI: $!";
# functions that take va_list* for implementing vararg functions
# NOTE: makedef.pl must be updated if you add symbols to %vfuncs