diff options
| -rw-r--r-- | ChangeLog | 7 | ||||
| -rw-r--r-- | dbus/dbus-string-util.c | 38 | ||||
| -rw-r--r-- | dbus/dbus-string.c | 67 | ||||
| -rw-r--r-- | dbus/dbus-string.h | 5 | 
4 files changed, 117 insertions, 0 deletions
@@ -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,  | 
