cvsuser 05/01/11 05:09:44
Modified: src string.c
t/op string.t
Log:
[perl #33747]
... take a non-zero length substring from out of a
zero-length string,
3) If the supplied offset is before the start or after the end of the
string, then throw an exception.
This does not work as intended
for a zero-length string, because src->strlen is an _unsigned_ int, and
so if src->strlen = 0, then src->strlen - 1 is very very large.
Courtesy of Simon Glover <[EMAIL PROTECTED]>
Revision Changes Path
1.230 +2 -2 parrot/src/string.c
Index: string.c
===================================================================
RCS file: /cvs/public/parrot/src/string.c,v
retrieving revision 1.229
retrieving revision 1.230
diff -u -r1.229 -r1.230
--- string.c 3 Nov 2004 21:44:39 -0000 1.229
+++ string.c 11 Jan 2005 13:09:41 -0000 1.230
@@ -1,6 +1,6 @@
/*
Copyright: 2001-2003 The Perl Foundation. All Rights Reserved.
-$Id: string.c,v 1.229 2004/11/03 21:44:39 dan Exp $
+$Id: string.c,v 1.230 2005/01/11 13:09:41 leo Exp $
=head1 NAME
@@ -1421,7 +1421,7 @@
true_offset = (UINTVAL)(src->strlen + offset);
}
- if (true_offset > src->strlen - 1) { /* 0 based... */
+ if (src->strlen == 0 || true_offset > src->strlen - 1) { /* 0 based...
*/
internal_exception(SUBSTR_OUT_OF_STRING,
"Cannot take substr outside string");
}
1.80 +123 -2 parrot/t/op/string.t
Index: string.t
===================================================================
RCS file: /cvs/public/parrot/t/op/string.t,v
retrieving revision 1.79
retrieving revision 1.80
diff -u -r1.79 -r1.80
--- string.t 2 Jan 2005 11:34:55 -0000 1.79
+++ string.t 11 Jan 2005 13:09:43 -0000 1.80
@@ -1,6 +1,6 @@
#! perl -w
# Copyright: 2001-2003 The Perl Foundation. All Rights Reserved.
-# $Id: string.t,v 1.79 2005/01/02 11:34:55 leo Exp $
+# $Id: string.t,v 1.80 2005/01/11 13:09:43 leo Exp $
=head1 NAME
@@ -16,7 +16,7 @@
=cut
-use Parrot::Test tests => 135;
+use Parrot::Test tests => 144;
use Test::More;
output_is( <<'CODE', <<OUTPUT, "set_s_s|sc" );
@@ -512,6 +512,127 @@
end
CODE
+output_like( <<'CODE', <<'OUTPUT', "substr, +ve offset, zero-length string"
);
+ set S0, ""
+ substr S1, S0, 10, 3
+ print S1
+ end
+CODE
+/Cannot take substr outside string/
+OUTPUT
+
+output_is( <<'CODE', <<'OUTPUT', "substr, offset 0, zero-length string" );
+ set S0, ""
+ substr S1, S0, 0, 1
+ print S1
+ print "_\n"
+ end
+CODE
+_
+OUTPUT
+
+output_like( <<'CODE', <<'OUTPUT', "substr, offset -1, zero-length string" );
+ set S0, ""
+ substr S1, S0, -1, 1
+ print S1
+ end
+CODE
+/Cannot take substr outside string/
+OUTPUT
+
+output_like( <<'CODE', <<'OUTPUT', "substr, -ve offset, zero-length string"
);
+ set S0, ""
+ substr S1, S0, -10, 5
+ print S1
+ end
+CODE
+/Cannot take substr outside string/
+OUTPUT
+
+output_is( <<'CODE', <<'OUTPUT', "zero-length substr, zero-length string" );
+ set S0, ""
+ substr S1, S0, 10, 0
+ print S1
+ print "_\n"
+ end
+CODE
+_
+OUTPUT
+
+output_is( <<'CODE', <<'OUTPUT', "zero-length substr, zero-length string" );
+ set S0, ""
+ substr S1, S0, -10, 0
+ print S1
+ print "_\n"
+ end
+CODE
+_
+OUTPUT
+
+output_is( <<'CODE', <<'OUTPUT', "3-arg substr, zero-length string" );
+ set S0, ""
+ substr S1, S0, 2
+ print S1
+ print "_\n"
+ end
+CODE
+_
+OUTPUT
+
+output_is( <<'CODE', <<'OUTPUT', "5 arg substr, zero-length string" );
+ set S0, ""
+ set S1, "xyz"
+ substr S2, S0, 0, 3, S1
+ print S0
+ print "\n"
+ print S1
+ print "\n"
+ print S2
+ print "\n"
+
+ set S3, ""
+ set S4, "abcde"
+ substr S5, S3, 0, 0, S4
+ print S3
+ print "\n"
+ print S4
+ print "\n"
+ print S5
+ print "\n"
+ end
+CODE
+xyz
+xyz
+
+abcde
+abcde
+
+OUTPUT
+
+output_is( <<'CODE', <<'OUTPUT', "4 arg substr replace, zero-length string"
);
+ set S0, ""
+ set S1, "xyz"
+ substr S0, 0, 3, S1
+ print S0
+ print "\n"
+ print S1
+ print "\n"
+
+ set S2, ""
+ set S3, "abcde"
+ substr S2, 0, 0, S3
+ print S2
+ print "\n"
+ print S3
+ print "\n"
+ end
+CODE
+xyz
+xyz
+abcde
+abcde
+OUTPUT
+
output_is( <<'CODE', '<><', "concat_s_s|sc, null onto null" );
print "<>"
concat S0, S0