|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
use strict; |
|
|
|
|
|
(my $ME = $0) =~ s|.*/||; |
|
|
|
|
|
my $limits = getlimits (); |
|
|
my $UINTMAX_OFLOW = $limits->{UINTMAX_OFLOW}; |
|
|
|
|
|
(my $program_name = $0) =~ s|.*/||; |
|
|
my $prog = 'expr'; |
|
|
|
|
|
my $locale = $ENV{LOCALE_FR_UTF8}; |
|
|
! defined $locale || $locale eq 'none' |
|
|
and CuSkip::skip "$ME: this test requires FR-UTF8 locale\n"; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
my $expression = "\x{1F14}\x{3BA}\x{3C6}\x{3C1}\x{3B1}\x{3C3}\x{3B9}\x{3C2}"; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
my @Tests = |
|
|
( |
|
|
|
|
|
|
|
|
|
|
|
['mb-l1', 'length abcdef', {OUT=>"6"}], |
|
|
['st-l1', 'length abcdef', {OUT=>"6"}], |
|
|
|
|
|
|
|
|
|
|
|
['mb-l2', "length \xCE\xB1bcdef", {OUT=>"6"}], |
|
|
['st-l2', "length \xCE\xB1bcdef", {OUT=>"7"}], |
|
|
|
|
|
|
|
|
|
|
|
['mb-l3', "length abc\xCE\xB4ef", {OUT=>"6"}], |
|
|
['st-l3', "length abc\xCE\xB4ef", {OUT=>"7"}], |
|
|
|
|
|
|
|
|
['mb-l4', "length fedcb\xCE\xB1", {OUT=>"6"}], |
|
|
['st-l4', "length fedcb\xCE\xB1", {OUT=>"7"}], |
|
|
|
|
|
|
|
|
['mb-l5', "length \xB1aaa", {OUT=>"4"}], |
|
|
['st-l5', "length \xB1aaa", {OUT=>"4"}], |
|
|
|
|
|
|
|
|
['mb-l6', "length aaa\xCE", {OUT=>"4"}], |
|
|
['st-l6', "length aaa\xCE", {OUT=>"4"}], |
|
|
|
|
|
|
|
|
['mb-l7', "length $expression", {OUT=>"8"}], |
|
|
['st-l7', "length $expression", {OUT=>"17"}], |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
['mb-i1', 'index abcdef fb', {OUT=>"2"}], |
|
|
['st-i1', 'index abcdef fb', {OUT=>"2"}], |
|
|
|
|
|
|
|
|
['mb-i2', "index \xCE\xB1bc\xCE\xB4ef b", {OUT=>"2"}], |
|
|
['st-i2', "index \xCE\xB1bc\xCE\xB4ef b", {OUT=>"3"}], |
|
|
['mb-i3', "index \xCE\xB1bc\xCE\xB4ef f", {OUT=>"6"}], |
|
|
['st-i3', "index \xCE\xB1bc\xCE\xB4ef f", {OUT=>"8"}], |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
['mb-i4', "index \xCE\xB1bc\xCE\xB4ef \xCE\xB4", {OUT=>"4"}], |
|
|
['st-i4', "index \xCE\xB1bc\xCE\xB4ef \xCE\xB4", {OUT=>"1"}], |
|
|
|
|
|
|
|
|
['mb-i5', "index \xCEbc\xCE\xB4ef \xCE\xB4", {OUT=>"4"}], |
|
|
['st-i5', "index \xCEbc\xCE\xB4ef \xCE\xB4", {OUT=>"1"}], |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
['mb-i6', "index \xCE\xB1bc\xCE\xB4ef \xB4", {OUT=>"0"}, {EXIT=>1}], |
|
|
['st-i6', "index \xCE\xB1bc\xCE\xB4ef \xB4", {OUT=>"6"}], |
|
|
|
|
|
|
|
|
|
|
|
['mb-i7', "index \xCE\xB1bc\xB4ef \xB4", {OUT=>"4"}], |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
['mb-s1', 'substr abcdef 2 3', {OUT=>"bcd"}], |
|
|
['st-s1', 'substr abcdef 2 3', {OUT=>"bcd"}], |
|
|
|
|
|
['mb-s2', "substr \xCE\xB1bc\xCE\xB4ef 1 1", {OUT=>"\xCE\xB1"}], |
|
|
['st-s2', "substr \xCE\xB1bc\xCE\xB4ef 1 1", {OUT=>"\xCE"}], |
|
|
|
|
|
['mb-s3', "substr \xCE\xB1bc\xCE\xB4ef 3 2", {OUT=>"c\xCE\xB4"}], |
|
|
['st-s3', "substr \xCE\xB1bc\xCE\xB4ef 3 2", {OUT=>"bc"}], |
|
|
|
|
|
['mb-s4', "substr \xCE\xB1bc\xCE\xB4ef 4 1", {OUT=>"\xCE\xB4"}], |
|
|
['st-s4', "substr \xCE\xB1bc\xCE\xB4ef 4 1", {OUT=>"c"}], |
|
|
|
|
|
['mb-s5', "substr \xCE\xB1bc\xCE\xB4ef 4 2", {OUT=>"\xCE\xB4e"}], |
|
|
['st-s5', "substr \xCE\xB1bc\xCE\xB4ef 4 2", {OUT=>"c\xCE"}], |
|
|
|
|
|
['mb-s6', "substr \xCE\xB1bc\xCE\xB4ef 6 1", {OUT=>"f"}], |
|
|
['st-s6', "substr \xCE\xB1bc\xCE\xB4ef 6 1", {OUT=>"\xB4"}], |
|
|
|
|
|
['mb-s7', "substr \xCE\xB1bc\xCE\xB4ef 7 1", {OUT=>""}, {EXIT=>1}], |
|
|
['st-s7', "substr \xCE\xB1bc\xCE\xB4ef 7 1", {OUT=>"e"}], |
|
|
|
|
|
|
|
|
['mb-s8', "substr \xCE\xB1bc\xB4ef 3 3", {OUT=>"c\xB4e"}], |
|
|
['st-s8', "substr \xCE\xB1bc\xB4ef 3 3", {OUT=>"bc\xB4"}], |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
['mb-m1', 'match abcdef ab', {OUT=>"2"}], |
|
|
['st-m1', 'match abcdef ab', {OUT=>"2"}], |
|
|
['mb-m2', 'match abcdef "\(ab\)"', {OUT=>"ab"}], |
|
|
['st-m2', 'match abcdef "\(ab\)"', {OUT=>"ab"}], |
|
|
|
|
|
|
|
|
['mb-m3', "match \xCE\xB1bc\xCE\xB4ef .bc", {OUT=>"3"}], |
|
|
['st-m3', "match \xCE\xB1bc\xCE\xB4ef .bc", {OUT=>"0"}, {EXIT=>1}], |
|
|
|
|
|
|
|
|
|
|
|
['mb-m4', "match \xCE\xB1bc\xCE\xB4ef ..bc", {OUT=>"0"}, {EXIT=>1}], |
|
|
['st-m4', "match \xCE\xB1bc\xCE\xB4ef ..bc", {OUT=>"4"}], |
|
|
|
|
|
|
|
|
['mb-m5', "match \xCE\xB1bc\xCE\xB4ef '\\(.b\\)c'", {OUT=>"\xCE\xB1b"}], |
|
|
['st-m5', "match \xCE\xB1bc\xCE\xB4ef '\\(.b\\)c'", {OUT=>""}, {EXIT=>1}], |
|
|
|
|
|
|
|
|
|
|
|
['mb-m6', "match \xCEbc\xCE\xB4ef '\\(.\\)'", {OUT=>""}, {EXIT=>1}], |
|
|
['st-m6', "match \xCEbc\xCE\xB4ef '\\(.\\)'", {OUT=>"\xCE"}], |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
['mb-m7', "match \xCE\xB1bc\xCE\xB4e '\\([\xCE\xB1]\\)'", {OUT=>"\xCE\xB1"}], |
|
|
['st-m7', "match \xCE\xB1bc\xCE\xB4e '\\([\xCE\xB1]\\)'", {OUT=>"\xCE"}], |
|
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
my $t; |
|
|
foreach $t (@Tests) |
|
|
{ |
|
|
my $arg1 = $t->[1]; |
|
|
my $e; |
|
|
foreach $e (@$t) |
|
|
{ |
|
|
$e->{OUT} .= "\n" |
|
|
if ref $e eq 'HASH' and exists $e->{OUT}; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ($locale ne 'C') |
|
|
{ |
|
|
my @new; |
|
|
foreach my $t (@Tests) |
|
|
{ |
|
|
my ($tname) = @$t; |
|
|
if ($tname =~ /^mb/) |
|
|
{ |
|
|
push @$t, ({ENV => "LC_ALL=$locale"}, |
|
|
{ERR_SUBST => "s/\xe2\x80[\x98\x99]/'/g"}); |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
my $save_temps = $ENV{DEBUG}; |
|
|
my $verbose = $ENV{VERBOSE}; |
|
|
|
|
|
my $fail = run_tests ($program_name, $prog, \@Tests, $save_temps, $verbose); |
|
|
exit $fail; |
|
|
|