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!';
39 BEGIN { pop @INC if $INC[-1] eq '.' }
44 use File::Path qw(mkpath);
47 # Make sure read permissions for all are set:
48 if (defined umask && (umask() & 0444)) {
49 umask (umask() & ~0444);
53 use vars qw($opt_D $opt_d $opt_r $opt_l $opt_h $opt_a $opt_Q $opt_e);
54 die "-r and -a options are mutually exclusive\n" if ($opt_r and $opt_a);
55 my @inc_dirs = inc_dirs() if $opt_a;
59 my $Dest_dir = $opt_d || $Config{installsitearch};
60 die "Destination directory $Dest_dir doesn't exist or isn't a directory\n"
73 @isatype{@isatype} = (1) x @isatype;
78 @ARGV = ('-') unless @ARGV;
80 build_preamble_if_necessary();
89 my ($t, $tab, %curargs, $new, $eval_index, $dir, $name, $args, $outfile);
90 my ($incl, $incl_type, $incl_quote, $next);
91 while (defined (my $file = next_file())) {
92 if (-l $file and -d $file) {
93 link_if_possible($file) if ($opt_l);
97 # Recover from header files with unbalanced cpp directives
101 # $eval_index goes into '#line' directives, to help locate syntax errors:
108 ($outfile = $file) =~ s/\.h$/.ph/ || next;
109 print "$file -> $outfile\n" unless $opt_Q;
110 if ($file =~ m|^(.*)/|) {
112 mkpath "$Dest_dir/$dir";
115 if ($opt_a) { # automagic mode: locate header file in @inc_dirs
116 foreach (@inc_dirs) {
122 open(IN,"$file") || (($Exit = 1),(warn "Can't open $file: $!\n"),next);
123 open(OUT,">$Dest_dir/$outfile") || die "Can't create $outfile: $!\n";
127 "require '_h2ph_pre.ph';\n\n",
128 "no warnings qw(redefine misc);\n\n";
130 while (defined (local $_ = next_line($file))) {
132 if (s/^define\s+(\w+)//) {
136 s/\(\w+\s*\(\*\)\s*\(\w*\)\)\s*(-?\d+)/$1/; # (int (*)(foo_t))0
137 if (s/^\(([\w,\s]*)\)//) {
142 foreach my $arg (split(/,\s*/,$args)) {
143 $arg =~ s/^\s*([^\s].*[^\s])\s*$/$1/;
146 $args =~ s/\b(\w)/\$$1/g;
147 $args = "my($args) = \@_;\n$t ";
151 $new =~ s/(["\\])/\\$1/g; #"]);
157 $new = 1 if $new eq '';
159 # Shunt around such directives as '#define FOO FOO':
160 next if $new =~ /^\s*&\Q$name\E\s*\z/;
162 $new = reindent($new);
163 $args = reindent($args);
164 $new =~ s/(['\\])/\\$1/g; #']);
166 print OUT $t, 'eval ';
168 print OUT "\"\\n#line $eval_index $outfile\\n\" . ";
171 print OUT "'sub $name () {$new;}' unless defined(&$name);\n";
173 } elsif (/^(include|import|include_next)\s*([<\"])(.*)[>\"]/) {
177 if (($incl_type eq 'include_next') ||
178 ($opt_e && exists($bad_file{$incl}))) {
179 $incl =~ s/\.h$/.ph/;
183 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
184 print OUT ($t, "my(\@REM);\n");
185 if ($incl_type eq 'include_next') {
187 "my(\%INCD) = map { \$INC{\$_} => 1 } ",
188 "(grep { \$_ eq \"$incl\" } ",
191 "\@REM = map { \"\$_/$incl\" } ",
192 "(grep { not exists(\$INCD{\"\$_/$incl\"})",
193 " and -f \"\$_/$incl\" } \@INC);\n");
196 "\@REM = map { \"\$_/$incl\" } ",
197 "(grep {-r \"\$_/$incl\" } \@INC);\n");
200 "require \"\$REM[0]\" if \@REM;\n");
202 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
206 "warn(\$\@) if \$\@;\n");
208 $incl =~ s/\.h$/.ph/;
209 # copy the prefix in the quote syntax (#include "x.h") case
210 if ($incl !~ m|/| && $incl_quote eq q{"} && $file =~ m|^(.*)/|) {
213 print OUT $t,"require '$incl';\n";
215 } elsif (/^ifdef\s+(\w+)/) {
216 print OUT $t,"if(defined(&$1)) {\n";
218 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
219 } elsif (/^ifndef\s+(\w+)/) {
220 print OUT $t,"unless(defined(&$1)) {\n";
222 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
223 } elsif (s/^if\s+//) {
228 print OUT $t,"if($new) {\n";
230 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
231 } elsif (s/^elif\s+//) {
237 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
238 print OUT $t,"}\n elsif($new) {\n";
240 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
243 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
244 print OUT $t,"} else {\n";
246 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
249 $t = "\t" x ($tab / 8) . ' ' x ($tab % 8);
251 } elsif(/^undef\s+(\w+)/) {
252 print OUT $t, "undef(&$1) if defined(&$1);\n";
253 } elsif(/^error\s+(".*")/) {
254 print OUT $t, "die($1);\n";
255 } elsif(/^error\s+(.*)/) {
256 print OUT $t, "die(\"", quotemeta($1), "\");\n";
257 } elsif(/^warning\s+(.*)/) {
258 print OUT $t, "warn(\"", quotemeta($1), "\");\n";
259 } elsif(/^ident\s+(.*)/) {
260 print OUT $t, "# $1\n";
262 } elsif (/^\s*(typedef\s*)?enum\s*(\s+[a-zA-Z_]\w*\s*)?/) { # { for vi
263 until(/\{[^}]*\}.*;/ || /;/) {
264 last unless defined ($next = next_line($file));
266 # drop "#define FOO FOO" in enums
267 $next =~ s/^\s*#\s*define\s+(\w+)\s+\1\s*$//;
268 # #defines in enums (aliases)
269 $next =~ s/^\s*#\s*define\s+(\w+)\s+(\w+)\s*$/$1 = $2,/;
271 print OUT "# $next\n" if $opt_D;
273 s/#\s*if.*?#\s*endif//g; # drop #ifdefs
276 next unless /^\s?(typedef\s?)?enum\s?([a-zA-Z_]\w*)?\s?\{(.*)\}\s?([a-zA-Z_]\w*)?\s?;/;
277 (my $enum_subs = $3) =~ s/\s//g;
278 my @enum_subs = split(/,/, $enum_subs);
280 foreach my $enum (@enum_subs) {
281 my ($enum_name, $enum_value) = $enum =~ /^([a-zA-Z_]\w*)(=.+)?$/;
283 $enum_value =~ s/^=//;
284 $enum_val = (length($enum_value) ? $enum_value : $enum_val + 1);
287 "eval(\"\\n#line $eval_index $outfile\\n",
288 "sub $enum_name () \{ $enum_val; \}\") ",
289 "unless defined(\&$enum_name);\n");
293 "eval(\"sub $enum_name () \{ $enum_val; \}\") ",
294 "unless defined(\&$enum_name);\n");
297 } elsif (/^(?:__extension__\s+)?(?:extern|static)\s+(?:__)?inline(?:__)?\s+/
298 and !/;\s*$/ and !/{\s*}\s*$/)
300 # This is a hack to parse the inline functions in the glibc headers.
301 # Warning: massive kludge ahead. We suppose inline functions
302 # are mainly constructed like macros.
304 last unless defined ($next = next_line($file));
306 undef $_, last if $next =~ /__THROW\s*;/
307 or $next =~ /^(__extension__|extern|static)\b/;
309 print OUT "# $next\n" if $opt_D;
310 last if $next =~ /^}|^{.*}\s*$/;
312 next if not defined; # because it's only a prototype
313 s/\b(__extension__|extern|static|(?:__)?inline(?:__)?)\b//g;
314 # violently drop #ifdefs
315 s/#\s*if.*?#\s*endif//g
316 and print OUT "# some #ifdef were dropped here -- fill in the blanks\n";
317 if (s/^(?:\w|\s|\*)*\s(\w+)\s*//) {
320 warn "name not found"; next; # shouldn't occur...
323 if (s/^\(([^()]*)\)\s*(\w+\s*)*//) {
324 for my $arg (split /,/, $1) {
325 if ($arg =~ /(\w+)\s*$/) {
333 ? "my(" . (join ',', map "\$$_", @args) . ") = \@_;\n$t "
336 my $proto = @args ? '' : '() ';
338 s/\breturn\b//g; # "return" doesn't occur in macros usually...
340 # try to find and perlify local C variables
341 our @local_variables = (); # needs to be a our(): (?{...}) bug workaround
344 my $typelist = join '|', keys %isatype;
346 (?:(?:__)?const(?:__)?\s+)?
347 (?:(?:un)?signed\s+)?
351 (?{ push @local_variables, $1 })
355 (?:(?:__)?const(?:__)?\s+)?
356 (?:(?:un)?signed\s+)?
360 (?{ push @local_variables, $1 })
364 $new =~ s/&$_\b/\$$_/g for @local_variables;
365 $new =~ s/(["\\])/\\$1/g; #"]);
366 # now that's almost like a macro (we hope)
370 $Is_converted{$file} = 1;
371 if ($opt_e && exists($bad_file{$file})) {
372 unlink($Dest_dir . '/' . $outfile);
376 queue_includes_from($file) if $opt_a;
380 if ($opt_e && (scalar(keys %bad_file) > 0)) {
381 warn "Was unable to convert the following files:\n";
382 warn "\t" . join("\n\t",sort(keys %bad_file)) . "\n";
390 $new = reindent($new);
391 $args = reindent($args);
393 $new =~ s/(['\\])/\\$1/g; #']);
396 "eval \"\\n#line $eval_index $outfile\\n\" . 'sub $name $proto\{\n$t ${args}eval q($new);\n$t}' unless defined(\&$name);\n";
400 "eval 'sub $name $proto\{\n$t ${args}eval q($new);\n$t}' unless defined(\&$name);\n";
403 print OUT "unless(defined(\&$name)) {\n sub $name $proto\{\n\t${args}eval q($new);\n }\n}\n";
410 if (/\b__asm__\b/) { # freak out
411 $new = '"(assembly code)"';
416 $joined_args = join('|', keys(%curargs));
419 s/^\&\&// && do { $new .= " &&"; next;}; # handle && operator
420 s/^\&([\(a-z\)]+)/$1/i; # hack for things that take the address of
421 s/^(\s+)// && do {$new .= ' '; next;};
422 s/^0X([0-9A-F]+)[UL]*//i
425 if (length $hex > 8 && !$Config{use64bitint}) {
426 # Croak if nv_preserves_uv_bits < 64 ?
427 $new .= hex(substr($hex, -8)) +
428 2**32 * hex(substr($hex, 0, -8));
429 # The above will produce "erroneous" code
430 # if the hex constant was e.g. inside UINT64_C
431 # macro, but then again, h2ph is an approximation.
433 $new .= lc("0x$hex");
436 s/^(-?\d+\.\d+E[-+]?\d+)[FL]?//i && do {$new .= $1; next;};
437 s/^(\d+)\s*[LU]*//i && do {$new .= $1; next;};
438 s/^("(\\"|[^"])*")// && do {$new .= $1; next;};
439 s/^'((\\"|[^"])*)'// && do {
441 $new .= "ord('\$$1')";
447 # replace "sizeof(foo)" with "{foo}"
448 # also, remove * (C dereference operator) to avoid perl syntax
449 # problems. Where the %sizeof array comes from is anyone's
450 # guess (c2ph?), but this at least avoids fatal syntax errors.
451 # Behavior is undefined if sizeof() delimiters are unbalanced.
452 # This code was modified to able to handle constructs like this:
453 # sizeof(*(p)), which appear in the HP-UX 10.01 header files.
454 s/^sizeof\s*\(// && do {
456 my $lvl = 1; # already saw one open paren
457 # tack { on the front, and skip it in the loop
460 # find balanced closing paren
461 while ($index <= length($_) && $lvl > 0) {
462 $lvl++ if substr($_, $index, 1) eq "(";
463 $lvl-- if substr($_, $index, 1) eq ")";
466 # tack } on the end, replacing )
467 substr($_, $index - 1, 1) = "}";
468 # remove pesky * operators within the sizeof argument
469 substr($_, 0, $index - 1) =~ s/\*//g;
473 /\(([\w\s]+)[\*\s]*\)\s*[\w\(]/ && do {
475 foreach (split /\s+/, $1) { # Make sure all the words are types,
476 unless($isatype{$_} or $_ eq 'struct' or $_ eq 'union'){
482 s/\([\w\s]+[\*\s]*\)// && next; # then eliminate them.
485 # struct/union member, including arrays:
486 s/^([_A-Z]\w*(\[[^\]]+\])?((\.|->)[_A-Z]\w*(\[[^\]]+\])?)+)//i && do {
488 $id =~ s/(\.|(->))([^\.\-]*)/->\{$3\}/g;
489 $id =~ s/\b([^\$])($joined_args)/$1\$$2/g if length($joined_args);
490 while($id =~ /\[\s*([^\$\&\d\]]+)\]/) {
493 if(exists($curargs{$index})) {
498 $id =~ s/\[\s*([^\$\&\d\]]+)\]/[$index]/;
502 s/^([_a-zA-Z]\w*)// && do {
504 if ($id eq 'struct' || $id eq 'union') {
508 } elsif ($id =~ /^((un)?signed)|(long)|(short)$/) {
509 while (s/^\s+(\w+)//) { $id .= ' ' . $1; }
514 $new .= '->' if /^[\[\{]/;
515 } elsif ($id eq 'defined') {
518 s/^\s*\((\w),/("$1",/ if $id =~ /^_IO[WR]*$/i; # cheat
520 } elsif ($isatype{$id}) {
521 if ($new =~ /\{\s*$/) {
523 } elsif ($new =~ /\(\s*$/ && /^[\s*]*\)/) {
527 $new .= q(').$id.q(');
531 if ($new =~ /defined\s*$/) {
532 $new .= '(&' . $id . ')';
533 } elsif ($new =~ /defined\s*\($/) {
536 $new .= '(defined(&' . $id . ') ? &' . $id . ' : undef)';
546 s/^(.)// && do { if ($1 ne '#') { $new .= $1; } next;};
555 my $pre_sub_tri_graphs = 1;
557 READ: while (not eof IN) {
560 next unless length $in;
563 if ($pre_sub_tri_graphs) {
564 # Preprocess all tri-graphs
565 # including things stuck in quoted string constants.
566 $in =~ s/\?\?=/#/g; # | ??=| #|
567 $in =~ s/\?\?\!/|/g; # | ??!| ||
568 $in =~ s/\?\?'/^/g; # | ??'| ^|
569 $in =~ s/\?\?\(/[/g; # | ??(| [|
570 $in =~ s/\?\?\)/]/g; # | ??)| ]|
571 $in =~ s/\?\?\-/~/g; # | ??-| ~|
572 $in =~ s/\?\?\//\\/g; # | ??/| \|
573 $in =~ s/\?\?</{/g; # | ??<| {|
574 $in =~ s/\?\?>/}/g; # | ??>| }|
576 if ($in =~ /^\#ifdef __LANGUAGE_PASCAL__/) {
577 # Tru64 disassembler.h evilness: mixed C and Pascal.
584 if ($in =~ /^extern inline / && # Inlined assembler.
585 $^O eq 'linux' && $file =~ m!(?:^|/)asm/[^/]+\.h$!) {
592 if ($in =~ s/\\$//) { # \-newline
595 } elsif ($in =~ s/^([^"'\\\/]+)//) { # Passthrough
597 } elsif ($in =~ s/^(\\.)//) { # \...
599 } elsif ($in =~ /^'/) { # '...
600 if ($in =~ s/^('(\\.|[^'\\])*')//) {
605 } elsif ($in =~ /^"/) { # "...
606 if ($in =~ s/^("(\\.|[^"\\])*")//) {
611 } elsif ($in =~ s/^\/\/.*//) { # //...
613 } elsif ($in =~ m/^\/\*/) { # /*...
614 # C comment removal adapted from perlfaq6:
615 if ($in =~ s/^\/\*[^*]*\*+([^\/*][^*]*\*+)*\///) {
617 } else { # Incomplete /* */
620 } elsif ($in =~ s/^(\/)//) { # /...
622 } elsif ($in =~ s/^([^\'\"\\\/]+)//) {
624 } elsif ($^O eq 'linux' &&
625 $file =~ m!(?:^|/)linux/byteorder/pdp_endian\.h$! &&
626 $in =~ s!\'T KNOW!!) {
627 $out =~ s!I DON$!I_DO_NOT_KNOW!;
630 warn "Cannot parse $file:\n$in\n";
631 $bad_file{$file} = 1;
636 die "Cannot parse:\n$in\n";
641 last READ if $out =~ /\S/;
648 # Handle recursive subdirectories without getting a grotesquely big stack.
649 # Could this be implemented using File::Find?
657 if ($file eq '-' or -f $file or -l $file) {
663 print STDERR "Skipping directory '$file'\n";
668 print STDERR "Skipping '$file': not a file or directory\n";
676 # Put all the files in $directory into @ARGV for processing.
679 my ($directory) = @_;
681 $directory =~ s:/$::;
683 opendir DIR, $directory;
684 foreach (readdir DIR) {
685 next if ($_ eq '.' or $_ eq '..');
687 # expand_glob() is going to be called until $ARGV[0] isn't a
688 # directory; so push directories, and unshift everything else.
689 if (-d "$directory/$_") { push @ARGV, "$directory/$_" }
690 else { unshift @ARGV, "$directory/$_" }
696 # Given $file, a symbolic link to a directory in the C include directory,
697 # make an equivalent symbolic link in $Dest_dir, if we can figure out how.
698 # Otherwise, just duplicate the file or directory.
702 my $target = eval 'readlink($dirlink)';
704 if ($target =~ m:^\.\./: or $target =~ m:^/:) {
705 # The target of a parent or absolute link could leave the $Dest_dir
706 # hierarchy, so let's put all of the contents of $dirlink (actually,
707 # the contents of $target) into @ARGV; as a side effect down the
708 # line, $dirlink will get created as an _actual_ directory.
709 expand_glob($dirlink);
711 if (-l "$Dest_dir/$dirlink") {
712 unlink "$Dest_dir/$dirlink" or
713 print STDERR "Could not remove link $Dest_dir/$dirlink: $!\n";
716 if (eval 'symlink($target, "$Dest_dir/$dirlink")') {
717 print "Linking $target -> $Dest_dir/$dirlink\n";
719 # Make sure that the link _links_ to something:
720 if (! -e "$Dest_dir/$target") {
721 mkpath("$Dest_dir/$target", 0755) or
722 print STDERR "Could not create $Dest_dir/$target/\n";
725 print STDERR "Could not symlink $target -> $Dest_dir/$dirlink: $!\n";
731 # Push all #included files in $file onto our stack, except for STDIN
732 # and files we've already processed.
733 sub queue_includes_from
738 return if ($file eq "-");
740 open HEADER, $file or return;
741 while (defined($line = <HEADER>)) {
742 while (/\\$/) { # Handle continuation lines
747 if ($line =~ /^#\s*include\s+([<"])(.*?)[>"]/) {
748 my ($delimiter, $new_file) = ($1, $2);
749 # copy the prefix in the quote syntax (#include "x.h") case
750 if ($delimiter eq q{"} && $file =~ m|^(.*)/|) {
751 $new_file = "$1/$new_file";
753 push(@ARGV, $new_file) unless $Is_converted{$new_file};
760 # Determine include directories; $Config{usrinc} should be enough for (all
761 # non-GCC?) C compilers, but gcc uses additional include directories.
764 my $from_gcc = `LC_ALL=C $Config{cc} -v -E - < /dev/null 2>&1 | awk '/^#include/, /^End of search list/' | grep '^ '`;
765 length($from_gcc) ? (split(' ', $from_gcc), $Config{usrinc}) : ($Config{usrinc});
769 # Create "_h2ph_pre.ph", if it doesn't exist or was built by a different
771 sub build_preamble_if_necessary
773 # Increment $VERSION every time this function is modified:
775 my $preamble = "$Dest_dir/_h2ph_pre.ph";
777 # Can we skip building the preamble file?
779 # Extract version number from first line of preamble:
780 open PREAMBLE, $preamble or die "Cannot open $preamble: $!";
781 my $line = <PREAMBLE>;
782 $line =~ /(\b\d+\b)/;
783 close PREAMBLE or die "Cannot close $preamble: $!";
785 # Don't build preamble if a compatible preamble exists:
786 return if $1 == $VERSION;
789 my (%define) = _extract_cc_defines();
791 open PREAMBLE, ">$preamble" or die "Cannot open $preamble: $!";
792 print PREAMBLE "# This file was created by h2ph version $VERSION\n";
793 # Prevent non-portable hex constants from warning.
795 # We still produce an overflow warning if we can't represent
796 # a hex constant as an integer.
797 print PREAMBLE "no warnings qw(portable);\n";
799 foreach (sort keys %define) {
801 print PREAMBLE "# $_=$define{$_}\n";
803 if ($define{$_} =~ /^\((.*)\)$/) {
804 # parenthesized value: d=(v)
807 if (/^(\w+)\((\w)\)$/) {
808 my($macro, $arg) = ($1, $2);
809 my $def = $define{$_};
810 $def =~ s/$arg/\$\{$arg\}/g;
811 print PREAMBLE <<DEFINE;
812 unless (defined &$macro) { sub $macro(\$) { my (\$$arg) = \@_; \"$def\" } }
816 ($define{$_} =~ /^([+-]?(\d+)?\.\d+([eE][+-]?\d+)?)[FL]?$/) {
819 "unless (defined &$_) { sub $_() { $1 } }\n\n";
820 } elsif ($define{$_} =~ /^([+-]?\d+)U?L{0,2}$/i) {
823 "unless (defined &$_) { sub $_() { $1 } }\n\n";
824 } elsif ($define{$_} =~ /^([+-]?0x[\da-f]+)U?L{0,2}$/i) {
826 # Special cased, since perl warns on hex integers
827 # that can't be represented in a UV.
829 # This way we get the warning at time of use, so the user
830 # only gets the warning if they happen to use this
831 # platform-specific definition.
833 $code = "hex('$code')" if length $code > 10;
835 "unless (defined &$_) { sub $_() { $code } }\n\n";
836 } elsif ($define{$_} =~ /^\w+$/) {
837 my $def = $define{$_};
838 if ($isatype{$def}) {
840 "unless (defined &$_) { sub $_() { \"$def\" } }\n\n";
843 "unless (defined &$_) { sub $_() { &$def } }\n\n";
847 "unless (defined &$_) { sub $_() { \"",
848 quotemeta($define{$_}), "\" } }\n\n";
851 print PREAMBLE "\n1;\n"; # avoid 'did not return a true value' when empty
852 close PREAMBLE or die "Cannot close $preamble: $!";
856 # %Config contains information on macros that are pre-defined by the
857 # system's compiler. We need this information to make the .ph files
858 # function with perl as the .h files do with cc.
859 sub _extract_cc_defines
862 my $allsymbols = join " ",
863 @Config{'ccsymbols', 'cppsymbols', 'cppccsymbols'};
865 # Split compiler pre-definitions into 'key=value' pairs:
866 while ($allsymbols =~ /([^\s]+)=((\\\s|[^\s])+)/g) {
869 print STDERR "$_: $1 -> $2\n";
879 ##############################################################################
884 h2ph - convert .h C header files to .ph Perl header files
888 B<h2ph [-d destination directory] [-r | -a] [-l] [-h] [-e] [-D] [-Q]
894 converts any C header files specified to the corresponding Perl header file
896 It is most easily run while in /usr/include:
898 cd /usr/include; h2ph * sys/*
902 cd /usr/include; h2ph * sys/* arpa/* netinet/*
906 cd /usr/include; h2ph -r -l .
908 The output files are placed in the hierarchy rooted at Perl's
909 architecture dependent library directory. You can specify a different
910 hierarchy with a B<-d> switch.
912 If run with no arguments, filters standard input to standard output.
918 =item -d destination_dir
920 Put the resulting B<.ph> files beneath B<destination_dir>, instead of
921 beneath the default Perl library location (C<$Config{'installsitearch'}>).
925 Run recursively; if any of B<headerfiles> are directories, then run I<h2ph>
926 on all files in those directories (and their subdirectories, etc.). B<-r>
927 and B<-a> are mutually exclusive.
931 Run automagically; convert B<headerfiles>, as well as any B<.h> files
932 which they include. This option will search for B<.h> files in all
933 directories which your C compiler ordinarily uses. B<-a> and B<-r> are
938 Symbolic links will be replicated in the destination directory. If B<-l>
939 is not specified, then links are skipped over.
943 Put 'hints' in the .ph files which will help in locating problems with
944 I<h2ph>. In those cases when you B<require> a B<.ph> file containing syntax
945 errors, instead of the cryptic
947 [ some error condition ] at (eval mmm) line nnn
949 you will see the slightly more helpful
951 [ some error condition ] at filename.ph line nnn
953 However, the B<.ph> files almost double in size when built using B<-h>.
957 If an error is encountered during conversion, output file will be removed and
958 a warning emitted instead of terminating the conversion immediately.
962 Include the code from the B<.h> file as a comment in the B<.ph> file.
963 This is primarily used for debugging I<h2ph>.
967 'Quiet' mode; don't print out the names of the files being converted.
973 No environment variables are used.
992 The usual warnings if it can't read or write the files involved.
996 Doesn't construct the %sizeof array for you.
998 It doesn't handle all C constructs, but it does attempt to isolate
999 definitions inside evals so that you can get at the definitions
1000 that it can translate.
1002 It's only intended as a rough tool.
1003 You may need to dicker with the files produced.
1005 You have to run this program by hand; it's not run as part of the Perl
1008 Doesn't handle complicated expressions built piecemeal, a la:
1018 Doesn't necessarily locate all of your C compiler's internally-defined
1025 close OUT or die "Can't close $file: $!";
1026 chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
1027 exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';