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