summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2008-07-11 11:32:30 -0400
committerRay Strode <rstrode@redhat.com>2008-07-11 23:58:59 -0400
commit0e3ec9cec0f6740acd39d6e6983f419e20461282 (patch)
treee0650726677c8368df3184847684244be9515222
parent417c41f6c1ca122e1ce72a920bfc8c3ee841bf3c (diff)
Add new function _dbus_string_split_on_byte
It allows you to turn a string like KEY=VALUE into two strings key and value.
-rw-r--r--dbus/dbus-string-util.c25
-rw-r--r--dbus/dbus-string.c42
-rw-r--r--dbus/dbus-string.h3
3 files changed, 70 insertions, 0 deletions
diff --git a/dbus/dbus-string-util.c b/dbus/dbus-string-util.c
index 492c5289..aed94878 100644
--- a/dbus/dbus-string-util.c
+++ b/dbus/dbus-string-util.c
@@ -846,6 +846,31 @@ _dbus_string_test (void)
_dbus_string_free (&str);
}
+
+ {
+ const char two_strings[] = "one\ttwo";
+
+ if (!_dbus_string_init (&str))
+ _dbus_assert_not_reached ("no memory");
+
+ if (!_dbus_string_init (&other))
+ _dbus_assert_not_reached ("no memory");
+
+ if (!_dbus_string_append (&str, two_strings))
+ _dbus_assert_not_reached ("no memory");
+
+ if (!_dbus_string_split_on_byte (&str, '\t', &other))
+ _dbus_assert_not_reached ("no memory or delimiter not found");
+
+ if (strcmp (_dbus_string_get_data (&str), "one") != 0)
+ _dbus_assert_not_reached ("left side after split on tab is wrong");
+
+ if (strcmp (_dbus_string_get_data (&other), "two") != 0)
+ _dbus_assert_not_reached ("right side after split on tab is wrong");
+
+ _dbus_string_free (&str);
+ _dbus_string_free (&other);
+ }
return TRUE;
}
diff --git a/dbus/dbus-string.c b/dbus/dbus-string.c
index cb108a8d..6b9b2bfe 100644
--- a/dbus/dbus-string.c
+++ b/dbus/dbus-string.c
@@ -1677,6 +1677,48 @@ _dbus_string_replace_len (const DBusString *source,
return TRUE;
}
+/**
+ * Looks for the first occurance of a byte, deletes that byte,
+ * and moves everything after the byte to the beginning of a
+ * separate string. Both strings must be initialized, valid
+ * strings.
+ *
+ * @param source the source string
+ * @param byte the byte to remove and split the string at
+ * @param tail the split off string
+ * @returns #FALSE if not enough memory or if byte could not be found
+ *
+ */
+dbus_bool_t
+_dbus_string_split_on_byte (DBusString *source,
+ unsigned char byte,
+ DBusString *tail)
+{
+ int byte_position;
+ char byte_string[2] = "";
+ int head_length;
+ int tail_length;
+
+ byte_string[0] = (char) byte;
+
+ if (!_dbus_string_find (source, 0, byte_string, &byte_position))
+ return FALSE;
+
+ head_length = byte_position;
+ tail_length = _dbus_string_get_length (source) - head_length - 1;
+
+ if (!_dbus_string_move_len (source, byte_position + 1, tail_length,
+ tail, 0))
+ return FALSE;
+
+ /* remove the trailing delimiter byte from the head now.
+ */
+ if (!_dbus_string_set_length (source, head_length))
+ return FALSE;
+
+ return TRUE;
+}
+
/* Unicode macros and utf8_validate() from GLib Owen Taylor, Havoc
* Pennington, and Tom Tromey are the authors and authorized relicense.
*/
diff --git a/dbus/dbus-string.h b/dbus/dbus-string.h
index d88d67ed..374f0a86 100644
--- a/dbus/dbus-string.h
+++ b/dbus/dbus-string.h
@@ -201,6 +201,9 @@ dbus_bool_t _dbus_string_replace_len (const DBusString *source,
DBusString *dest,
int replace_at,
int replace_len);
+dbus_bool_t _dbus_string_split_on_byte (DBusString *source,
+ unsigned char byte,
+ DBusString *tail);
void _dbus_string_get_unichar (const DBusString *str,
int start,
dbus_unichar_t *ch_return,