From c2a98e1103544277e8d36be53f8a24a32c2c6bea Mon Sep 17 00:00:00 2001 From: Havoc Pennington Date: Fri, 31 Dec 2004 21:01:56 +0000 Subject: 2004-12-31 Havoc Pennington * dbus/dbus-string.c (_dbus_string_equal_substrings): new function I keep wishing I had --- dbus/dbus-string.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) (limited to 'dbus/dbus-string.c') diff --git a/dbus/dbus-string.c b/dbus/dbus-string.c index b4e626b5..65797b12 100644 --- a/dbus/dbus-string.c +++ b/dbus/dbus-string.c @@ -2125,6 +2125,7 @@ _dbus_string_equal (const DBusString *a, /** * Tests two DBusString for equality up to the given length. + * The strings may be shorter than the given length. * * @todo write a unit test * @@ -2132,7 +2133,7 @@ _dbus_string_equal (const DBusString *a, * * @param a first string * @param b second string - * @param len the lengh + * @param len the maximum length to look at * @returns #TRUE if equal for the given number of bytes */ dbus_bool_t @@ -2167,6 +2168,63 @@ _dbus_string_equal_len (const DBusString *a, return TRUE; } +/** + * Tests two sub-parts of two DBusString for equality. The specified + * range of the first string must exist; the specified start position + * of the second string must exist. + * + * @todo write a unit test + * + * @todo memcmp is probably faster + * + * @param a first string + * @param a_start where to start substring in first string + * @param a_len length of substring in first string + * @param b second string + * @param b_start where to start substring in second string + * @returns #TRUE if the two substrings are equal + */ +dbus_bool_t +_dbus_string_equal_substring (const DBusString *a, + int a_start, + int a_len, + const DBusString *b, + int b_start) +{ + const unsigned char *ap; + const unsigned char *bp; + const unsigned char *a_end; + const DBusRealString *real_a = (const DBusRealString*) a; + const DBusRealString *real_b = (const DBusRealString*) b; + DBUS_GENERIC_STRING_PREAMBLE (real_a); + DBUS_GENERIC_STRING_PREAMBLE (real_b); + _dbus_assert (a_start >= 0); + _dbus_assert (a_len >= 0); + _dbus_assert (a_start <= real_a->len); + _dbus_assert (a_len <= real_a->len - a_start); + _dbus_assert (b_start >= 0); + _dbus_assert (b_start <= real_b->len); + + if (a_len > real_b->len - b_start) + return FALSE; + + ap = real_a->str + a_start; + bp = real_b->str + b_start; + a_end = ap + a_len; + while (ap != a_end) + { + if (*ap != *bp) + return FALSE; + + ++ap; + ++bp; + } + + _dbus_assert (bp <= (real_b->str + real_b->len)); + + return TRUE; +} + /** * Checks whether a string is equal to a C string. * -- cgit