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
  
  
  

Reply via email to