Enclosed patch adds a number of tests for the 5-argument form of
substr.
Simon
--- t/op/string.t.old Sat Apr 6 19:56:32 2002
+++ t/op/string.t Sat Apr 6 20:38:59 2002
@@ -1,6 +1,6 @@
#! perl -w
-use Parrot::Test tests => 64;
+use Parrot::Test tests => 76;
output_is( <<'CODE', <<OUTPUT, "set_s_s|sc" );
set S4, "JAPH\n"
@@ -166,6 +166,199 @@
length 21
OUTPUT
+output_is( <<'CODE', <<'OUTPUT', "5 arg substr, replacement = length" );
+ set S0, "abcdefghijk"
+ set S1, "xyz"
+ substr S2, S0, 4, 3, S1
+ print S0
+ print "\n"
+ print S1
+ print "\n"
+ print S2
+ print "\n"
+ end
+CODE
+abcdxyzhijk
+xyz
+efg
+OUTPUT
+
+output_is( <<'CODE', <<'OUTPUT', "5 arg substr, replacement > length" );
+ set S0, "abcdefghijk"
+ set S1, "xyz0123"
+ substr S2, S0, 4, 3, S1
+ print S0
+ print "\n"
+ print S1
+ print "\n"
+ print S2
+ print "\n"
+ end
+CODE
+abcdxyz0123hijk
+xyz0123
+efg
+OUTPUT
+
+output_is( <<'CODE', <<'OUTPUT', "5 arg substr, replacement < length" );
+ set S0, "abcdefghijk"
+ set S1, "x"
+ substr S2, S0, 4, 3, S1
+ print S0
+ print "\n"
+ print S1
+ print "\n"
+ print S2
+ print "\n"
+ end
+CODE
+abcdxhijk
+x
+efg
+OUTPUT
+
+output_is( <<'CODE', <<'OUTPUT', "5 arg substr, offset at end of string" );
+ set S0, "abcdefghijk"
+ set S1, "xyz"
+ substr S2, S0, 11, 3, S1
+ print S0
+ print "\n"
+ print S1
+ print "\n"
+ print S2
+ print "\n"
+ end
+CODE
+abcdefghijkxyz
+xyz
+
+OUTPUT
+
+output_is( <<'CODE', 'Can only replace inside string or index after end of string',
+"5 arg substr, offset past end of string" );
+ set S0, "abcdefghijk"
+ set S1, "xyz"
+ substr S2, S0, 12, 3, S1
+ print S0
+ print "\n"
+ print S1
+ print "\n"
+ print S2
+ print "\n"
+ end
+CODE
+
+output_is( <<'CODE', <<'OUTPUT', "5 arg substr, -ve offset, repl=length" );
+ set S0, "abcdefghijk"
+ set S1, "xyz"
+ substr S2, S0, -3, 3, S1
+ print S0
+ print "\n"
+ print S1
+ print "\n"
+ print S2
+ print "\n"
+ end
+CODE
+abcdefghxyz
+xyz
+ijk
+OUTPUT
+
+output_is( <<'CODE', <<'OUTPUT', "5 arg substr, -ve offset, repl>length" );
+ set S0, "abcdefghijk"
+ set S1, "xyz"
+ substr S2, S0, -6, 2, S1
+ print S0
+ print "\n"
+ print S1
+ print "\n"
+ print S2
+ print "\n"
+ end
+CODE
+abcdexyzhijk
+xyz
+fg
+OUTPUT
+
+output_is( <<'CODE', <<'OUTPUT', "5 arg substr, -ve offset, repl<length" );
+ set S0, "abcdefghijk"
+ set S1, "xyz"
+ substr S2, S0, -6, 4, S1
+ print S0
+ print "\n"
+ print S1
+ print "\n"
+ print S2
+ print "\n"
+ end
+CODE
+abcdexyzjk
+xyz
+fghi
+OUTPUT
+
+output_is( <<'CODE', 'Can only replace inside string or index after end of string',
+"5 arg substr, -ve offset out of string" );
+ set S0, "abcdefghijk"
+ set S1, "xyz"
+ substr S2, S0, -12, 4, S1
+ print S0
+ print "\n"
+ print S1
+ print "\n"
+ print S2
+ print "\n"
+ end
+CODE
+
+output_is( <<'CODE', <<'OUTPUT', "5 arg substr, length > strlen " );
+ set S0, "abcdefghijk"
+ set S1, "xyz"
+ substr S2, S0, 3, 11, S1
+ print S0
+ print "\n"
+ print S1
+ print "\n"
+ print S2
+ print "\n"
+ end
+CODE
+abcxyz
+xyz
+defghijk
+OUTPUT
+
+output_is( <<'CODE', <<'OUTPUT', "5 arg substr, length > strlen, -ve offset" );
+ set S0, "abcdefghijk"
+ set S1, "xyz"
+ substr S2, S0, -3, 11, S1
+ print S0
+ print "\n"
+ print S1
+ print "\n"
+ print S2
+ print "\n"
+ end
+CODE
+abcdefghxyz
+xyz
+ijk
+OUTPUT
+
+output_is( <<'CODE', <<'OUTPUT', "4-arg, replacement-only substr" );
+ set S0, "abcdefghijk"
+ set S1, "xyz"
+ substr S0, 3, 3, S1
+ print S0
+ print "\n"
+ print S1
+ print "\n"
+ end
+CODE
+abcxyzghijk
+xyz
+OUTPUT
+
output_is( <<'CODE', '<><', "concat_s_s|sc, null onto null" );
print "<>"
concat S0, S0