3 if test ! -f config.sh; then
5 ln ../../config.sh . || \
6 ln ../../../config.sh . || \
7 (echo "Can't find config.sh."; exit 1)
12 : This forces SH files to create target in same directory as SH file.
13 : This is so that make depend always knows where to find SH derivatives.
15 */*) cd `expr X$0 : 'X\(.*\)/'` ;;
17 echo "Extracting h2ph (with variable substitutions)"
18 : This section of the file will have variable substitutions done on it.
19 : Move anything that needs config subs from !NO!SUBS! section to !GROK!THIS!.
20 : Protect any dollar signs and backticks that you do not want interpreted
21 : by putting a backslash in front. You may delete these comments.
23 $spitshell >h2ph <<!GROK!THIS!
29 \$perlincl = '$archlibexp';
32 : In the following dollars and backticks do not need the extra backslash.
33 $spitshell >>h2ph <<'!NO!SUBS!'
35 chdir '/usr/include' || die "Can't cd /usr/include";
37 @isatype = split(' ',<<END);
45 @isatype{@isatype} = (1) x @isatype;
47 @ARGV = ('-') unless @ARGV;
49 foreach $file (@ARGV) {
55 ($outfile = $file) =~ s/\.h$/.ph/ || next;
56 print "$file -> $outfile\n";
57 if ($file =~ m|^(.*)/|) {
59 if (!-d "$perlincl/$dir") {
60 mkdir("$perlincl/$dir",0777);
63 open(IN,"$file") || ((warn "Can't open $file: $!\n"),next);
64 open(OUT,">$perlincl/$outfile") || die "Can't create $outfile: $!\n";
75 s/\200[^\201]*\201//g; # delete single line comments
76 if (s/\200.*//) { # begin multi-line comment?
83 if (s/^define\s+(\w+)//) {
87 if (s/^\(([\w,\s]*)\)//) {
90 foreach $arg (split(/,\s*/,$args)) {
91 $arg =~ s/^\s*([^\s].*[^\s])\s*$/$1/;
94 $args =~ s/\b(\w)/\$$1/g;
95 $args = "local($args) = \@_;\n$t ";
99 $new =~ s/(["\\])/\\$1/g;
101 $new =~ s/(['\\])/\\$1/g;
103 "eval 'sub $name {\n$t ${args}eval \"$new\";\n$t}';\n";
106 print OUT "sub $name {\n ${args}eval \"$new\";\n}\n";
113 $new = 1 if $new eq '';
115 $new =~ s/(['\\])/\\$1/g;
116 print OUT $t,"eval 'sub $name {",$new,";}';\n";
119 print OUT $t,"sub $name {",$new,";}\n";
123 elsif (/^include\s+<(.*)>/) {
124 ($incl = $1) =~ s/\.h$/.ph/;
125 print OUT $t,"require '$incl';\n";
127 elsif (/^ifdef\s+(\w+)/) {
128 print OUT $t,"if (defined &$1) {\n";
130 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
132 elsif (/^ifndef\s+(\w+)/) {
133 print OUT $t,"if (!defined &$1) {\n";
135 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
140 print OUT $t,"if ($new) {\n";
142 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
144 elsif (s/^elif\s+//) {
148 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
149 print OUT $t,"}\n${t}elsif ($new) {\n";
151 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
155 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
156 print OUT $t,"}\n${t}else {\n";
158 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
162 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
172 s/^(\s+)// && do {$new .= ' '; next;};
173 s/^(0x[0-9a-fA-F]+)// && do {$new .= $1; next;};
174 s/^(\d+)// && do {$new .= $1; next;};
175 s/^("(\\"|[^"])*")// && do {$new .= $1; next;};
176 s/^'((\\"|[^"])*)'// && do {
178 $new .= "ord('\$$1')";
185 s/^sizeof\s*\(([^)]+)\)/{$1}/ && do {
189 s/^([_a-zA-Z]\w*)// && do {
191 if ($id eq 'struct') {
196 elsif ($id eq 'unsigned') {
204 elsif ($id eq 'defined') {
208 s/^\((\w),/("$1",/ if $id =~ /^_IO[WR]*$/i; # cheat
211 elsif ($isatype{$id}) {
212 if ($new =~ /{\s*$/) {
215 elsif ($new =~ /\(\s*$/ && /^[\s*]*\)/) {
228 s/^(.)// && do {$new .= $1; next;};
231 ##############################################################################
233 # These next few lines are legal in both Perl and nroff.
237 'di \" finish diversion--previous line must be blank
238 .nr nl 0-1 \" fake up transition to first page again
239 .nr % 0 \" start at page 1
240 '; __END__ ############# From here on it's a standard manual page ############
241 .TH H2PH 1 "August 8, 1990"
244 h2ph \- convert .h C header files to .ph Perl header files
246 .B h2ph [headerfiles]
249 converts any C header files specified to the corresponding Perl header file
251 It is most easily run while in /usr/include:
254 cd /usr/include; h2ph * sys/*
257 If run with no arguments, filters standard input to standard output.
259 No environment variables are used.
271 The usual warnings if it can't read or write the files involved.
273 Doesn't construct the %sizeof array for you.
275 It doesn't handle all C constructs, but it does attempt to isolate
276 definitions inside evals so that you can get at the definitions
277 that it can translate.
279 It's only intended as a rough tool.
280 You may need to dicker with the files produced.