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;
   }
  
  
  

Reply via email to