This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
for pod/perlfaq2.pod against latest snapshot for Alpaca
[perl5.git] / embed.pl
index 548294a..2f2072d 100755 (executable)
--- a/embed.pl
+++ b/embed.pl
@@ -3,6 +3,11 @@
 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,
@@ -13,11 +18,30 @@ require 5.003;      # keep this compatible, an old perl is all we may have before
 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';
+    } elsif ($file eq 'embedvar.h') {
+        $years = '1999, 2000, 2001, 2002, 2003';
+    } elsif ($file eq 'global.sym') {
+        $years = '1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003';
+    } elsif ($file eq 'perlapi.c') {
+        $years = '1999, 2000, 2001';
+    } elsif ($file eq 'perlapi.h') {
+        $years = '1999, 2000, 2001, 2002, 2003';
+    } elsif ($file eq 'proto.h') {
+        $years = '1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003';
+    }
+
+    $years =~ s/1999,/1999,\n  / if length $years > 40;
+
     my $warning = <<EOW;
 
    $file
 
-   Copyright (c) 1997-2002, Larry Wall
+   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.
@@ -32,14 +56,14 @@ Edit those files and run 'make regen_headers' to effect changes.
 EOW
 
     if ($file =~ m:\.[ch]$:) {
-$warning =~ s:^: * :gm;
-$warning =~ s: +$::gm;
-$warning =~ s: :/:;
-$warning =~ s:$:/:;
+       $warning =~ s:^: * :gm;
+       $warning =~ s: +$::gm;
+       $warning =~ s: :/:;
+       $warning =~ s:$:/:;
     }
     else {
-$warning =~ s:^:# :gm;
-$warning =~ s: +$::gm;
+       $warning =~ s:^:# :gm;
+       $warning =~ s: +$::gm;
     }
     $warning;
 } # do_not_edit
@@ -51,7 +75,8 @@ open IN, "embed.fnc" or die $!;
 sub walk_table (&@) {
     my $function = shift;
     my $filename = shift || '-';
-    my $leader = shift || do_not_edit ($filename);
+    my $leader = shift;
+    defined $leader or $leader = do_not_edit ($filename);
     my $trailer = shift;
     my $F;
     local *F;
@@ -59,7 +84,7 @@ sub walk_table (&@) {
        $F = $filename;
     }
     else {
-       unlink $filename;
+       safer_unlink $filename;
        open F, ">$filename" or die "Can't open $filename: $!";
        $F = \*F;
     }
@@ -83,7 +108,9 @@ sub walk_table (&@) {
         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 () {
@@ -96,7 +123,7 @@ sub munge_c_files () {
        if (@_ > 1) {
            $functions->{$_[2]} = \@_ if $_[@_-1] =~ /\.\.\./;
        }
-    } '/dev/null';
+    } '/dev/null', '';
     local $^I = '.bak';
     while (<>) {
 #      if (/^#\s*include\s+"perl.h"/) {
@@ -175,10 +202,8 @@ sub write_protos {
        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/;
@@ -192,16 +217,17 @@ sub write_global_sym {
     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");
-walk_table(\&write_global_sym, "global.sym");
+walk_table(\&write_protos,     "proto.h", undef);
+walk_table(\&write_global_sym, "global.sym", undef);
 
 # XXX others that may need adding
 #       warnhook
@@ -211,7 +237,7 @@ my @extvars = qw(sv_undef sv_yes sv_no na dowarn
                  curcop compiling
                  tainting tainted stack_base stack_sp sv_arenaroot
                 no_modify
-                 curstash DBsub DBsingle debstash
+                 curstash DBsub DBsingle DBassertion debstash
                  rsfp
                  stdingv
                 defgv
@@ -301,14 +327,18 @@ sub multoff ($$) {
     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";
 
 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 */
 
@@ -332,9 +362,16 @@ walk_table {
                $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_//;
@@ -385,9 +422,16 @@ walk_table {
                $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_//;
@@ -406,6 +450,8 @@ print EM <<'END';
 
 #endif /* PERL_IMPLICIT_CONTEXT */
 
+#endif /* #ifndef PERL_NO_SHORT_NAMES */
+
 END
 
 print EM <<'END';
@@ -450,7 +496,7 @@ 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
@@ -487,9 +533,9 @@ print EM <<'END';
 
 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";
 
@@ -594,10 +640,10 @@ print EM <<'END';
 #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";
 open(CAPIH, '> perlapi.h') or die "Can't create perlapi.h: $!\n";
 
@@ -695,7 +741,7 @@ print CAPIH <<'EOT';
 #endif /* __perlapi_h__ */
 
 EOT
-close CAPIH;
+close CAPIH or die "Error closing CAPIH: $!";
 
 print CAPI do_not_edit ("perlapi.c"), <<'EOT';
 
@@ -745,7 +791,7 @@ END_EXTERN_C
 #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