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.
22 $spitshell >h2ph <<!GROK!THIS!
27 \$perlincl = '$privlib';
30 : In the following dollars and backticks do not need the extra backslash.
31 $spitshell >>h2ph <<'!NO!SUBS!'
33 chdir '/usr/include' || die "Can't cd /usr/include";
35 @isatype = split(' ',<<END);
43 $isatype{@isatype} = (1) x @isatype;
45 @ARGV = ('-') unless @ARGV;
47 foreach $file (@ARGV) {
53 ($outfile = $file) =~ s/\.h$/.ph/ || next;
54 print "$file -> $outfile\n";
55 if ($file =~ m|^(.*)/|) {
57 if (!-d "$perlincl/$dir") {
58 mkdir("$perlincl/$dir",0777);
61 open(IN,"$file") || ((warn "Can't open $file: $!\n"),next);
62 open(OUT,">$perlincl/$outfile") || die "Can't create $outfile: $!\n";
73 s/\200[^\201]*\201//g; # delete single line comments
74 if (s/\200.*//) { # begin multi-line comment?
81 if (s/^define\s+(\w+)//) {
85 if (s/^\(([\w,\s]*)\)//) {
88 foreach $arg (split(/,\s*/,$args)) {
91 $args =~ s/\b(\w)/\$$1/g;
92 $args = "local($args) = \@_;\n$t ";
96 $new =~ s/(["\\])/\\$1/g;
98 $new =~ s/(['\\])/\\$1/g;
100 "eval 'sub $name {\n$t ${args}eval \"$new\";\n$t}';\n";
103 print OUT "sub $name {\n ${args}eval \"$new\";\n}\n";
110 $new = 1 if $new eq '';
112 $new =~ s/(['\\])/\\$1/g;
113 print OUT $t,"eval 'sub $name {",$new,";}';\n";
116 print OUT $t,"sub $name {",$new,";}\n";
120 elsif (/^include <(.*)>/) {
121 ($incl = $1) =~ s/\.h$/.ph/;
122 print OUT $t,"require '$incl';\n";
124 elsif (/^ifdef\s+(\w+)/) {
125 print OUT $t,"if (defined &$1) {\n";
127 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
129 elsif (/^ifndef\s+(\w+)/) {
130 print OUT $t,"if (!defined &$1) {\n";
132 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
137 print OUT $t,"if ($new) {\n";
139 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
141 elsif (s/^elif\s+//) {
145 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
146 print OUT $t,"}\n${t}elsif ($new) {\n";
148 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
152 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
153 print OUT $t,"}\n${t}else {\n";
155 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
159 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
169 s/^(\s+)// && do {$new .= ' '; next;};
170 s/^(0x[0-9a-fA-F]+)// && do {$new .= $1; next;};
171 s/^(\d+)// && do {$new .= $1; next;};
172 s/^("(\\"|[^"])*")// && do {$new .= $1; next;};
173 s/^'((\\"|[^"])*)'// && do {
175 $new .= "ord('\$$1')";
182 s/^sizeof\s*\(([^)]+)\)/{$1}/ && do {
186 s/^([_a-zA-Z]\w*)// && do {
188 if ($id eq 'struct') {
193 elsif ($id eq 'unsigned') {
201 elsif ($id eq 'defined') {
205 s/^\((\w),/("$1",/ if $id =~ /^_IO[WR]*$/i; # cheat
208 elsif ($isatype{$id}) {
209 if ($new =~ /{\s*$/) {
212 elsif ($new =~ /\(\s*$/ && /^[\s*]*\)/) {
225 s/^(.)// && do {$new .= $1; next;};
228 ##############################################################################
230 # These next few lines are legal in both Perl and nroff.
234 'di \" finish diversion--previous line must be blank
235 .nr nl 0-1 \" fake up transition to first page again
236 .nr % 0 \" start at page 1
237 '; __END__ ############# From here on it's a standard manual page ############
238 .TH H2PH 1 "August 8, 1990"
241 h2ph \- convert .h C header files to .ph Perl header files
243 .B h2ph [headerfiles]
246 converts any C header files specified to the corresponding Perl header file
248 It is most easily run while in /usr/include:
251 cd /usr/include; h2ph * sys/*
254 If run with no arguments, filters standard input to standard output.
256 No environment variables are used.
268 The usual warnings if it can't read or write the files involved.
270 Doesn't construct the %sizeof array for you.
272 It doesn't handle all C constructs, but it does attempt to isolate
273 definitions inside evals so that you can get at the definitions
274 that it can translate.
276 It's only intended as a rough tool.
277 You may need to dicker with the files produced.