print OUT <<'!NO!SUBS!';
+BEGIN { pop @INC if $INC[-1] eq '.' }
+
use strict;
use Config;
$t = '';
$tab = 0;
- # $eval_index goes into ``#line'' directives, to help locate syntax errors:
+ # $eval_index goes into '#line' directives, to help locate syntax errors:
$eval_index = 1;
if ($file eq '-') {
$new = 1 if $new eq '';
- # Shunt around such directives as `#define FOO FOO':
+ # Shunt around such directives as '#define FOO FOO':
next if $new =~ /^\s*&\Q$name\E\s*\z/;
$new = reindent($new);
if ($opt_r) {
expand_glob($file);
} else {
- print STDERR "Skipping directory `$file'\n";
+ print STDERR "Skipping directory '$file'\n";
}
} elsif ($opt_a) {
return $file;
} else {
- print STDERR "Skipping `$file': not a file or directory\n";
+ print STDERR "Skipping '$file': not a file or directory\n";
}
}
sub build_preamble_if_necessary
{
# Increment $VERSION every time this function is modified:
- my $VERSION = 3;
+ my $VERSION = 4;
my $preamble = "$Dest_dir/_h2ph_pre.ph";
# Can we skip building the preamble file?
open PREAMBLE, ">$preamble" or die "Cannot open $preamble: $!";
print PREAMBLE "# This file was created by h2ph version $VERSION\n";
+ # Prevent non-portable hex constants from warning.
+ #
+ # We still produce an overflow warning if we can't represent
+ # a hex constant as an integer.
+ print PREAMBLE "no warnings qw(portable);\n";
foreach (sort keys %define) {
if ($opt_D) {
# integer:
print PREAMBLE
"unless (defined &$_) { sub $_() { $1 } }\n\n";
+ } elsif ($define{$_} =~ /^([+-]?0x[\da-f]+)U?L{0,2}$/i) {
+ # hex integer
+ # Special cased, since perl warns on hex integers
+ # that can't be represented in a UV.
+ #
+ # This way we get the warning at time of use, so the user
+ # only gets the warning if they happen to use this
+ # platform-specific definition.
+ my $code = $1;
+ $code = "hex('$code')" if length $code > 10;
+ print PREAMBLE
+ "unless (defined &$_) { sub $_() { $code } }\n\n";
} elsif ($define{$_} =~ /^\w+$/) {
my $def = $define{$_};
if ($isatype{$def}) {
my $allsymbols = join " ",
@Config{'ccsymbols', 'cppsymbols', 'cppccsymbols'};
- # Split compiler pre-definitions into `key=value' pairs:
+ # Split compiler pre-definitions into 'key=value' pairs:
while ($allsymbols =~ /([^\s]+)=((\\\s|[^\s])+)/g) {
$define{$1} = $2;
if ($opt_D) {
=head1 SYNOPSIS
-B<h2ph [-d destination directory] [-r | -a] [-l] [headerfiles]>
+B<h2ph [-d destination directory] [-r | -a] [-l] [-h] [-e] [-D] [-Q]
+[headerfiles]>
=head1 DESCRIPTION
=item -h
-Put ``hints'' in the .ph files which will help in locating problems with
+Put 'hints' in the .ph files which will help in locating problems with
I<h2ph>. In those cases when you B<require> a B<.ph> file containing syntax
errors, instead of the cryptic
However, the B<.ph> files almost double in size when built using B<-h>.
+=item -e
+
+If an error is encountered during conversion, output file will be removed and
+a warning emitted instead of terminating the conversion immediately.
+
=item -D
Include the code from the B<.h> file as a comment in the B<.ph> file.
=item -Q
-``Quiet'' mode; don't print out the names of the files being converted.
+'Quiet' mode; don't print out the names of the files being converted.
=back