4 use File::Basename qw(basename dirname);
7 # List explicitly here the variables you want Configure to
8 # generate. Metaconfig only looks for shell variables, so you
9 # have to mention them as if they were shell variables, not
10 # %Config entries. Thus you write
12 # to ensure Configure will look for $Config{startperl}.
15 # This forces PL files to create target in same directory as PL file.
16 # This is so that make depend always knows where to find PL derivatives.
19 $file = basename($0, '.PL');
20 $file .= '.com' if $^O eq 'VMS';
22 open OUT,">$file" or die "Can't create $file: $!";
24 print "Extracting $file (with variable substitutions)\n";
26 # In this section, perl variables will be expanded during extraction.
27 # You can use $Config{...} to use Configure variables.
29 print OUT <<"!GROK!THIS!";
31 eval 'exec $Config{perlpath} -S \$0 \${1+"\$@"}'
32 if \$running_under_some_shell;
35 # In the following, perl variables are not expanded during extraction.
37 print OUT <<'!NO!SUBS!';
42 use File::Path qw(mkpath);
45 # Make sure read permissions for all are set:
46 if (defined umask && (umask() & 0444)) {
47 umask (umask() & ~0444);
51 use vars qw($opt_D $opt_d $opt_r $opt_l $opt_h $opt_a $opt_Q $opt_e);
52 die "-r and -a options are mutually exclusive\n" if ($opt_r and $opt_a);
53 my @inc_dirs = inc_dirs() if $opt_a;
57 my $Dest_dir = $opt_d || $Config{installsitearch};
58 die "Destination directory $Dest_dir doesn't exist or isn't a directory\n"
71 @isatype{@isatype} = (1) x @isatype;
76 @ARGV = ('-') unless @ARGV;
78 build_preamble_if_necessary();
87 my ($t, $tab, %curargs, $new, $eval_index, $dir, $name, $args, $outfile);
88 my ($incl, $incl_type, $next);
89 while (defined (my $file = next_file())) {
90 if (-l $file and -d $file) {
91 link_if_possible($file) if ($opt_l);
95 # Recover from header files with unbalanced cpp directives
99 # $eval_index goes into ``#line'' directives, to help locate syntax errors:
106 ($outfile = $file) =~ s/\.h$/.ph/ || next;
107 print "$file -> $outfile\n" unless $opt_Q;
108 if ($file =~ m|^(.*)/|) {
110 mkpath "$Dest_dir/$dir";
113 if ($opt_a) { # automagic mode: locate header file in @inc_dirs
114 foreach (@inc_dirs) {
120 open(IN,"$file") || (($Exit = 1),(warn "Can't open $file: $!\n"),next);
121 open(OUT,">$Dest_dir/$outfile") || die "Can't create $outfile: $!\n";
125 "require '_h2ph_pre.ph';\n\n",
126 "no warnings 'redefine';\n\n";
128 while (defined (local $_ = next_line($file))) {
130 if (s/^define\s+(\w+)//) {
134 s/\(\w+\s*\(\*\)\s*\(\w*\)\)\s*(-?\d+)/$1/; # (int (*)(foo_t))0
135 if (s/^\(([\w,\s]*)\)//) {
140 foreach my $arg (split(/,\s*/,$args)) {
141 $arg =~ s/^\s*([^\s].*[^\s])\s*$/$1/;
144 $args =~ s/\b(\w)/\$$1/g;
145 $args = "my($args) = \@_;\n$t ";
149 $new =~ s/(["\\])/\\$1/g; #"]);
151 $new = reindent($new);
152 $args = reindent($args);
154 $new =~ s/(['\\])/\\$1/g; #']);
157 "eval \"\\n#line $eval_index $outfile\\n\" . 'sub $name $proto\{\n$t ${args}eval q($new);\n$t}' unless defined(\&$name);\n";
161 "eval 'sub $name $proto\{\n$t ${args}eval q($new);\n$t}' unless defined(\&$name);\n";
164 print OUT "unless(defined(\&$name)) {\n sub $name $proto\{\n\t${args}eval q($new);\n }\n}\n";
170 $new = 1 if $new eq '';
171 $new = reindent($new);
172 $args = reindent($args);
174 $new =~ s/(['\\])/\\$1/g; #']);
177 print OUT $t,"eval \"\\n#line $eval_index $outfile\\n\" . 'sub $name () {",$new,";}' unless defined(\&$name);\n";
180 print OUT $t,"eval 'sub $name () {",$new,";}' unless defined(\&$name);\n";
183 # Shunt around such directives as `#define FOO FOO':
184 next if " \&$name" eq $new;
186 print OUT $t,"unless(defined(\&$name)) {\n sub $name () {\t",$new,";}\n}\n";
189 } elsif (/^(include|import|include_next)\s*[<\"](.*)[>\"]/) {
192 if (($incl_type eq 'include_next') ||
193 ($opt_e && exists($bad_file{$incl}))) {
194 $incl =~ s/\.h$/.ph/;
198 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
199 print OUT ($t, "my(\@REM);\n");
200 if ($incl_type eq 'include_next') {
202 "my(\%INCD) = map { \$INC{\$_} => 1 } ",
203 "(grep { \$_ eq \"$incl\" } ",
206 "\@REM = map { \"\$_/$incl\" } ",
207 "(grep { not exists(\$INCD{\"\$_/$incl\"})",
208 " and -f \"\$_/$incl\" } \@INC);\n");
211 "\@REM = map { \"\$_/$incl\" } ",
212 "(grep {-r \"\$_/$incl\" } \@INC);\n");
215 "require \"\$REM[0]\" if \@REM;\n");
217 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
221 "warn(\$\@) if \$\@;\n");
223 $incl =~ s/\.h$/.ph/;
224 print OUT $t,"require '$incl';\n";
226 } elsif (/^ifdef\s+(\w+)/) {
227 print OUT $t,"if(defined(&$1)) {\n";
229 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
230 } elsif (/^ifndef\s+(\w+)/) {
231 print OUT $t,"unless(defined(&$1)) {\n";
233 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
234 } elsif (s/^if\s+//) {
239 print OUT $t,"if($new) {\n";
241 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
242 } elsif (s/^elif\s+//) {
248 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
249 print OUT $t,"}\n elsif($new) {\n";
251 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
254 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
255 print OUT $t,"} else {\n";
257 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
260 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
262 } elsif(/^undef\s+(\w+)/) {
263 print OUT $t, "undef(&$1) if defined(&$1);\n";
264 } elsif(/^error\s+(".*")/) {
265 print OUT $t, "die($1);\n";
266 } elsif(/^error\s+(.*)/) {
267 print OUT $t, "die(\"", quotemeta($1), "\");\n";
268 } elsif(/^warning\s+(.*)/) {
269 print OUT $t, "warn(\"", quotemeta($1), "\");\n";
270 } elsif(/^ident\s+(.*)/) {
271 print OUT $t, "# $1\n";
273 } elsif (/^\s*(typedef\s*)?enum\s*(\s+[a-zA-Z_]\w*\s*)?/) { # { for vi
274 until(/\{[^}]*\}.*;/ || /;/) {
275 last unless defined ($next = next_line($file));
277 # drop "#define FOO FOO" in enums
278 $next =~ s/^\s*#\s*define\s+(\w+)\s+\1\s*$//;
279 # #defines in enums (aliases)
280 $next =~ s/^\s*#\s*define\s+(\w+)\s+(\w+)\s*$/$1 = $2,/;
282 print OUT "# $next\n" if $opt_D;
284 s/#\s*if.*?#\s*endif//g; # drop #ifdefs
287 next unless /^\s?(typedef\s?)?enum\s?([a-zA-Z_]\w*)?\s?\{(.*)\}\s?([a-zA-Z_]\w*)?\s?;/;
288 (my $enum_subs = $3) =~ s/\s//g;
289 my @enum_subs = split(/,/, $enum_subs);
291 foreach my $enum (@enum_subs) {
292 my ($enum_name, $enum_value) = $enum =~ /^([a-zA-Z_]\w*)(=.+)?$/;
294 $enum_value =~ s/^=//;
295 $enum_val = (length($enum_value) ? $enum_value : $enum_val + 1);
298 "eval(\"\\n#line $eval_index $outfile\\n",
299 "sub $enum_name () \{ $enum_val; \}\") ",
300 "unless defined(\&$enum_name);\n");
304 "eval(\"sub $enum_name () \{ $enum_val; \}\") ",
305 "unless defined(\&$enum_name);\n");
308 } elsif (/^(?:__extension__\s+)?(?:extern|static)\s+(?:__)?inline(?:__)?\s+/
309 and !/;\s*$/ and !/{\s*}\s*$/)
311 # This is a hack to parse the inline functions in the glibc headers.
312 # Warning: massive kludge ahead. We suppose inline functions
313 # are mainly constructed like macros.
315 last unless defined ($next = next_line($file));
317 undef $_, last if $next =~ /__THROW\s*;/
318 or $next =~ /^(__extension__|extern|static)\b/;
320 print OUT "# $next\n" if $opt_D;
321 last if $next =~ /^}|^{.*}\s*$/;
323 next if not defined; # because it's only a prototype
324 s/\b(__extension__|extern|static|(?:__)?inline(?:__)?)\b//g;
325 # violently drop #ifdefs
326 s/#\s*if.*?#\s*endif//g
327 and print OUT "# some #ifdef were dropped here -- fill in the blanks\n";
328 if (s/^(?:\w|\s|\*)*\s(\w+)\s*//) {
331 warn "name not found"; next; # shouldn't occur...
334 if (s/^\(([^()]*)\)\s*(\w+\s*)*//) {
335 for my $arg (split /,/, $1) {
336 if ($arg =~ /(\w+)\s*$/) {
344 ? "my(" . (join ',', map "\$$_", @args) . ") = \@_;\n$t "
347 my $proto = @args ? '' : '() ';
349 s/\breturn\b//g; # "return" doesn't occur in macros usually...
351 # try to find and perlify local C variables
352 our @local_variables = (); # needs to be a our(): (?{...}) bug workaround
355 my $typelist = join '|', keys %isatype;
357 (?:(?:__)?const(?:__)?\s+)?
358 (?:(?:un)?signed\s+)?
362 (?{ push @local_variables, $1 })
366 (?:(?:__)?const(?:__)?\s+)?
367 (?:(?:un)?signed\s+)?
371 (?{ push @local_variables, $1 })
375 $new =~ s/&$_\b/\$$_/g for @local_variables;
376 $new =~ s/(["\\])/\\$1/g; #"]);
377 # now that's almost like a macro (we hope)
381 $Is_converted{$file} = 1;
382 if ($opt_e && exists($bad_file{$file})) {
383 unlink($Dest_dir . '/' . $outfile);
387 queue_includes_from($file) if $opt_a;
391 if ($opt_e && (scalar(keys %bad_file) > 0)) {
392 warn "Was unable to convert the following files:\n";
393 warn "\t" . join("\n\t",sort(keys %bad_file)) . "\n";
399 $new = '"(assembly code)"' and return if /\b__asm__\b/; # freak out.
402 $joined_args = join('|', keys(%curargs));
405 s/^\&\&// && do { $new .= " &&"; next;}; # handle && operator
406 s/^\&([\(a-z\)]+)/$1/i; # hack for things that take the address of
407 s/^(\s+)// && do {$new .= ' '; next;};
408 s/^0X([0-9A-F]+)[UL]*//i
411 if (length $hex > 8 && !$Config{use64bitint}) {
412 # Croak if nv_preserves_uv_bits < 64 ?
413 $new .= hex(substr($hex, -8)) +
414 2**32 * hex(substr($hex, 0, -8));
415 # The above will produce "errorneus" code
416 # if the hex constant was e.g. inside UINT64_C
417 # macro, but then again, h2ph is an approximation.
419 $new .= lc("0x$hex");
422 s/^(-?\d+\.\d+E[-+]?\d+)[FL]?//i && do {$new .= $1; next;};
423 s/^(\d+)\s*[LU]*//i && do {$new .= $1; next;};
424 s/^("(\\"|[^"])*")// && do {$new .= $1; next;};
425 s/^'((\\"|[^"])*)'// && do {
427 $new .= "ord('\$$1')";
433 # replace "sizeof(foo)" with "{foo}"
434 # also, remove * (C dereference operator) to avoid perl syntax
435 # problems. Where the %sizeof array comes from is anyone's
436 # guess (c2ph?), but this at least avoids fatal syntax errors.
437 # Behavior is undefined if sizeof() delimiters are unbalanced.
438 # This code was modified to able to handle constructs like this:
439 # sizeof(*(p)), which appear in the HP-UX 10.01 header files.
440 s/^sizeof\s*\(// && do {
442 my $lvl = 1; # already saw one open paren
443 # tack { on the front, and skip it in the loop
446 # find balanced closing paren
447 while ($index <= length($_) && $lvl > 0) {
448 $lvl++ if substr($_, $index, 1) eq "(";
449 $lvl-- if substr($_, $index, 1) eq ")";
452 # tack } on the end, replacing )
453 substr($_, $index - 1, 1) = "}";
454 # remove pesky * operators within the sizeof argument
455 substr($_, 0, $index - 1) =~ s/\*//g;
459 /\(([\w\s]+)[\*\s]*\)\s*[\w\(]/ && do {
461 foreach (split /\s+/, $1) { # Make sure all the words are types,
462 unless($isatype{$_} or $_ eq 'struct' or $_ eq 'union'){
468 s/\([\w\s]+[\*\s]*\)// && next; # then eliminate them.
471 # struct/union member, including arrays:
472 s/^([_A-Z]\w*(\[[^\]]+\])?((\.|->)[_A-Z]\w*(\[[^\]]+\])?)+)//i && do {
474 $id =~ s/(\.|(->))([^\.\-]*)/->\{$3\}/g;
475 $id =~ s/\b([^\$])($joined_args)/$1\$$2/g if length($joined_args);
476 while($id =~ /\[\s*([^\$\&\d\]]+)\]/) {
479 if(exists($curargs{$index})) {
484 $id =~ s/\[\s*([^\$\&\d\]]+)\]/[$index]/;
488 s/^([_a-zA-Z]\w*)// && do {
490 if ($id eq 'struct' || $id eq 'union') {
494 } elsif ($id =~ /^((un)?signed)|(long)|(short)$/) {
495 while (s/^\s+(\w+)//) { $id .= ' ' . $1; }
500 $new .= '->' if /^[\[\{]/;
501 } elsif ($id eq 'defined') {
504 s/^\s*\((\w),/("$1",/ if $id =~ /^_IO[WR]*$/i; # cheat
506 } elsif ($isatype{$id}) {
507 if ($new =~ /{\s*$/) {
509 } elsif ($new =~ /\(\s*$/ && /^[\s*]*\)/) {
513 $new .= q(').$id.q(');
516 if ($inif && $new !~ /defined\s*\($/) {
517 $new .= '(defined(&' . $id . ') ? &' . $id . ' : undef)';
526 s/^(.)// && do { if ($1 ne '#') { $new .= $1; } next;};
535 my $pre_sub_tri_graphs = 1;
537 READ: while (not eof IN) {
540 next unless length $in;
543 if ($pre_sub_tri_graphs) {
544 # Preprocess all tri-graphs
545 # including things stuck in quoted string constants.
546 $in =~ s/\?\?=/#/g; # | ??=| #|
547 $in =~ s/\?\?\!/|/g; # | ??!| ||
548 $in =~ s/\?\?'/^/g; # | ??'| ^|
549 $in =~ s/\?\?\(/[/g; # | ??(| [|
550 $in =~ s/\?\?\)/]/g; # | ??)| ]|
551 $in =~ s/\?\?\-/~/g; # | ??-| ~|
552 $in =~ s/\?\?\//\\/g; # | ??/| \|
553 $in =~ s/\?\?</{/g; # | ??<| {|
554 $in =~ s/\?\?>/}/g; # | ??>| }|
556 if ($in =~ /^\#ifdef __LANGUAGE_PASCAL__/) {
557 # Tru64 disassembler.h evilness: mixed C and Pascal.
564 if ($in =~ /^extern inline / && # Inlined assembler.
565 $^O eq 'linux' && $file =~ m!(?:^|/)asm/[^/]+\.h$!) {
572 if ($in =~ s/\\$//) { # \-newline
575 } elsif ($in =~ s/^([^"'\\\/]+)//) { # Passthrough
577 } elsif ($in =~ s/^(\\.)//) { # \...
579 } elsif ($in =~ /^'/) { # '...
580 if ($in =~ s/^('(\\.|[^'\\])*')//) {
585 } elsif ($in =~ /^"/) { # "...
586 if ($in =~ s/^("(\\.|[^"\\])*")//) {
591 } elsif ($in =~ s/^\/\/.*//) { # //...
593 } elsif ($in =~ m/^\/\*/) { # /*...
594 # C comment removal adapted from perlfaq6:
595 if ($in =~ s/^\/\*[^*]*\*+([^\/*][^*]*\*+)*\///) {
597 } else { # Incomplete /* */
600 } elsif ($in =~ s/^(\/)//) { # /...
602 } elsif ($in =~ s/^([^\'\"\\\/]+)//) {
604 } elsif ($^O eq 'linux' &&
605 $file =~ m!(?:^|/)linux/byteorder/pdp_endian\.h$! &&
606 $in =~ s!\'T KNOW!!) {
607 $out =~ s!I DON$!I_DO_NOT_KNOW!;
610 warn "Cannot parse $file:\n$in\n";
611 $bad_file{$file} = 1;
616 die "Cannot parse:\n$in\n";
621 last READ if $out =~ /\S/;
628 # Handle recursive subdirectories without getting a grotesquely big stack.
629 # Could this be implemented using File::Find?
637 if ($file eq '-' or -f $file or -l $file) {
643 print STDERR "Skipping directory `$file'\n";
648 print STDERR "Skipping `$file': not a file or directory\n";
656 # Put all the files in $directory into @ARGV for processing.
659 my ($directory) = @_;
661 $directory =~ s:/$::;
663 opendir DIR, $directory;
664 foreach (readdir DIR) {
665 next if ($_ eq '.' or $_ eq '..');
667 # expand_glob() is going to be called until $ARGV[0] isn't a
668 # directory; so push directories, and unshift everything else.
669 if (-d "$directory/$_") { push @ARGV, "$directory/$_" }
670 else { unshift @ARGV, "$directory/$_" }
676 # Given $file, a symbolic link to a directory in the C include directory,
677 # make an equivalent symbolic link in $Dest_dir, if we can figure out how.
678 # Otherwise, just duplicate the file or directory.
682 my $target = eval 'readlink($dirlink)';
684 if ($target =~ m:^\.\./: or $target =~ m:^/:) {
685 # The target of a parent or absolute link could leave the $Dest_dir
686 # hierarchy, so let's put all of the contents of $dirlink (actually,
687 # the contents of $target) into @ARGV; as a side effect down the
688 # line, $dirlink will get created as an _actual_ directory.
689 expand_glob($dirlink);
691 if (-l "$Dest_dir/$dirlink") {
692 unlink "$Dest_dir/$dirlink" or
693 print STDERR "Could not remove link $Dest_dir/$dirlink: $!\n";
696 if (eval 'symlink($target, "$Dest_dir/$dirlink")') {
697 print "Linking $target -> $Dest_dir/$dirlink\n";
699 # Make sure that the link _links_ to something:
700 if (! -e "$Dest_dir/$target") {
701 mkpath("$Dest_dir/$target", 0755) or
702 print STDERR "Could not create $Dest_dir/$target/\n";
705 print STDERR "Could not symlink $target -> $Dest_dir/$dirlink: $!\n";
711 # Push all #included files in $file onto our stack, except for STDIN
712 # and files we've already processed.
713 sub queue_includes_from
718 return if ($file eq "-");
720 open HEADER, $file or return;
721 while (defined($line = <HEADER>)) {
722 while (/\\$/) { # Handle continuation lines
727 if ($line =~ /^#\s*include\s+<(.*?)>/) {
728 push(@ARGV, $1) unless $Is_converted{$1};
735 # Determine include directories; $Config{usrinc} should be enough for (all
736 # non-GCC?) C compilers, but gcc uses an additional include directory.
739 my $from_gcc = `LC_ALL=C $Config{cc} -v 2>&1`;
740 if( !( $from_gcc =~ s:^Reading specs from (.*?)/specs\b.*:$1/include:s ) )
742 $from_gcc = `LC_ALL=C $Config{cc} -print-search-dirs 2>&1`;
743 if ( !($from_gcc =~ s/^install:\s*([^\s]+[^\s\/])([\s\/]*).*$/$1\/include/s) )
748 length($from_gcc) ? ($from_gcc, $Config{usrinc}) : ($Config{usrinc});
752 # Create "_h2ph_pre.ph", if it doesn't exist or was built by a different
754 sub build_preamble_if_necessary
756 # Increment $VERSION every time this function is modified:
758 my $preamble = "$Dest_dir/_h2ph_pre.ph";
760 # Can we skip building the preamble file?
762 # Extract version number from first line of preamble:
763 open PREAMBLE, $preamble or die "Cannot open $preamble: $!";
764 my $line = <PREAMBLE>;
765 $line =~ /(\b\d+\b)/;
766 close PREAMBLE or die "Cannot close $preamble: $!";
768 # Don't build preamble if a compatible preamble exists:
769 return if $1 == $VERSION;
772 my (%define) = _extract_cc_defines();
774 open PREAMBLE, ">$preamble" or die "Cannot open $preamble: $!";
775 print PREAMBLE "# This file was created by h2ph version $VERSION\n";
777 foreach (sort keys %define) {
779 print PREAMBLE "# $_=$define{$_}\n";
781 if ($define{$_} =~ /^\((.*)\)$/) {
782 # parenthesized value: d=(v)
785 if ($define{$_} =~ /^([+-]?(\d+)?\.\d+([eE][+-]?\d+)?)[FL]?$/) {
788 "unless (defined &$_) { sub $_() { $1 } }\n\n";
789 } elsif ($define{$_} =~ /^([+-]?\d+)U?L{0,2}$/i) {
792 "unless (defined &$_) { sub $_() { $1 } }\n\n";
793 } elsif ($define{$_} =~ /^\w+$/) {
795 "unless (defined &$_) { sub $_() { &$define{$_} } }\n\n";
798 "unless (defined &$_) { sub $_() { \"",
799 quotemeta($define{$_}), "\" } }\n\n";
802 close PREAMBLE or die "Cannot close $preamble: $!";
806 # %Config contains information on macros that are pre-defined by the
807 # system's compiler. We need this information to make the .ph files
808 # function with perl as the .h files do with cc.
809 sub _extract_cc_defines
812 my $allsymbols = join " ",
813 @Config{'ccsymbols', 'cppsymbols', 'cppccsymbols'};
815 # Split compiler pre-definitions into `key=value' pairs:
816 while ($allsymbols =~ /([^\s]+)=((\\\s|[^\s])+)/g) {
819 print STDERR "$_: $1 -> $2\n";
829 ##############################################################################
834 h2ph - convert .h C header files to .ph Perl header files
838 B<h2ph [-d destination directory] [-r | -a] [-l] [headerfiles]>
843 converts any C header files specified to the corresponding Perl header file
845 It is most easily run while in /usr/include:
847 cd /usr/include; h2ph * sys/*
851 cd /usr/include; h2ph * sys/* arpa/* netinet/*
855 cd /usr/include; h2ph -r -l .
857 The output files are placed in the hierarchy rooted at Perl's
858 architecture dependent library directory. You can specify a different
859 hierarchy with a B<-d> switch.
861 If run with no arguments, filters standard input to standard output.
867 =item -d destination_dir
869 Put the resulting B<.ph> files beneath B<destination_dir>, instead of
870 beneath the default Perl library location (C<$Config{'installsitsearch'}>).
874 Run recursively; if any of B<headerfiles> are directories, then run I<h2ph>
875 on all files in those directories (and their subdirectories, etc.). B<-r>
876 and B<-a> are mutually exclusive.
880 Run automagically; convert B<headerfiles>, as well as any B<.h> files
881 which they include. This option will search for B<.h> files in all
882 directories which your C compiler ordinarily uses. B<-a> and B<-r> are
887 Symbolic links will be replicated in the destination directory. If B<-l>
888 is not specified, then links are skipped over.
892 Put ``hints'' in the .ph files which will help in locating problems with
893 I<h2ph>. In those cases when you B<require> a B<.ph> file containing syntax
894 errors, instead of the cryptic
896 [ some error condition ] at (eval mmm) line nnn
898 you will see the slightly more helpful
900 [ some error condition ] at filename.ph line nnn
902 However, the B<.ph> files almost double in size when built using B<-h>.
906 Include the code from the B<.h> file as a comment in the B<.ph> file.
907 This is primarily used for debugging I<h2ph>.
911 ``Quiet'' mode; don't print out the names of the files being converted.
917 No environment variables are used.
936 The usual warnings if it can't read or write the files involved.
940 Doesn't construct the %sizeof array for you.
942 It doesn't handle all C constructs, but it does attempt to isolate
943 definitions inside evals so that you can get at the definitions
944 that it can translate.
946 It's only intended as a rough tool.
947 You may need to dicker with the files produced.
949 You have to run this program by hand; it's not run as part of the Perl
952 Doesn't handle complicated expressions built piecemeal, a la:
962 Doesn't necessarily locate all of your C compiler's internally-defined
969 close OUT or die "Can't close $file: $!";
970 chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
971 exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';