summaryrefslogtreecommitdiff
path: root/embed.pl
blob: 266a33e7e0a2537e1c3d1d85bdbf915a3c8aa0f6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#!/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 (<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, 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