⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ppphtest

📁 source of perl for linux application,
💻
📖 第 1 页 / 共 2 页
字号:
####################################################################################  $Revision: 41 $##  $Author: mhx $##  $Date: 2007/09/11 23:18:33 +0200 $######################################################################################  Version 3.x, Copyright (C) 2004-2007, Marcus Holland-Moritz.##  Version 2.x, Copyright (C) 2001, Paul Marquess.##  Version 1.x, Copyright (C) 1999, Kenneth Albanowski.####  This program is free software; you can redistribute it and/or##  modify it under the same terms as Perl itself.##################################################################################=tests plan => 229BEGIN {  if ($ENV{'SKIP_SLOW_TESTS'}) {    for (1 .. 229) {      skip("skip: SKIP_SLOW_TESTS", 0);    }    exit 0;  }}use File::Path qw/rmtree mkpath/;use Config;my $tmp = 'ppptmp';my $inc = '';my $isVMS = $^O eq 'VMS';my $isMAC = $^O eq 'MacOS';my $perl = find_perl();rmtree($tmp) if -d $tmp;mkpath($tmp) or die "mkpath $tmp: $!\n";chdir($tmp) or die "chdir $tmp: $!\n";if ($ENV{'PERL_CORE'}) {  if (-d '../../lib') {    if ($isVMS) {      $inc = '"-I../../lib"';    }    elsif ($isMAC) {      $inc = '-I:::lib';    }    else {      $inc = '-I../../lib';    }    unshift @INC, '../../lib';  }}if ($perl =~ m!^\./!) {  $perl = ".$perl";}END {  chdir('..') if !-d $tmp && -d "../$tmp";  rmtree($tmp) if -d $tmp;}ok(&Devel::PPPort::WriteFile("ppport.h"));sub comment{  my $c = shift;  $c =~ s/^/# | /mg;  $c .= "\n" unless $c =~ /[\r\n]$/;  print $c;}sub ppport{  my @args = ('ppport.h', @_);  unshift @args, $inc if $inc;  my $run = $perl =~ m/\s/ ? qq("$perl") : $perl;  $run .= ' -MMac::err=unix' if $isMAC;  for (@args) {    $_ = qq("$_") if $isVMS && /^[^"]/;    $run .= " $_";  }  print "# *** running $run ***\n";  $run .= ' 2>&1' unless $isMAC;  my @out = `$run`;  my $out = join '', @out;  comment($out);  return wantarray ? @out : $out;}sub matches{  my($str, $re, $mod) = @_;  my @n;  eval "\@n = \$str =~ /$re/g$mod;";  if ($@) {    my $err = $@;    $err =~ s/^/# *** /mg;    print "# *** ERROR ***\n$err\n";  }  return $@ ? -42 : scalar @n;}sub eq_files{  my($f1, $f2) = @_;  return 0 unless -e $f1 && -e $f2;  local *F;  for ($f1, $f2) {    print "# File: $_\n";    unless (open F, $_) {      print "# couldn't open $_: $!\n";      return 0;    }    $_ = do { local $/; <F> };    close F;    comment($_);  }  return $f1 eq $f2;}my @tests;for (split /\s*={70,}\s*/, do { local $/; <DATA> }) {  s/^\s+//; s/\s+$//;  my($c, %f);  ($c, @f{m/-{20,}\s+(\S+)\s+-{20,}/g}) = split /\s*-{20,}\s+\S+\s+-{20,}\s*/;  push @tests, { code => $c, files => \%f };}my $t;for $t (@tests) {  print "#\n", ('# ', '-'x70, "\n")x3, "#\n";  my $f;  for $f (keys %{$t->{files}}) {    my @f = split /\//, $f;    if (@f > 1) {      pop @f;      my $path = join '/', @f;      mkpath($path) or die "mkpath('$path'): $!\n";    }    my $txt = $t->{files}{$f};    local *F;    open F, ">$f" or die "open $f: $!\n";    print F "$txt\n";    close F;    $txt =~ s/^/# | /mg;    print "# *** writing $f ***\n$txt\n";  }  my $code = $t->{code};  $code =~ s/^/# | /mg;  print "# *** evaluating test code ***\n$code\n";  eval $t->{code};  if ($@) {    my $err = $@;    $err =~ s/^/# *** /mg;    print "# *** ERROR ***\n$err\n";  }  ok($@, '');  for (keys %{$t->{files}}) {    unlink $_ or die "unlink('$_'): $!\n";  }}sub find_perl{  my $perl = $^X;  return $perl if $isVMS;  my $exe = $Config{'_exe'} || '';  if ($perl =~ /^perl\Q$exe\E$/i) {    $perl = "perl$exe";    eval "require File::Spec";    if ($@) {      $perl = "./$perl";    } else {      $perl = File::Spec->catfile(File::Spec->curdir(), $perl);    }  }  if ($perl !~ /\Q$exe\E$/i) {    $perl .= $exe;  }  warn "find_perl: cannot find $perl from $^X" unless -f $perl;  return $perl;}__DATA__my $o = ppport(qw(--help));ok($o =~ /^Usage:.*ppport\.h/m);ok($o =~ /--help/m);$o = ppport(qw(--version));ok($o =~ /^This is.*ppport.*\d+\.\d+(?:_?\d+)?\.$/);$o = ppport(qw(--nochanges));ok($o =~ /^Scanning.*test\.xs/mi);ok($o =~ /Analyzing.*test\.xs/mi);ok(matches($o, '^Scanning', 'm'), 1);ok(matches($o, 'Analyzing', 'm'), 1);ok($o =~ /Uses Perl_newSViv instead of newSViv/);$o = ppport(qw(--quiet --nochanges));ok($o =~ /^\s*$/);---------------------------- test.xs ------------------------------------------Perl_newSViv();===============================================================================# check if C and C++ comments are filtered correctlymy $o = ppport(qw(--copy=a));ok($o =~ /^Scanning.*MyExt\.xs/mi);ok($o =~ /Analyzing.*MyExt\.xs/mi);ok(matches($o, '^Scanning', 'm'), 1);ok($o =~ /^Needs to include.*ppport\.h/m);ok($o !~ /^Uses grok_bin/m);ok($o !~ /^Uses newSVpv/m);ok($o =~ /Uses 1 C\+\+ style comment/m);ok(eq_files('MyExt.xsa', 'MyExt.ra'));# check if C++ are left untouched with --cplusplus$o = ppport(qw(--copy=b --cplusplus));ok($o =~ /^Scanning.*MyExt\.xs/mi);ok($o =~ /Analyzing.*MyExt\.xs/mi);ok(matches($o, '^Scanning', 'm'), 1);ok($o =~ /^Needs to include.*ppport\.h/m);ok($o !~ /^Uses grok_bin/m);ok($o !~ /^Uses newSVpv/m);ok($o !~ /Uses \d+ C\+\+ style comment/m);ok(eq_files('MyExt.xsb', 'MyExt.rb'));unlink qw(MyExt.xsa MyExt.xsb);---------------------------- MyExt.xs -----------------------------------------newSVuv();    // newSVpv();  XPUSHs(foo);/* grok_bin(); */---------------------------- MyExt.ra -----------------------------------------#include "ppport.h"newSVuv();    /* newSVpv(); */  XPUSHs(foo);/* grok_bin(); */---------------------------- MyExt.rb -----------------------------------------#include "ppport.h"newSVuv();    // newSVpv();  XPUSHs(foo);/* grok_bin(); */===============================================================================my $o = ppport(qw(--nochanges file1.xs));ok($o =~ /^Scanning.*file1\.xs/mi);ok($o =~ /Analyzing.*file1\.xs/mi);ok($o !~ /^Scanning.*file2\.xs/mi);ok($o =~ /^Uses newCONSTSUB/m);ok($o =~ /^Uses SvPV_nolen.*depends.*sv_2pv_flags/m);ok($o =~ /WARNING: PL_expect/m);ok($o =~ /hint for newCONSTSUB/m);ok($o =~ /^Looks good/m);$o = ppport(qw(--nochanges --nohints file1.xs));ok($o =~ /^Scanning.*file1\.xs/mi);ok($o =~ /Analyzing.*file1\.xs/mi);ok($o !~ /^Scanning.*file2\.xs/mi);ok($o =~ /^Uses newCONSTSUB/m);ok($o =~ /^Uses SvPV_nolen.*depends.*sv_2pv_flags/m);ok($o =~ /WARNING: PL_expect/m);ok($o !~ /hint for newCONSTSUB/m);ok($o =~ /^Looks good/m);$o = ppport(qw(--nochanges --nohints --nodiag file1.xs));ok($o =~ /^Scanning.*file1\.xs/mi);ok($o =~ /Analyzing.*file1\.xs/mi);ok($o !~ /^Scanning.*file2\.xs/mi);ok($o !~ /^Uses newCONSTSUB/m);ok($o !~ /^Uses SvPV_nolen/m);ok($o =~ /WARNING: PL_expect/m);ok($o !~ /hint for newCONSTSUB/m);ok($o =~ /^Looks good/m);$o = ppport(qw(--nochanges --quiet file1.xs));ok($o =~ /^\s*$/);$o = ppport(qw(--nochanges file2.xs));ok($o =~ /^Scanning.*file2\.xs/mi);ok($o =~ /Analyzing.*file2\.xs/mi);ok($o !~ /^Scanning.*file1\.xs/mi);ok($o =~ /^Uses mXPUSHp/m);ok($o =~ /^Needs to include.*ppport\.h/m);ok($o !~ /^Looks good/m);ok($o =~ /^1 potentially required change detected/m);$o = ppport(qw(--nochanges --nohints file2.xs));ok($o =~ /^Scanning.*file2\.xs/mi);ok($o =~ /Analyzing.*file2\.xs/mi);ok($o !~ /^Scanning.*file1\.xs/mi);ok($o =~ /^Uses mXPUSHp/m);ok($o =~ /^Needs to include.*ppport\.h/m);ok($o !~ /^Looks good/m);ok($o =~ /^1 potentially required change detected/m);$o = ppport(qw(--nochanges --nohints --nodiag file2.xs));ok($o =~ /^Scanning.*file2\.xs/mi);ok($o =~ /Analyzing.*file2\.xs/mi);ok($o !~ /^Scanning.*file1\.xs/mi);ok($o !~ /^Uses mXPUSHp/m);ok($o !~ /^Needs to include.*ppport\.h/m);ok($o !~ /^Looks good/m);ok($o =~ /^1 potentially required change detected/m);$o = ppport(qw(--nochanges --quiet file2.xs));ok($o =~ /^\s*$/);---------------------------- file1.xs -----------------------------------------#define NEED_newCONSTSUB#define NEED_sv_2pv_flags#include "ppport.h"newCONSTSUB();SvPV_nolen();PL_expect = 0;---------------------------- file2.xs -----------------------------------------mXPUSHp(foo);===============================================================================my $o = ppport(qw(--nochanges));ok($o =~ /^Scanning.*FooBar\.xs/mi);ok($o =~ /Analyzing.*FooBar\.xs/mi);ok(matches($o, '^Scanning', 'm'), 1);ok($o !~ /^Looks good/m);ok($o =~ /^Uses grok_bin/m);---------------------------- FooBar.xs ----------------------------------------newSViv();XPUSHs(foo);grok_bin();===============================================================================my $o = ppport(qw(--nochanges));ok($o =~ /^Scanning.*First\.xs/mi);ok($o =~ /Analyzing.*First\.xs/mi);ok($o =~ /^Scanning.*second\.h/mi);ok($o =~ /Analyzing.*second\.h/mi);ok($o =~ /^Scanning.*sub.*third\.c/mi);ok($o =~ /Analyzing.*sub.*third\.c/mi);ok($o !~ /^Scanning.*foobar/mi);ok(matches($o, '^Scanning', 'm'), 3);---------------------------- First.xs -----------------------------------------one---------------------------- foobar.xyz ---------------------------------------two---------------------------- second.h -----------------------------------------three---------------------------- sub/third.c --------------------------------------four===============================================================================my $o = ppport(qw(--nochanges));ok($o =~ /Possibly wrong #define NEED_foobar in.*test.xs/i);---------------------------- test.xs ------------------------------------------#define NEED_foobar===============================================================================# And now some complex "real-world" examplemy $o = ppport(qw(--copy=f));for (qw(main.xs mod1.c mod2.c mod3.c mod4.c mod5.c)) {  ok($o =~ /^Scanning.*\Q$_\E/mi);  ok($o =~ /Analyzing.*\Q$_\E/i);}ok(matches($o, '^Scanning', 'm'), 6);ok(matches($o, '^Writing copy of', 'm'), 5);ok(!-e "mod5.cf");for (qw(main.xs mod1.c mod2.c mod3.c mod4.c)) {  ok($o =~ /^Writing copy of.*\Q$_\E.*with changes/mi);  ok(-e "${_}f");  ok(eq_files("${_}f", "${_}r"));  unlink "${_}f";}---------------------------- main.xs ------------------------------------------#include "EXTERN.h"#include "perl.h"#include "XSUB.h"#define NEED_newCONSTSUB#define NEED_grok_hex_GLOBAL#include "ppport.h"newCONSTSUB();grok_hex();Perl_grok_bin(aTHX_ foo, bar);/* some comment */perl_eval_pv();grok_bin();Perl_grok_bin(bar, sv_no);---------------------------- mod1.c -------------------------------------------#include "EXTERN.h"#include "perl.h"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -