#!/usr/bin/perl
# Test misc.
# Copyright (C) 2017-2022 Free Software Foundation, Inc.
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# 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. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
use strict;
use File::stat;
(my $program_name = $0) =~ s|.*/||;
# Turn off localization of executable's output.
@ENV{qw(LANGUAGE LANG LC_ALL)} = ('C') x 3;
my $prog = 'sed';
print "PATH = $ENV{PATH}\n";
my @Tests =
(
['empty', qw(-e ''), {IN=>''}, {OUT=>''}],
['empty2', q('s/^ *//'), {IN=>"x\n\n"}, {OUT=>"x\n\n"}],
['head', qw(3q), {IN=>"1\n2\n3\n4\n"}, {OUT=>"1\n2\n3\n"}],
['space', q('s/_\S/XX/g;s/\s/_/g'),
{IN=> "Hello World\t!\nSecond_line_ of tests\n" },
{OUT=> "Hello_World_!\nSecondXXine__of_tests\n" }],
['zero-anchor', qw(-z), q('N;N;s/^/X/g;s/^/X/mg;s/$/Y/g;s/$/Y/mg'),
{IN=>"a\0b\0c\0" },
{OUT=>"XXaY\0XbY\0XcYY\0" }],
['case-insensitive', qw(-n), q('h;s/Version: *//p;g;s/version: *//Ip'),
{IN=>"Version: 1.2.3\n" },
{OUT=>"1.2.3\n1.2.3\n" },
],
['preserve-missing-EOL-at-EOF', q('s/$/x/'),
{IN=> "a\nb" },
{OUT=>"ax\nbx" },
],
['y-bracket', q('y/[/ /'),
{IN => "Are you sure (y/n)? [y]\n" },
{OUT=> "Are you sure (y/n)? y]\n" },
],
['y-zero', q('y/b/\x00/'),
{IN => "abc\n" },
{OUT=> "a\0c\n" },
],
['y-newline', q('H
G
y/Ss\nYy/yY$sS/'),
{IN => "Are you sure (y/n)? [y]\n" },
{OUT=> 'Are Sou Yure (S/n)? [S]$$Are Sou Yure (S/n)? [S]'."\n"},
],
['allsub', q('s/foo/bar/g'),
{IN => "foo foo fo oo f oo foo foo foo foo foo foo foo foo foo\n"},
{OUT=> "bar bar fo oo f oo bar bar bar bar bar bar bar bar bar\n"},
],
['insert-nl', qw(-f), {IN => "/foo/i\\\n"},
{IN => "bar\nfoo\n" },
{OUT=> "bar\n\nfoo\n" },
],
['recall',
# Check that the empty regex recalls the last *executed* regex,
# not the last *compiled* regex
qw(-f), {IN => "p;s/e/X/p;:x;s//Y/p;/f/bx"},
{IN => "eeefff\n" },
{OUT=> "eeefff\n"
. "Xeefff\n"
. "XYefff\n"
. "XYeYff\n"
. "XYeYYf\n"
. "XYeYYY\n"
. "XYeYYY\n"
},
],
['recall2',
# Starting from sed 4.1.3, regexes are compiled with REG_NOSUB
# if they are used in an address, so that the matcher does not
# have to obey leftmost-longest. The tricky part is to recompile
# them if they are then used in a substitution.
qw(-f), {IN => '/\(ab*\)\+/ s//>\1</g'},
{IN => "ababb||abbbabbbb\n" },
{OUT=> ">abb<||>abbbb<\n" },
],
['0range',
# Test address 0 (GNU extension)
# FIXME: This test does NOT actually fail if the address is changed to 1.
qw(-e '0,/aaa/d'),
{IN => "1\n"
. "2\n"
. "3\n"
. "4\n"
. "aaa\n"
. "yes\n"},
{OUT => "yes\n"}
],
['amp-escape',
# Test ampersand as escape sequence (ASCII 0x26), which should
# not have a special meaning (i.e. the 'matched pattern')
qw(-e 's/yes/yes\x26/'),
{IN => "yes\n"},
{OUT => "yes&\n"}
],
['appquit',
# Test 'a'ppend command before 'q'uit
qw(-f),
{IN => q(a\
ok
q)},
{IN => "doh\n"},
{OUT => "doh\n"
. "ok\n"}
],
['brackets',
qw(-f),
{IN => q(s/[[]/a/
s/[[[]/b/
s/[[[[]/c/
s/[[[[[]/d/
s/[[[[[[]/e/
s/[[[[[[[]/f/
s/[[[[[[[[]/g/
s/[[[[[[[[[]/h/
)},
{IN => "[[[[[[[[[\n"},
{OUT => "abcdefgh[\n"}
],
['bkslashes',
# Test backslashes in regex
# bug in sed 4.0b
qw(-f),
{IN => q(s/$/\\\\\
/
)},
{IN => "a\n"},
{OUT => "a\\\n"
. "\n"}
],
['classes',
# inspired by an autoconf generated configure script.
qw(-n -f),
{IN => 's/^\([/[:lower:]A-Z0-9]*_cv_[[:lower:][:upper:]/[:digit:]]*\)'.
'=\(.*\)/: \${\1=\'\2\'}/p'},
{IN => "_cv_=emptyvar\n"
. "ac_cv_prog/RANLIB=/usr/bin/ranlib\n"
. "ac_cv_prog/CC=/usr/unsupported/\\ \\ /lib/_cv_/cc\n"
. "a/c_cv_prog/CPP=/usr/bin/cpp\n"
. "SHELL=bash\n"
. "GNU=GNU!UNIX\n"},
{OUT => ": \${_cv_='emptyvar'}\n"
. ": \${ac_cv_prog/RANLIB='/usr/bin/ranlib'}\n"
. ": \${ac_cv_prog/CC='/usr/unsupported/\\ \\ /lib/_cv_/cc'}\n"
. ": \${a/c_cv_prog/CPP='/usr/bin/cpp'}\n"}
],
['cv-vars',
# inspired by an autoconf generated configure script.
qw(-n -f),
{IN => q|s/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/: \${\1='\2'}/p|},
{IN => "_cv_=emptyvar\n"
. "ac_cv_prog_RANLIB=/usr/bin/ranlib\n"
. "ac_cv_prog_CC=/usr/unsupported/\ \ /lib/_cv_/cc\n"
. "ac_cv_prog_CPP=/usr/bin/cpp\n"
. "SHELL=bash\n"
. "GNU=GNU!UNIX\n"},
{OUT => ": \${_cv_='emptyvar'}\n"
. ": \${ac_cv_prog_RANLIB='/usr/bin/ranlib'}\n"
. ": \${ac_cv_prog_CC='/usr/unsupported/\ \ /lib/_cv_/cc'}\n"
. ": \${ac_cv_prog_CPP='/usr/bin/cpp'}\n"}
],
['quiet',
# the old 'quiet' test: --quiet instead of -n
qw(--quiet -f),
{IN => q|s/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/: \${\1='\2'}/p|},
{IN => "_cv_=emptyvar\n"
. "ac_cv_prog_RANLIB=/usr/bin/ranlib\n"
. "ac_cv_prog_CC=/usr/unsupported/\ \ /lib/_cv_/cc\n"
. "ac_cv_prog_CPP=/usr/bin/cpp\n"
. "SHELL=bash\n"
. "GNU=GNU!UNIX\n"},
{OUT => ": \${_cv_='emptyvar'}\n"
. ": \${ac_cv_prog_RANLIB='/usr/bin/ranlib'}\n"
. ": \${ac_cv_prog_CC='/usr/unsupported/\ \ /lib/_cv_/cc'}\n"
. ": \${ac_cv_prog_CPP='/usr/bin/cpp'}\n"}
],
['file',
# the old 'file' test: --file instead of -f
qw(-n --file),
{IN => q|s/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/: \${\1='\2'}/p|},
{IN => "_cv_=emptyvar\n"
. "ac_cv_prog_RANLIB=/usr/bin/ranlib\n"
. "ac_cv_prog_CC=/usr/unsupported/\ \ /lib/_cv_/cc\n"
. "ac_cv_prog_CPP=/usr/bin/cpp\n"
. "SHELL=bash\n"
. "GNU=GNU!UNIX\n"},
{OUT => ": \${_cv_='emptyvar'}\n"
. ": \${ac_cv_prog_RANLIB='/usr/bin/ranlib'}\n"
. ": \${ac_cv_prog_CC='/usr/unsupported/\ \ /lib/_cv_/cc'}\n"
. ": \${ac_cv_prog_CPP='/usr/bin/cpp'}\n"}
],
['dollar',
# Test replacement on the last line (address '$')
qw(-e '$s/^/space /'),
{IN => "I can't quite remember where I heard it,\n"
. "but I can't seem to get out of my head\n"
. "the phrase\n"
. "the final frontier\n"},
{OUT => "I can't quite remember where I heard it,\n"
. "but I can't seem to get out of my head\n"
. "the phrase\n"
. "space the final frontier\n"}
],
['enable',
# inspired by an autoconf generated configure script.
qw(-e 's/-*enable-//;s/=.*//'),
{IN => "--enable-targets=sparc-sun-sunos4.1.3,srec\n"
. "--enable-x11-testing=on\n"
. "--enable-wollybears-in-minnesota=yes-id-like-that\n"},
{OUT => "targets\n"
. "x11-testing\n"
. "wollybears-in-minnesota\n"}
],
['fasts',
# test `fast' substitutions
qw(-f),
{IN => q(
h
s/a//
p
g
s/a//g
p
g
s/^a//p
g
s/^a//g
p
g
s/not present//g
p
g
s/^[a-z]//g
p
g
s/a$//
p
g
y/a/b/
h
s/b//
p
g
s/b//g
p
g
s/^b//p
g
s/^b//g
p
g
s/^[a-z]//g
p
g
s/b$//
p
g
)},
{IN => "aaaaaaabbbbbbaaaaaaa\n"},
{OUT => "aaaaaabbbbbbaaaaaaa\n"
. "bbbbbb\n"
. "aaaaaabbbbbbaaaaaaa\n"
. "aaaaaabbbbbbaaaaaaa\n"
. "aaaaaaabbbbbbaaaaaaa\n"
. "aaaaaabbbbbbaaaaaaa\n"
. "aaaaaaabbbbbbaaaaaa\n"
. "bbbbbbbbbbbbbbbbbbb\n"
. "\n"
. "bbbbbbbbbbbbbbbbbbb\n"
. "bbbbbbbbbbbbbbbbbbb\n"
. "bbbbbbbbbbbbbbbbbbb\n"
. "bbbbbbbbbbbbbbbbbbb\n"
. "bbbbbbbbbbbbbbbbbbbb\n"}
],
['factor',
# Compute a few common factors for speed. Clear the subst flag
# These are placed here to make the flow harder to understand :-)
# The quotient of dividing by 11 is a limit to the remaining prime factors
# Pattern space looks like CANDIDATE\nNUMBER. When a candidate is valid,
# the number is divided and the candidate is tried again
# We have a prime factor in CANDIDATE! Print it
# If NUMBER = 1, we don't have any more factors
qw(-n -f),
{IN => q~
s/.*/&;9aaaaaaaaa8aaaaaaaa7aaaaaaa6aaaaaa5aaaaa4aaaa3aaa2aa1a0/
:encode
s/\(a*\)\([0-9]\)\([0-9]*;.*\2\(a*\)\)/\1\1\1\1\1\1\1\1\1\1\4\3/
tencode
s/;.*//
t7a
:2
a\
2
b2a
:3
a\
3
b3a
:5
a\
5
b5a
:7
a\
7
:7a
s/^\(aa*\)\1\{6\}$/\1/
t7
:5a
s/^\(aa*\)\1\{4\}$/\1/
t5
:3a
s/^\(aa*\)\1\1$/\1/
t3
:2a
s/^\(aa*\)\1$/\1/
t2
/^a$/b
s/^\(aa*\)\1\{10\}/\1=&/
:factor
/^\(a\{7,\}\)=\1\1*$/! {
# Decrement CANDIDATE, and search again if it is still >1
s/^a//
/^aa/b factor
# Print the last remaining factor: since it is stored in the NUMBER
# rather than in the CANDIDATE, swap 'em: now NUMBER=1
s/\(.*\)=\(.*\)/\2=\1/
}
h
s/=.*/;;0a1aa2aaa3aaaa4aaaaa5aaaaaa6aaaaaaa7aaaaaaaa8aaaaaaaaa9/
:decode
s/^\(a*\)\1\{9\}\(a\{0,9\}\)\([0-9]*;.*[^a]\2\([0-9]\)\)/\1\4\3/
/^a/tdecode
s/;.*//p
g
:divide
s/^\(a*\)\(=b*\)\1/\1\2b/
tdivide
y/b/a/
/aa$/bfactor
~},
{IN => "2\n"
. "3\n"
. "4\n"
. "5\n"
. "8\n"
. "11\n"
. "16\n"
. "143\n"},
{OUT => "2\n"
. "3\n"
. "2\n"
. "2\n"
. "5\n"
. "2\n"
. "2\n"
. "2\n"
. "11\n"
. "2\n"
. "2\n"
. "2\n"
. "2\n"
. "13\n"
. "11\n"}
],
['flipcase',
qw(-f),
{IN => q|s,\([^A-Za-z]*\)\([A-Za-z]*\),\1\L\u\2,g|},
{IN => "09 - 02 - 2002 00.00 Tg La7 La7 -\n"
. "09 - 02 - 2002 00.00 Brand New Tmc 2 -\n"
. "09 - 02 - 2002 00.10 Tg1 Notte Rai Uno -\n"
. "09 - 02 - 2002 00.15 Tg Parlamento Rai Due -\n"
. "09 - 02 - 2002 00.15 Kung Fu - La Leggenda Continua La7 -\n"
. "09 - 02 - 2002 00.20 Berserk - La CoNFESSIONE Di Gatz"
. " Italia 1 Cartoon\n"
. "09 - 02 - 2002 00.20 Tg3 - Tg3 Meteo Rai TrE -\n"
. "09 - 02 - 2002 00.25 Meteo 2 Rai Due -\n"
. "09 - 02 - 2002 00.30 Appuntamento Al CinEMA RaI Due -\n"
. "09 - 02 - 2002 00.30 Rai Educational - Mediamente Rai Tre -\n"
. "09 - 02 - 2002 00.35 Profiler Rai Due -\n"
. "09 - 02 - 2002 00.35 Stampa OggI - Che Tempo Fa Rai Uno -\n"
. "09 - 02 - 2002 00.45 Rai Educational - Babele: Euro Rai Uno -\n"
. "09 - 02 - 2002 00.45 BollettINO Della NEVE RETE 4 News\n"
. "09 - 02 - 2002 00.50 STUDIO Aperto - La Giornata Italia 1 News\n"
. "09 - 02 - 2002 00.50 BOCCA A Bocca - 2 Tempo Rete 4 Film\n"
. "09 - 02 - 2002 01.00 AppuntAMENTO Al Cinema Rai Tre -\n"
. "09 - 02 - 2002 01.00 Music NoN Stop Tmc 2 -\n"
. "09 - 02 - 2002 01.00 Studio SpORT Italia 1 SporT\n"
. "09 - 02 - 2002 01.00 Tg 5 - Notte Canale 5 News\n"
. "09 - 02 - 2002 01.05 Fuori Orario. CosE (Mai) Viste Rai Tre -\n"
. "09 - 02 - 2002 01.15 RAINOTTE Rai Due -\n"
. "09 - 02 - 2002 01.15 Sottovoce Rai Uno -\n"
. "09 - 02 - 2002 01.15 GiOCHI Olimpici InVERNALI - CERIMONIA"
. " Di Apertura Rai Tre -\n"
. "09 - 02 - 2002 01.17 Italia Interroga Rai Due -\n"},
{OUT => "09 - 02 - 2002 00.00 Tg La7 La7 -\n"
. "09 - 02 - 2002 00.00 Brand New Tmc 2 -\n"
. "09 - 02 - 2002 00.10 Tg1 Notte Rai Uno -\n"
. "09 - 02 - 2002 00.15 Tg Parlamento Rai Due -\n"
. "09 - 02 - 2002 00.15 Kung Fu - La Leggenda Continua La7 -\n"
. "09 - 02 - 2002 00.20 Berserk - La Confessione Di Gatz"
. " Italia 1 Cartoon\n"
. "09 - 02 - 2002 00.20 Tg3 - Tg3 Meteo Rai Tre -\n"
. "09 - 02 - 2002 00.25 Meteo 2 Rai Due -\n"
. "09 - 02 - 2002 00.30 Appuntamento Al Cinema Rai Due -\n"
. "09 - 02 - 2002 00.30 Rai Educational - Mediamente Rai Tre -\n"
. "09 - 02 - 2002 00.35 Profiler Rai Due -\n"
. "09 - 02 - 2002 00.35 Stampa Oggi - Che Tempo Fa Rai Uno -\n"
. "09 - 02 - 2002 00.45 Rai Educational - Babele: Euro Rai Uno -\n"
. "09 - 02 - 2002 00.45 Bollettino Della Neve Rete 4 News\n"
. "09 - 02 - 2002 00.50 Studio Aperto - La Giornata Italia 1 News\n"
. "09 - 02 - 2002 00.50 Bocca A Bocca - 2 Tempo Rete 4 Film\n"
. "09 - 02 - 2002 01.00 Appuntamento Al Cinema Rai Tre -\n"
. "09 - 02 - 2002 01.00 Music Non Stop Tmc 2 -\n"
. "09 - 02 - 2002 01.00 Studio Sport Italia 1 Sport\n"
. "09 - 02 - 2002 01.00 Tg 5 - Notte Canale 5 News\n"
. "09 - 02 - 2002 01.05 Fuori Orario. Cose (Mai) Viste Rai Tre -\n"
. "09 - 02 - 2002 01.15 Rainotte Rai Due -\n"
. "09 - 02 - 2002 01.15 Sottovoce Rai Uno -\n"
. "09 - 02 - 2002 01.15 Giochi Olimpici Invernali - Cerimonia"
. " Di Apertura Rai Tre -\n"
. "09 - 02 - 2002 01.17 Italia Interroga Rai Due -\n"}
],
['inclib',
# inspired by an autoconf generated configure script.
qw(-e 's;lib;include;'),
{IN => " /usr/X11R6/lib\n"
. " /usr/X11R5/lib\n"
. " /usr/X11R4/lib\n"
. "\n"
. " /usr/lib/X11R6\n"
. " /usr/lib/X11R5\n"
. " /usr/lib/X11R4\n"
. "\n"
. " /usr/local/X11R6/lib\n"
. " /usr/local/X11R5/lib\n"
. " /usr/local/X11R4/lib\n"
. "\n"
. " /usr/local/lib/X11R6\n"
. " /usr/local/lib/X11R5\n"
. " /usr/local/lib/X11R4\n"
. "\n"
. " /usr/X11/lib\n"
. " /usr/lib/X11\n"
. " /usr/local/X11/lib\n"
. " /usr/local/lib/X11\n"
. "\n"
. " /usr/X386/lib\n"
. " /usr/x386/lib\n"
. " /usr/XFree86/lib/X11\n"
. "\n"
. " /usr/lib\n"
. " /usr/local/lib\n"
. " /usr/unsupported/lib\n"
. " /usr/athena/lib\n"
. " /usr/local/x11r5/lib\n"
. " /usr/lpp/Xamples/lib\n"
. "\n"
. " /usr/openwin/lib\n"
. " /usr/openwin/share/lib\n"},
{OUT => " /usr/X11R6/include\n"
. " /usr/X11R5/include\n"
. " /usr/X11R4/include\n"
. "\n"
. " /usr/include/X11R6\n"
. " /usr/include/X11R5\n"
. " /usr/include/X11R4\n"
. "\n"
. " /usr/local/X11R6/include\n"
. " /usr/local/X11R5/include\n"
. " /usr/local/X11R4/include\n"
. "\n"
. " /usr/local/include/X11R6\n"
. " /usr/local/include/X11R5\n"
. " /usr/local/include/X11R4\n"
. "\n"
. " /usr/X11/include\n"
. " /usr/include/X11\n"
. " /usr/local/X11/include\n"
. " /usr/local/include/X11\n"
. "\n"
. " /usr/X386/include\n"
. " /usr/x386/include\n"
. " /usr/XFree86/include/X11\n"
. "\n"
. " /usr/include\n"
. " /usr/local/include\n"
. " /usr/unsupported/include\n"
. " /usr/athena/include\n"
. " /usr/local/x11r5/include\n"
. " /usr/lpp/Xamples/include\n"
. "\n"
. " /usr/openwin/include\n"
. " /usr/openwin/share/include\n"}
],
['khadafy',
# The Khadafy test is brought to you by Scott Anderson . . .
qw(-f),
{IN => '/M[ou]\'\{0,1\}am\{1,2\}[ae]r' .
' .*' .
'\([AEae]l[- ]\)\{0,1\}' .
'[GKQ]h\{0,1\}[aeu]\{1,\}\([dtz][dhz]\{0,1\}\)\{1,\}af[iy]/!d'},
{IN => "1) Muammar Qaddafi\n"
. "2) Mo'ammar Gadhafi\n"
. "3) Muammar Kaddafi\n"
. "4) Muammar Qadhafi\n"
. "5) Moammar El Kadhafi\n"
. "6) Muammar Gadafi\n"
. "7) Mu'ammar al-Qadafi\n"
. "8) Moamer El Kazzafi\n"
. "9) Moamar al-Gaddafi\n"
. "10) Mu'ammar Al Qathafi\n"
. "11) Muammar Al Qathafi\n"
. "12) Mo'ammar el-Gadhafi\n"
. "13) Moamar El Kadhafi\n"
. "14) Muammar al-Qadhafi\n"
. "15) Mu'ammar al-Qadhdhafi\n"
. "16) Mu'ammar Qadafi\n"
. "17) Moamar Gaddafi\n"
. "18) Mu'ammar Qadhdhafi\n"
. "19) Muammar Khaddafi\n"
. "20) Muammar al-Khaddafi\n"
. "21) Mu'amar al-Kadafi\n"
. "22) Muammar Ghaddafy\n"
. "23) Muammar Ghadafi\n"
. "24) Muammar Ghaddafi\n"
. "25) Muamar Kaddafi\n"
. "26) Muammar Quathafi\n"
. "27) Muammar Gheddafi\n"
. "28) Muamar Al-Kaddafi\n"
. "29) Moammar Khadafy\n"
. "30) Moammar Qudhafi\n"
. "31) Mu'ammar al-Qaddafi\n"
. "32) Mulazim Awwal Mu'ammar Muhammad Abu Minyar al-Qadhafi\n"},
{OUT => "1) Muammar Qaddafi\n"
. "2) Mo'ammar Gadhafi\n"
. "3) Muammar Kaddafi\n"
. "4) Muammar Qadhafi\n"
. "5) Moammar El Kadhafi\n"
. "6) Muammar Gadafi\n"
. "7) Mu'ammar al-Qadafi\n"
. "8) Moamer El Kazzafi\n"
. "9) Moamar al-Gaddafi\n"
. "10) Mu'ammar Al Qathafi\n"
. "11) Muammar Al Qathafi\n"
. "12) Mo'ammar el-Gadhafi\n"
. "13) Moamar El Kadhafi\n"
. "14) Muammar al-Qadhafi\n"
. "15) Mu'ammar al-Qadhdhafi\n"
. "16) Mu'ammar Qadafi\n"
. "17) Moamar Gaddafi\n"
. "18) Mu'ammar Qadhdhafi\n"
. "19) Muammar Khaddafi\n"
. "20) Muammar al-Khaddafi\n"
. "21) Mu'amar al-Kadafi\n"
. "22) Muammar Ghaddafy\n"
. "23) Muammar Ghadafi\n"
. "24) Muammar Ghaddafi\n"
. "25) Muamar Kaddafi\n"
. "26) Muammar Quathafi\n"
. "27) Muammar Gheddafi\n"
. "28) Muamar Al-Kaddafi\n"
. "29) Moammar Khadafy\n"
. "30) Moammar Qudhafi\n"
. "31) Mu'ammar al-Qaddafi\n"
. "32) Mulazim Awwal Mu'ammar Muhammad Abu Minyar al-Qadhafi\n"}
],
['linecnt',
qw(-e '='),
{IN => "A dialogue on poverty\n"
. "\n"
. " On the night when the rain beats,\n"
. " Driven by the wind,\n"
. " On the night when the snowflakes mingle\n"
. " With a sleety rain,\n"
. " I feel so helplessly cold.\n"
. " I nibble at a lump of salt,\n"
. " Sip the hot, oft-diluted dregs of _sake_;\n"
. " And coughing, snuffling,\n"
. " And stroking my scanty beard,\n"
. " I say in my pride,\n"
. " \"There's none worthy, save I!\"\n"
. " But I shiver still with cold.\n"
. " I pull up my hempen bedclothes,\n"
. " Wear what few sleeveless clothes I have,\n"
. " But cold and bitter is the night!\n"
. " As for those poorer than myself,\n"
. " Their parents must be cold and hungry,\n"
. " Their wives and children beg and cry.\n"
. " Then, how do you struggle through life?\n"
. "\n"
. " Wide as they call the heaven and earth,\n"
. " For me they have shrunk quite small;\n"
. " Bright though they call the sun and moon,\n"
. " They never shine for me.\n"
. " Is it the same with all men,\n"
. " Or for me alone?\n"
. " By rare chance I was born a man\n"
. " And no meaner than my fellows,\n"
. " But, wearing unwadded sleeveless clothes\n"
. " In tatters, like weeds waving in the sea,\n"
. " Hanging from my shoulders,\n"
. " And under the sunken roof,\n"
. " Within the leaning walls,\n"
. " Here I lie on straw\n"
. " Spread on bare earth,\n"
. " With my parents at my pillow,\n"
. " And my wife and children at my feet,\n"
. " All huddled in grief and tears.\n"
. " No fire sends up smoke\n"
. " At the cooking-place,\n"
. " And in the cauldron\n"
. " A spider spins its web.\n"
. " With not a grain to cook,\n"
. " We moan like the night thrush.\n"
. " Then, \"to cut,\" as the saying is,\n"
. " \"The ends of what is already too short,\"\n"
. " The village headman comes,\n"
. " With rod in hand, to our sleeping place,\n"
. " Growling for his dues.\n"
. " Must it be so hopeless --\n"
. " The way of this world?\n"
. "\n"
. " -- Yamanoue Okura\n"},
{OUT => "1\n"
. "A dialogue on poverty\n"
. "2\n"
. "\n"
. "3\n"
. " On the night when the rain beats,\n"
. "4\n"
. " Driven by the wind,\n"
. "5\n"
. " On the night when the snowflakes mingle\n"
. "6\n"
. " With a sleety rain,\n"
. "7\n"
. " I feel so helplessly cold.\n"
. "8\n"
. " I nibble at a lump of salt,\n"
. "9\n"
. " Sip the hot, oft-diluted dregs of _sake_;\n"
. "10\n"
. " And coughing, snuffling,\n"
. "11\n"
. " And stroking my scanty beard,\n"
. "12\n"
. " I say in my pride,\n"
. "13\n"
. " \"There's none worthy, save I!\"\n"
. "14\n"
. " But I shiver still with cold.\n"
. "15\n"
. " I pull up my hempen bedclothes,\n"
. "16\n"
. " Wear what few sleeveless clothes I have,\n"
. "17\n"
. " But cold and bitter is the night!\n"
. "18\n"
. " As for those poorer than myself,\n"
. "19\n"
. " Their parents must be cold and hungry,\n"
. "20\n"
. " Their wives and children beg and cry.\n"
. "21\n"
. " Then, how do you struggle through life?\n"
. "22\n"
. "\n"
. "23\n"
. " Wide as they call the heaven and earth,\n"
. "24\n"
. " For me they have shrunk quite small;\n"
. "25\n"
. " Bright though they call the sun and moon,\n"
. "26\n"
. " They never shine for me.\n"
. "27\n"
. " Is it the same with all men,\n"
. "28\n"
. " Or for me alone?\n"
. "29\n"
. " By rare chance I was born a man\n"
. "30\n"
. " And no meaner than my fellows,\n"
. "31\n"
. " But, wearing unwadded sleeveless clothes\n"
. "32\n"
. " In tatters, like weeds waving in the sea,\n"
. "33\n"
. " Hanging from my shoulders,\n"
. "34\n"
. " And under the sunken roof,\n"
. "35\n"
. " Within the leaning walls,\n"
. "36\n"
. " Here I lie on straw\n"
. "37\n"
. " Spread on bare earth,\n"
. "38\n"
. " With my parents at my pillow,\n"
. "39\n"
. " And my wife and children at my feet,\n"
. "40\n"
. " All huddled in grief and tears.\n"
. "41\n"
. " No fire sends up smoke\n"
. "42\n"
. " At the cooking-place,\n"
. "43\n"
. " And in the cauldron\n"
. "44\n"
. " A spider spins its web.\n"
. "45\n"
. " With not a grain to cook,\n"
. "46\n"
. " We moan like the night thrush.\n"
. "47\n"
. " Then, \"to cut,\" as the saying is,\n"
. "48\n"
. " \"The ends of what is already too short,\"\n"
. "49\n"
. " The village headman comes,\n"
. "50\n"
. " With rod in hand, to our sleeping place,\n"
. "51\n"
. " Growling for his dues.\n"
. "52\n"
. " Must it be so hopeless --\n"
. "53\n"
. " The way of this world?\n"
. "54\n"
. "\n"
. "55\n"
. " -- Yamanoue Okura\n"}
],
['manis',
# straight out of an autoconf-generated configure.
# The input should look just like the input after this is run.
#
# Protect against being on the right side of a sed subst in config.status.
qw(-f),
{IN => q(s/%@/@@/; s/@%/@@/; s/%g$/@g/; /@g$/s/[\\\\&%]/\\\\&/g;
s/@@/%@/; s/@@/@%/; s/@g$/%g/
)},
{IN => "s\%\@CFLAGS\@\%\%g\n"
. "s\%\@CPPFLAGS\@\%-I/\%g\n"
. "s\%\@CXXFLAGS\@\%-x c++\%g\n"
. "s\%\@DEFS\@\%\$DEFS\%g\n"
. "s\%\@LDFLAGS\@\%-L/usr/lib\%g\n"
. "s\%\@LIBS\@\%-lgnu -lbfd\%g\n"
. "s\%\@exec_prefix\@\%\%g\n"
. "s\%\@prefix\@\%\$prefix\%g\n"
. "s\%\@RANLIB\@\%\$RANLIB\%g\n"
. "s\%\@CC\@\%/usr/local/bin/gcc\%g\n"
. "s\%\@CPP\@\%\$CPP\%g\n"
. "s\%\@XCFLAGS\@\%\$XCFLAGS\%g\n"
. "s\%\@XINCLUDES\@\%\$XINCLUDES\%g\n"
. "s\%\@XLIBS\@\%\$XLIBS\%g\n"
. "s\%\@XPROGS\@\%\$XPROGS\%g\n"
. "s\%\@TCLHDIR\@\%\$TCLHDIR\%g\n"
. "s\%\@TCLLIB\@\%\$TCLLIB\%g\n"
. "s\%\@TKHDIR\@\%\$TKHDIR\%g\n"
. "s\%\@TKLIB\@\%\$TKLIB\%g\n"
. "s\%\@PTY_TYPE\@\%\$PTY_TYPE\%g\n"
. "s\%\@EVENT_TYPE\@\%\$EVENT_TYPE\%g\n"
. "s\%\@SETUID\@\%\$SETUID\%g\n"},
{OUT => "s\%\@CFLAGS\@\%\%g\n"
. "s\%\@CPPFLAGS\@\%-I/\%g\n"
. "s\%\@CXXFLAGS\@\%-x c++\%g\n"
. "s\%\@DEFS\@\%\$DEFS\%g\n"
. "s\%\@LDFLAGS\@\%-L/usr/lib\%g\n"
. "s\%\@LIBS\@\%-lgnu -lbfd\%g\n"
. "s\%\@exec_prefix\@\%\%g\n"
. "s\%\@prefix\@\%\$prefix\%g\n"
. "s\%\@RANLIB\@\%\$RANLIB\%g\n"
. "s\%\@CC\@\%/usr/local/bin/gcc\%g\n"
. "s\%\@CPP\@\%\$CPP\%g\n"
. "s\%\@XCFLAGS\@\%\$XCFLAGS\%g\n"
. "s\%\@XINCLUDES\@\%\$XINCLUDES\%g\n"
. "s\%\@XLIBS\@\%\$XLIBS\%g\n"
. "s\%\@XPROGS\@\%\$XPROGS\%g\n"
. "s\%\@TCLHDIR\@\%\$TCLHDIR\%g\n"
. "s\%\@TCLLIB\@\%\$TCLLIB\%g\n"
. "s\%\@TKHDIR\@\%\$TKHDIR\%g\n"
. "s\%\@TKLIB\@\%\$TKLIB\%g\n"
. "s\%\@PTY_TYPE\@\%\$PTY_TYPE\%g\n"
. "s\%\@EVENT_TYPE\@\%\$EVENT_TYPE\%g\n"
. "s\%\@SETUID\@\%\$SETUID\%g\n"}
],
['modulo',
qw(-e '0~2d;='),
{IN => "s\%\@CFLAGS\@\%\%g\n"
. "s\%\@CPPFLAGS\@\%-I/\%g\n"
. "s\%\@CXXFLAGS\@\%-x c++\%g\n"
. "s\%\@DEFS\@\%\$DEFS\%g\n"
. "s\%\@LDFLAGS\@\%-L/usr/lib\%g\n"
. "s\%\@LIBS\@\%-lgnu -lbfd\%g\n"
. "s\%\@exec_prefix\@\%\%g\n"
. "s\%\@prefix\@\%\$prefix\%g\n"
. "s\%\@RANLIB\@\%\$RANLIB\%g\n"
. "s\%\@CC\@\%/usr/local/bin/gcc\%g\n"
. "s\%\@CPP\@\%\$CPP\%g\n"
. "s\%\@XCFLAGS\@\%\$XCFLAGS\%g\n"
. "s\%\@XINCLUDES\@\%\$XINCLUDES\%g\n"
. "s\%\@XLIBS\@\%\$XLIBS\%g\n"
. "s\%\@XPROGS\@\%\$XPROGS\%g\n"
. "s\%\@TCLHDIR\@\%\$TCLHDIR\%g\n"
. "s\%\@TCLLIB\@\%\$TCLLIB\%g\n"
. "s\%\@TKHDIR\@\%\$TKHDIR\%g\n"
. "s\%\@TKLIB\@\%\$TKLIB\%g\n"
. "s\%\@PTY_TYPE\@\%\$PTY_TYPE\%g\n"
. "s\%\@EVENT_TYPE\@\%\$EVENT_TYPE\%g\n"
. "s\%\@SETUID\@\%\$SETUID\%g\n"},
{OUT => "1\n"
. "s\%\@CFLAGS\@\%\%g\n"
. "3\n"
. "s\%\@CXXFLAGS\@\%-x c++\%g\n"
. "5\n"
. "s\%\@LDFLAGS\@\%-L/usr/lib\%g\n"
. "7\n"
. "s\%\@exec_prefix\@\%\%g\n"
. "9\n"
. "s\%\@RANLIB\@\%\$RANLIB\%g\n"
. "11\n"
. "s\%\@CPP\@\%\$CPP\%g\n"
. "13\n"
. "s\%\@XINCLUDES\@\%\$XINCLUDES\%g\n"
. "15\n"
. "s\%\@XPROGS\@\%\$XPROGS\%g\n"
. "17\n"
. "s\%\@TCLLIB\@\%\$TCLLIB\%g\n"
. "19\n"
. "s\%\@TKLIB\@\%\$TKLIB\%g\n"
. "21\n"
. "s\%\@EVENT_TYPE\@\%\$EVENT_TYPE\%g\n"}
],
['middle',
qw(-n -e '3,5p'),
{IN => q( "...by imposing a tiny bit of order in a communication you are
translating, you are carving out a little bit of order in the
universe. You will never succeed. Everything will fail and come
to an end finally. But you have a chance to carve a little bit
of order and maybe even beauty out of the raw materials that
surround you everywhere, and I think there is no greater meaning
in life."
Donald L. Philippi, Oct 1930 - Jan 1993
)},
{OUT =>
q( universe. You will never succeed. Everything will fail and come
to an end finally. But you have a chance to carve a little bit
of order and maybe even beauty out of the raw materials that
)}
],
['newline-anchor',
qw(-f),
{IN => q(N
N
s/^/X/g
s/^/X/mg
s/$/Y/g
s/$/Y/mg
)},
{IN => "a\n"
. "b\n"
. "c\n"},
{OUT => "XXaY\n"
. "XbY\n"
. "XcYY\n"}
],
['noeolw',
qw(-n -f),
# The sed program:
# generates two output files (in addition to STDOUT)
{IN => q(w noeolw.1out
$ {
x
w noeolw.1out
x
}
h
1,3w noeolw.2out
p
p
)},
# The input file (was: noeolw.inp).
# NOTE: in the old test, the input file was given twice.
# here we specify two (identical) input files.
{IN => "This file is unique\n" .
"in that it does\n" .
"end in a newline."},
{IN => "This file is unique\n" .
"in that it does\n" .
"end in a newline."},
# The expected STDOUT (was: noeolw.good)
{OUT => "This file is unique\n" .
"This file is unique\n" .
"in that it does\n" .
"in that it does\n" .
"end in a newline.\n" .
"end in a newline.\n" .
"This file is unique\n" .
"This file is unique\n" .
"in that it does\n" .
"in that it does\n" .
"end in a newline.\n" .
"end in a newline."},
# The expected content of 'noeolw.1out' (was: noeolw.1good)
{CMP => [ "This file is unique\n" .
"in that it does\n" .
"end in a newline.\n" .
"This file is unique\n" .
"in that it does\n" .
"end in a newline.\n" .
"in that it does\n",
{ 'noeolw.1out' => undef }]},
# The expected content of 'noeolw.2out' (was: noeolw.2good)
{CMP => [ "This file is unique\n" .
"in that it does\n" .
"end in a newline.",
{ 'noeolw.2out' => undef }]},
],
['numsub',
qw(-f),
{IN => q(
# the first one matches, the second doesn't
1s/foo/bar/10
2s/foo/bar/20
# The second line should be deleted. ssed 3.55-3.58 do not.
t
d
)},
{IN =>
q(foo foo fo oo f oo foo foo foo foo foo foo foo foo foo foo foo foo foo
foo foo fo oo f oo foo foo foo foo foo foo foo foo foo foo foo foo foo
)},
{OUT => "foo foo fo oo f oo foo foo foo foo "
. "foo foo foo bar foo foo foo foo foo\n"}
],
['numsub2',
qw(-n -e 's/a*/b/2'),
{IN => "\n"},
{OUT => ""}
],
['numsub3',
qw(-n -e 's/^a*/b/2'),
{IN => "\n"},
{OUT => ""}
],
['numsub4',
qw(-n -e 's/^a*/b/2p'),
{IN => "z\n"},
{OUT => ""}
],
['numsub5',
qw(-n -e 's/a*/b/3p'),
{IN => "z\n"},
{OUT => ""}
],
['readin',
qw(-f),
{IN => q(/\.$/r readin.in2
/too\.$/q
)},
{AUX => { 'readin.in2' => "MOO\n" }},
{IN => "``Democracy will not come today, this year,\n"
. " nor ever through compromise and fear.\n"
. " I have as much right as the other fellow has\n"
. " to stand on my two feet and own the land.\n"
. " I tire so of hearing people say\n"
. " let things take their course,\n"
. " tomorrow is another day.\n"
. " I do not need my freedom when I'm dead.\n"
. " I cannot live on tomorrow's bread.\n"
. " Freedom is a strong seed\n"
. " planted in a great need.\n"
. " I live here, too.\n"
. " I want freedom just as you.''\n"
. " ``The Weary Blues'', Langston Hughes\n"},
{OUT => "``Democracy will not come today, this year,\n"
. " nor ever through compromise and fear.\n"
. "MOO\n"
. " I have as much right as the other fellow has\n"
. " to stand on my two feet and own the land.\n"
. "MOO\n"
. " I tire so of hearing people say\n"
. " let things take their course,\n"
. " tomorrow is another day.\n"
. "MOO\n"
. " I do not need my freedom when I'm dead.\n"
. "MOO\n"
. " I cannot live on tomorrow's bread.\n"
. "MOO\n"
. " Freedom is a strong seed\n"
. " planted in a great need.\n"
. "MOO\n"
. " I live here, too.\n"
. "MOO\n"}
],
['sep',
# inspired by an autoconf generated configure script.
qw(-f),
{IN => q(s%/[^/][^/]*$%%
s%[\/][^\/][^\/]*$%%
s,.*[^\/],,
)},
{IN => "miss mary mack mack//mack/ran down/the track track track\n"
. "slashes\aren't%used enough/in/casual-conversation///\n"
. "possibly sentences would be more attractive if they ended"
. "in two slashes//\n"},
{OUT => "\n"
. "///\n"
. "//\n"}
],
['subwrite',
# test s///w option
qw(-e 's/you/YoU/w subwrite.wout'),
{IN => "Not some church, and not the state,\n"
. "Not some dark capricious fate.\n"
. "Who you are, and when you lose,\n"
. "Comes only from the things you choose.\n"},
# The expected STDOUT
{OUT => "Not some church, and not the state,\n"
. "Not some dark capricious fate.\n"
. "Who YoU are, and when you lose,\n"
. "Comes only from the things YoU choose.\n"},
# The expected content of 'writeout.wout'
{CMP => [ "Who YoU are, and when you lose,\n"
. "Comes only from the things YoU choose.\n",
{ 'subwrite.wout' => undef }]}
],
['writeout',
# Test 'w' command
qw(-e '/^Facts ar/w writeout.wout'),
{IN => "Facts are simple and facts are straight\n"
. "Facts are lazy and facts are late\n"
. "Facts all come with points of view\n"
. "Facts don't do what I want them to\n"},
# The expected STDOUT
{OUT => "Facts are simple and facts are straight\n"
. "Facts are lazy and facts are late\n"
. "Facts all come with points of view\n"
. "Facts don't do what I want them to\n"},
# The expected content of 'writeout.wout'
{CMP => [ "Facts are simple and facts are straight\n"
. "Facts are lazy and facts are late\n",
{ 'writeout.wout' => undef }]}
],
['xabcx',
# from the ChangeLog (Fri May 21 1993)
# Regex address with custom character (\xREGEXx)
qw(-e '\xfeetxs/blue/too/'),
{IN => "roses are red\n"
. "violets are blue\n"
. "my feet are cold\n"
. "your feet are blue\n"},
{OUT => "roses are red\n"
. "violets are blue\n"
. "my feet are cold\n"
. "your feet are too\n"}
],
['xbxcx',
# from the ChangeLog (Wed Sep 5 2001)
qw(-e 's/a*/x/g'),
{IN => "\n"
. "b\n"
. "bc\n"
. "bac\n"
. "baac\n"
. "baaac\n"
. "baaaac\n"},
{OUT => "x\n"
. "xbx\n"
. "xbxcx\n"
. "xbxcx\n"
. "xbxcx\n"
. "xbxcx\n"
. "xbxcx\n"}
],
['xbxcx3',
# Test s///N replacements (GNU extension)
qw(-e 's/a*/x/3'),
{IN => "\n"
. "b\n"
. "bc\n"
. "bac\n"
. "baac\n"
. "baaac\n"
. "baaaac\n"},
{OUT => "\n"
. "b\n"
. "bcx\n"
. "bacx\n"
. "baacx\n"
. "baaacx\n"
. "baaaacx\n"}
],
# Four backslashes (2 pairs of "\\") to pass through two interpolations:
# once in Perl, then the shell command line argument.
# sed will see one backslash character in the s/// command.
['bug30794_1', "s/z/\\\\x5cA/", {IN=>'z'}, {OUT => "\\A"}],
['bug30794_2', "s/z/\\\\x5c/", {IN=>'z'}, {OUT => "\\"}],
['bug30794_3', "s/z/\\\\x5c1/", {IN=>'z'}, {OUT => "\\1"}],
['bug40242', q('sn\nnXn'), {IN=>'n'}, {OUT => 'X'}],
);
my $save_temps = $ENV{SAVE_TEMPS};
my $verbose = $ENV{VERBOSE};
my $fail = run_tests ($program_name, $prog, \@Tests, $save_temps, $verbose);
exit $fail;