
h.m.brand at xs4all
May 15, 2008, 11:45 PM
Post #2 of 8
(79 views)
Permalink
|
|
Re: [PATCH] h2ph: allow the quote mark delimiter when chasing #include directives with "-a"
[In reply to]
|
|
On Thu, 15 May 2008 23:15:35 +0300, Niko Tyni <ntyni[at]debian.org> wrote: > Recent Linux kernel headers like <asm/unistd.h> have quote delimiters in system > header #include directives: > > > # ifdef __i386__ > > # include "unistd_32.h" > > # else > > # include "unistd_64.h" > > # endif > > which results in both unistd_32.h and unistd_64.h being skipped altogether. > See <http://bugs.debian.org/479762>. > > In addition to simply matching the quote marks, we need to prepend the > directory prefix of the current file when the quote syntax is used. Unlike > cpp, 'require' will not look in the directory of the source file, only > in @INC. Some comments that are not only to your patch, which - I think - looks fine. I just wondered, looking at this code ... > This is most probably still suboptimal, but it seems to work and generated > no regressions on the translated system headers on current Debian unstable > (manually checked on the amd64 architecture.) > > The patch is currently included in the Debian package as of 5.10.0-10. > --- > utils/h2ph.PL | 20 +++++++++++++++----- > 1 files changed, 15 insertions(+), 5 deletions(-) > > diff --git a/utils/h2ph.PL b/utils/h2ph.PL > index 0bfea18..a3ff285 100644 > --- a/utils/h2ph.PL > +++ b/utils/h2ph.PL > @@ -85,7 +85,7 @@ sub reindent($) { > } > > my ($t, $tab, %curargs, $new, $eval_index, $dir, $name, $args, $outfile); > -my ($incl, $incl_type, $next); > +my ($incl, $incl_type, $incl_quote, $next); > while (defined (my $file = next_file())) { > if (-l $file and -d $file) { > link_if_possible($file) if ($opt_l); > @@ -186,9 +186,10 @@ while (defined (my $file = next_file())) { > print OUT $t,"unless(defined(\&$name)) {\n sub $name () {\t",$new,";}\n}\n"; > } > } > - } elsif (/^(include|import|include_next)\s*[<\"](.*)[>\"]/) { > + } elsif (/^(include|import|include_next)\s*([<\"])(.*)[>\"]/) { why are the " escaped in the char classes? is this safe enough? it would also match #include "foo.h> not that it is very likely to happen, but still > $incl_type = $1; > - $incl = $2; > + $incl_quote = $2; > + $incl = $3; > if (($incl_type eq 'include_next') || > ($opt_e && exists($bad_file{$incl}))) { > $incl =~ s/\.h$/.ph/; > @@ -221,6 +222,10 @@ while (defined (my $file = next_file())) { > "warn(\$\@) if \$\@;\n"); > } else { > $incl =~ s/\.h$/.ph/; > + # copy the prefix in the quote syntax (#include "x.h") case > + if ($incl !~ m|/| && $incl_quote eq q{"} && $file =~ m|^(.*)/|) { > + $incl = "$1/$incl"; > + } > print OUT $t,"require '$incl';\n"; > } > } elsif (/^ifdef\s+(\w+)/) { > @@ -724,8 +729,13 @@ sub queue_includes_from > $line .= <HEADER>; > } > > - if ($line =~ /^#\s*include\s+<(.*?)>/) { > - push(@ARGV, $1) unless $Is_converted{$1}; > + if ($line =~ /^#\s*include\s+([<"])(.*?)[>"]/) { here the quotes are not escaped, and still no check on matching quotes > + my ($delimiter, $new_file) = ($1, $2); > + # copy the prefix in the quote syntax (#include "x.h") case > + if ($delimiter eq q{"} && $file =~ m|^(.*)/|) { > + $new_file = "$1/$new_file"; > + } > + push(@ARGV, $new_file) unless $Is_converted{$new_file}; > } > } > close HEADER; -- H.Merijn Brand Amsterdam Perl Mongers (http://amsterdam.pm.org/) using & porting perl 5.6.2, 5.8.x, 5.10.x on HP-UX 10.20, 11.00, 11.11, & 11.23, SuSE 10.1 & 10.2, AIX 5.2, and Cygwin. http://qa.perl.org http://mirrors.develooper.com/hpux/ http://www.test-smoke.org http://www.goldmark.org/jeff/stupid-disclaimers/
|