cvsuser 04/01/08 01:12:30
Modified: src string.c
Log:
Change string_compare to use iterators
Revision Changes Path
1.165 +28 -32 parrot/src/string.c
Index: string.c
===================================================================
RCS file: /cvs/public/parrot/src/string.c,v
retrieving revision 1.164
retrieving revision 1.165
diff -u -w -r1.164 -r1.165
--- string.c 3 Jan 2004 09:44:13 -0000 1.164
+++ string.c 8 Jan 2004 09:12:30 -0000 1.165
@@ -1,7 +1,7 @@
/* string.c
* Copyright: 2001-2003 The Perl Foundation. All Rights Reserved.
* CVS Info
- * $Id: string.c,v 1.164 2004/01/03 09:44:13 petergibbs Exp $
+ * $Id: string.c,v 1.165 2004/01/08 09:12:30 petergibbs Exp $
* Overview:
* This is the api definitions for the string subsystem
* Data Structure and Algorithms:
@@ -938,10 +938,6 @@
string_compare(struct Parrot_Interp *interpreter, STRING *s1,
STRING *s2)
{
- const char *s1start;
- const char *s1end;
- const char *s2start;
- const char *s2end;
INTVAL cmp;
if (!s1 && !s2) {
@@ -967,35 +963,34 @@
NULL);
}
- s1start = s1->strstart;
- s1end = s1start + s1->bufused;
- s2start = s2->strstart;
- s2end = s2start + s2->bufused;
-
if (s1->encoding->index == enum_encoding_singlebyte) {
size_t minlen = s1->bufused > s2->bufused ? s2->bufused : s1->bufused;
-
- cmp = memcmp(s1start, s2start, minlen);
- s1start += minlen;
- s2start += minlen;
+ cmp = memcmp(s1->strstart, s2->strstart, minlen);
+ if (cmp == 0) {
+ if (minlen < s1->bufused)
+ cmp = 1;
+ else if (minlen < s2->bufused)
+ cmp = -1;
+ }
+ else if (cmp > 0) {
+ cmp = 1;
+ }
+ else
+ cmp = -1;
}
else {
+ struct string_iterator_t i1;
+ struct string_iterator_t i2;
+ string_iterator_init(&i1, s1);
+ string_iterator_init(&i2, s2);
cmp = 0;
- while (cmp == 0 && s1start < s1end && s2start < s2end) {
- INTVAL c1 = s1->encoding->decode(s1start);
- INTVAL c2 = s2->encoding->decode(s2start);
-
- cmp = c1 - c2;
-
- s1start = s1->encoding->skip_forward(s1start, 1);
- s2start = s2->encoding->skip_forward(s2start, 1);
- }
+ while (!cmp && i1.charpos < s1->strlen && i2.charpos < s2->strlen) {
+ cmp = i1.decode_and_advance(&i1) - i2.decode_and_advance(&i2);
}
-
if (cmp == 0) {
- if (s1start < s1end)
+ if (i1.charpos < s1->strlen)
cmp = 1;
- else if (s2start < s2end)
+ else if (i2.charpos < s2->strlen)
cmp = -1;
}
else if (cmp > 0) {
@@ -1003,6 +998,7 @@
}
else
cmp = -1;
+ }
return cmp;
}