cvsuser 03/08/19 07:42:46
Modified: classes perlstring.pmc
t/pmc iter.t
Log:
perlstring iterator interface - get_integer
Revision Changes Path
1.46 +17 -2 parrot/classes/perlstring.pmc
Index: perlstring.pmc
===================================================================
RCS file: /cvs/public/parrot/classes/perlstring.pmc,v
retrieving revision 1.45
retrieving revision 1.46
diff -u -w -r1.45 -r1.46
--- perlstring.pmc 19 Aug 2003 14:05:44 -0000 1.45
+++ perlstring.pmc 19 Aug 2003 14:42:45 -0000 1.46
@@ -1,7 +1,7 @@
/* perlstring.pmc
* Copyright: 2001-2003 The Perl Foundation. All Rights Reserved.
* CVS Info
- * $Id: perlstring.pmc,v 1.45 2003/08/19 14:05:44 leo Exp $
+ * $Id: perlstring.pmc,v 1.46 2003/08/19 14:42:45 leo Exp $
* Overview:
* These are the vtable functions for the PerlString base class
* Data Structure and Algorithms:
@@ -405,8 +405,10 @@
}
break;
case 3: /* reset key, iterate from end */
- ret->cache.int_val = n;
+ ret->cache.int_val = n-1;
PMC_data(key) = (char *)s->strstart + s->bufused;
+ (const char *)PMC_data(key) =
+ s->encoding->skip_backward( PMC_data(key), 1);
break;
}
return ret;
@@ -428,5 +430,18 @@
res->strstart, 1) - (const char *)res->strstart;
return res;
+ }
+ INTVAL get_integer_keyed(PMC* key) {
+ STRING *s = SELF->cache.string_val;
+ if ((char*)PMC_data(key) >= (char *)s->strstart &&
+ (char *)PMC_data(key) <= (char *)s->strstart + s->bufused) {
+ if (s->encoding->index == enum_encoding_singlebyte)
+ return *(unsigned char*) PMC_data(key);
+ else
+ return s->encoding->decode(PMC_data(key));
+ }
+ else
+ return s->encoding->decode(s->encoding->skip_forward(s->strstart,
+ key->cache.int_val));
}
}
1.7 +42 -1 parrot/t/pmc/iter.t
Index: iter.t
===================================================================
RCS file: /cvs/public/parrot/t/pmc/iter.t,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -w -r1.6 -r1.7
--- iter.t 19 Aug 2003 14:05:49 -0000 1.6
+++ iter.t 19 Aug 2003 14:42:46 -0000 1.7
@@ -1,6 +1,6 @@
#! perl -w
-use Parrot::Test tests => 8;
+use Parrot::Test tests => 10;
use Test::More qw(skip);
output_is(<<'CODE', <<'OUTPUT', "new iter");
new P2, .PerlArray
@@ -269,6 +269,47 @@
torrap
parrot
OUTPUT
+
+output_is(<<'CODE', <<OUTPUT, "string iteration forward get ord");
+ new P2, .PerlString
+ set P2, "ABC"
+ new P1, .Iterator, P2
+ set P1, 0
+iter_loop:
+ unless P1, iter_end # while (entries) ...
+ shift I1, P1
+ print I1
+ branch iter_loop
+iter_end:
+ print "\n"
+ print P2
+ print "\n"
+ end
+CODE
+656667
+ABC
+OUTPUT
+
+output_is(<<'CODE', <<OUTPUT, "string iteration backward get ord");
+ new P2, .PerlString
+ set P2, "ABC"
+ new P1, .Iterator, P2
+ set P1, 3
+iter_loop:
+ unless P1, iter_end # while (entries) ...
+ pop I1, P1
+ print I1
+ branch iter_loop
+iter_end:
+ print "\n"
+ print P2
+ print "\n"
+ end
+CODE
+676665
+ABC
+OUTPUT
+
SKIP: {
skip("N/Y: get_keyed_int gets rest of array", 1);
output_is(<<'CODE', <<'OUTPUT', "shift + index access");