diff options
author | Thierry Vignaud <tv@mageia.org> | 2012-01-30 17:48:03 +0000 |
---|---|---|
committer | Thierry Vignaud <tv@mageia.org> | 2012-01-30 17:48:03 +0000 |
commit | c84e02b58babf893d1c63eae4a090a75902293ea (patch) | |
tree | 738cb55d5bf2ed5d71287c8fd4586f8afd7fe90b /fake_packages | |
parent | c9eb5a44c2022318d0ee927b8098ce251504fef8 (diff) | |
download | perl_checker-c84e02b58babf893d1c63eae4a090a75902293ea.tar perl_checker-c84e02b58babf893d1c63eae4a090a75902293ea.tar.gz perl_checker-c84e02b58babf893d1c63eae4a090a75902293ea.tar.bz2 perl_checker-c84e02b58babf893d1c63eae4a090a75902293ea.tar.xz perl_checker-c84e02b58babf893d1c63eae4a090a75902293ea.zip |
(parse_pm) parse .pm files too when generating fake packages
eg: URPM (or some Gtk2*) implement methods in both perl & XS
Diffstat (limited to 'fake_packages')
-rwxr-xr-x | fake_packages/gen.pl | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/fake_packages/gen.pl b/fake_packages/gen.pl index f5e336f..f65c3e6 100755 --- a/fake_packages/gen.pl +++ b/fake_packages/gen.pl @@ -85,12 +85,48 @@ sub parse_xs { } } +sub parse_pm { + my ($file) = @_; + warn "parse_pm $file\n"; + my $state = 'waiting_for_type'; + my $name; + $current_package = ''; + my $c; + foreach (cat_($file)) { + $c++; + next if /^=/ ... /^=cut/; + chomp; + my $orig_line = $_; + + if (/^\s*#/ || (m!^\s*/\*! .. m!\*/!)) { + # forget it + } elsif (/^package\s*(\S+)\s*;/) { + $current_package = $1; + } elsif (!$current_package) { + # waiting for the package line + } elsif (/^sub\s*(\S*)/) { + $name = $1; + $l{$current_package}{$name} = [] if !defined($l{$current_package}{$name}); + $state = 'waiting_for_param'; + } elsif ($state eq 'waiting_for_param' && /=\s*\@_/) { + get_paras($name, $_); + $state = 'waiting_for_end'; + } else { + warn "bad line2 #$c $orig_line (state: $state)\n" if 0 && + !(($state eq 'waiting_for_end' || $state eq 'waiting_for_type') && + (/^\s/ || /^[{}]\s*$/ || /^(CODE|OUTPUT):\s*$/)); + } + } +} my ($pkg_name, $dir) = @ARGV; my @xs_files = chomp_(`find $dir -name "*.xs"`); +# ignore test suites, inc/ and ext/ : +my @pm_files = chomp_(`find $dir -name "*.pm" | egrep -v '/(ext|inc|t)/'`); @ARGV == 2 && @xs_files or die "usage: gen.pl <Gtk2 or Glib> <dir where Gtk2's or Glib's *.xs are>\n"; parse_xs($_) foreach @xs_files; +parse_pm($_) foreach @pm_files; print "package $pkg_name;\nuse Glib;\n" if $pkg_name eq 'Gtk2'; |