On Sat, Mar 19, 2005 at 12:24:37PM -0000, Alexey Tourbin wrote:
> h2ph fails to convert the following simple header file.
> 
> $ cat asm/unistd.h
> #ifndef _ASM_X86_64_UNISTD_H_
> #define _ASM_X86_64_UNISTD_H_
> 
> extern inline long exit(int error_code)
> {
>         sys_exit(error_code);
> }
> 
> #endif
> $
> 
> Please note that its location under asm/ directory is essential.

And even the following simple header file suffers wrong conversion:

$ cat test.h
#ifndef TEST_H
#define TEST_H
#ifdef __LANGUAGE_PASCAL__
#endif
#endif
$

Note that asm/ location is unrelated for this time.

$ h2ph -d . test.h
test.h -> test.ph
$ perl -c test.ph
Missing right curly or square bracket at test.ph line 7, at end of line
syntax error at test.ph line 7, at EOF
test.ph had compilation errors.
$ cat test.ph
require '_h2ph_pre.ph';

no warnings 'redefine';

unless(defined(&TEST_H)) {
    eval 'sub TEST_H () {1;}' unless defined(&TEST_H);
1;
$

The problem seems to be inside next_line():

    READ: while (not eof IN) {
        $in  .= <IN>;
        chomp $in;
        next unless length $in;

        while (length $in) {
            ...
            if ($in =~ /^\#ifdef __LANGUAGE_PASCAL__/) {
                # Tru64 disassembler.h evilness: mixed C and Pascal.
                while (<IN>) {
                    last if /^\#endif/;
                }
                next READ;
            }
            if ($in =~ /^extern inline / && # Inlined assembler.
                $^O eq 'linux' && $file =~ m!(?:^|/)asm/[^/]+\.h$!) {
                while (<IN>) {
                    last if /^}/;
                }
                next READ;
            }

The problem is that $in varialbe is not reset and "if" conditons hold
true till the end of file.  Here is a patch (which has not been tested
yet, but seems to be reasonable offhand).


--- perl-5.9.2.24046/utils/h2ph.PL-     2005-01-30 15:19:00 +0000
+++ perl-5.9.2.24046/utils/h2ph.PL      2005-03-19 13:32:26 +0000
@@ -556,6 +556,7 @@ sub next_line
                while (<IN>) {
                    last if /^\#endif/; 
                }
+               $in = "";
                next READ;
            }
            if ($in =~ /^extern inline / && # Inlined assembler.
@@ -563,6 +564,7 @@ sub next_line
                while (<IN>) {
                    last if /^}/; 
                }
+               $in = "";
                next READ;
            }
             if ($in =~ s/\\$//) {                           # \-newline
End of patch


> $ h2ph -d . asm/unistd.h
> asm/unistd.h -> asm/unistd.ph
> $ perl -c asm/unistd.ph
> Missing right curly or square bracket at asm/unistd.ph line 7, at end of line
> syntax error at asm/unistd.ph line 7, at EOF
> asm/unistd.ph had compilation errors.
> $ cat asm/unistd.ph
> require '_h2ph_pre.ph';
> 
> no warnings 'redefine';
> 
> unless(defined(&_ASM_X86_64_UNISTD_H_)) {
>     eval 'sub _ASM_X86_64_UNISTD_H_ () {1;}' unless 
> defined(&_ASM_X86_64_UNISTD_H_);
> 1;
> $


-- 
Alexey Tourbin
ALT Linux Team

Attachment: pgpE1nsnAUZ6K.pgp
Description: PGP signature

Reply via email to