summaryrefslogtreecommitdiffstats
path: root/dbus/dbus-string.c
diff options
context:
space:
mode:
authorHavoc Pennington <hp@redhat.com>2004-12-31 21:01:56 +0000
committerHavoc Pennington <hp@redhat.com>2004-12-31 21:01:56 +0000
commitc2a98e1103544277e8d36be53f8a24a32c2c6bea (patch)
tree99aaf7b9d9781718ad4056d7434f10fdda5c6827 /dbus/dbus-string.c
parentb16ad22d870bd05a5cb04a127c3507edd9cd01fa (diff)
2004-12-31 Havoc Pennington <hp@redhat.com>
* dbus/dbus-string.c (_dbus_string_equal_substrings): new function I keep wishing I had
Diffstat (limited to 'dbus/dbus-string.c')
-rw-r--r--dbus/dbus-string.c60
1 files changed, 59 insertions, 1 deletions
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
@@ -2168,6 +2169,63 @@ _dbus_string_equal_len (const DBusString *a,
}
/**
+ * 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.
*
* @param a the string