[inseparable changes from patch from perl5.003_11 to perl5.003_12]
[p5sagit/p5-mst-13.2.git] / embed.pl
index a1e77db..266a33e 100755 (executable)
--- a/embed.pl
+++ b/embed.pl
@@ -1,12 +1,52 @@
-#!/usr/bin/perl
+#!/usr/bin/perl -w
 
-unlink "embed.h";
-open(EM, ">embed.h") || die "Can't create embed.h: $!\n";
+require 5.003;
+
+sub readsyms (\%$) {
+    my ($syms, $file) = @_;
+    %$syms = ();
+    local (*FILE, $_);
+    open(FILE, "< $file")
+       or die "embed.pl: Can't open $file: $!\n";
+    while (<FILE>) {
+       s/[ \t]*#.*//;          # Delete comments.
+       if (/^\s*(\S+)\s*$/) {
+           $$syms{$1} = 1;
+       }
+    }
+    close(FILE);
+}
+
+readsyms %global, 'global.sym';
+readsyms %interp, 'interp.sym';
+readsyms %compat3, 'compat3.sym';
+
+sub hide ($$) {
+    my ($from, $to) = @_;
+    my $t = int(length($from) / 8);
+    "#define $from" . "\t" x ($t < 3 ? 3 - $t : 1) . "$to\n";
+}
+sub embed ($) {
+    my ($sym) = @_;
+    hide($sym, "Perl_$sym");
+}
+sub multon ($) {
+    my ($sym) = @_;
+    hide($sym, "(curinterp->I$sym)");
+}
+sub multoff ($) {
+    my ($sym) = @_;
+    hide("I$sym", $sym);
+}
+
+unlink 'embed.h';
+open(EM, '> embed.h')
+    or die "Can't create embed.h: $!\n";
 
 print EM <<'END';
 /* !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-   This file is built by embed.pl from global.sym and interp.sym.
-   Any changes made here will be lost 
+   This file is built by embed.pl from global.sym, interp.sym,
+   and compat3.sym.  Any changes made here will be lost!
 */
 
 /* (Doing namespace management portably in C is really gross.) */
@@ -21,78 +61,82 @@ print EM <<'END';
 #  define EMBED 1 
 #endif
 
+/* Hide global symbols? */
+
 #ifdef EMBED
 
-/* globals we need to hide from the world */
 END
 
-open(GL, "<global.sym") || die "Can't open global.sym: $!\n";
-
-while(<GL>) {
-       s/[ \t]*#.*//;          # Delete comments.
-       next unless /\S/;
-       s/^\s*(\S+).*$/#define $1\t\tPerl_$1/;
-       $global{$1} = 1; 
-       s/(................\t)\t/$1/;
-       print EM $_;
+for $sym (sort keys %global) {
+    print EM embed($sym) unless $compat3{$sym};
 }
 
-close(GL) || warn "Can't close global.sym: $!\n";
+print EM <<'END';
+
+/* Hide global symbols that 5.003 revealed? */
+
+#ifndef BINCOMPAT3
+
+END
+
+for $sym (sort keys %global) {
+    print EM embed($sym) if $compat3{$sym};
+}
 
 print EM <<'END';
 
+#endif /* !BINCOMPAT3 */
+
 #endif /* EMBED */
 
-/* Put interpreter specific symbols into a struct? */
+/* Put interpreter-specific symbols into a struct? */
 
 #ifdef MULTIPLICITY
 
 END
 
-open(INT, "<interp.sym") || die "Can't open interp.sym: $!\n";
-while (<INT>) {
-       s/[ \t]*#.*//;          # Delete comments.
-       next unless /\S/;
-       s/^\s*(\S+).*$/#define $1\t\t(curinterp->I$1)/;
-       s/(................\t)\t/$1/;
-       print EM $_;
+for $sym (sort keys %interp) {
+    print EM multon($sym);
 }
-close(INT) || warn "Can't close interp.sym: $!\n";
 
 print EM <<'END';
 
-#else  /* not multiple, so translate interpreter symbols the other way... */
+#else  /* !MULTIPLICITY */
 
 END
 
-open(INT, "<interp.sym") || die "Can't open interp.sym: $!\n";
-while (<INT>) {
-       s/[ \t]*#.*//;          # Delete comments.
-       next unless /\S/;
-       s/^\s*(\S+).*$/#define I$1\t\t$1/;
-       s/(................\t)\t/$1/;
-       print EM $_;
+for $sym (sort keys %interp) {
+    print EM multoff($sym);
 }
-close(INT) || warn "Can't close interp.sym: $!\n";
 
 print EM <<'END';
 
+/* Hide interpreter-specific symbols? */
+
 #ifdef EMBED
 
 END
 
-open(INT, "<interp.sym") || die "Can't open interp.sym: $!\n";
-while (<INT>) {
-       s/[ \t]*#.*//;          # Delete comments.
-       next unless /\S/;
-       s/^\s*(\S+).*$/#define $1\t\tPerl_$1/;
-       s/(................\t)\t/$1/;
-       print EM $_;
+for $sym (sort keys %interp) {
+    print EM embed($sym) if $compat3{$sym};
 }
-close(INT) || warn "Can't close interp.sym: $!\n";
 
 print EM <<'END';
 
+/* Hide interpreter symbols that 5.003 revealed? */
+
+#ifndef BINCOMPAT3
+
+END
+
+for $sym (sort keys %interp) {
+    print EM embed($sym) unless $compat3{$sym};
+}
+
+print EM <<'END';
+
+#endif /* !BINCOMPAT3 */
+
 #endif /* EMBED */
 
 #endif /* MULTIPLICITY */