From cb39e60e1639fb982a46aa1625e3adec2bf0df46 Mon Sep 17 00:00:00 2001 From: Ralf Habacker Date: Tue, 12 Dec 2006 23:46:27 +0000 Subject: [PATCH] * 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. --- ChangeLog | 7 ++++++ dbus/dbus-string-util.c | 38 ++++++++++++++++++++++++++++ dbus/dbus-string.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++ dbus/dbus-string.h | 5 ++++ 4 files changed, 117 insertions(+) diff --git a/ChangeLog b/ChangeLog index 89e7781..30be985 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2006-12-12 Ralf Habacker + + * 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 * configure.in: Added switch to disable user_database caching. diff --git a/dbus/dbus-string-util.c b/dbus/dbus-string-util.c index 260ef87..16a7934 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 * * 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 a218ed5..5ae8ac3 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 * * 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 47fd1b4..f81e566 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 * * 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, -- 2.7.4