diff options
author | Dirk Herrmann <dirk@dirk-herrmanns-seiten.de> | 2000-10-26 18:18:28 +0000 |
---|---|---|
committer | Dirk Herrmann <dirk@dirk-herrmanns-seiten.de> | 2000-10-26 18:18:28 +0000 |
commit | e9bfab50e4ec7787db05605727a06f98fe30f5b6 (patch) | |
tree | 2281aa0aaf6967a7eeed0063dbff031454fc0d3e /libguile/strorder.c | |
parent | c6c2ea9fa8ca18f59d37b0d6d1d52d36e11626ea (diff) | |
download | guile-e9bfab50e4ec7787db05605727a06f98fe30f5b6.tar.gz |
* String comparison functions don't accept symbols as arguments any more.
* Added macro SCM_STRING_COERCE_0TERMINATION_X.
Diffstat (limited to 'libguile/strorder.c')
-rw-r--r-- | libguile/strorder.c | 135 |
1 files changed, 78 insertions, 57 deletions
diff --git a/libguile/strorder.c b/libguile/strorder.c index 8d2453fea..c370aca77 100644 --- a/libguile/strorder.c +++ b/libguile/strorder.c @@ -63,25 +63,33 @@ SCM_DEFINE1 (scm_string_equal_p, "string=?", scm_tc7_rpsubr, "@samp{string=?} treats upper and lower case as distinct characters.") #define FUNC_NAME s_scm_string_equal_p { - register scm_sizet i; - register unsigned char *c1, *c2; - SCM_VALIDATE_ROSTRING (1,s1); - SCM_VALIDATE_ROSTRING (2,s2); + scm_sizet length; - i = SCM_ROLENGTH (s2); - if (SCM_ROLENGTH (s1) != i) + SCM_VALIDATE_STRING (1, s1); + SCM_VALIDATE_STRING (2, s2); + + length = SCM_STRING_LENGTH (s2); + if (SCM_STRING_LENGTH (s1) == length) { - return SCM_BOOL_F; + unsigned char *c1 = SCM_ROUCHARS (s1) + length - 1; + unsigned char *c2 = SCM_ROUCHARS (s2) + length - 1; + scm_sizet i; + + /* comparing from back to front typically finds mismatches faster */ + for (i = 0; i != length; ++i, --c1, --c2) + if (*c1 != *c2) + return SCM_BOOL_F; + + return SCM_BOOL_T; } - c1 = SCM_ROUCHARS (s1); - c2 = SCM_ROUCHARS (s2); - while (0 != i--) - if (*c1++ != *c2++) + else + { return SCM_BOOL_F; - return SCM_BOOL_T; + } } #undef FUNC_NAME + SCM_DEFINE1 (scm_string_ci_equal_p, "string-ci=?", scm_tc7_rpsubr, (SCM s1, SCM s2), "Case-insensitive string equality predicate; returns @t{#t} if\n" @@ -89,58 +97,62 @@ SCM_DEFINE1 (scm_string_ci_equal_p, "string-ci=?", scm_tc7_rpsubr, "match (ignoring case) at each position; otherwise returns @t{#f}. (r5rs)") #define FUNC_NAME s_scm_string_ci_equal_p { - register scm_sizet i; - register unsigned char *c1, *c2; - SCM_VALIDATE_ROSTRING (1,s1); - SCM_VALIDATE_ROSTRING (2,s2); + scm_sizet length; - i = SCM_ROLENGTH (s2); - if (SCM_ROLENGTH (s1) != i) + SCM_VALIDATE_STRING (1, s1); + SCM_VALIDATE_STRING (2, s2); + + length = SCM_STRING_LENGTH (s2); + if (SCM_STRING_LENGTH (s1) == length) { - return SCM_BOOL_F; + unsigned char *c1 = SCM_ROUCHARS (s1) + length - 1; + unsigned char *c2 = SCM_ROUCHARS (s2) + length - 1; + scm_sizet i; + + /* comparing from back to front typically finds mismatches faster */ + for (i = 0; i != length; ++i, --c1, --c2) + if (scm_upcase (*c1) != scm_upcase (*c2)) + return SCM_BOOL_F; + + return SCM_BOOL_T; } - c1 = SCM_ROUCHARS (s1); - c2 = SCM_ROUCHARS (s2); - while (0 != i--) - if (scm_upcase(*c1++) != scm_upcase(*c2++)) + else + { return SCM_BOOL_F; - return SCM_BOOL_T; + } } #undef FUNC_NAME + SCM_DEFINE1 (scm_string_less_p, "string<?", scm_tc7_rpsubr, (SCM s1, SCM s2), "Lexicographic ordering predicate; returns @t{#t} if @var{s1}\n" "is lexicographically less than @var{s2}. (r5rs)") #define FUNC_NAME s_scm_string_less_p { - register scm_sizet i, len, s2len; - register unsigned char *c1, *c2; - register int c; - - SCM_VALIDATE_ROSTRING (1,s1); - SCM_VALIDATE_ROSTRING (2,s2); - len = SCM_ROLENGTH (s1); - s2len = SCM_ROLENGTH (s2); - if (len>s2len) len = s2len; + scm_sizet i, length1, length2, lengthm; + unsigned char *c1, *c2; + + SCM_VALIDATE_STRING (1, s1); + SCM_VALIDATE_STRING (2, s2); + + length1 = SCM_STRING_LENGTH (s1); + length2 = SCM_STRING_LENGTH (s2); + lengthm = min (length1, length2); c1 = SCM_ROUCHARS (s1); c2 = SCM_ROUCHARS (s2); - for (i = 0;i<len;i++) { - c = (*c1++ - *c2++); - if (c>0) - return SCM_BOOL_F; - if (c<0) - return SCM_BOOL_T; - } - { - SCM answer; - answer = SCM_BOOL(s2len != len); - return answer; + for (i = 0; i != lengthm; ++i, ++c1, ++c2) { + int c = *c1 - *c2; + if (c < 0) return SCM_BOOL_T; + if (c > 0) return SCM_BOOL_F; } + + return SCM_BOOL (length1 < length2); } #undef FUNC_NAME + SCM_DEFINE1 (scm_string_leq_p, "string<=?", scm_tc7_rpsubr, (SCM s1, SCM s2), "Lexicographic ordering predicate; returns @t{#t} if @var{s1}\n" @@ -151,6 +163,7 @@ SCM_DEFINE1 (scm_string_leq_p, "string<=?", scm_tc7_rpsubr, } #undef FUNC_NAME + SCM_DEFINE1 (scm_string_gr_p, "string>?", scm_tc7_rpsubr, (SCM s1, SCM s2), "Lexicographic ordering predicate; returns @t{#t} if @var{s1}\n" @@ -161,6 +174,7 @@ SCM_DEFINE1 (scm_string_gr_p, "string>?", scm_tc7_rpsubr, } #undef FUNC_NAME + SCM_DEFINE1 (scm_string_geq_p, "string>=?", scm_tc7_rpsubr, (SCM s1, SCM s2), "Lexicographic ordering predicate; returns @t{#t} if @var{s1}\n" @@ -171,6 +185,7 @@ SCM_DEFINE1 (scm_string_geq_p, "string>=?", scm_tc7_rpsubr, } #undef FUNC_NAME + SCM_DEFINE1 (scm_string_ci_less_p, "string-ci<?", scm_tc7_rpsubr, (SCM s1, SCM s2), "Case insensitive lexicographic ordering predicate; \n" @@ -178,25 +193,29 @@ SCM_DEFINE1 (scm_string_ci_less_p, "string-ci<?", scm_tc7_rpsubr, "@var{s2} regardless of case. (r5rs)") #define FUNC_NAME s_scm_string_ci_less_p { - register scm_sizet i, len, s2len; - register unsigned char *c1, *c2; - register int c; - SCM_VALIDATE_ROSTRING (1,s1); - SCM_VALIDATE_ROSTRING (2,s2); - len = SCM_ROLENGTH (s1); - s2len = SCM_ROLENGTH (s2); - if (len>s2len) len = s2len; + scm_sizet i, length1, length2, lengthm; + unsigned char *c1, *c2; + + SCM_VALIDATE_STRING (1, s1); + SCM_VALIDATE_STRING (2, s2); + + length1 = SCM_STRING_LENGTH (s1); + length2 = SCM_STRING_LENGTH (s2); + lengthm = min (length1, length2); c1 = SCM_ROUCHARS (s1); c2 = SCM_ROUCHARS (s2); - for (i = 0;i<len;i++) { - c = (scm_upcase(*c1++) - scm_upcase(*c2++)); - if (c>0) return SCM_BOOL_F; - if (c<0) return SCM_BOOL_T; + + for (i = 0; i != lengthm; ++i, ++c1, ++c2) { + int c = scm_upcase (*c1) - scm_upcase (*c2); + if (c < 0) return SCM_BOOL_T; + if (c > 0) return SCM_BOOL_F; } - return SCM_BOOL(s2len != len); + + return SCM_BOOL (length1 < length2); } #undef FUNC_NAME + SCM_DEFINE1 (scm_string_ci_leq_p, "string-ci<=?", scm_tc7_rpsubr, (SCM s1, SCM s2), "Case insensitive lexicographic ordering predicate; \n" @@ -208,6 +227,7 @@ SCM_DEFINE1 (scm_string_ci_leq_p, "string-ci<=?", scm_tc7_rpsubr, } #undef FUNC_NAME + SCM_DEFINE1 (scm_string_ci_gr_p, "string-ci>?", scm_tc7_rpsubr, (SCM s1, SCM s2), "Case insensitive lexicographic ordering predicate; \n" @@ -219,6 +239,7 @@ SCM_DEFINE1 (scm_string_ci_gr_p, "string-ci>?", scm_tc7_rpsubr, } #undef FUNC_NAME + SCM_DEFINE1 (scm_string_ci_geq_p, "string-ci>=?", scm_tc7_rpsubr, (SCM s1, SCM s2), "Case insensitive lexicographic ordering predicate; \n" |