The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

package Einfomixv6als;
######################################################################
#
# Einfomixv6als - Run-time routines for INFOMIXV6ALS.pm
#
# Copyright (c) 2008, 2009 INABA Hitoshi <ina@cpan.org>
#
######################################################################
use strict;
use 5.00503;
use vars qw($VERSION $_warning $last_s_matched);
$VERSION = sprintf '%d.%02d', q$Revision: 0.41 $ =~ m/(\d+)/xmsg;
use Fcntl;
use Symbol;
use FindBin;
use Carp qw(carp croak confess cluck verbose);
local $SIG{__DIE__} = sub { confess @_ } if exists $ENV{'SJIS_DEBUG'};
local $SIG{__WARN__} = sub { cluck @_ } if exists $ENV{'SJIS_DEBUG'};
$_warning = $^W; # push warning, warning on
local $^W = 1;
BEGIN {
if ($^X =~ m/ jperl /oxmsi) {
croak "$0 need perl(not jperl) 5.00503 or later. (\$^X==$^X)";
}
}
my $your_char = q{\xFD[\xA1-\xFE][\xA1-\xFE]|[\x81-\x9F\xE0-\xFC][\x00-\xFF]|[\x00-\xFF]};
# regexp of character
my $q_char = qr/$your_char/oxms;
#
# INFOMIX V6 ALS character range per length
#
my %range_tr = ();
my $is_shiftjis_family = 0;
my $is_eucjp_family = 0;
# Big5Plus
if (__PACKAGE__ eq 'Ebig5plus') {
%range_tr = (
1 => [ [0x00..0x80,0xFF],
],
2 => [ [0x81..0xFE],[0x40..0x7E,0x80..0xFE],
],
);
}
# EUC-JP
elsif (__PACKAGE__ eq 'Eeucjp') {
%range_tr = (
1 => [ [0x00..0x8D,0x90..0xA0,0xFF],
],
2 => [ [0x8E..0x8E],[0xA1..0xDF],
[0xA1..0xFE],[0xA1..0xFE],
],
3 => [ [0x8F..0x8F],[0xA1..0xFE],[0xA1..0xFE],
],
);
$is_eucjp_family = 1;
}
# GB18030
elsif (__PACKAGE__ eq 'Egb18030') {
%range_tr = (
1 => [ [0x00..0x80,0xFF],
],
2 => [ [0x81..0xFE],[0x40..0x7E,0x80..0xFE],
],
4 => [ [0x81..0xFE],[0x30..0x39],[0x81..0xFE],[0x30..0x39],
],
);
}
# GBK
elsif (__PACKAGE__ eq 'Egbk') {
%range_tr = (
1 => [ [0x00..0x80,0xFF],
],
2 => [ [0x81..0xFE],[0x40..0x7E,0x80..0xFE],
],
);
}
# HP-15
elsif (__PACKAGE__ eq 'Ehp15') {
%range_tr = (
1 => [ [0x00..0x7F,0xA1..0xDF,0xFF],
],
2 => [ [0x80..0xA0,0xE0..0xFE],[0x21..0x7E,0x80..0xFF],
],
);
$is_shiftjis_family = 1;
}
# INFOMIX V6 ALS
elsif (__PACKAGE__ eq 'Einfomixv6als') {
%range_tr = (
1 => [ [0x00..0x80,0xA0..0xDF,0xFE..0xFF],
],
2 => [ [0x81..0x9F,0xE0..0xFC],[0x40..0x7E,0x80..0xFC],
],
3 => [ [0xFD..0xFD],[0xA1..0xFE],[0xA1..0xFE],
],
);
$is_shiftjis_family = 1;
}
# INFOMIX V6 ALS
elsif (__PACKAGE__ eq 'E'.'sjis') {
%range_tr = (
1 => [ [0x00..0x80,0xA0..0xDF,0xFD..0xFF],
],
2 => [ [0x81..0x9F,0xE0..0xFC],[0x40..0x7E,0x80..0xFC],
],
);
$is_shiftjis_family = 1;
}
# UHC
elsif (__PACKAGE__ eq 'Euhc') {
%range_tr = (
1 => [ [0x00..0x80,0xFF],
],
2 => [ [0x81..0xFE],[0x41..0x5A,0x61..0x7A,0x81..0xFE],
],
);
}
else {
croak "$0 don't know my package name '" . __PACKAGE__ . "'";
}
#
# Prototypes of subroutines
#
sub import() {}
sub unimport() {}
sub Einfomixv6als::split(;$$$);
sub Einfomixv6als::tr($$$$;$);
sub Einfomixv6als::chop(@);
sub Einfomixv6als::index($$;$);
sub Einfomixv6als::rindex($$;$);
sub Einfomixv6als::lc(@);
sub Einfomixv6als::lc_();
sub Einfomixv6als::uc(@);
sub Einfomixv6als::uc_();
sub Einfomixv6als::capture($);
sub Einfomixv6als::ignorecase(@);
sub Einfomixv6als::chr(;$);
sub Einfomixv6als::chr_();
sub Einfomixv6als::r(;*@);
sub Einfomixv6als::w(;*@);
sub Einfomixv6als::x(;*@);
sub Einfomixv6als::o(;*@);
sub Einfomixv6als::R(;*@);
sub Einfomixv6als::W(;*@);
sub Einfomixv6als::X(;*@);
sub Einfomixv6als::O(;*@);
sub Einfomixv6als::e(;*@);
sub Einfomixv6als::z(;*@);
sub Einfomixv6als::s(;*@);
sub Einfomixv6als::f(;*@);
sub Einfomixv6als::d(;*@);
sub Einfomixv6als::l(;*@);
sub Einfomixv6als::p(;*@);
sub Einfomixv6als::S(;*@);
sub Einfomixv6als::b(;*@);
sub Einfomixv6als::c(;*@);
sub Einfomixv6als::t(;*@);
sub Einfomixv6als::u(;*@);
sub Einfomixv6als::g(;*@);
sub Einfomixv6als::k(;*@);
sub Einfomixv6als::T(;*@);
sub Einfomixv6als::B(;*@);
sub Einfomixv6als::M(;*@);
sub Einfomixv6als::A(;*@);
sub Einfomixv6als::C(;*@);
sub Einfomixv6als::r_();
sub Einfomixv6als::w_();
sub Einfomixv6als::x_();
sub Einfomixv6als::o_();
sub Einfomixv6als::R_();
sub Einfomixv6als::W_();
sub Einfomixv6als::X_();
sub Einfomixv6als::O_();
sub Einfomixv6als::e_();
sub Einfomixv6als::z_();
sub Einfomixv6als::s_();
sub Einfomixv6als::f_();
sub Einfomixv6als::d_();
sub Einfomixv6als::l_();
sub Einfomixv6als::p_();
sub Einfomixv6als::S_();
sub Einfomixv6als::b_();
sub Einfomixv6als::c_();
sub Einfomixv6als::t_();
sub Einfomixv6als::u_();
sub Einfomixv6als::g_();
sub Einfomixv6als::k_();
sub Einfomixv6als::T_();
sub Einfomixv6als::B_();
sub Einfomixv6als::M_();
sub Einfomixv6als::A_();
sub Einfomixv6als::C_();
sub Einfomixv6als::glob($);
sub Einfomixv6als::glob_();
sub Einfomixv6als::lstat(*);
sub Einfomixv6als::lstat_();
sub Einfomixv6als::opendir(*$);
sub Einfomixv6als::stat(*);
sub Einfomixv6als::stat_();
sub Einfomixv6als::unlink(@);
sub Einfomixv6als::chdir(;$);
sub Einfomixv6als::do($);
sub Einfomixv6als::require(;$);
sub INFOMIXV6ALS::ord(;$);
sub INFOMIXV6ALS::ord_();
sub INFOMIXV6ALS::reverse(@);
sub INFOMIXV6ALS::length(;$);
sub INFOMIXV6ALS::substr($$;$$);
sub INFOMIXV6ALS::index($$;$);
sub INFOMIXV6ALS::rindex($$;$);
#
# @ARGV wildcard globbing
#
if ($^O =~ /\A (?: MSWin32 | NetWare | symbian | dos ) \z/oxms) {
if ($ENV{'ComSpec'} =~ / (?: COMMAND\.COM | CMD\.EXE ) \z /oxmsi) {
my @argv = ();
for (@ARGV) {
if (m/\A ' ((?:$q_char)*) ' \z/oxms) {
push @argv, $1;
}
elsif (my @glob = Einfomixv6als::glob($_)) {
push @argv, @glob;
}
else {
push @argv, $_;
}
}
@ARGV = @argv;
}
}
#
# prepare INFOMIX V6 ALS characters per length
#
my @chars1 = ();
my @chars2 = ();
my @chars3 = ();
my @chars4 = ();
if (exists $range_tr{1}) {
my @ranges = @{ $range_tr{1} };
while (my @range = splice(@ranges,0,1)) {
for my $oct0 (@{$range[0]}) {
push @chars1, pack 'C', $oct0;
}
}
}
if (exists $range_tr{2}) {
my @ranges = @{ $range_tr{2} };
while (my @range = splice(@ranges,0,2)) {
for my $oct0 (@{$range[0]}) {
for my $oct1 (@{$range[1]}) {
push @chars2, pack 'CC', $oct0,$oct1;
}
}
}
}
if (exists $range_tr{3}) {
my @ranges = @{ $range_tr{3} };
while (my @range = splice(@ranges,0,3)) {
for my $oct0 (@{$range[0]}) {
for my $oct1 (@{$range[1]}) {
for my $oct2 (@{$range[2]}) {
push @chars3, pack 'CCC', $oct0,$oct1,$oct2;
}
}
}
}
}
if (exists $range_tr{4}) {
my @ranges = @{ $range_tr{4} };
while (my @range = splice(@ranges,0,4)) {
for my $oct0 (@{$range[0]}) {
for my $oct1 (@{$range[1]}) {
for my $oct2 (@{$range[2]}) {
for my $oct3 (@{$range[3]}) {
push @chars4, pack 'CCCC', $oct0,$oct1,$oct2,$oct3;
}
}
}
}
}
}
my @minchar = (undef, $chars1[ 0], $chars2[ 0], $chars3[ 0], $chars4[ 0]);
my @maxchar = (undef, $chars1[-1], $chars2[-1], $chars3[-1], $chars4[-1]);
#
# INFOMIX V6 ALS split
#
sub Einfomixv6als::split(;$$$) {
# P.794 split
# in Chapter 29: Functions
# of ISBN 0-596-00027-8 Programming Perl Third Edition.
my $pattern = $_[0];
my $string = $_[1];
my $limit = $_[2];
# if $string is omitted, the function splits the $_ string
$string = $_ if not defined $string;
my @split = ();
# if $limit is negative, it is treated as if an arbitrarily large $limit has been specified
if ((not defined $limit) or ($limit <= 0)) {
# if $pattern is also omitted or is the literal space, " ", the function splits
# on whitespace, /\s+/, after skipping any leading whitespace
# (and so on)
if ((not defined $pattern) or ($pattern eq ' ')) {
$string =~ s/ \A \s+ //oxms;
# the //m modifier is assumed when you split on the pattern /^/
# (and so on)
while ($string =~ s/\A((?:$q_char)*?)\s+//m) {
# if the $pattern contains parentheses, then the substring matched by each pair of parentheses
# is included in the resulting list, interspersed with the fields that are ordinarily returned
# (and so on)
local $@;
for (my $digit=1; eval "defined(\$$digit)"; $digit++) {
push @split, eval '$' . $digit;
}
}
}
# a pattern capable of matching either the null string or something longer than the
# null string will split the value of $string into separate characters wherever it
# matches the null string between characters
# (and so on)
elsif ('' =~ m/ \A $pattern \z /xms) {
while ($string =~ s/\A((?:$q_char)+?)$pattern//m) {
local $@;
for (my $digit=1; eval "defined(\$$digit)"; $digit++) {
push @split, eval '$' . $digit;
}
}
}
else {
while ($string =~ s/\A((?:$q_char)*?)$pattern//m) {
local $@;
for (my $digit=1; eval "defined(\$$digit)"; $digit++) {
push @split, eval '$' . $digit;
}
}
}
}
else {
if ((not defined $pattern) or ($pattern eq ' ')) {
$string =~ s/ \A \s+ //oxms;
while ((--$limit > 0) and (CORE::length($string) > 0)) {
if ($string =~ s/\A((?:$q_char)*?)\s+//m) {
local $@;
for (my $digit=1; eval "defined(\$$digit)"; $digit++) {
push @split, eval '$' . $digit;
}
}
}
}
elsif ('' =~ m/ \A $pattern \z /xms) {
while ((--$limit > 0) and (CORE::length($string) > 0)) {
if ($string =~ s/\A((?:$q_char)+?)$pattern//m) {
local $@;
for (my $digit=1; eval "defined(\$$digit)"; $digit++) {
push @split, eval '$' . $digit;
}
}
}
}
else {
while ((--$limit > 0) and (CORE::length($string) > 0)) {
if ($string =~ s/\A((?:$q_char)*?)$pattern//m) {
local $@;
for (my $digit=1; eval "defined(\$$digit)"; $digit++) {
push @split, eval '$' . $digit;
}
}
}
}
}
push @split, $string;
# if $limit is omitted or zero, trailing null fields are stripped from the result
if ((not defined $limit) or ($limit == 0)) {
while ($split[-1] eq '') {
pop @split;
}
}
# resulting list value in list context
if (wantarray) {
return @split;
}
# count of substrings in scalar context
else {
cluck "$0: Use of implicit split to \@_ is deprecated" if $^W;
@_ = @split;
return scalar @_;
}
}
#
# INFOMIX V6 ALS transliteration (tr///)
#
sub Einfomixv6als::tr($$$$;$) {
my $bind_operator = $_[1];
my $searchlist = $_[2];
my $replacementlist = $_[3];
my $modifier = $_[4] || '';
my @char = $_[0] =~ m/\G ($q_char) /oxmsg;
my @searchlist = _charlist_tr($searchlist);
my @replacementlist = _charlist_tr($replacementlist);
my %tr = ();
for (my $i=0; $i <= $#searchlist; $i++) {
if (not exists $tr{$searchlist[$i]}) {
if (defined $replacementlist[$i] and ($replacementlist[$i] ne '')) {
$tr{$searchlist[$i]} = $replacementlist[$i];
}
elsif ($modifier =~ m/d/oxms) {
$tr{$searchlist[$i]} = '';
}
elsif (defined $replacementlist[-1] and ($replacementlist[-1] ne '')) {
$tr{$searchlist[$i]} = $replacementlist[-1];
}
else {
$tr{$searchlist[$i]} = $searchlist[$i];
}
}
}
my $tr = 0;
$_[0] = '';
if ($modifier =~ m/c/oxms) {
while (defined(my $char = shift @char)) {
if (not exists $tr{$char}) {
if (defined $replacementlist[0]) {
$_[0] .= $replacementlist[0];
}
$tr++;
if ($modifier =~ m/s/oxms) {
while (@char and (not exists $tr{$char[0]})) {
shift @char;
$tr++;
}
}
}
else {
$_[0] .= $char;
}
}
}
else {
while (defined(my $char = shift @char)) {
if (exists $tr{$char}) {
$_[0] .= $tr{$char};
$tr++;
if ($modifier =~ m/s/oxms) {
while (@char and (exists $tr{$char[0]}) and ($tr{$char[0]} eq $tr{$char})) {
shift @char;
$tr++;
}
}
}
else {
$_[0] .= $char;
}
}
}
if ($bind_operator =~ m/ !~ /oxms) {
return not $tr;
}
else {
return $tr;
}
}
#
# INFOMIX V6 ALS chop
#
sub Einfomixv6als::chop(@) {
my $chop;
if (@_ == 0) {
my @char = m/\G ($q_char) /oxmsg;
$chop = pop @char;
$_ = join '', @char;
}
else {
for (@_) {
my @char = m/\G ($q_char) /oxmsg;
$chop = pop @char;
$_ = join '', @char;
}
}
return $chop;
}
#
# INFOMIX V6 ALS index by octet
#
sub Einfomixv6als::index($$;$) {
my($str,$substr,$position) = @_;
$position ||= 0;
my $pos = 0;
while ($pos < CORE::length($str)) {
if (CORE::substr($str,$pos,CORE::length($substr)) eq $substr) {
if ($pos >= $position) {
return $pos;
}
}
if (CORE::substr($str,$pos) =~ m/\A ($q_char) /oxms) {
$pos += CORE::length($1);
}
else {
$pos += 1;
}
}
return -1;
}
#
# INFOMIX V6 ALS reverse index
#
sub Einfomixv6als::rindex($$;$) {
my($str,$substr,$position) = @_;
$position ||= CORE::length($str) - 1;
my $pos = 0;
my $rindex = -1;
while (($pos < CORE::length($str)) and ($pos <= $position)) {
if (CORE::substr($str,$pos,CORE::length($substr)) eq $substr) {
$rindex = $pos;
}
if (CORE::substr($str,$pos) =~ m/\A ($q_char) /oxms) {
$pos += CORE::length($1);
}
else {
$pos += 1;
}
}
return $rindex;
}
#
# INFOMIX V6 ALS lower case (with parameter)
#
sub Einfomixv6als::lc(@) {
local $_ = shift if @_;
my %lc = ();
@lc{qw(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)} =
qw(a b c d e f g h i j k l m n o p q r s t u v w x y z);
local $^W = 0;
return join('', map {$lc{$_}||$_} m/\G ($q_char) /oxmsg), @_;
}
#
# INFOMIX V6 ALS lower case (without parameter)
#
sub Einfomixv6als::lc_() {
my %lc = ();
@lc{qw(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)} =
qw(a b c d e f g h i j k l m n o p q r s t u v w x y z);
local $^W = 0;
return join('', map {$lc{$_}||$_} m/\G ($q_char) /oxmsg);
}
#
# INFOMIX V6 ALS upper case (with parameter)
#
sub Einfomixv6als::uc(@) {
local $_ = shift if @_;
my %uc = ();
@uc{qw(a b c d e f g h i j k l m n o p q r s t u v w x y z)} =
qw(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z);
local $^W = 0;
return join('', map {$uc{$_}||$_} m/\G ($q_char) /oxmsg), @_;
}
#
# INFOMIX V6 ALS upper case (without parameter)
#
sub Einfomixv6als::uc_() {
my %uc = ();
@uc{qw(a b c d e f g h i j k l m n o p q r s t u v w x y z)} =
qw(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z);
local $^W = 0;
return join('', map {$uc{$_}||$_} m/\G ($q_char) /oxmsg);
}
#
# INFOMIX V6 ALS regexp capture
#
sub Einfomixv6als::capture($) {
if ($last_s_matched and ($_[0] =~ m/\A [1-9][0-9]* \z/oxms)) {
return $_[0] + 1;
}
else {
return $_[0];
}
}
#
# INFOMIX V6 ALS regexp ignore case option
#
sub Einfomixv6als::ignorecase(@) {
my @string = @_;
my $metachar = qr/[\@\\|[\]{]/oxms;
# ignore case of $scalar or @array
for my $string (@string) {
# split regexp
my @char = $string =~ m{\G(
\[\^ |
\\? (?:$q_char)
)}oxmsg;
# unescape character
for (my $i=0; $i <= $#char; $i++) {
next if not defined $char[$i];
# open character class [...]
if ($char[$i] eq '[') {
my $left = $i;
while (1) {
if (++$i > $#char) {
croak "$0: unmatched [] in regexp";
}
if ($char[$i] eq ']') {
my $right = $i;
my @charlist = charlist_qr(@char[$left+1..$right-1], 'i');
# escape character
for my $char (@charlist) {
# do not use quotemeta here
if ($char =~ m/\A ([\x80-\xFF].*) ($metachar) \z/oxms) {
$char = $1 . '\\' . $2;
}
elsif ($char =~ m/\A [.|)] \z/oxms) {
$char = $1 . '\\' . $char;
}
}
# [...]
splice @char, $left, $right-$left+1, '(?:' . join('|', @charlist) . ')';
$i = $left;
last;
}
}
}
# open character class [^...]
elsif ($char[$i] eq '[^') {
my $left = $i;
while (1) {
if (++$i > $#char) {
croak "$0: unmatched [] in regexp";
}
if ($char[$i] eq ']') {
my $right = $i;
my @charlist = charlist_not_qr(@char[$left+1..$right-1], 'i');
# escape character
for my $char (@charlist) {
# do not use quotemeta here
if ($char =~ m/\A ([\x80-\xFF].*) ($metachar) \z/oxms) {
$char = $1 . '\\' . $2;
}
elsif ($char =~ m/\A [.|)] \z/oxms) {
$char = '\\' . $char;
}
}
# [^...]
splice @char, $left, $right-$left+1, '(?!' . join('|', @charlist) . ")(?:$your_char)";
$i = $left;
last;
}
}
}
# rewrite character class or escape character
elsif (my $char = {
'\D' => '(?:\xFD[\xA1-\xFE][\xA1-\xFE]|[\x81-\x9F\xE0-\xFC][\x00-\xFF]|[^\d])',
'\S' => '(?:\xFD[\xA1-\xFE][\xA1-\xFE]|[\x81-\x9F\xE0-\xFC][\x00-\xFF]|[^\s])',
'\W' => '(?:\xFD[\xA1-\xFE][\xA1-\xFE]|[\x81-\x9F\xE0-\xFC][\x00-\xFF]|[^\w])',
'\H' => '(?:\xFD[\xA1-\xFE][\xA1-\xFE]|[\x81-\x9F\xE0-\xFC][\x00-\xFF]|[^\x09\x20])',
'\V' => '(?:\xFD[\xA1-\xFE][\xA1-\xFE]|[\x81-\x9F\xE0-\xFC][\x00-\xFF]|[^\x0A\x0B\x0C\x0D])',
'\h' => '[\x09\x20]', # not include \xA0
'\v' => '[\x0A\x0B\x0C\x0D]', # not include \x85
}->{$char[$i]}
) {
$char[$i] = $char;
}
# /i option
elsif ($char[$i] =~ m/\A ([A-Za-z]) \z/oxms) {
my $c = $1;
$char[$i] = '[' . CORE::uc($c) . CORE::lc($c) . ']';
}
}
# characterize
for (my $i=0; $i <= $#char; $i++) {
next if not defined $char[$i];
# escape last octet of multiple octet
if ($char[$i] =~ m/\A ([\x80-\xFF].*) ($metachar) \z/oxms) {
$char[$i] = $1 . '\\' . $2;
}
# quote character before ? + * {
elsif (($i >= 1) and ($char[$i] =~ m/\A [\?\+\*\{] \z/oxms)) {
if ($char[$i-1] !~ m/\A [\x00-\xFF] \z/oxms) {
$char[$i-1] = '(?:' . $char[$i-1] . ')';
}
}
}
$string = join '', @char;
}
# make regexp string
return @string;
}
#
# INFOMIX V6 ALS open character list for tr
#
sub _charlist_tr {
local $_ = shift @_;
# unescape character
my @char = ();
while (not m/\G \z/oxmsgc) {
if (m/\G (\\0?55|\\x2[Dd]|\\-) /oxmsgc) {
push @char, '\-';
}
elsif (m/\G \\ ([0-7]{2,3}) /oxmsgc) {
push @char, CORE::chr(oct $1);
}
elsif (m/\G \\x ([0-9A-Fa-f]{1,2}) /oxmsgc) {
push @char, CORE::chr(hex $1);
}
elsif (m/\G \\c ([\x40-\x5F]) /oxmsgc) {
push @char, CORE::chr(CORE::ord($1) & 0x1F);
}
elsif (m/\G (\\ [0nrtfbae]) /oxmsgc) {
push @char, {
'\0' => "\0",
'\n' => "\n",
'\r' => "\r",
'\t' => "\t",
'\f' => "\f",
'\b' => "\x08", # \b means backspace in character class
'\a' => "\a",
'\e' => "\e",
}->{$1};
}
elsif (m/\G \\ ($q_char) /oxmsgc) {
push @char, $1;
}
elsif (m/\G ($q_char) /oxmsgc) {
push @char, $1;
}
}
# join separated multiple octet
@char = join('',@char) =~ m/\G (\\-|$q_char) /oxmsg;
# unescape '-'
my @i = ();
for my $i (0 .. $#char) {
if ($char[$i] eq '\-') {
$char[$i] = '-';
}
elsif ($char[$i] eq '-') {
if ((0 < $i) and ($i < $#char)) {
push @i, $i;
}
}
}
# open character list (reverse for splice)
for my $i (CORE::reverse @i) {
my @range = ();
# range error
if ((length($char[$i-1]) > length($char[$i+1])) or ($char[$i-1] gt $char[$i+1])) {
croak "$0: invalid [] range \"\\x" . unpack('H*',$char[$i-1]) . '-\\x' . unpack('H*',$char[$i+1]) . '" in regexp';
}
# range of multiple octet code
if (length($char[$i-1]) == 1) {
if (length($char[$i+1]) == 1) {
push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} @chars1;
}
elsif (length($char[$i+1]) == 2) {
push @range, grep {$char[$i-1] le $_} @chars1;
push @range, grep {$_ le $char[$i+1]} @chars2;
}
elsif (length($char[$i+1]) == 3) {
push @range, grep {$char[$i-1] le $_} @chars1;
push @range, @chars2;
push @range, grep {$_ le $char[$i+1]} @chars3;
}
elsif (length($char[$i+1]) == 4) {
push @range, grep {$char[$i-1] le $_} @chars1;
push @range, @chars2;
push @range, @chars3;
push @range, grep {$_ le $char[$i+1]} @chars4;
}
}
elsif (length($char[$i-1]) == 2) {
if (length($char[$i+1]) == 2) {
push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} @chars2;
}
elsif (length($char[$i+1]) == 3) {
push @range, grep {$char[$i-1] le $_} @chars2;
push @range, grep {$_ le $char[$i+1]} @chars3;
}
elsif (length($char[$i+1]) == 4) {
push @range, grep {$char[$i-1] le $_} @chars2;
push @range, @chars3;
push @range, grep {$_ le $char[$i+1]} @chars4;
}
}
elsif (length($char[$i-1]) == 3) {
if (length($char[$i+1]) == 3) {
push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} @chars3;
}
elsif (length($char[$i+1]) == 4) {
push @range, grep {$char[$i-1] le $_} @chars3;
push @range, grep {$_ le $char[$i+1]} @chars4;
}
}
elsif (length($char[$i-1]) == 4) {
if (length($char[$i+1]) == 4) {
push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} @chars4;
}
}
splice @char, $i-1, 3, @range;
}
return @char;
}
#
# INFOMIX V6 ALS octet range
#
sub _octets {
my $modifier = pop @_;
my $length = shift;
my($a) = unpack 'C', $_[0];
my($z) = unpack 'C', $_[1];
# single octet code
if ($length == 1) {
# single octet and ignore case
if (((caller(1))[3] ne 'Einfomixv6als::_octets') and ($modifier =~ m/i/oxms)) {
if ($a == $z) {
return sprintf('(?i:\x%02X)', $a);
}
elsif (($a+1) == $z) {
return sprintf('(?i:[\x%02X\x%02X])', $a, $z);
}
else {
return sprintf('(?i:[\x%02X-\x%02X])', $a, $z);
}
}
# not ignore case or one of multiple octet
else {
if ($a == $z) {
return sprintf('\x%02X', $a);
}
elsif (($a+1) == $z) {
return sprintf('[\x%02X\x%02X]', $a, $z);
}
else {
return sprintf('[\x%02X-\x%02X]', $a, $z);
}
}
}
# double octet code of Shift_JIS family
elsif (($length == 2) and $is_shiftjis_family and ($a <= 0x9F) and (0xE0 <= $z)) {
my(undef,$a2) = unpack 'CC', $_[0];
my(undef,$z2) = unpack 'CC', $_[1];
my $octets1;
my $octets2;
if ($a == 0x9F) {
$octets1 = sprintf('\x%02X[\x%02X-\xFF]', 0x9F,$a2);
}
elsif (($a+1) == 0x9F) {
$octets1 = sprintf('\x%02X[\x%02X-\xFF]|\x%02X[\x00-\xFF]', $a, $a2,$a+1),
}
elsif (($a+2) == 0x9F) {
$octets1 = sprintf('\x%02X[\x%02X-\xFF]|[\x%02X\x%02X][\x00-\xFF]', $a, $a2,$a+1,$a+2),
}
else {
$octets1 = sprintf('\x%02X[\x%02X-\xFF]|[\x%02X-\x%02X][\x00-\xFF]', $a, $a2,$a+1,$a+2),
}
if ($z == 0xE0) {
$octets2 = sprintf('\x%02X[\x00-\x%02X]', $z,$z2);
}
elsif (($z-1) == 0xE0) {
$octets2 = sprintf('\x%02X[\x00-\xFF]|\x%02X[\x00-\x%02X]', $z-1,$z,$z2),
}
elsif (($z-2) == 0xE0) {
$octets2 = sprintf('[\x%02X\x%02X][\x00-\xFF]|\x%02X[\x00X-\x%02X]', $z-2,$z-1,$z,$z2),
}
else {
$octets2 = sprintf('[\x%02X-\x%02X][\x00-\xFF]|\x%02X[\x00-\x%02X]', 0xE0,$z-1,$z,$z2),
}
return "(?:$octets1|$octets2)";
}
# double octet code of EUC-JP family
elsif (($length == 2) and $is_eucjp_family and ($a == 0x8E) and (0xA1 <= $z)) {
my(undef,$a2) = unpack 'CC', $_[0];
my(undef,$z2) = unpack 'CC', $_[1];
my $octets1;
my $octets2;
$octets1 = sprintf('\x%02X[\x%02X-\xFF]', 0x8E,$a2);
if ($z == 0xA1) {
$octets2 = sprintf('\x%02X[\x00-\x%02X]', $z,$z2);
}
elsif (($z-1) == 0xA1) {
$octets2 = sprintf('\x%02X[\x00-\xFF]|\x%02X[\x00-\x%02X]', $z-1,$z,$z2),
}
elsif (($z-2) == 0xA1) {
$octets2 = sprintf('[\x%02X\x%02X][\x00-\xFF]|\x%02X[\x00X-\x%02X]', $z-2,$z-1,$z,$z2),
}
else {
$octets2 = sprintf('[\x%02X-\x%02X][\x00-\xFF]|\x%02X[\x00-\x%02X]', 0xA1,$z-1,$z,$z2),
}
return "(?:$octets1|$octets2)";
}
# multiple octet code
else {
my(undef,$aa) = unpack 'Ca*', $_[0];
my(undef,$zz) = unpack 'Ca*', $_[1];
if ($a == $z) {
return '(?:' . join('|',
sprintf('\x%02X%s', $a, _octets($length-1,$aa, $zz, $modifier)),
) . ')';
}
elsif (($a+1) == $z) {
return '(?:' . join('|',
sprintf('\x%02X%s', $a, _octets($length-1,$aa, $maxchar[$length-1],$modifier)),
sprintf('\x%02X%s', $z, _octets($length-1,$minchar[$length-1],$zz, $modifier)),
) . ')';
}
elsif (($a+2) == $z) {
return '(?:' . join('|',
sprintf('\x%02X%s', $a, _octets($length-1,$aa, $maxchar[$length-1],$modifier)),
sprintf('\x%02X%s', $a+1, _octets($length-1,$minchar[$length-1],$maxchar[$length-1],$modifier)),
sprintf('\x%02X%s', $z, _octets($length-1,$minchar[$length-1],$zz, $modifier)),
) . ')';
}
elsif (($a+3) == $z) {
return '(?:' . join('|',
sprintf('\x%02X%s', $a, _octets($length-1,$aa, $maxchar[$length-1],$modifier)),
sprintf('[\x%02X\x%02X]%s', $a+1,$z-1, _octets($length-1,$minchar[$length-1],$maxchar[$length-1],$modifier)),
sprintf('\x%02X%s', $z, _octets($length-1,$minchar[$length-1],$zz, $modifier)),
) . ')';
}
else {
return '(?:' . join('|',
sprintf('\x%02X%s', $a, _octets($length-1,$aa, $maxchar[$length-1],$modifier)),
sprintf('[\x%02X-\x%02X]%s', $a+1,$z-1, _octets($length-1,$minchar[$length-1],$maxchar[$length-1],$modifier)),
sprintf('\x%02X%s', $z, _octets($length-1,$minchar[$length-1],$zz, $modifier)),
) . ')';
}
}
}
#
# INFOMIX V6 ALS open character list for qr and not qr
#
sub _charlist {
my $modifier = pop @_;
my @char = @_;
# unescape character
for (my $i=0; $i <= $#char; $i++) {
# escape - to ...
if ($char[$i] eq '-') {
if ((0 < $i) and ($i < $#char)) {
$char[$i] = '...';
}
}
elsif ($char[$i] =~ m/\A \\ ([0-7]{2,3}) \z/oxms) {
$char[$i] = CORE::chr oct $1;
}
elsif ($char[$i] =~ m/\A \\x ([0-9A-Fa-f]{1,2}) \z/oxms) {
$char[$i] = CORE::chr hex $1;
}
elsif ($char[$i] =~ m/\A \\c ([\x40-\x5F]) \z/oxms) {
$char[$i] = CORE::chr(CORE::ord($1) & 0x1F);
}
elsif ($char[$i] =~ m/\A (\\ [0nrtfbaedDhHsSvVwW]) \z/oxms) {
$char[$i] = {
'\0' => "\0",
'\n' => "\n",
'\r' => "\r",
'\t' => "\t",
'\f' => "\f",
'\b' => "\x08", # \b means backspace in character class
'\a' => "\a",
'\e' => "\e",
'\d' => '\d',
'\s' => '\s',
'\w' => '\w',
'\D' => '(?:\xFD[\xA1-\xFE][\xA1-\xFE]|[\x81-\x9F\xE0-\xFC][\x00-\xFF]|[^\d])',
'\S' => '(?:\xFD[\xA1-\xFE][\xA1-\xFE]|[\x81-\x9F\xE0-\xFC][\x00-\xFF]|[^\s])',
'\W' => '(?:\xFD[\xA1-\xFE][\xA1-\xFE]|[\x81-\x9F\xE0-\xFC][\x00-\xFF]|[^\w])',
'\H' => '(?:\xFD[\xA1-\xFE][\xA1-\xFE]|[\x81-\x9F\xE0-\xFC][\x00-\xFF]|[^\x09\x20])',
'\V' => '(?:\xFD[\xA1-\xFE][\xA1-\xFE]|[\x81-\x9F\xE0-\xFC][\x00-\xFF]|[^\x0A\x0B\x0C\x0D])',
'\h' => '[\x09\x20]', # not include \xA0
'\v' => '[\x0A\x0B\x0C\x0D]', # not include \x85
}->{$1};
}
elsif ($char[$i] =~ m/\A \\ ($q_char) \z/oxms) {
$char[$i] = $1;
}
}
# open character list
my @singleoctet = ();
my @charlist = ();
for (my $i=0; $i <= $#char; ) {
# escaped -
if (defined($char[$i+1]) and ($char[$i+1] eq '...')) {
$i += 1;
next;
}
elsif ($char[$i] eq '...') {
# range error
if ((length($char[$i-1]) > length($char[$i+1])) or ($char[$i-1] gt $char[$i+1])) {
croak "$0: invalid [] range \"\\x" . unpack('H*',$char[$i-1]) . '-\\x' . unpack('H*',$char[$i+1]) . '" in regexp';
}
# range of single octet code and not ignore case
if ((length($char[$i-1]) == 1) and (length($char[$i+1]) == 1) and ($modifier !~ m/i/oxms)) {
my $a = unpack 'C', $char[$i-1];
my $z = unpack 'C', $char[$i+1];
if ($a == $z) {
push @singleoctet, sprintf('\x%02X', $a);
}
elsif (($a+1) == $z) {
push @singleoctet, sprintf('\x%02X\x%02X', $a, $z);
}
else {
push @singleoctet, sprintf('\x%02X-\x%02X', $a, $z);
}
}
# range of multiple octet code
elsif (length($char[$i-1]) == length($char[$i+1])) {
push @charlist, _octets(length($char[$i-1]), $char[$i-1], $char[$i+1], $modifier);
}
elsif (length($char[$i-1]) == 1) {
if (length($char[$i+1]) == 2) {
push @charlist,
_octets(1, $char[$i-1], $maxchar[1], $modifier),
_octets(2, $minchar[2], $char[$i+1], $modifier);
}
elsif (length($char[$i+1]) == 3) {
push @charlist,
_octets(1, $char[$i-1], $maxchar[1], $modifier),
_octets(2, $minchar[2], $maxchar[2], $modifier),
_octets(3, $minchar[3], $char[$i+1], $modifier);
}
elsif (length($char[$i+1]) == 4) {
push @charlist,
_octets(1, $char[$i-1], $maxchar[1], $modifier),
_octets(2, $minchar[2], $maxchar[2], $modifier),
_octets(3, $minchar[3], $maxchar[3], $modifier),
_octets(4, $minchar[4], $char[$i+1], $modifier);
}
}
elsif (length($char[$i-1]) == 2) {
if (length($char[$i+1]) == 3) {
push @charlist,
_octets(2, $char[$i-1], $maxchar[2], $modifier),
_octets(3, $minchar[3], $char[$i+1], $modifier);
}
elsif (length($char[$i+1]) == 4) {
push @charlist,
_octets(2, $char[$i-1], $maxchar[2], $modifier),
_octets(3, $minchar[3], $maxchar[3], $modifier),
_octets(4, $minchar[4], $char[$i+1], $modifier);
}
}
elsif (length($char[$i-1]) == 3) {
if (length($char[$i+1]) == 4) {
push @charlist,
_octets(3, $char[$i-1], $maxchar[3], $modifier),
_octets(4, $minchar[4], $char[$i+1], $modifier);
}
}
else {
croak "$0: invalid [] range \"\\x" . unpack('H*',$char[$i-1]) . '-\\x' . unpack('H*',$char[$i+1]) . '" in regexp';
}
$i += 2;
}
# /i modifier
elsif ($char[$i] =~ m/\A [A-Za-z] \z/oxms) {
if ($modifier =~ m/i/oxms) {
push @singleoctet, CORE::uc $char[$i], CORE::lc $char[$i];
}
else {
push @singleoctet, $char[$i];
}
$i += 1;
}
# single character of single octet code
elsif ($char[$i] =~ m/\A (?: \\h ) \z/oxms) {
push @singleoctet, "\x09", "\x20";
$i += 1;
}
elsif ($char[$i] =~ m/\A (?: \\v ) \z/oxms) {
push @singleoctet, "\x0A","\x0B","\x0C","\x0D";
$i += 1;
}
elsif ($char[$i] =~ m/\A (?: [\x00-\xFF] | \\d | \\s | \\w ) \z/oxms) {
push @singleoctet, $char[$i];
$i += 1;
}
# single character of multiple octet code
else {
push @charlist, $char[$i];
$i += 1;
}
}
# quote metachar
for (@singleoctet) {
if (m/\A \n \z/oxms) {
$_ = '\n';
}
elsif (m/\A \r \z/oxms) {
$_ = '\r';
}
elsif (m/\A ([\x00-\x20\x7F-\xFF]) \z/oxms) {
$_ = sprintf('\x%02X', CORE::ord $1);
}
elsif (m/\A [\x00-\xFF] \z/oxms) {
$_ = quotemeta $_;
}
}
for (@charlist) {
if (m/\A (\xFD[\xA1-\xFE][\xA1-\xFE]|[\x81-\x9F\xE0-\xFC]) ([\x00-\xFF]) \z/oxms) {
$_ = $1 . quotemeta $2;
}
}
# return character list
return \@singleoctet, \@charlist;
}
#
# INFOMIX V6 ALS open character list for qr
#
sub charlist_qr {
my $modifier = pop @_;
my @char = @_;
my($singleoctet, $charlist) = _charlist(@char, $modifier);
my @singleoctet = @$singleoctet;
my @charlist = @$charlist;
# return character list
if (scalar(@singleoctet) == 0) {
}
elsif (scalar(@singleoctet) >= 2) {
push @charlist, '[' . join('',@singleoctet) . ']';
}
elsif ($singleoctet[0] =~ m/ . - . /oxms) {
push @charlist, '[' . $singleoctet[0] . ']';
}
else {
push @charlist, $singleoctet[0];
}
if (scalar(@charlist) >= 2) {
return '(?:' . join('|', @charlist) . ')';
}
else {
return $charlist[0];
}
}
#
# INFOMIX V6 ALS open character list for not qr
#
sub charlist_not_qr {
my $modifier = pop @_;
my @char = @_;
my($singleoctet, $charlist) = _charlist(@char, $modifier);
my @singleoctet = @$singleoctet;
my @charlist = @$charlist;
# return character list
if (scalar(@charlist) >= 1) {
if (scalar(@singleoctet) >= 1) {
# any character other than multiple octet and single octet character class
return '(?!' . join('|', @charlist) . ')(?:\xFD[\xA1-\xFE][\xA1-\xFE]|[\x81-\x9F\xE0-\xFC][\x00-\xFF]|[^'. join('', @singleoctet) . '])';
}
else {
# any character other than multiple octet character class
return '(?!' . join('|', @charlist) . ")(?:$your_char)";
}
}
else {
if (scalar(@singleoctet) >= 1) {
# any character other than single octet character class
return '(?:\xFD[\xA1-\xFE][\xA1-\xFE]|[\x81-\x9F\xE0-\xFC][\x00-\xFF]|[^'. join('', @singleoctet) . '])';
}
else {
# any character
return "(?:$your_char)";
}
}
}
#
# INFOMIX V6 ALS order to character (with parameter)
#
sub Einfomixv6als::chr(;$) {
my $c = @_ ? $_[0] : $_;
if ($c == 0x00) {
return "\x00";
}
else {
my @chr = ();
while ($c > 0) {
unshift @chr, ($c % 0x100);
$c = int($c / 0x100);
}
return pack 'C*', @chr;
}
}
#
# INFOMIX V6 ALS order to character (without parameter)
#
sub Einfomixv6als::chr_() {
my $c = $_;
if ($c == 0x00) {
return "\x00";
}
else {
my @chr = ();
while ($c > 0) {
unshift @chr, ($c % 0x100);
$c = int($c / 0x100);
}
return pack 'C*', @chr;
}
}
#
# INFOMIX V6 ALS file test -r expr
#
sub Einfomixv6als::r(;*@) {
local $_ = shift if @_;
croak 'Too many arguments for -r (Einfomixv6als::r)' if @_ and not wantarray;
if ($_ eq '_') {
return wantarray ? (-r _,@_) : -r _;
}
# P.908 Symbol
# in Chapter 32: Standard Modules
# of ISBN 0-596-00027-8 Programming Perl Third Edition.
# (and so on)
elsif (fileno(my $fh = Symbol::qualify_to_ref $_)) {
return wantarray ? (-r $fh,@_) : -r $fh;
}
elsif (-e $_) {
return wantarray ? (-r _,@_) : -r _;
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return wantarray ? (-r _,@_) : -r _;
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my $r = -r $fh;
close $fh;
return wantarray ? ($r,@_) : $r;
}
}
}
return wantarray ? (undef,@_) : undef;
}
#
# INFOMIX V6 ALS file test -w expr
#
sub Einfomixv6als::w(;*@) {
local $_ = shift if @_;
croak 'Too many arguments for -w (Einfomixv6als::w)' if @_ and not wantarray;
if ($_ eq '_') {
return wantarray ? (-w _,@_) : -w _;
}
elsif (fileno(my $fh = Symbol::qualify_to_ref $_)) {
return wantarray ? (-w $fh,@_) : -w $fh;
}
elsif (-e $_) {
return wantarray ? (-w _,@_) : -w _;
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return wantarray ? (-w _,@_) : -w _;
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_WRONLY|O_APPEND) {
my $w = -w $fh;
close $fh;
return wantarray ? ($w,@_) : $w;
}
}
}
return wantarray ? (undef,@_) : undef;
}
#
# INFOMIX V6 ALS file test -x expr
#
sub Einfomixv6als::x(;*@) {
local $_ = shift if @_;
croak 'Too many arguments for -x (Einfomixv6als::x)' if @_ and not wantarray;
if ($_ eq '_') {
return wantarray ? (-x _,@_) : -x _;
}
elsif (fileno(my $fh = Symbol::qualify_to_ref $_)) {
return wantarray ? (-x $fh,@_) : -x $fh;
}
elsif (-e $_) {
return wantarray ? (-x _,@_) : -x _;
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return wantarray ? (-x _,@_) : -x _;
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my $dummy_for_underline_cache = -x $fh;
close $fh;
}
# filename is not .COM .EXE .BAT .CMD
return wantarray ? ('',@_) : '';
}
}
return wantarray ? (undef,@_) : undef;
}
#
# INFOMIX V6 ALS file test -o expr
#
sub Einfomixv6als::o(;*@) {
local $_ = shift if @_;
croak 'Too many arguments for -o (Einfomixv6als::o)' if @_ and not wantarray;
if ($_ eq '_') {
return wantarray ? (-o _,@_) : -o _;
}
elsif (fileno(my $fh = Symbol::qualify_to_ref $_)) {
return wantarray ? (-o $fh,@_) : -o $fh;
}
elsif (-e $_) {
return wantarray ? (-o _,@_) : -o _;
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return wantarray ? (-o _,@_) : -o _;
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my $o = -o $fh;
close $fh;
return wantarray ? ($o,@_) : $o;
}
}
}
return wantarray ? (undef,@_) : undef;
}
#
# INFOMIX V6 ALS file test -R expr
#
sub Einfomixv6als::R(;*@) {
local $_ = shift if @_;
croak 'Too many arguments for -R (Einfomixv6als::R)' if @_ and not wantarray;
if ($_ eq '_') {
return wantarray ? (-R _,@_) : -R _;
}
elsif (fileno(my $fh = Symbol::qualify_to_ref $_)) {
return wantarray ? (-R $fh,@_) : -R $fh;
}
elsif (-e $_) {
return wantarray ? (-R _,@_) : -R _;
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return wantarray ? (-R _,@_) : -R _;
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my $R = -R $fh;
close $fh;
return wantarray ? ($R,@_) : $R;
}
}
}
return wantarray ? (undef,@_) : undef;
}
#
# INFOMIX V6 ALS file test -W expr
#
sub Einfomixv6als::W(;*@) {
local $_ = shift if @_;
croak 'Too many arguments for -W (Einfomixv6als::W)' if @_ and not wantarray;
if ($_ eq '_') {
return wantarray ? (-W _,@_) : -W _;
}
elsif (fileno(my $fh = Symbol::qualify_to_ref $_)) {
return wantarray ? (-W $fh,@_) : -W $fh;
}
elsif (-e $_) {
return wantarray ? (-W _,@_) : -W _;
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return wantarray ? (-W _,@_) : -W _;
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_WRONLY|O_APPEND) {
my $W = -W $fh;
close $fh;
return wantarray ? ($W,@_) : $W;
}
}
}
return wantarray ? (undef,@_) : undef;
}
#
# INFOMIX V6 ALS file test -X expr
#
sub Einfomixv6als::X(;*@) {
local $_ = shift if @_;
croak 'Too many arguments for -X (Einfomixv6als::X)' if @_ and not wantarray;
if ($_ eq '_') {
return wantarray ? (-X _,@_) : -X _;
}
elsif (fileno(my $fh = Symbol::qualify_to_ref $_)) {
return wantarray ? (-X $fh,@_) : -X $fh;
}
elsif (-e $_) {
return wantarray ? (-X _,@_) : -X _;
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return wantarray ? (-X _,@_) : -X _;
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my $dummy_for_underline_cache = -X $fh;
close $fh;
}
# filename is not .COM .EXE .BAT .CMD
return wantarray ? ('',@_) : '';
}
}
return wantarray ? (undef,@_) : undef;
}
#
# INFOMIX V6 ALS file test -O expr
#
sub Einfomixv6als::O(;*@) {
local $_ = shift if @_;
croak 'Too many arguments for -O (Einfomixv6als::O)' if @_ and not wantarray;
if ($_ eq '_') {
return wantarray ? (-O _,@_) : -O _;
}
elsif (fileno(my $fh = Symbol::qualify_to_ref $_)) {
return wantarray ? (-O $fh,@_) : -O $fh;
}
elsif (-e $_) {
return wantarray ? (-O _,@_) : -O _;
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return wantarray ? (-O _,@_) : -O _;
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my $O = -O $fh;
close $fh;
return wantarray ? ($O,@_) : $O;
}
}
}
return wantarray ? (undef,@_) : undef;
}
#
# INFOMIX V6 ALS file test -e expr
#
sub Einfomixv6als::e(;*@) {
local $_ = shift if @_;
croak 'Too many arguments for -e (Einfomixv6als::e)' if @_ and not wantarray;
local $^W = 0;
if ($_ eq '_') {
return wantarray ? (-e _,@_) : -e _;
}
# return false if directory handle
elsif (defined telldir(my $fh = Symbol::qualify_to_ref $_)) {
return wantarray ? ('',@_) : '';
}
# return true if file handle
elsif (fileno $fh) {
return wantarray ? (1,@_) : 1;
}
elsif (-e $_) {
return wantarray ? (1,@_) : 1;
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return wantarray ? (1,@_) : 1;
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my $e = -e $fh;
close $fh;
return wantarray ? ($e,@_) : $e;
}
}
}
return wantarray ? (undef,@_) : undef;
}
#
# INFOMIX V6 ALS file test -z expr
#
sub Einfomixv6als::z(;*@) {
local $_ = shift if @_;
croak 'Too many arguments for -z (Einfomixv6als::z)' if @_ and not wantarray;
if ($_ eq '_') {
return wantarray ? (-z _,@_) : -z _;
}
elsif (fileno(my $fh = Symbol::qualify_to_ref $_)) {
return wantarray ? (-z $fh,@_) : -z $fh;
}
elsif (-e $_) {
return wantarray ? (-z _,@_) : -z _;
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return wantarray ? (-z _,@_) : -z _;
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my $z = -z $fh;
close $fh;
return wantarray ? ($z,@_) : $z;
}
}
}
return wantarray ? (undef,@_) : undef;
}
#
# INFOMIX V6 ALS file test -s expr
#
sub Einfomixv6als::s(;*@) {
local $_ = shift if @_;
croak 'Too many arguments for -s (Einfomixv6als::s)' if @_ and not wantarray;
if ($_ eq '_') {
return wantarray ? (-s _,@_) : -s _;
}
elsif (fileno(my $fh = Symbol::qualify_to_ref $_)) {
return wantarray ? (-s $fh,@_) : -s $fh;
}
elsif (-e $_) {
return wantarray ? (-s _,@_) : -s _;
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return wantarray ? (-s _,@_) : -s _;
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my $s = -s $fh;
close $fh;
return wantarray ? ($s,@_) : $s;
}
}
}
return wantarray ? (undef,@_) : undef;
}
#
# INFOMIX V6 ALS file test -f expr
#
sub Einfomixv6als::f(;*@) {
local $_ = shift if @_;
croak 'Too many arguments for -f (Einfomixv6als::f)' if @_ and not wantarray;
if ($_ eq '_') {
return wantarray ? (-f _,@_) : -f _;
}
elsif (fileno(my $fh = Symbol::qualify_to_ref $_)) {
return wantarray ? (-f $fh,@_) : -f $fh;
}
elsif (-e $_) {
return wantarray ? (-f _,@_) : -f _;
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return wantarray ? ('',@_) : '';
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my $f = -f $fh;
close $fh;
return wantarray ? ($f,@_) : $f;
}
}
}
return wantarray ? (undef,@_) : undef;
}
#
# INFOMIX V6 ALS file test -d expr
#
sub Einfomixv6als::d(;*@) {
local $_ = shift if @_;
croak 'Too many arguments for -d (Einfomixv6als::d)' if @_ and not wantarray;
if ($_ eq '_') {
return wantarray ? (-d _,@_) : -d _;
}
# return false if file handle or directory handle
elsif (fileno(my $fh = Symbol::qualify_to_ref $_)) {
return wantarray ? ('',@_) : '';
}
elsif (-e $_) {
return wantarray ? (-d _,@_) : -d _;
}
elsif (_MSWin32_5Cended_path($_)) {
return wantarray ? (-d "$_/.",@_) : -d "$_/.";
}
return wantarray ? (undef,@_) : undef;
}
#
# INFOMIX V6 ALS file test -l expr
#
sub Einfomixv6als::l(;*@) {
local $_ = shift if @_;
croak 'Too many arguments for -l (Einfomixv6als::l)' if @_ and not wantarray;
if ($_ eq '_') {
return wantarray ? (-l _,@_) : -l _;
}
elsif (fileno(my $fh = Symbol::qualify_to_ref $_)) {
return wantarray ? (-l $fh,@_) : -l $fh;
}
elsif (-e $_) {
return wantarray ? (-l _,@_) : -l _;
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return wantarray ? (-l _,@_) : -l _;
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my $l = -l $fh;
close $fh;
return wantarray ? ($l,@_) : $l;
}
}
}
return wantarray ? (undef,@_) : undef;
}
#
# INFOMIX V6 ALS file test -p expr
#
sub Einfomixv6als::p(;*@) {
local $_ = shift if @_;
croak 'Too many arguments for -p (Einfomixv6als::p)' if @_ and not wantarray;
if ($_ eq '_') {
return wantarray ? (-p _,@_) : -p _;
}
elsif (fileno(my $fh = Symbol::qualify_to_ref $_)) {
return wantarray ? (-p $fh,@_) : -p $fh;
}
elsif (-e $_) {
return wantarray ? (-p _,@_) : -p _;
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return wantarray ? (-p _,@_) : -p _;
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my $p = -p $fh;
close $fh;
return wantarray ? ($p,@_) : $p;
}
}
}
return wantarray ? (undef,@_) : undef;
}
#
# INFOMIX V6 ALS file test -S expr
#
sub Einfomixv6als::S(;*@) {
local $_ = shift if @_;
croak 'Too many arguments for -S (Einfomixv6als::S)' if @_ and not wantarray;
if ($_ eq '_') {
return wantarray ? (-S _,@_) : -S _;
}
elsif (fileno(my $fh = Symbol::qualify_to_ref $_)) {
return wantarray ? (-S $fh,@_) : -S $fh;
}
elsif (-e $_) {
return wantarray ? (-S _,@_) : -S _;
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return wantarray ? (-S _,@_) : -S _;
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my $S = -S $fh;
close $fh;
return wantarray ? ($S,@_) : $S;
}
}
}
return wantarray ? (undef,@_) : undef;
}
#
# INFOMIX V6 ALS file test -b expr
#
sub Einfomixv6als::b(;*@) {
local $_ = shift if @_;
croak 'Too many arguments for -b (Einfomixv6als::b)' if @_ and not wantarray;
if ($_ eq '_') {
return wantarray ? (-b _,@_) : -b _;
}
elsif (fileno(my $fh = Symbol::qualify_to_ref $_)) {
return wantarray ? (-b $fh,@_) : -b $fh;
}
elsif (-e $_) {
return wantarray ? (-b _,@_) : -b _;
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return wantarray ? (-b _,@_) : -b _;
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my $b = -b $fh;
close $fh;
return wantarray ? ($b,@_) : $b;
}
}
}
return wantarray ? (undef,@_) : undef;
}
#
# INFOMIX V6 ALS file test -c expr
#
sub Einfomixv6als::c(;*@) {
local $_ = shift if @_;
croak 'Too many arguments for -c (Einfomixv6als::c)' if @_ and not wantarray;
if ($_ eq '_') {
return wantarray ? (-c _,@_) : -c _;
}
elsif (fileno(my $fh = Symbol::qualify_to_ref $_)) {
return wantarray ? (-c $fh,@_) : -c $fh;
}
elsif (-e $_) {
return wantarray ? (-c _,@_) : -c _;
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return wantarray ? (-c _,@_) : -c _;
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my $c = -c $fh;
close $fh;
return wantarray ? ($c,@_) : $c;
}
}
}
return wantarray ? (undef,@_) : undef;
}
#
# INFOMIX V6 ALS file test -t expr
#
sub Einfomixv6als::t(;*@) {
local $_ = shift if @_;
croak 'Too many arguments for -t (Einfomixv6als::t)' if @_ and not wantarray;
if ($_ eq '_') {
return wantarray ? (-t _,@_) : -t _;
}
elsif (fileno(my $fh = Symbol::qualify_to_ref $_)) {
return wantarray ? (-t $fh,@_) : -t $fh;
}
elsif (-e $_) {
return wantarray ? (-t _,@_) : -t _;
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return wantarray ? ('',@_) : '';
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
close $fh;
my $t = -t $fh;
return wantarray ? ($t,@_) : $t;
}
}
}
return wantarray ? (undef,@_) : undef;
}
#
# INFOMIX V6 ALS file test -u expr
#
sub Einfomixv6als::u(;*@) {
local $_ = shift if @_;
croak 'Too many arguments for -u (Einfomixv6als::u)' if @_ and not wantarray;
if ($_ eq '_') {
return wantarray ? (-u _,@_) : -u _;
}
elsif (fileno(my $fh = Symbol::qualify_to_ref $_)) {
return wantarray ? (-u $fh,@_) : -u $fh;
}
elsif (-e $_) {
return wantarray ? (-u _,@_) : -u _;
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return wantarray ? (-u _,@_) : -u _;
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my $u = -u $fh;
close $fh;
return wantarray ? ($u,@_) : $u;
}
}
}
return wantarray ? (undef,@_) : undef;
}
#
# INFOMIX V6 ALS file test -g expr
#
sub Einfomixv6als::g(;*@) {
local $_ = shift if @_;
croak 'Too many arguments for -g (Einfomixv6als::g)' if @_ and not wantarray;
if ($_ eq '_') {
return wantarray ? (-g _,@_) : -g _;
}
elsif (fileno(my $fh = Symbol::qualify_to_ref $_)) {
return wantarray ? (-g $fh,@_) : -g $fh;
}
elsif (-e $_) {
return wantarray ? (-g _,@_) : -g _;
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return wantarray ? (-g _,@_) : -g _;
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my $g = -g $fh;
close $fh;
return wantarray ? ($g,@_) : $g;
}
}
}
return wantarray ? (undef,@_) : undef;
}
#
# INFOMIX V6 ALS file test -k expr
#
sub Einfomixv6als::k(;*@) {
local $_ = shift if @_;
croak 'Too many arguments for -k (Einfomixv6als::k)' if @_ and not wantarray;
if ($_ eq '_') {
return wantarray ? (-k _,@_) : -k _;
}
elsif (fileno(my $fh = Symbol::qualify_to_ref $_)) {
return wantarray ? (-k $fh,@_) : -k $fh;
}
elsif (-e $_) {
return wantarray ? (-k _,@_) : -k _;
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return wantarray ? (-k _,@_) : -k _;
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my $k = -k $fh;
close $fh;
return wantarray ? ($k,@_) : $k;
}
}
}
return wantarray ? (undef,@_) : undef;
}
#
# INFOMIX V6 ALS file test -T expr
#
sub Einfomixv6als::T(;*@) {
local $_ = shift if @_;
croak 'Too many arguments for -T (Einfomixv6als::T)' if @_ and not wantarray;
my $T = 1;
my $fh = Symbol::qualify_to_ref $_;
if (fileno $fh) {
# avoid warning of telldir by not DIRHANDLE
local $^W = 0;
if (defined telldir $fh) {
return wantarray ? (undef,@_) : undef;
}
# P.813 tell
# in Chapter 29: Functions
# of ISBN 0-596-00027-8 Programming Perl Third Edition.
# (and so on)
my $systell = sysseek $fh, 0, 1;
if (sysread $fh, my $block, 512) {
# P.163 Binary file check in Little Perl Parlor 16
# of Book No. T1008901080816 ZASSHI 08901-8 UNIX MAGAZINE 1993 Aug VOL8#8
# (and so on)
if ($block =~ /[\000\377]/oxms) {
$T = '';
}
elsif (($block =~ tr/\000-\007\013\016-\032\034-\037\377//) * 10 > CORE::length $block) {
$T = '';
}
}
# 0 byte or eof
else {
$T = 1;
}
sysseek $fh, $systell, 0;
}
else {
if (-d $_ or -d "$_/.") {
return wantarray ? (undef,@_) : undef;
}
$fh = Symbol::gensym();
unless (sysopen $fh, $_, O_RDONLY) {
return wantarray ? (undef,@_) : undef;
}
if (sysread $fh, my $block, 512) {
if ($block =~ /[\000\377]/oxms) {
$T = '';
}
elsif (($block =~ tr/\000-\007\013\016-\032\034-\037\377//) * 10 > CORE::length $block) {
$T = '';
}
}
# 0 byte or eof
else {
$T = 1;
}
close $fh;
}
my $dummy_for_underline_cache = -T $fh;
return wantarray ? ($T,@_) : $T;
}
#
# INFOMIX V6 ALS file test -B expr
#
sub Einfomixv6als::B(;*@) {
local $_ = shift if @_;
croak 'Too many arguments for -B (Einfomixv6als::B)' if @_ and not wantarray;
my $B = '';
my $fh = Symbol::qualify_to_ref $_;
if (fileno $fh) {
# avoid warning of telldir by not DIRHANDLE
local $^W = 0;
if (defined telldir $fh) {
return wantarray ? (undef,@_) : undef;
}
my $systell = sysseek $fh, 0, 1;
if (sysread $fh, my $block, 512) {
if ($block =~ /[\000\377]/oxms) {
$B = 1;
}
elsif (($block =~ tr/\000-\007\013\016-\032\034-\037\377//) * 10 > CORE::length $block) {
$B = 1;
}
}
# 0 byte or eof
else {
$B = 1;
}
sysseek $fh, $systell, 0;
}
else {
if (-d $_ or -d "$_/.") {
return wantarray ? (undef,@_) : undef;
}
$fh = Symbol::gensym();
unless (sysopen $fh, $_, O_RDONLY) {
return wantarray ? (undef,@_) : undef;
}
if (sysread $fh, my $block, 512) {
if ($block =~ /[\000\377]/oxms) {
$B = 1;
}
elsif (($block =~ tr/\000-\007\013\016-\032\034-\037\377//) * 10 > CORE::length $block) {
$B = 1;
}
}
# 0 byte or eof
else {
$B = 1;
}
close $fh;
}
my $dummy_for_underline_cache = -B $fh;
return wantarray ? ($B,@_) : $B;
}
#
# INFOMIX V6 ALS file test -M expr
#
sub Einfomixv6als::M(;*@) {
local $_ = shift if @_;
croak 'Too many arguments for -M (Einfomixv6als::M)' if @_ and not wantarray;
if ($_ eq '_') {
return wantarray ? (-M _,@_) : -M _;
}
elsif (fileno(my $fh = Symbol::qualify_to_ref $_)) {
return wantarray ? (-M $fh,@_) : -M $fh;
}
elsif (-e $_) {
return wantarray ? (-M _,@_) : -M _;
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return wantarray ? (-M _,@_) : -M _;
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = CORE::stat $fh;
close $fh;
my $M = ($^T - $mtime) / (24*60*60);
return wantarray ? ($M,@_) : $M;
}
}
}
return wantarray ? (undef,@_) : undef;
}
#
# INFOMIX V6 ALS file test -A expr
#
sub Einfomixv6als::A(;*@) {
local $_ = shift if @_;
croak 'Too many arguments for -A (Einfomixv6als::A)' if @_ and not wantarray;
if ($_ eq '_') {
return wantarray ? (-A _,@_) : -A _;
}
elsif (fileno(my $fh = Symbol::qualify_to_ref $_)) {
return wantarray ? (-A $fh,@_) : -A $fh;
}
elsif (-e $_) {
return wantarray ? (-A _,@_) : -A _;
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return wantarray ? (-A _,@_) : -A _;
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = CORE::stat $fh;
close $fh;
my $A = ($^T - $atime) / (24*60*60);
return wantarray ? ($A,@_) : $A;
}
}
}
return wantarray ? (undef,@_) : undef;
}
#
# INFOMIX V6 ALS file test -C expr
#
sub Einfomixv6als::C(;*@) {
local $_ = shift if @_;
croak 'Too many arguments for -C (Einfomixv6als::C)' if @_ and not wantarray;
if ($_ eq '_') {
return wantarray ? (-C _,@_) : -C _;
}
elsif (fileno(my $fh = Symbol::qualify_to_ref $_)) {
return wantarray ? (-C $fh,@_) : -C $fh;
}
elsif (-e $_) {
return wantarray ? (-C _,@_) : -C _;
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return wantarray ? (-C _,@_) : -C _;
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = CORE::stat $fh;
close $fh;
my $C = ($^T - $ctime) / (24*60*60);
return wantarray ? ($C,@_) : $C;
}
}
}
return wantarray ? (undef,@_) : undef;
}
#
# INFOMIX V6 ALS file test -r $_
#
sub Einfomixv6als::r_() {
if (-e $_) {
return -r _ ? 1 : '';
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return -r _ ? 1 : '';
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my $r = -r $fh;
close $fh;
return $r ? 1 : '';
}
}
}
return;
}
#
# INFOMIX V6 ALS file test -w $_
#
sub Einfomixv6als::w_() {
if (-e $_) {
return -w _ ? 1 : '';
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return -w _ ? 1 : '';
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_WRONLY|O_APPEND) {
my $w = -w $fh;
close $fh;
return $w ? 1 : '';
}
}
}
return;
}
#
# INFOMIX V6 ALS file test -x $_
#
sub Einfomixv6als::x_() {
if (-e $_) {
return -x _ ? 1 : '';
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return -x _ ? 1 : '';
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my $dummy_for_underline_cache = -x $fh;
close $fh;
}
# filename is not .COM .EXE .BAT .CMD
return '';
}
}
return;
}
#
# INFOMIX V6 ALS file test -o $_
#
sub Einfomixv6als::o_() {
if (-e $_) {
return -o _ ? 1 : '';
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return -o _ ? 1 : '';
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my $o = -o $fh;
close $fh;
return $o ? 1 : '';
}
}
}
return;
}
#
# INFOMIX V6 ALS file test -R $_
#
sub Einfomixv6als::R_() {
if (-e $_) {
return -R _ ? 1 : '';
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return -R _ ? 1 : '';
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my $R = -R $fh;
close $fh;
return $R ? 1 : '';
}
}
}
return;
}
#
# INFOMIX V6 ALS file test -W $_
#
sub Einfomixv6als::W_() {
if (-e $_) {
return -W _ ? 1 : '';
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return -W _ ? 1 : '';
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_WRONLY|O_APPEND) {
my $W = -W $fh;
close $fh;
return $W ? 1 : '';
}
}
}
return;
}
#
# INFOMIX V6 ALS file test -X $_
#
sub Einfomixv6als::X_() {
if (-e $_) {
return -X _ ? 1 : '';
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return -X _ ? 1 : '';
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my $dummy_for_underline_cache = -X $fh;
close $fh;
}
# filename is not .COM .EXE .BAT .CMD
return '';
}
}
return;
}
#
# INFOMIX V6 ALS file test -O $_
#
sub Einfomixv6als::O_() {
if (-e $_) {
return -O _ ? 1 : '';
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return -O _ ? 1 : '';
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my $O = -O $fh;
close $fh;
return $O ? 1 : '';
}
}
}
return;
}
#
# INFOMIX V6 ALS file test -e $_
#
sub Einfomixv6als::e_() {
if (-e $_) {
return 1;
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return 1;
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my $e = -e $fh;
close $fh;
return $e ? 1 : '';
}
}
}
return;
}
#
# INFOMIX V6 ALS file test -z $_
#
sub Einfomixv6als::z_() {
if (-e $_) {
return -z _ ? 1 : '';
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return -z _ ? 1 : '';
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my $z = -z $fh;
close $fh;
return $z ? 1 : '';
}
}
}
return;
}
#
# INFOMIX V6 ALS file test -s $_
#
sub Einfomixv6als::s_() {
if (-e $_) {
return -s _;
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return -s _;
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my $s = -s $fh;
close $fh;
return $s;
}
}
}
return;
}
#
# INFOMIX V6 ALS file test -f $_
#
sub Einfomixv6als::f_() {
if (-e $_) {
return -f _ ? 1 : '';
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return '';
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my $f = -f $fh;
close $fh;
return $f ? 1 : '';
}
}
}
return;
}
#
# INFOMIX V6 ALS file test -d $_
#
sub Einfomixv6als::d_() {
if (-e $_) {
return -d _ ? 1 : '';
}
elsif (_MSWin32_5Cended_path($_)) {
return -d "$_/." ? 1 : '';
}
return;
}
#
# INFOMIX V6 ALS file test -l $_
#
sub Einfomixv6als::l_() {
if (-e $_) {
return -l _ ? 1 : '';
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return -l _ ? 1 : '';
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my $l = -l $fh;
close $fh;
return $l ? 1 : '';
}
}
}
return;
}
#
# INFOMIX V6 ALS file test -p $_
#
sub Einfomixv6als::p_() {
if (-e $_) {
return -p _ ? 1 : '';
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return -p _ ? 1 : '';
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my $p = -p $fh;
close $fh;
return $p ? 1 : '';
}
}
}
return;
}
#
# INFOMIX V6 ALS file test -S $_
#
sub Einfomixv6als::S_() {
if (-e $_) {
return -S _ ? 1 : '';
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return -S _ ? 1 : '';
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my $S = -S $fh;
close $fh;
return $S ? 1 : '';
}
}
}
return;
}
#
# INFOMIX V6 ALS file test -b $_
#
sub Einfomixv6als::b_() {
if (-e $_) {
return -b _ ? 1 : '';
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return -b _ ? 1 : '';
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my $b = -b $fh;
close $fh;
return $b ? 1 : '';
}
}
}
return;
}
#
# INFOMIX V6 ALS file test -c $_
#
sub Einfomixv6als::c_() {
if (-e $_) {
return -c _ ? 1 : '';
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return -c _ ? 1 : '';
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my $c = -c $fh;
close $fh;
return $c ? 1 : '';
}
}
}
return;
}
#
# INFOMIX V6 ALS file test -t $_
#
sub Einfomixv6als::t_() {
return -t STDIN ? 1 : '';
}
#
# INFOMIX V6 ALS file test -u $_
#
sub Einfomixv6als::u_() {
if (-e $_) {
return -u _ ? 1 : '';
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return -u _ ? 1 : '';
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my $u = -u $fh;
close $fh;
return $u ? 1 : '';
}
}
}
return;
}
#
# INFOMIX V6 ALS file test -g $_
#
sub Einfomixv6als::g_() {
if (-e $_) {
return -g _ ? 1 : '';
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return -g _ ? 1 : '';
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my $g = -g $fh;
close $fh;
return $g ? 1 : '';
}
}
}
return;
}
#
# INFOMIX V6 ALS file test -k $_
#
sub Einfomixv6als::k_() {
if (-e $_) {
return -k _ ? 1 : '';
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return -k _ ? 1 : '';
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my $k = -k $fh;
close $fh;
return $k ? 1 : '';
}
}
}
return;
}
#
# INFOMIX V6 ALS file test -T $_
#
sub Einfomixv6als::T_() {
my $T = 1;
if (-d $_ or -d "$_/.") {
return;
}
my $fh = Symbol::gensym();
unless (sysopen $fh, $_, O_RDONLY) {
return;
}
if (sysread $fh, my $block, 512) {
if ($block =~ /[\000\377]/oxms) {
$T = '';
}
elsif (($block =~ tr/\000-\007\013\016-\032\034-\037\377//) * 10 > CORE::length $block) {
$T = '';
}
}
# 0 byte or eof
else {
$T = 1;
}
close $fh;
my $dummy_for_underline_cache = -T $fh;
return $T;
}
#
# INFOMIX V6 ALS file test -B $_
#
sub Einfomixv6als::B_() {
my $B = '';
if (-d $_ or -d "$_/.") {
return;
}
my $fh = Symbol::gensym();
unless (sysopen $fh, $_, O_RDONLY) {
return;
}
if (sysread $fh, my $block, 512) {
if ($block =~ /[\000\377]/oxms) {
$B = 1;
}
elsif (($block =~ tr/\000-\007\013\016-\032\034-\037\377//) * 10 > CORE::length $block) {
$B = 1;
}
}
# 0 byte or eof
else {
$B = 1;
}
close $fh;
my $dummy_for_underline_cache = -B $fh;
return $B;
}
#
# INFOMIX V6 ALS file test -M $_
#
sub Einfomixv6als::M_() {
if (-e $_) {
return -M _;
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return -M _;
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = CORE::stat $fh;
close $fh;
my $M = ($^T - $mtime) / (24*60*60);
return $M;
}
}
}
return;
}
#
# INFOMIX V6 ALS file test -A $_
#
sub Einfomixv6als::A_() {
if (-e $_) {
return -A _;
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return -A _;
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = CORE::stat $fh;
close $fh;
my $A = ($^T - $atime) / (24*60*60);
return $A;
}
}
}
return;
}
#
# INFOMIX V6 ALS file test -C $_
#
sub Einfomixv6als::C_() {
if (-e $_) {
return -C _;
}
elsif (_MSWin32_5Cended_path($_)) {
if (-d "$_/.") {
return -C _;
}
else {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = CORE::stat $fh;
close $fh;
my $C = ($^T - $ctime) / (24*60*60);
return $C;
}
}
}
return;
}
#
# INFOMIX V6 ALS path globbing (with parameter)
#
sub Einfomixv6als::glob($) {
if ($^O =~ /\A (?: MSWin32 | NetWare | symbian | dos ) \z/oxms) {
return _dosglob(@_);
}
else {
return CORE::glob @_;
}
}
#
# INFOMIX V6 ALS path globbing (without parameter)
#
sub Einfomixv6als::glob_() {
if ($^O =~ /\A (?: MSWin32 | NetWare | symbian | dos ) \z/oxms) {
return _dosglob();
}
else {
return CORE::glob;
}
}
#
# INFOMIX V6 ALS path globbing from File::DosGlob module
#
my %iter;
my %entries;
sub _dosglob {
# context (keyed by second cxix argument provided by core)
my($expr,$cxix) = @_;
# glob without args defaults to $_
$expr = $_ if not defined $expr;
# represents the current user's home directory
#
# 7.3. Expanding Tildes in Filenames
# in Chapter 7. File Access
# of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
#
# and File::HomeDir::Windows module
$expr =~ s{ \A ~ (?= [^/\\] ) }
{ $ENV{'HOME'} || $ENV{'USERPROFILE'} || "$ENV{'HOMEDRIVE'}$ENV{'HOMEPATH'}" }oxmse;
# assume global context if not provided one
$cxix = '_G_' if not defined $cxix;
$iter{$cxix} = 0 if not exists $iter{$cxix};
# if we're just beginning, do it all first
if ($iter{$cxix} == 0) {
$entries{$cxix} = [ _do_glob(1, _parse_line($expr)) ];
}
# chuck it all out, quick or slow
if (wantarray) {
delete $iter{$cxix};
return @{delete $entries{$cxix}};
}
else {
if ($iter{$cxix} = scalar @{$entries{$cxix}}) {
return shift @{$entries{$cxix}};
}
else {
# return undef for EOL
delete $iter{$cxix};
delete $entries{$cxix};
return undef;
}
}
}
#
# INFOMIX V6 ALS path globbing subroutine
#
sub _do_glob {
my($cond,@expr) = @_;
my @glob = ();
OUTER:
for my $expr (@expr) {
next OUTER if not defined $expr;
next OUTER if $expr eq '';
my @matched = ();
my @globdir = ();
my $head = '.';
my $pathsep = '/';
my $tail;
# if argument is within quotes strip em and do no globbing
if ($expr =~ m/\A " ((?:$q_char)*) " \z/oxms) {
$expr = $1;
if ($cond eq 'd') {
if (Einfomixv6als::d $expr) {
push @glob, $expr;
}
}
else {
if (Einfomixv6als::e $expr) {
push @glob, $expr;
}
}
next OUTER;
}
# wildcards with a drive prefix such as h:*.pm must be changed
# to h:./*.pm to expand correctly
$expr =~ s# \A ((?:[A-Za-z]:)?) (\xFD[\xA1-\xFE][\xA1-\xFE]|[\x81-\x9F\xE0-\xFC][\x00-\xFF]|[^/\\]) #$1./$2#oxms;
if (($head, $tail) = _parse_path($expr,$pathsep)) {
if ($tail eq '') {
push @glob, $expr;
next OUTER;
}
if ($head =~ m/ \A (?:$q_char)*? [*?] /oxms) {
if (@globdir = _do_glob('d', $head)) {
push @glob, _do_glob($cond, map {"$_$pathsep$tail"} @globdir);
next OUTER;
}
}
if ($head eq '' or $head =~ m/\A [A-Za-z]: \z/oxms) {
$head .= $pathsep;
}
$expr = $tail;
}
# If file component has no wildcards, we can avoid opendir
if ($expr !~ m/ \A (?:$q_char)*? [*?] /oxms) {
if ($head eq '.') {
$head = '';
}
if ($head ne '' and ($head =~ m/ \G ($q_char) /oxmsg)[-1] ne $pathsep) {
$head .= $pathsep;
}
$head .= $expr;
if ($cond eq 'd') {
if (Einfomixv6als::d $head) {
push @glob, $head;
}
}
else {
if (Einfomixv6als::e $head) {
push @glob, $head;
}
}
next OUTER;
}
Einfomixv6als::opendir(*DIR, $head) or next OUTER;
my @leaf = readdir DIR;
closedir DIR;
if ($head eq '.') {
$head = '';
}
if ($head ne '' and ($head =~ m/ \G ($q_char) /oxmsg)[-1] ne $pathsep) {
$head .= $pathsep;
}
my $pattern = '';
while ($expr =~ m/ \G ($q_char) /oxgc) {
$pattern .= {
'*' => "(?:$your_char)*",
### '?' => "(?:$your_char)", # UNIX style
'?' => "(?:$your_char)?", # DOS style
'a' => 'A',
'b' => 'B',
'c' => 'C',
'd' => 'D',
'e' => 'E',
'f' => 'F',
'g' => 'G',
'h' => 'H',
'i' => 'I',
'j' => 'J',
'k' => 'K',
'l' => 'L',
'm' => 'M',
'n' => 'N',
'o' => 'O',
'p' => 'P',
'q' => 'Q',
'r' => 'R',
's' => 'S',
't' => 'T',
'u' => 'U',
'v' => 'V',
'w' => 'W',
'x' => 'X',
'y' => 'Y',
'z' => 'Z',
}->{$1} || quotemeta $1;
}
my $matchsub = sub { Einfomixv6als::uc($_[0]) =~ m{\A $pattern \z}xms };
# if ($@) {
# print STDERR "$0: $@\n";
# next OUTER;
# }
INNER:
for my $leaf (@leaf) {
if ($leaf eq '.' or $leaf eq '..') {
next INNER;
}
if ($cond eq 'd' and not Einfomixv6als::d "$head$leaf") {
next INNER;
}
if (&$matchsub($leaf)) {
push @matched, "$head$leaf";
next INNER;
}
# [DOS compatibility special case]
# Failed, add a trailing dot and try again, but only...
if (Einfomixv6als::index($leaf,'.') == -1 and # if name does not have a dot in it *and*
CORE::length($leaf) <= 8 and # name is shorter than or equal to 8 chars *and*
Einfomixv6als::index($pattern,'\\.') != -1 # pattern has a dot.
) {
if (&$matchsub("$leaf.")) {
push @matched, "$head$leaf";
next INNER;
}
}
}
if (@matched) {
push @glob, @matched;
}
}
return @glob;
}
#
# INFOMIX V6 ALS parse line
#
sub _parse_line {
my($line) = @_;
$line .= ' ';
my @piece = ();
while ($line =~ m{
" ( (?: \xFD[\xA1-\xFE][\xA1-\xFE]|[\x81-\x9F\xE0-\xFC][\x00-\xFF]|[^"] )* ) " \s+ |
( (?: \xFD[\xA1-\xFE][\xA1-\xFE]|[\x81-\x9F\xE0-\xFC][\x00-\xFF]|[^"\s] )* ) \s+
}oxmsg
) {
push @piece, defined($1) ? $1 : $2;
}
return @piece;
}
#
# INFOMIX V6 ALS parse path
#
sub _parse_path {
my($path,$pathsep) = @_;
$path .= '/';
my @subpath = ();
while ($path =~ m{
((?: \xFD[\xA1-\xFE][\xA1-\xFE]|[\x81-\x9F\xE0-\xFC][\x00-\xFF]|[^/\\] )+?) [/\\] }oxmsg
) {
push @subpath, $1;
}
my $tail = pop @subpath;
my $head = join $pathsep, @subpath;
return $head, $tail;
}
#
# INFOMIX V6 ALS file lstat (with parameter)
#
sub Einfomixv6als::lstat(*) {
local $_ = shift if @_;
my $fh = Symbol::qualify_to_ref $_;
if (fileno $fh) {
return CORE::lstat $fh;
}
elsif (-e $_) {
return CORE::lstat _;
}
elsif (_MSWin32_5Cended_path($_)) {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my @lstat = CORE::lstat $fh;
close $fh;
return @lstat;
}
}
return;
}
#
# INFOMIX V6 ALS file lstat (without parameter)
#
sub Einfomixv6als::lstat_() {
my $fh = Symbol::qualify_to_ref $_;
if (fileno $fh) {
return CORE::lstat $fh;
}
elsif (-e $_) {
return CORE::lstat _;
}
elsif (_MSWin32_5Cended_path($_)) {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my @lstat = CORE::lstat $fh;
close $fh;
return @lstat;
}
}
return;
}
#
# INFOMIX V6 ALS path opendir
#
sub Einfomixv6als::opendir(*$) {
# 7.6. Writing a Subroutine That Takes Filehandles as Built-ins Do
# in Chapter 7. File Access
# of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
my $dh = Symbol::qualify_to_ref $_[0];
if (CORE::opendir $dh, $_[1]) {
return 1;
}
elsif (_MSWin32_5Cended_path($_[1])) {
if (CORE::opendir $dh, "$_[1]/.") {
return 1;
}
}
return;
}
#
# INFOMIX V6 ALS file stat (with parameter)
#
sub Einfomixv6als::stat(*) {
local $_ = shift if @_;
my $fh = Symbol::qualify_to_ref $_;
if (fileno $fh) {
return CORE::stat $fh;
}
elsif (-e $_) {
return CORE::stat _;
}
elsif (_MSWin32_5Cended_path($_)) {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my @stat = CORE::stat $fh;
close $fh;
return @stat;
}
}
return;
}
#
# INFOMIX V6 ALS file stat (without parameter)
#
sub Einfomixv6als::stat_() {
my $fh = Symbol::qualify_to_ref $_;
if (fileno $fh) {
return CORE::stat $fh;
}
elsif (-e $_) {
return CORE::stat _;
}
elsif (_MSWin32_5Cended_path($_)) {
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
my @stat = CORE::stat $fh;
close $fh;
return @stat;
}
}
return;
}
#
# INFOMIX V6 ALS path unlink
#
sub Einfomixv6als::unlink(@) {
local @_ = ($_) unless @_;
my $unlink = 0;
for (@_) {
if (CORE::unlink) {
$unlink++;
}
elsif (_MSWin32_5Cended_path($_)) {
my @char = m/\G ($q_char) /oxmsg;
my $file = join '', map {{'/' => '\\'}->{$_} || $_} @char;
if ($file =~ m/ \A (?:$q_char)*? [ ] /oxms) {
$file = qq{"$file"};
}
# P.565 Cleaning Up Your Environment
# in Chapter 23: Security
# of ISBN 0-596-00027-8 Programming Perl Third Edition.
# (and so on)
# local $ENV{'PATH'} = '.';
local @ENV{qw(IFS CDPATH ENV BASH_ENV)};
system qq{del $file >NUL 2>NUL};
my $fh = Symbol::gensym();
if (sysopen $fh, $_, O_RDONLY) {
close $fh;
}
else {
$unlink++;
}
}
}
return $unlink;
}
#
# INFOMIX V6 ALS chdir
#
sub Einfomixv6als::chdir(;$) {
my($dir) = @_;
if (not defined $dir) {
$dir = ($ENV{'HOME'} || $ENV{'USERPROFILE'} || "$ENV{'HOMEDRIVE'}$ENV{'HOMEPATH'}");
}
if (_MSWin32_5Cended_path($dir)) {
if (not Einfomixv6als::d $dir) {
return 0;
}
if ($] =~ /^5\.005/) {
return CORE::chdir $dir;
}
elsif ($] =~ /^5\.006/) {
croak "perl$] can't chdir to $dir (chr(0x5C) ended path)";
}
elsif ($] =~ /^5\.008/) {
croak "perl$] can't chdir to $dir (chr(0x5C) ended path)";
}
elsif ($] =~ /^5\.010/) {
croak "perl$] can't chdir to $dir (chr(0x5C) ended path)";
}
else {
croak "perl$] can't chdir to $dir (chr(0x5C) ended path)";
}
}
else {
return CORE::chdir $dir;
}
}
#
# INFOMIX V6 ALS chr(0x5C) ended path on MSWin32
#
sub _MSWin32_5Cended_path {
if ((@_ >= 1) and ($_[0] ne '')) {
if ($^O =~ m/\A (?: MSWin32 | NetWare | symbian | dos ) \z/oxms) {
my @char = $_[0] =~ /\G ($q_char) /oxmsg;
if ($char[-1] =~ m/ \x5C \z/oxms) {
return 1;
}
}
}
return;
}
#
# do INFOMIX V6 ALS file
#
sub Einfomixv6als::do($) {
my($filename) = @_;
my $realfilename;
my $result;
ITER_DO:
{
for my $prefix (@INC) {
$realfilename = "$prefix/$filename";
if (Einfomixv6als::f($realfilename)) {
my $script = '';
my $e_mtime = (Einfomixv6als::stat("$realfilename.e"))[9];
my $mtime = (Einfomixv6als::stat($realfilename))[9];
my $module_mtime = (Einfomixv6als::stat("$FindBin::Bin/INFOMIXV6ALS.pm"))[9];
if (Einfomixv6als::e("$realfilename.e") and ($mtime < $e_mtime) and ($module_mtime < $e_mtime)) {
my $fh = Symbol::gensym();
sysopen $fh, "$realfilename.e", O_RDONLY;
local $/ = undef; # slurp mode
$script = <$fh>;
close $fh;
}
else {
my $fh = Symbol::gensym();
sysopen $fh, $realfilename, O_RDONLY;
local $/ = undef; # slurp mode
$script = <$fh>;
close $fh;
if ($script =~ m/^ \s* use \s+ INFOMIXV6ALS \s* ([^;]*) ; \s* \n? $/oxms) {
CORE::require INFOMIXV6ALS;
$script = INFOMIXV6ALS::escape_script($script);
my $fh = Symbol::gensym();
sysopen $fh, "$realfilename.e", O_WRONLY | O_TRUNC | O_CREAT;
print {$fh} $script;
close $fh;
}
}
no strict;
local $^W = $_warning;
local $@;
$result = eval $script;
last ITER_DO;
}
}
}
$INC{$filename} = $realfilename;
return $result;
}
#
# require INFOMIX V6 ALS file
#
# require
# in Chapter 3: Functions
# of ISBN 1-56592-149-6 Programming Perl, Second Edition.
sub Einfomixv6als::require(;$) {
local $_ = shift if @_;
return 1 if $INC{$_};
my $realfilename;
my $result;
ITER_REQUIRE:
{
for my $prefix (@INC) {
$realfilename = "$prefix/$_";
if (Einfomixv6als::f($realfilename)) {
my $script = '';
my $e_mtime = (Einfomixv6als::stat("$realfilename.e"))[9];
my $mtime = (Einfomixv6als::stat($realfilename))[9];
my $module_mtime = (Einfomixv6als::stat("$FindBin::Bin/INFOMIXV6ALS.pm"))[9];
if (Einfomixv6als::e("$realfilename.e") and ($mtime < $e_mtime) and ($module_mtime < $e_mtime)) {
my $fh = Symbol::gensym();
sysopen($fh, "$realfilename.e", O_RDONLY) or croak "Can't open file: $realfilename.e";
local $/ = undef; # slurp mode
$script = <$fh>;
close($fh) or croak "Can't close file: $realfilename";
}
else {
my $fh = Symbol::gensym();
sysopen($fh, $realfilename, O_RDONLY) or croak "Can't open file: $realfilename";
local $/ = undef; # slurp mode
$script = <$fh>;
close($fh) or croak "Can't close file: $realfilename";
if ($script =~ m/^ \s* use \s+ INFOMIXV6ALS \s* ([^;]*) ; \s* \n? $/oxms) {
CORE::require INFOMIXV6ALS;
$script = INFOMIXV6ALS::escape_script($script);
my $fh = Symbol::gensym();
sysopen($fh, "$realfilename.e", O_WRONLY | O_TRUNC | O_CREAT) or croak "Can't open file: $realfilename.e";
print {$fh} $script;
close($fh) or croak "Can't close file: $realfilename";
}
}
no strict;
local $^W = $_warning;
$result = eval $script;
last ITER_REQUIRE;
}
}
croak "Can't find $_ in \@INC";
}
croak $@ if $@;
croak "$_ did not return true value" unless $result;
$INC{$_} = $realfilename;
return $result;
}
#
# INFOMIX V6 ALS character to order (with parameter)
#
sub INFOMIXV6ALS::ord(;$) {
local $_ = shift if @_;
if (m/\A ($q_char) /oxms) {
my @ord = unpack 'C*', $1;
my $ord = 0;
while (my $o = shift @ord) {
$ord = $ord * 0x100 + $o;
}
return $ord;
}
else {
return CORE::ord $_;
}
}
#
# INFOMIX V6 ALS character to order (without parameter)
#
sub INFOMIXV6ALS::ord_() {
if (m/\A ($q_char) /oxms) {
my @ord = unpack 'C*', $1;
my $ord = 0;
while (my $o = shift @ord) {
$ord = $ord * 0x100 + $o;
}
return $ord;
}
else {
return CORE::ord $_;
}
}
#
# INFOMIX V6 ALS reverse
#
sub INFOMIXV6ALS::reverse(@) {
if (wantarray) {
return CORE::reverse @_;
}
else {
return join '', CORE::reverse(join('',@_) =~ m/\G ($q_char) /oxmsg);
}
}
#
# INFOMIX V6 ALS length by character
#
sub INFOMIXV6ALS::length(;$) {
local $_ = shift if @_;
local @_ = m/\G ($q_char) /oxmsg;
return scalar @_;
}
#
# INFOMIX V6 ALS substr by character
#
sub INFOMIXV6ALS::substr ($$;$$) {
my @char = $_[0] =~ m/\G ($q_char) /oxmsg;
# substr($string,$offset,$length,$replacement)
if (@_ == 4) {
my(undef,$offset,$length,$replacement) = @_;
my $substr = join '', splice(@char, $offset, $length, $replacement);
$_[0] = join '', @char;
return $substr;
}
# substr($string,$offset,$length)
elsif (@_ == 3) {
my(undef,$offset,$length) = @_;
return join '', (@char[$offset .. $#char])[0 .. $length-1];
}
# substr($string,$offset)
else {
my(undef,$offset) = @_;
if ($offset >= 0) {
return join '', @char[$offset .. $#char];
}
else {
return join '', @char[($#char+$offset+1) .. $#char];
}
}
croak "$0: INFOMIXV6ALS::substr outside of string";
}
#
# INFOMIX V6 ALS index by character
#
sub INFOMIXV6ALS::index($$;$) {
my $index;
if (@_ == 3) {
$index = Einfomixv6als::index($_[0], $_[1], CORE::length(INFOMIXV6ALS::substr($_[0], 0, $_[2])));
}
else {
$index = Einfomixv6als::index($_[0], $_[1]);
}
if ($index == -1) {
return -1;
}
else {
return INFOMIXV6ALS::length(CORE::substr $_[0], 0, $index);
}
}
#
# INFOMIX V6 ALS rindex by character
#
sub INFOMIXV6ALS::rindex($$;$) {
my $rindex;
if (@_ == 3) {
$rindex = Einfomixv6als::rindex($_[0], $_[1], CORE::length(INFOMIXV6ALS::substr($_[0], 0, $_[2])));
}
else {
$rindex = Einfomixv6als::rindex($_[0], $_[1]);
}
if ($rindex == -1) {
return -1;
}
else {
return INFOMIXV6ALS::length(CORE::substr $_[0], 0, $rindex);
}
}
# pop warning
$^W = $_warning;
1;
__END__
=pod
=head1 NAME
Einfomixv6als - Run-time routines for INFOMIXV6ALS.pm
=head1 SYNOPSIS
use Einfomixv6als;
Einfomixv6als::split(...);
Einfomixv6als::tr(...);
Einfomixv6als::chop(...);
Einfomixv6als::index(...);
Einfomixv6als::rindex(...);
Einfomixv6als::lc(...);
Einfomixv6als::lc_;
Einfomixv6als::uc(...);
Einfomixv6als::uc_;
Einfomixv6als::capture(...);
Einfomixv6als::ignorecase(...);
Einfomixv6als::chr(...);
Einfomixv6als::chr_;
Einfomixv6als::X ...;
Einfomixv6als::X_;
Einfomixv6als::glob(...);
Einfomixv6als::glob_;
Einfomixv6als::lstat(...);
Einfomixv6als::lstat_;
Einfomixv6als::opendir(...);
Einfomixv6als::stat(...);
Einfomixv6als::stat_;
Einfomixv6als::unlink(...);
Einfomixv6als::chdir(...);
Einfomixv6als::do(...);
Einfomixv6als::require(...);
INFOMIXV6ALS::ord(...);
INFOMIXV6ALS::ord_;
INFOMIXV6ALS::reverse(...);
INFOMIXV6ALS::length(...);
INFOMIXV6ALS::substr(...);
INFOMIXV6ALS::index(...);
INFOMIXV6ALS::rindex(...);
# "no Einfomixv6als;" not supported
=head1 ABSTRACT
This module is a run-time routines of the INFOMIXV6ALS module.
Because the INFOMIXV6ALS module automatically uses this module, you need not use directly.
=head1 BUGS AND LIMITATIONS
Please patches and report problems to author are welcome.
=head1 HISTORY
This Einfomixv6als module first appeared in ActivePerl Build 522 Built under
MSWin32 Compiled at Nov 2 1999 09:52:28
=head1 AUTHOR
INABA Hitoshi E<lt>ina@cpan.orgE<gt>
This project was originated by INABA Hitoshi.
For any questions, use E<lt>ina@cpan.orgE<gt> so we can share
this file.
=head1 LICENSE AND COPYRIGHT
This module is free software; you can redistribute it and/or
modify it under the same terms as Perl itself. See L<perlartistic>.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
=head1 EXAMPLES
=over 4
=item Split string
@split = Einfomixv6als::split(/pattern/,$string,$limit);
@split = Einfomixv6als::split(/pattern/,$string);
@split = Einfomixv6als::split(/pattern/);
@split = Einfomixv6als::split('',$string,$limit);
@split = Einfomixv6als::split('',$string);
@split = Einfomixv6als::split('');
@split = Einfomixv6als::split();
@split = Einfomixv6als::split;
Scans a INFOMIX V6 ALS $string for delimiters that match pattern and splits the INFOMIX V6 ALS
$string into a list of substrings, returning the resulting list value in list
context, or the count of substrings in scalar context. The delimiters are
determined by repeated pattern matching, using the regular expression given in
pattern, so the delimiters may be of any size and need not be the same INFOMIX V6 ALS
$string on every match. If the pattern doesn't match at all, Einfomixv6als::split returns
the original INFOMIX V6 ALS $string as a single substring. If it matches once, you get
two substrings, and so on.
If $limit is specified and is not negative, the function splits into no more than
that many fields. If $limit is negative, it is treated as if an arbitrarily large
$limit has been specified. If $limit is omitted, trailing null fields are stripped
from the result (which potential users of pop would do well to remember).
If INFOMIX V6 ALS $string is omitted, the function splits the $_ INFOMIX V6 ALS string.
If $patten is also omitted, the function splits on whitespace, /\s+/, after
skipping any leading whitespace.
If the pattern contains parentheses, then the substring matched by each pair of
parentheses is included in the resulting list, interspersed with the fields that
are ordinarily returned.
=item Transliteration
$tr = Einfomixv6als::tr($variable,$bind_operator,$searchlist,$replacementlist,$modifier);
$tr = Einfomixv6als::tr($variable,$bind_operator,$searchlist,$replacementlist);
This function scans a INFOMIX V6 ALS string character by character and replaces all
occurrences of the characters found in $searchlist with the corresponding character
in $replacementlist. It returns the number of characters replaced or deleted.
If no INFOMIX V6 ALS string is specified via =~ operator, the $_ variable is translated.
$modifier are:
Modifier Meaning
------------------------------------------------------
c Complement $searchlist
d Delete found but unreplaced characters
s Squash duplicate replaced characters
------------------------------------------------------
=item Chop string
$chop = Einfomixv6als::chop(@list);
$chop = Einfomixv6als::chop();
$chop = Einfomixv6als::chop;
Chops off the last character of a INFOMIX V6 ALS string contained in the variable (or
INFOMIX V6 ALS strings in each element of a @list) and returns the character chopped.
The Einfomixv6als::chop operator is used primarily to remove the newline from the end of
an input record but is more efficient than s/\n$//. If no argument is given, the
function chops the $_ variable.
=item Index string
$pos = Einfomixv6als::index($string,$substr,$position);
$pos = Einfomixv6als::index($string,$substr);
Returns the position of the first occurrence of $substr in INFOMIX V6 ALS $string.
The start, if specified, specifies the $position to start looking in the INFOMIX V6 ALS
$string. Positions are integer numbers based at 0. If the substring is not found,
the Einfomixv6als::index function returns -1.
=item Reverse index string
$pos = Einfomixv6als::rindex($string,$substr,$position);
$pos = Einfomixv6als::rindex($string,$substr);
Works just like Einfomixv6als::index except that it returns the position of the last
occurence of $substr in INFOMIX V6 ALS $string (a reverse index). The function returns
-1 if not found. $position, if specified, is the rightmost position that may be
returned, i.e., how far in the INFOMIX V6 ALS string the function can search.
=item Lower case string
$lc = Einfomixv6als::lc($string);
$lc = Einfomixv6als::lc_;
Returns a lowercase version of INFOMIX V6 ALS string (or $_, if omitted). This is the
internal function implementing the \L escape in double-quoted strings.
=item Upper case string
$uc = Einfomixv6als::uc($string);
$uc = Einfomixv6als::uc_;
Returns an uppercased version of INFOMIX V6 ALS string (or $_, if string is omitted).
This is the internal function implementing the \U escape in double-quoted
strings.
=item Make capture number
$capturenumber = Einfomixv6als::capture($string);
This function is internal use to m/ /i, s/ / /i, split and qr/ /i.
=item Make ignore case string
@ignorecase = Einfomixv6als::ignorecase(@string);
This function is internal use to m/ /i, s/ / /i, split and qr/ /i.
=item Make character
$chr = Einfomixv6als::chr($code);
$chr = Einfomixv6als::chr_;
This function returns the character represented by that $code in the character
set. For example, Einfomixv6als::chr(65) is "A" in either ASCII or INFOMIX V6 ALS, and
Einfomixv6als::chr(0x82a0) is a INFOMIX V6 ALS HIRAGANA LETTER A. For the reverse of Einfomixv6als::chr,
use INFOMIXV6ALS::ord.
=item File test operator -X
A file test operator is an unary operator that tests a pathname or a filehandle.
If $string is omitted, it uses $_ by function Einfomixv6als::r_.
The following functions function when the pathname ends with chr(0x5C) on MSWin32.
$test = Einfomixv6als::r $string;
$test = Einfomixv6als::r_;
Returns 1 when true case or '' when false case.
Returns undef unless successful.
Function and Prototype Meaning
------------------------------------------------------------------------------
Einfomixv6als::r(*), Einfomixv6als::r_() File is readable by effective uid/gid
Einfomixv6als::w(*), Einfomixv6als::w_() File is writable by effective uid/gid
Einfomixv6als::x(*), Einfomixv6als::x_() File is executable by effective uid/gid
Einfomixv6als::o(*), Einfomixv6als::o_() File is owned by effective uid
Einfomixv6als::R(*), Einfomixv6als::R_() File is readable by real uid/gid
Einfomixv6als::W(*), Einfomixv6als::W_() File is writable by real uid/gid
Einfomixv6als::X(*), Einfomixv6als::X_() File is executable by real uid/gid
Einfomixv6als::O(*), Einfomixv6als::O_() File is owned by real uid
Einfomixv6als::e(*), Einfomixv6als::e_() File exists
Einfomixv6als::z(*), Einfomixv6als::z_() File has zero size
Einfomixv6als::f(*), Einfomixv6als::f_() File is a plain file
Einfomixv6als::d(*), Einfomixv6als::d_() File is a directory
Einfomixv6als::l(*), Einfomixv6als::l_() File is a symbolic link
Einfomixv6als::p(*), Einfomixv6als::p_() File is a named pipe (FIFO)
Einfomixv6als::S(*), Einfomixv6als::S_() File is a socket
Einfomixv6als::b(*), Einfomixv6als::b_() File is a block special file
Einfomixv6als::c(*), Einfomixv6als::c_() File is a character special file
Einfomixv6als::t(*), Einfomixv6als::t_() Filehandle is opened to a tty
Einfomixv6als::u(*), Einfomixv6als::u_() File has setuid bit set
Einfomixv6als::g(*), Einfomixv6als::g_() File has setgid bit set
Einfomixv6als::k(*), Einfomixv6als::k_() File has sticky bit set
------------------------------------------------------------------------------
Returns 1 when true case or '' when false case.
Returns undef unless successful.
The Einfomixv6als::T, Einfomixv6als::T_, Einfomixv6als::B and Einfomixv6als::B_ work as follows. The first block
or so of the file is examined for strange chatracters such as
[\000-\007\013\016-\032\034-\037\377] (that don't look like INFOMIX V6 ALS). If more
than 10% of the bytes appear to be strange, it's a *maybe* binary file;
otherwise, it's a *maybe* text file. Also, any file containing ASCII NUL(\0) or
\377 in the first block is considered a binary file. If Einfomixv6als::T or Einfomixv6als::B is
used on a filehandle, the current input (standard I/O or "stdio") buffer is
examined rather than the first block of the file. Both Einfomixv6als::T and Einfomixv6als::B
return 1 as true on an empty file, or on a file at EOF (end-of-file) when testing
a filehandle. Both Einfomixv6als::T and Einfomixv6als::B deosn't work when given the special
filehandle consisting of a solitary underline.
Function and Prototype Meaning
------------------------------------------------------------------------------
Einfomixv6als::T(*), Einfomixv6als::T_() File is a text file
Einfomixv6als::B(*), Einfomixv6als::B_() File is a binary file (opposite of -T)
------------------------------------------------------------------------------
Returns useful value if successful, or undef unless successful.
$value = Einfomixv6als::s $string;
$value = Einfomixv6als::s_;
Function and Prototype Meaning
------------------------------------------------------------------------------
Einfomixv6als::s(*), Einfomixv6als::s_() File has nonzero size (returns size)
Einfomixv6als::M(*), Einfomixv6als::M_() Age of file (at startup) in days since modification
Einfomixv6als::A(*), Einfomixv6als::A_() Age of file (at startup) in days since last access
Einfomixv6als::C(*), Einfomixv6als::C_() Age of file (at startup) in days since inode change
------------------------------------------------------------------------------
=item Filename expansion (globbing)
@glob = Einfomixv6als::glob($string);
@glob = Einfomixv6als::glob_;
Performs filename expansion (DOS-like globbing) on $string, returning the next
successive name on each call. If $string is omitted, $_ is globbed instead.
This function function when the pathname ends with chr(0x5C) on MSWin32.
For example, C<<..\\l*b\\file/*glob.p?>> will work as expected (in that it will
find something like '..\lib\File/DosGlob.pm' alright). Note that all path
components are case-insensitive, and that backslashes and forward slashes are
both accepted, and preserved. You may have to double the backslashes if you are
putting them in literally, due to double-quotish parsing of the pattern by perl.
A tilde ("~") expands to the current user's home directory.
Spaces in the argument delimit distinct patterns, so C<glob('*.exe *.dll')> globs
all filenames that end in C<.exe> or C<.dll>. If you want to put in literal spaces
in the glob pattern, you can escape them with either double quotes.
e.g. C<glob('c:/"Program Files"/*/*.dll')>.
=item Statistics about link
@lstat = Einfomixv6als::lstat($file);
@lstat = Einfomixv6als::lstat_;
Like Einfomixv6als::stat, returns information on file, except that if file is a symbolic
link, Einfomixv6als::lstat returns information about the link; Einfomixv6als::stat returns
information about the file pointed to by the link. (If symbolic links are
unimplemented on your system, a normal Einfomixv6als::stat is done instead.) If file is
omitted, returns information on file given in $_.
This function function when the filename ends with chr(0x5C) on MSWin32.
=item Open directory handle
$rc = Einfomixv6als::opendir(DIR,$dir);
Opens a directory for processing by readdir, telldir, seekdir, rewinddir and
closedir. The function returns true if successful.
This function function when the directory name ends with chr(0x5C) on MSWin32.
=item Statistics about file
@stat = Einfomixv6als::stat($file);
@stat = Einfomixv6als::stat_;
Returns a 13-element list giving the statistics for a file, indicated by either
a filehandle or an expression that gives its name. It's typically used as
follows:
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
$atime,$mtime,$ctime,$blksize,$blocks) = Einfomixv6als::stat($file);
Not all fields are supported on all filesystem types. Here are the meanings of
the fields:
Field Meaning
-----------------------------------------------------------------
dev Device number of filesystem
ino Inode number
mode File mode (type and permissions)
nlink Nunmer of (hard) links to the file
uid Numeric user ID of file's owner
gid Numeric group ID of file's owner
rdev The device identifier (special files only)
size Total size of file, in bytes
atime Last access time since the epoch
mtime Last modification time since the epoch
ctime Inode change time (not creation time!) since the epoch
blksize Preferred blocksize for file system I/O
blocks Actual number of blocks allocated
-----------------------------------------------------------------
$dev and $ino, token together, uniquely identify a file. The $blksize and
$blocks are likely defined only on BSD-derived filesystem. The $blocks field
(if defined) is reported in 512-byte blocks.
If stat is passed the special filehandle consisting of an underline, no
actual stat is done, but the current contents of the stat structure from the
last stat or stat-based file test (the -x operators) is returned.
If file is omitted, returns information on file given in $_.
This function function when the filename ends with chr(0x5C) on MSWin32.
=item Deletes a list of files.
$unlink = Einfomixv6als::unlink(@list);
$unlink = Einfomixv6als::unlink($file);
$unlink = Einfomixv6als::unlink;
Delete a list of files. (Under Unix, it will remove a link to a file, but the
file may still exist if another link references it.) If list is omitted, it
unlinks the file given in $_. The function returns the number of files
successfully deleted.
This function function when the filename ends with chr(0x5C) on MSWin32.
=item Changes the working directory.
$chdir = Einfomixv6als::chdir($dirname);
$chdir = Einfomixv6als::chdir;
Changes the working directory to $dirname, if possible. If $dirname is omitted,
it changes to the home directory. The function returns 1 upon success, 0
otherwise (and puts the error code into $!).
This function can't function when the $dirname ends with chr(0x5C) on perl5.006,
perl5.008, perl5.010 on MSWin32.
=item do file
$return = Einfomixv6als::do($file);
The do FILE form uses the value of FILE as a filename and executes the contents
of the file as a Perl script. Its primary use is (or rather was) to include
subroutines from a Perl subroutine library, so that:
Einfomixv6als::do('stat.pl');
is rather like:
scalar eval `cat stat.pl`; # `type stat.pl` on Windows
except that Einfomixv6als::do is more efficient, more concise, keeps track of the current
filename for error messages, searches all the directories listed in the @INC
array, and updates %INC if the file is found.
It also differs in that code evaluated with Einfomixv6als::do FILE can not see lexicals in
the enclosing scope, whereas code in eval FILE does. It's the same, however, in
that it reparses the file every time you call it -- so you might not want to do
this inside a loop unless the filename itself changes at each loop iteration.
If Einfomixv6als::do can't read the file, it returns undef and sets $! to the error. If
Einfomixv6als::do can read the file but can't compile it, it returns undef and sets an
error message in $@. If the file is successfully compiled, do returns the value of
the last expression evaluated.
Inclusion of library modules (which have a mandatory .pm suffix) is better done
with the use and require operators, which also Einfomixv6als::do error checking and raise
an exception if there's a problem. They also offer other benefits: they avoid
duplicate loading, help with object-oriented programming, and provide hints to the
compiler on function prototypes.
But Einfomixv6als::do FILE is still useful for such things as reading program configuration
files. Manual error checking can be done this way:
# read in config files: system first, then user
for $file ("/usr/share/proggie/defaults.rc", "$ENV{HOME}/.someprogrc") {
unless ($return = Einfomixv6als::do($file)) {
warn "couldn't parse $file: $@" if $@;
warn "couldn't Einfomixv6als::do($file): $!" unless defined $return;
warn "couldn't run $file" unless $return;
}
}
A long-running daemon could periodically examine the timestamp on its configuration
file, and if the file has changed since it was last read in, the daemon could use
Einfomixv6als::do to reload that file. This is more tidily accomplished with Einfomixv6als::do than
with Einfomixv6als::require.
=item require file
Einfomixv6als::require($file);
Einfomixv6als::require();
This function asserts a dependency of some kind on its argument. If an argument is not
supplied, $_ is used.
If the argument is a string, Einfomixv6als::require loads and executes the Perl code found in
the separate file whose name is given by the string. This is similar to performing a
Einfomixv6als::do on a file, except that Einfomixv6als::require checks to see whether the library
file has been loaded already and raises an exception if any difficulties are
encountered. (It can thus be used to express file dependencies without worrying about
duplicate compilation.) Like its cousins Einfomixv6als::do and use, Einfomixv6als::require knows how
to search the include path stored in the @INC array and to update %INC upon success.
The file must return true as the last value to indicate successful execution of any
initialization code, so it's customary to end such a file with 1; unless you're sure
it'll return true otherwise.
See also do file.
=item Order of Character
$ord = INFOMIXV6ALS::ord($string);
$ord = INFOMIXV6ALS::ord_;
This function returns the numeric value (ASCII or INFOMIX V6 ALS) of the first character
of $string. The return value is always unsigned.
=item Reverse list or string
@reverse = INFOMIXV6ALS::reverse(@list);
$reverse = INFOMIXV6ALS::reverse(@list);
In list context, this function returns a list value consisting of the elements of
@list in the opposite order. The function can be used to create descending sequences:
for (INFOMIXV6ALS::reverse(1 .. 10)) { ... }
Because of the way hashes flatten into lists when passed as a @list, reverse can also
be used to invert a hash, presuming the values are unique:
%barfoo = INFOMIXV6ALS::reverse(%foobar);
In scalar context, the function concatenates all the elements of LIST and then returns
the reverse of that resulting string, character by character.
=item length by INFOMIX V6 ALS character
$length = INFOMIXV6ALS::length($string);
$length = INFOMIXV6ALS::length();
This function returns the length in characters of the scalar value $string. If $string
is omitted, it returns the INFOMIXV6ALS::length of $_.
Do not try to use length to find the size of an array or hash. Use scalar @array for
the size of an array, and scalar keys %hash for the number of key/value pairs in a
hash. (The scalar is typically omitted when redundant.)
To find the length of a string in bytes rather than characters, say:
$blen = length $string;
or
$blen = CORE::length $string;
=item substr by INFOMIX V6 ALS character
$substr = INFOMIXV6ALS::substr($string,$offset,$length,$replacement);
$substr = INFOMIXV6ALS::substr($string,$offset,$length);
$substr = INFOMIXV6ALS::substr($string,$offset);
This function extracts a substring out of the string given by $string and returns
it. The substring is extracted starting at $offset characters from the front of
the string.
If $offset is negative, the substring starts that far from the end of the string
instead. If $length is omitted, everything to the end of the string is returned.
If $length is negative, the length is calculated to leave that many characters off
the end of the string. Otherwise, $length indicates the length of the substring to
extract, which is sort of what you'd expect.
An alternative to using INFOMIXV6ALS::substr as an lvalue is to specify the $replacement
string as the fourth argument. This allows you to replace parts of the $string and
return what was there before in one operation, just as you can with splice. The next
example also replaces the last character of $var with "Curly" and puts that replaced
character into $oldstr:
$oldstr = INFOMIXV6ALS::substr($var, -1, 1, "Curly");
If you assign something shorter than the length of your substring, the string will
shrink, and if you assign something longer than the length, the string will grow to
accommodate it. To keep the string the same length, you may need to pad or chop your
value using sprintf or the x operator. If you attempt to assign to an unallocated
area past the end of the string, INFOMIXV6ALS::substr raises an exception.
To prepend the string "Larry" to the current value of $_, use:
INFOMIXV6ALS::substr($var, 0, 0, "Larry");
To instead replace the first character of $_ with "Moe", use:
INFOMIXV6ALS::substr($var, 0, 1, "Moe");
And finally, to replace the last character of $var with "Curly", use:
INFOMIXV6ALS::substr($var, -1, 0, "Curly");
=item index by INFOMIX V6 ALS character
$index = INFOMIXV6ALS::index($string,$substring,$offset);
$index = INFOMIXV6ALS::index($string,$substring);
This function searches for one string within another. It returns the position of
the first occurrence of $substring in $string. The $offset, if specified, says how
many characters from the start to skip before beginning to look. Positions are
based at 0. If the substring is not found, the function returns one less than the
base, ordinarily -1. To work your way through a string, you might say:
$pos = -1;
while (($pos = INFOMIXV6ALS::index($string, $lookfor, $pos)) > -1) {
print "Found at $pos\n";
$pos++;
}
=item rindex by INFOMIX V6 ALS character
$rindex = INFOMIXV6ALS::rindex($string,$substring,$position);
$rindex = INFOMIXV6ALS::rindex($string,$substring);
This function works just like INFOMIXV6ALS::index except that it returns the position of
the last occurrence of $substring in $string (a reverse index). The function
returns -1 if not $substring is found. $position, if specified, is the rightmost
position that may be returned. To work your way through a string backward, say:
$pos = INFOMIXV6ALS::length($string);
while (($pos = INFOMIXV6ALS::rindex($string, $lookfor, $pos)) >= 0) {
print "Found at $pos\n";
$pos--;
}
=back
=cut