Perl500503Syntax-OrDie
view release on metacpan or search on metacpan
t/corpus-stack/mb/lib/mb.pm view on Meta::CPAN
if (my @x = /\G$x/g) {
$chop = pop @x;
$_ = join '', @x;
}
}
return $chop;
}
#---------------------------------------------------------------------
# chr() for MBCS encoding
sub mb::chr (;$) {
my $number = @_ ? $_[0] : $_;
# Negative values give the Unicode replacement character (chr(0xfffd)),
# except under the bytes pragma, where the low eight bits of the value
# (truncated to an integer) are used.
my @octet = ();
CORE::do {
unshift @octet, ($number % 0x100);
$number = int($number / 0x100);
} while ($number > 0);
return pack 'C*', @octet;
}
#---------------------------------------------------------------------
# do FILE for MBCS encoding
sub mb::do ($) {
my($file) = @_;
for my $prefix_file ($file, map { "$_/$file" } @INC) {
if (-f $prefix_file) {
# poor "make"
(my $prefix_file_oo = $prefix_file) =~ s{\A (.*) \. ([^.]+) \z}{$1.oo.$2}xms;
if (
(not -e $prefix_file_oo) or
(mtime($prefix_file_oo) <= mtime($prefix_file)) or
(mtime($prefix_file_oo) <= mtime(__FILE__))
) {
my $fh = mb::_open_r($prefix_file) or confess "$0(@{[__LINE__]}): can't open file: $prefix_file\n";
local $_ = CORE::do { local $/; no strict 'refs'; readline(*{$fh}) };
{ no strict 'refs'; close($fh) }
# poor file locking
local $SIG{__DIE__} = sub { rmdir "$prefix_file.lock"; };
if (mkdir "$prefix_file.lock", 0755) {
my $fh = mb::_open_w($prefix_file_oo) or confess "$0(@{[__LINE__]}): can't open file: $prefix_file_oo\n";
{ no strict 'refs'; print {*{$fh}} mb::_insert_source_encoding_unimport(mb::parse()) }
{ no strict 'refs'; close($fh) }
rmdir "$prefix_file.lock";
}
else {
confess "$0(@{[__LINE__]}): can't mkdir: $prefix_file.lock\n";
}
}
$INC{$file} = $prefix_file_oo;
# run as Perl script
# must use CORE::do to use <DATA>, because CORE::eval cannot do it
# moreover "goto &CORE::do" doesn't work
return CORE::eval sprintf(<<'END', (caller)[0,2,1]);
package %s;
#line %s "%s"
CORE::do "$prefix_file_oo";
END
}
}
confess "Can't find $file in \@INC";
}
#---------------------------------------------------------------------
# DOS-like glob() for MBCS encoding
sub mb::dosglob (;$) {
my $expr = @_ ? $_[0] : $_;
my @glob = ();
# works on not MSWin32
if ($OSNAME !~ /MSWin32/) {
@glob = CORE::glob($expr);
}
# works on MSWin32
else {
# gets pattern
while ($expr =~ s{\A [\x20]* ( "(?:$x)+?" | (?:(?!["\x20])$x)+ ) }{}xms) {
my $pattern = $1;
# avoids command injection
next if $pattern =~ /\G${mb::_anchor} \& /xms;
next if $pattern =~ /\G${mb::_anchor} \( /xms;
next if $pattern =~ /\G${mb::_anchor} \) /xms;
next if $pattern =~ /\G${mb::_anchor} \< /xms;
next if $pattern =~ /\G${mb::_anchor} \> /xms;
next if $pattern =~ /\G${mb::_anchor} \^ /xms;
next if $pattern =~ /\G${mb::_anchor} \| /xms;
# makes globbing result
mb::tr($pattern, '/', "\x5C");
if (my($dir) = $pattern =~ m{\A ($x*) \\ }xms) {
push @glob, map { "$dir\\$_" } CORE::split /\n/, `DIR /B $pattern 2>NUL`;
}
else {
push @glob, CORE::split /\n/, `DIR /B $pattern 2>NUL`;
}
}
}
# returns globbing result
my %glob = map { $_ => 1 } @glob;
return sort { (mb::uc($a) cmp mb::uc($b)) || ($a cmp $b) } keys %glob;
}
#---------------------------------------------------------------------
# eval STRING for MBCS encoding
sub mb::eval (;$) {
local $_ = @_ ? $_[0] : $_;
# run as Perl script in caller package
return CORE::eval sprintf(<<'END', (caller)[0,2,1], mb::parse());
package %s;
#line %s "%s"
%s
END
}
#---------------------------------------------------------------------
# getc() for MBCS encoding
sub mb::getc (;*) {
my $fh = @_ ? shift(@_) : \*STDIN;
confess 'Too many arguments for mb::getc' if @_ and not wantarray;
my $getc = CORE::getc $fh;
if ($script_encoding =~ /\A (?: sjis ) \z/xms) {
if ($getc =~ /\A [\x81-\x9F\xE0-\xFC] \z/xms) {
$getc .= CORE::getc $fh;
}
}
elsif ($script_encoding =~ /\A (?: eucjp ) \z/xms) {
if ($getc =~ /\A [\xA1-\xFE] \z/xms) {
$getc .= CORE::getc $fh;
}
}
elsif ($script_encoding =~ /\A (?: gbk | uhc | big5 | big5hkscs ) \z/xms) {
if ($getc =~ /\A [\x81-\xFE] \z/xms) {
$getc .= CORE::getc $fh;
}
}
elsif ($script_encoding =~ /\A (?: gb18030 ) \z/xms) {
if ($getc =~ /\A [\x81-\xFE] \z/xms) {
$getc .= CORE::getc $fh;
if ($getc =~ /\A [\x81-\xFE] [\x30-\x39] \z/xms) {
$getc .= CORE::getc $fh;
$getc .= CORE::getc $fh;
}
}
}
elsif ($script_encoding =~ /\A (?: rfc2279 | utf8 | wtf8 ) \z/xms) {
if ($getc =~ /\A [\x00-\x7F\x80-\xC1\xF5-\xFF] \z/xms) {
}
elsif ($getc =~ /\A [\xC2-\xDF] \z/xms) {
$getc .= CORE::getc $fh;
}
elsif ($getc =~ /\A [\xE0-\xEF] \z/xms) {
$getc .= CORE::getc $fh;
$getc .= CORE::getc $fh;
}
elsif ($getc =~ /\A [\xF0-\xF4] \z/xms) {
$getc .= CORE::getc $fh;
$getc .= CORE::getc $fh;
$getc .= CORE::getc $fh;
}
}
return wantarray ? ($getc,@_) : $getc;
}
#---------------------------------------------------------------------
# index() for MBCS encoding
sub mb::index ($$;$) {
my $index = 0;
if (@_ == 3) {
t/corpus-stack/mb/lib/mb.pm view on Meta::CPAN
#---------------------------------------------------------------------
# require for MBCS encoding
sub mb::require (;$) {
local $_ = @_ ? $_[0] : $_;
# require perl version
if (/^[0-9]/) {
if ($] < $_) {
confess "Perl $_ required--this is only version $], stopped";
}
else {
undef $@;
return 1;
}
}
# require expr
else {
# find expr in @INC
my $file = $_;
if (($file =~ s{::}{/}g) or ($file !~ m{[\./\\]})) {
$file .= '.pm';
}
if (exists $INC{$file}) {
undef $@;
return 1 if $INC{$file};
confess "Compilation failed in require";
}
for my $prefix_file ($file, map { "$_/$file" } @INC) {
if (-f $prefix_file) {
# poor "make"
(my $prefix_file_oo = $prefix_file) =~ s{\A (.*) \. ([^.]+) \z}{$1.oo.$2}xms;
if (
(not -e $prefix_file_oo) or
(mtime($prefix_file_oo) <= mtime($prefix_file)) or
(mtime($prefix_file_oo) <= mtime(__FILE__))
) {
my $fh = mb::_open_r($prefix_file) or confess "$0(@{[__LINE__]}): can't open file: $prefix_file\n";
local $_ = CORE::do { local $/; no strict 'refs'; readline(*{$fh}) };
{ no strict 'refs'; close($fh) }
# poor file locking
local $SIG{__DIE__} = sub { rmdir "$prefix_file.lock"; };
if (mkdir "$prefix_file.lock", 0755) {
my $fh = mb::_open_w($prefix_file_oo) or confess "$0(@{[__LINE__]}): can't open file: $prefix_file_oo\n";
{ no strict 'refs'; print {*{$fh}} mb::_insert_source_encoding_unimport(mb::parse()) }
{ no strict 'refs'; close($fh) }
rmdir "$prefix_file.lock";
}
else {
confess "$0(@{[__LINE__]}): can't mkdir: $prefix_file.lock\n";
}
}
$INC{$_} = $prefix_file_oo;
# run as Perl script
# must use CORE::do to use <DATA>, because CORE::eval cannot do it.
local $@;
my $result = CORE::eval sprintf(<<'END', (caller)[0,2,1]);
package %s;
#line %s "%s"
CORE::do "$prefix_file_oo";
END
# return result
if ($@) {
$INC{$_} = undef;
confess $@;
}
elsif (not $result) {
delete $INC{$_};
confess "$_ did not return true value";
}
else {
return $result;
}
}
}
confess "Can't find $_ in \@INC";
}
}
#---------------------------------------------------------------------
# reverse() for MBCS encoding
sub mb::reverse (@) {
# in list context,
if (wantarray) {
# returns a list value consisting of the elements of @_ in the opposite order
return CORE::reverse @_;
}
# in scalar context,
else {
# returns a string value with all characters in the opposite order of
return (join '',
CORE::reverse(
@_ ?
join('',@_) =~ /\G$x/g : # concatenates the elements of @_
/\G$x/g # $_ when without arguments
)
);
}
}
#---------------------------------------------------------------------
# rindex() for MBCS encoding
sub mb::rindex ($$;$) {
my $rindex = 0;
if (@_ == 3) {
$rindex = mb::rindex_byte($_[0], $_[1], CORE::length(mb::substr($_[0], 0, $_[2])));
}
else {
$rindex = mb::rindex_byte($_[0], $_[1]);
}
if ($rindex == -1) {
return -1;
( run in 2.317 seconds using v1.01-cache-2.11-cpan-cdf2f3d4e48 )