#!/usr/bin/perl -w require 5.003; sub readsyms (\%$) { my ($syms, $file) = @_; %$syms = (); local (*FILE, $_); open(FILE, "< $file") or die "embed.pl: Can't open $file: $!\n"; while () { 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, interp.sym, and compat3.sym. Any changes made here will be lost! */ /* (Doing namespace management portably in C is really gross.) */ /* EMBED has no run-time penalty, but helps keep the Perl namespace from colliding with that used by other libraries pulled in by extensions or by embedding perl. Allow a cc -DNO_EMBED override, however, to keep binary compatability with previous versions of perl. */ #ifndef NO_EMBED # define EMBED 1 #endif /* Hide global symbols? */ #ifdef EMBED END for $sym (sort keys %global) { print EM embed($sym) unless $compat3{$sym}; } 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? */ #ifdef MULTIPLICITY END for $sym (sort keys %interp) { print EM multon($sym); } print EM <<'END'; #else /* !MULTIPLICITY */ END for $sym (sort keys %interp) { print EM multoff($sym); } print EM <<'END'; /* Hide interpreter-specific symbols? */ #ifdef EMBED END for $sym (sort keys %interp) { print EM embed($sym) if $compat3{$sym}; } 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 */ END