cvsuser     03/11/14 00:35:50

  Modified:    include/parrot string_funcs.h
               src      hash.c string.c
  Log:
  move hash compare to new string_equal function
  
  Revision  Changes    Path
  1.29      +3 -1      parrot/include/parrot/string_funcs.h
  
  Index: string_funcs.h
  ===================================================================
  RCS file: /cvs/public/parrot/include/parrot/string_funcs.h,v
  retrieving revision 1.28
  retrieving revision 1.29
  diff -u -w -r1.28 -r1.29
  --- string_funcs.h    5 Aug 2003 13:47:57 -0000       1.28
  +++ string_funcs.h    14 Nov 2003 08:35:47 -0000      1.29
  @@ -1,7 +1,7 @@
   /* string_funcs.h
    *  Copyright: 2001-2003 The Perl Foundation.  All Rights Reserved.
    *  CVS Info
  - *     $Id: string_funcs.h,v 1.28 2003/08/05 13:47:57 leo Exp $
  + *     $Id: string_funcs.h,v 1.29 2003/11/14 08:35:47 leo Exp $
    *  Overview:
    *     This is the api header for the string subsystem
    *  Data Structure and Algorithms:
  @@ -31,6 +31,8 @@
   STRING *string_nprintf(struct Parrot_Interp *,
                          STRING *, INTVAL, const char *, ...);
   INTVAL string_compare(struct Parrot_Interp *, STRING *, STRING *);
  +INTVAL string_equal(struct Parrot_Interp *, STRING *, STRING *);
  +INTVAL hash_string_equal(struct Parrot_Interp *, STRING *, STRING *);
   INTVAL string_bool(const STRING *);
   const char *Parrot_string_cstring(const STRING *);
   
  
  
  
  1.57      +2 -36     parrot/src/hash.c
  
  Index: hash.c
  ===================================================================
  RCS file: /cvs/public/parrot/src/hash.c,v
  retrieving revision 1.56
  retrieving revision 1.57
  diff -u -w -r1.56 -r1.57
  --- hash.c    14 Nov 2003 08:03:17 -0000      1.56
  +++ hash.c    14 Nov 2003 08:35:50 -0000      1.57
  @@ -1,7 +1,7 @@
   /* hash.c
    *  Copyright: 2001-2003 The Perl Foundation.  All Rights Reserved.
    *  CVS Info
  - *     $Id: hash.c,v 1.56 2003/11/14 08:03:17 leo Exp $
  + *     $Id: hash.c,v 1.57 2003/11/14 08:35:50 leo Exp $
    *  Overview:
    *  Data Structure and Algorithms:
    *     A hashtable contains an array of bucket indexes. Buckets
  @@ -139,41 +139,7 @@
   #if USE_STRING_COMPARE
       return string_compare(interp, (STRING *)a, (STRING *) b);
   #else
  -    STRING *s1 = (STRING*) a;
  -    STRING *s2 = (STRING*) b;
  -    const char *s1start, *s1end;
  -    const char *s2start;
  -    size_t len;
  -    /*
  -     * both strings aren't null
  -     */
  -    if (s1->strlen != s2->strlen)
  -        return 1;       /* we don't care which is bigger */
  -    if (!s1->strlen)
  -        return 0;
  -    /*
  -     * both strings have equal amount of chars
  -     */
  -    s1start = s1->strstart;
  -    s2start = s2->strstart;
  -    len = (size_t) s1->bufused;
  -
  -    /* speed up ascii, slow down general case
  -     * TODO we could save some cylces, if we use 2 compare functions
  -     */
  -    if (s1->encoding->index == enum_encoding_singlebyte &&
  -        s2->encoding->index == enum_encoding_singlebyte) {
  -        return memcmp(s1start, s2start, s1->bufused);
  -    }
  -
  -    s1end = s1start + len;
  -    while (s1start < s1end) {
  -        if (s1->encoding->decode(s1start) != s2->encoding->decode(s2start))
  -            return 1;
  -        s1start = s1->encoding->skip_forward(s1start, 1);
  -        s2start = s2->encoding->skip_forward(s2start, 1);
  -    }
  -    return 0;
  +    return hash_string_equal(interp, (STRING *)a, (STRING *) b);
   #endif
   }
   
  
  
  
  1.157     +81 -2     parrot/src/string.c
  
  Index: string.c
  ===================================================================
  RCS file: /cvs/public/parrot/src/string.c,v
  retrieving revision 1.156
  retrieving revision 1.157
  diff -u -w -r1.156 -r1.157
  --- string.c  9 Nov 2003 10:15:25 -0000       1.156
  +++ string.c  14 Nov 2003 08:35:50 -0000      1.157
  @@ -1,7 +1,7 @@
   /* string.c
    *  Copyright: 2001-2003 The Perl Foundation.  All Rights Reserved.
    *  CVS Info
  - *     $Id: string.c,v 1.156 2003/11/09 10:15:25 leo Exp $
  + *     $Id: string.c,v 1.157 2003/11/14 08:35:50 leo Exp $
    *  Overview:
    *     This is the api definitions for the string subsystem
    *  Data Structure and Algorithms:
  @@ -930,7 +930,8 @@
   
   /*=for api string string_compare
    * compare two strings, performing type and encoding conversions if
  - * necessary
  + * necessary.
  + * return -1, 0, 1 if s1 < , == , > s2
    */
   INTVAL
   string_compare(struct Parrot_Interp *interpreter, STRING *s1,
  @@ -1003,6 +1004,84 @@
           cmp = -1;
   
       return cmp;
  +}
  +
  +/*=for api hash_string_equal
  + * compare 2 strings, which are non-null and properly transcoded
  + * return 0 if equal
  + */
  +INTVAL
  +hash_string_equal(struct Parrot_Interp *interpreter, STRING *s1, STRING *s2)
  +{
  +    const char *s1start, *s1end;
  +    const char *s2start;
  +    size_t len;
  +    /*
  +     * both strings aren't null
  +     */
  +    if (s1->strlen != s2->strlen)
  +        return 1;       /* we don't care which is bigger */
  +    if (!s1->strlen)
  +        return 0;
  +    /*
  +     * both strings have equal amount of chars
  +     */
  +    s1start = s1->strstart;
  +    s2start = s2->strstart;
  +    len = (size_t) s1->bufused;
  +
  +    /* speed up ascii, slow down general case
  +     */
  +    if (s1->encoding->index == enum_encoding_singlebyte &&
  +        s2->encoding->index == enum_encoding_singlebyte) {
  +        return memcmp(s1start, s2start, s1->bufused);
  +    }
  +
  +    s1end = s1start + len;
  +    while (s1start < s1end) {
  +        if (s1->encoding->decode(s1start) != s2->encoding->decode(s2start))
  +            return 1;
  +        s1start = s1->encoding->skip_forward(s1start, 1);
  +        s2start = s2->encoding->skip_forward(s2start, 1);
  +    }
  +    return 0;
  +}
  +
  +/*=for api string string_equal
  + * compare two strings, performing type and encoding conversions if
  + * necessary, like string_compare, but just return 0 = equal else unequal
  + */
  +INTVAL
  +string_equal(struct Parrot_Interp *interpreter, STRING *s1, STRING *s2)
  +{
  +    const char *s1start;
  +    const char *s1end;
  +    const char *s2start;
  +    const char *s2end;
  +
  +    if (!s1 && !s2) {
  +        return 0;
  +    }
  +    if (!s2) {
  +        return s1->strlen != 0;
  +    }
  +    if (!s1) {
  +        return s2->strlen != 0;
  +    }
  +
  +#  if ! DISABLE_GC_DEBUG
  +    /* It's easy to forget that string comparison can trigger GC */
  +    if (GC_DEBUG(interpreter))
  +        Parrot_do_dod_run(interpreter, 1);
  +#  endif
  +
  +    if (s1->type != s2->type || s1->encoding != s2->encoding) {
  +        s1 = string_transcode(interpreter, s1, NULL, string_unicode_type,
  +                NULL);
  +        s2 = string_transcode(interpreter, s2, NULL, string_unicode_type,
  +                NULL);
  +    }
  +    return hash_string_equal(interpreter, s1, s2);
   }
   
   /*=for api string string_bitwise_and
  
  
  

Reply via email to