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 = '$installprivlib';
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)) {
89 $arg =~ s/^\s*([^\s].*[^\s])\s*$/$1/;
92 $args =~ s/\b(\w)/\$$1/g;
93 $args = "local($args) = \@_;\n$t ";
97 $new =~ s/(["\\])/\\$1/g;
99 $new =~ s/(['\\])/\\$1/g;
101 "eval 'sub $name {\n$t ${args}eval \"$new\";\n$t}';\n";
104 print OUT "sub $name {\n ${args}eval \"$new\";\n}\n";
111 $new = 1 if $new eq '';
113 $new =~ s/(['\\])/\\$1/g;
114 print OUT $t,"eval 'sub $name {",$new,";}';\n";
117 print OUT $t,"sub $name {",$new,";}\n";
121 elsif (/^include\s+<(.*)>/) {
122 ($incl = $1) =~ s/\.h$/.ph/;
123 print OUT $t,"require '$incl';\n";
125 elsif (/^ifdef\s+(\w+)/) {
126 print OUT $t,"if (defined &$1) {\n";
128 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
130 elsif (/^ifndef\s+(\w+)/) {
131 print OUT $t,"if (!defined &$1) {\n";
133 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
138 print OUT $t,"if ($new) {\n";
140 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
142 elsif (s/^elif\s+//) {
146 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
147 print OUT $t,"}\n${t}elsif ($new) {\n";
149 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
153 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
154 print OUT $t,"}\n${t}else {\n";
156 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
160 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
170 s/^(\s+)// && do {$new .= ' '; next;};
171 s/^(0x[0-9a-fA-F]+)// && do {$new .= $1; next;};
172 s/^(\d+)// && do {$new .= $1; next;};
173 s/^("(\\"|[^"])*")// && do {$new .= $1; next;};
174 s/^'((\\"|[^"])*)'// && do {
176 $new .= "ord('\$$1')";
183 s/^sizeof\s*\(([^)]+)\)/{$1}/ && do {
187 s/^([_a-zA-Z]\w*)// && do {
189 if ($id eq 'struct') {
194 elsif ($id eq 'unsigned') {
202 elsif ($id eq 'defined') {
206 s/^\((\w),/("$1",/ if $id =~ /^_IO[WR]*$/i; # cheat
209 elsif ($isatype{$id}) {
210 if ($new =~ /{\s*$/) {
213 elsif ($new =~ /\(\s*$/ && /^[\s*]*\)/) {
226 s/^(.)// && do {$new .= $1; next;};
229 ##############################################################################
231 # These next few lines are legal in both Perl and nroff.
235 'di \" finish diversion--previous line must be blank
236 .nr nl 0-1 \" fake up transition to first page again
237 .nr % 0 \" start at page 1
238 '; __END__ ############# From here on it's a standard manual page ############
239 .TH H2PH 1 "August 8, 1990"
242 h2ph \- convert .h C header files to .ph Perl header files
244 .B h2ph [headerfiles]
247 converts any C header files specified to the corresponding Perl header file
249 It is most easily run while in /usr/include:
252 cd /usr/include; h2ph * sys/*
255 If run with no arguments, filters standard input to standard output.
257 No environment variables are used.
269 The usual warnings if it can't read or write the files involved.
271 Doesn't construct the %sizeof array for you.
273 It doesn't handle all C constructs, but it does attempt to isolate
274 definitions inside evals so that you can get at the definitions
275 that it can translate.
277 It's only intended as a rough tool.
278 You may need to dicker with the files produced.