summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--dbus/dbus-string-util.c38
-rw-r--r--dbus/dbus-string.c67
-rw-r--r--dbus/dbus-string.h5
4 files changed, 117 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 89e7781b..30be985f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2006-12-12 Ralf Habacker <ralf.habacker@freenet.de>
+
+ * dbus/dbus-string.[ch] (_dbus_string_find_eol): new function.
+ * dbus/dbus-string-util.c (_dbus_string_test): added testcases for
+ _dbus_string_find_eol().
+ Approved by: Havoc Pennington.
+
2006-12-12 Tim Dijkstra <tim@famdijkstra.org>
* configure.in: Added switch to disable user_database caching.
diff --git a/dbus/dbus-string-util.c b/dbus/dbus-string-util.c
index 260ef875..16a79340 100644
--- a/dbus/dbus-string-util.c
+++ b/dbus/dbus-string-util.c
@@ -2,6 +2,7 @@
/* dbus-string-util.c Would be in dbus-string.c, but not used in libdbus
*
* Copyright (C) 2002, 2003, 2004, 2005 Red Hat, Inc.
+ * Copyright (C) 2006 Ralf Habacker <ralf.habacker@freenet.de>
*
* Licensed under the Academic Free License version 2.1
*
@@ -702,8 +703,45 @@ _dbus_string_test (void)
test_roundtrips (test_hex_roundtrip);
_dbus_string_free (&str);
+
+ {
+ int found,found_len;
+ _dbus_string_init_const (&str, "012\r\n567\n90");
+
+ if (!_dbus_string_find_eol(&str, 0, &found, &found_len) || found != 3 || found_len != 2)
+ _dbus_assert_not_reached ("Did not find '\\r\\n'");
+ if (found != 3 || found_len != 2)
+ _dbus_assert_not_reached ("invalid return values");
+
+ if (!_dbus_string_find_eol(&str, 5, &found, &found_len))
+ _dbus_assert_not_reached ("Did not find '\\n'");
+ if (found != 8 || found_len != 1)
+ _dbus_assert_not_reached ("invalid return values");
+
+ if (_dbus_string_find_eol(&str, 9, &found, &found_len))
+ _dbus_assert_not_reached ("Found not expected '\\n'");
+ else if (found != 11 || found_len != 0)
+ _dbus_assert_not_reached ("invalid return values '\\n'");
+
+ _dbus_string_free (&str);
+ }
return TRUE;
}
#endif /* DBUS_BUILD_TESTS */
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dbus/dbus-string.c b/dbus/dbus-string.c
index a218ed5d..5ae8ac3f 100644
--- a/dbus/dbus-string.c
+++ b/dbus/dbus-string.c
@@ -2,6 +2,7 @@
/* dbus-string.c String utility class (internal to D-Bus implementation)
*
* Copyright (C) 2002, 2003, 2004, 2005 Red Hat, Inc.
+ * Copyright (C) 2006 Ralf Habacker <ralf.habacker@freenet.de>
*
* Licensed under the Academic Free License version 2.1
*
@@ -1790,6 +1791,72 @@ _dbus_string_find (const DBusString *str,
}
/**
+ * Finds end of line ("\r\n" or "\n") in the string,
+ * returning #TRUE and filling in the byte index
+ * where the eol string was found, if it was found.
+ * Returns #FALSE if eol wasn't found.
+ *
+ * @param str the string
+ * @param start where to start looking
+ * @param found return location for where eol was found or string length otherwise
+ * @param found_len return length of found eol string or zero otherwise
+ * @returns #TRUE if found
+ */
+dbus_bool_t
+_dbus_string_find_eol (const DBusString *str,
+ int start,
+ int *found,
+ int *found_len)
+{
+ int i;
+
+ DBUS_CONST_STRING_PREAMBLE (str);
+ _dbus_assert (start <= real->len);
+ _dbus_assert (start >= 0);
+
+ i = start;
+ while (i < real->len)
+ {
+ if (real->str[i] == '\r')
+ {
+ if ((i+1) < real->len && real->str[i+1] == '\n') /* "\r\n" */
+ {
+ if (found)
+ *found = i;
+ if (found_len)
+ *found_len = 2;
+ return TRUE;
+ }
+ else /* only "\r" */
+ {
+ if (found)
+ *found = i;
+ if (found_len)
+ *found_len = 1;
+ return TRUE;
+ }
+ }
+ else if (real->str[i] == '\n') /* only "\n" */
+ {
+ if (found)
+ *found = i;
+ if (found_len)
+ *found_len = 1;
+ return TRUE;
+ }
+ ++i;
+ }
+
+ if (found)
+ *found = real->len;
+
+ if (found_len)
+ *found_len = 0;
+
+ return FALSE;
+}
+
+/**
* Finds the given substring in the string,
* up to a certain position,
* returning #TRUE and filling in the byte index
diff --git a/dbus/dbus-string.h b/dbus/dbus-string.h
index 47fd1b41..f81e566a 100644
--- a/dbus/dbus-string.h
+++ b/dbus/dbus-string.h
@@ -2,6 +2,7 @@
/* dbus-string.h String utility class (internal to D-Bus implementation)
*
* Copyright (C) 2002, 2003 Red Hat, Inc.
+ * Copyright (C) 2006 Ralf Habacker <ralf.habacker@freenet.de>
*
* Licensed under the Academic Free License version 2.1
*
@@ -215,6 +216,10 @@ dbus_bool_t _dbus_string_find (const DBusString *str,
int start,
const char *substr,
int *found);
+dbus_bool_t _dbus_string_find_eol (const DBusString *str,
+ int start,
+ int *found,
+ int *found_len);
dbus_bool_t _dbus_string_find_to (const DBusString *str,
int start,
int end,