1d012387afef0ba02185ebe27bc6bb15551912e92Havoc Pennington/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
27bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington/* dbus-string-util.c Would be in dbus-string.c, but not used in libdbus
37bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington *
47bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * Copyright (C) 2002, 2003, 2004, 2005 Red Hat, Inc.
5cb39e60e1639fb982a46aa1625e3adec2bf0df46Ralf Habacker * Copyright (C) 2006 Ralf Habacker <ralf.habacker@freenet.de>
67bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington *
77bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * Licensed under the Academic Free License version 2.1
87bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington *
97bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * This program is free software; you can redistribute it and/or modify
107bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * it under the terms of the GNU General Public License as published by
117bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * the Free Software Foundation; either version 2 of the License, or
127bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * (at your option) any later version.
137bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington *
147bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * This program is distributed in the hope that it will be useful,
157bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * but WITHOUT ANY WARRANTY; without even the implied warranty of
167bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
177bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * GNU General Public License for more details.
187bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington *
197bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * You should have received a copy of the GNU General Public License
207bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * along with this program; if not, write to the Free Software
215baf2f856a9c6625993234855b07680da1c8916fTobias Mueller * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
227bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington *
237bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington */
247bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
25dbecdeabb20e0ce11121819c63373f0afba57c58Marcus Brinkmann#include <config.h>
267bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington#include "dbus-internals.h"
277bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington#include "dbus-string.h"
287bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington#define DBUS_CAN_USE_DBUS_STRING_PRIVATE 1
297bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington#include "dbus-string-private.h"
307bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
317bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington/**
327bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * @addtogroup DBusString
337bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * @{
347bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington */
357bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
367bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington/**
377bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * Returns whether a string ends with the given suffix
387bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington *
397bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * @todo memcmp might make this faster.
407bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington *
417bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * @param a the string
427bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * @param c_str the C-style string
437bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * @returns #TRUE if the string ends with the suffix
447bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington */
457bf62e31a3c820852271768fafc04ba95c31a19fHavoc Penningtondbus_bool_t
467bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington_dbus_string_ends_with_c_str (const DBusString *a,
477bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington                              const char       *c_str)
487bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington{
497bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  const unsigned char *ap;
507bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  const unsigned char *bp;
517bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  const unsigned char *a_end;
527bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  unsigned long c_str_len;
537bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  const DBusRealString *real_a = (const DBusRealString*) a;
547bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  DBUS_GENERIC_STRING_PREAMBLE (real_a);
557bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (c_str != NULL);
567bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
577bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  c_str_len = strlen (c_str);
587bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (((unsigned long)real_a->len) < c_str_len)
597bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    return FALSE;
607bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
617bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  ap = real_a->str + (real_a->len - c_str_len);
627bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  bp = (const unsigned char*) c_str;
637bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  a_end = real_a->str + real_a->len;
647bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  while (ap != a_end)
657bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    {
667bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington      if (*ap != *bp)
677bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington        return FALSE;
687bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
697bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington      ++ap;
707bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington      ++bp;
717bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    }
727bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
737bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (*ap == '\0');
747bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (*bp == '\0');
757bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
767bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  return TRUE;
777bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington}
787bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
797bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington/**
807bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * Find the given byte scanning backward from the given start.
817bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * Sets *found to -1 if the byte is not found.
827bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington *
837bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * @param str the string
847bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * @param start the place to start scanning (will not find the byte at this point)
857bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * @param byte the byte to find
867bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * @param found return location for where it was found
877bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * @returns #TRUE if found
887bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington */
897bf62e31a3c820852271768fafc04ba95c31a19fHavoc Penningtondbus_bool_t
907bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington_dbus_string_find_byte_backward (const DBusString  *str,
917bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington                                 int                start,
927bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington                                 unsigned char      byte,
937bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington                                 int               *found)
947bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington{
957bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  int i;
967bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  DBUS_CONST_STRING_PREAMBLE (str);
977bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (start <= real->len);
987bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (start >= 0);
997bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (found != NULL);
1007bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
1017bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  i = start - 1;
1027bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  while (i >= 0)
1037bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    {
1047bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington      if (real->str[i] == byte)
1057bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington        break;
1067bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
1077bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington      --i;
1087bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    }
1097bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
1107bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (found)
1117bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    *found = i;
1127bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
1137bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  return i >= 0;
1147bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington}
1157bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
1167bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington/** @} */
1177bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
1187bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington#ifdef DBUS_BUILD_TESTS
1197bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington#include "dbus-test.h"
1207bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington#include <stdio.h>
1217bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
1227bf62e31a3c820852271768fafc04ba95c31a19fHavoc Penningtonstatic void
1237bf62e31a3c820852271768fafc04ba95c31a19fHavoc Penningtontest_max_len (DBusString *str,
1247bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington              int         max_len)
1257bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington{
1267bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (max_len > 0)
1277bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    {
1287bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington      if (!_dbus_string_set_length (str, max_len - 1))
1297bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington        _dbus_assert_not_reached ("setting len to one less than max should have worked");
1307bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    }
1317bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
1327bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_set_length (str, max_len))
1337bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("setting len to max len should have worked");
1347bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
1357bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (_dbus_string_set_length (str, max_len + 1))
1367bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("setting len to one more than max len should not have worked");
1377bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
1387bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_set_length (str, 0))
1397bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("setting len to zero should have worked");
1407bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington}
1417bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
1427bf62e31a3c820852271768fafc04ba95c31a19fHavoc Penningtonstatic void
1437bf62e31a3c820852271768fafc04ba95c31a19fHavoc Penningtontest_hex_roundtrip (const unsigned char *data,
1447bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington                    int                  len)
1457bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington{
1467bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  DBusString orig;
1477bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  DBusString encoded;
1487bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  DBusString decoded;
1497bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  int end;
1507bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
1517bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (len < 0)
1527bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    len = strlen (data);
1537bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
1547bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_init (&orig))
1557bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("could not init string");
1567bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
1577bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_init (&encoded))
1587bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("could not init string");
1597bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
1607bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_init (&decoded))
1617bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("could not init string");
1627bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
1637bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_append_len (&orig, data, len))
1647bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("couldn't append orig data");
1657bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
1667bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_hex_encode (&orig, 0, &encoded, 0))
1677bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("could not encode");
1687bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
1697bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_hex_decode (&encoded, 0, &end, &decoded, 0))
1707bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("could not decode");
1717bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
1727bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_get_length (&encoded) == end);
1737bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
1747bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_equal (&orig, &decoded))
1757bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    {
1767bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington      const char *s;
1777bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
1787bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington      printf ("Original string %d bytes encoded %d bytes decoded %d bytes\n",
1797bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington              _dbus_string_get_length (&orig),
1807bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington              _dbus_string_get_length (&encoded),
1817bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington              _dbus_string_get_length (&decoded));
1827bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington      printf ("Original: %s\n", data);
1837bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington      s = _dbus_string_get_const_data (&decoded);
1847bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington      printf ("Decoded: %s\n", s);
1857bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington      _dbus_assert_not_reached ("original string not the same as string decoded from hex");
1867bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    }
1877bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
1887bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_string_free (&orig);
1897bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_string_free (&encoded);
1907bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_string_free (&decoded);
1917bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington}
1927bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
1937bf62e31a3c820852271768fafc04ba95c31a19fHavoc Penningtontypedef void (* TestRoundtripFunc) (const unsigned char *data,
1947bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington                                    int                  len);
1957bf62e31a3c820852271768fafc04ba95c31a19fHavoc Penningtonstatic void
1967bf62e31a3c820852271768fafc04ba95c31a19fHavoc Penningtontest_roundtrips (TestRoundtripFunc func)
1977bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington{
1987bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  (* func) ("Hello this is a string\n", -1);
1997bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  (* func) ("Hello this is a string\n1", -1);
2007bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  (* func) ("Hello this is a string\n12", -1);
2017bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  (* func) ("Hello this is a string\n123", -1);
2027bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  (* func) ("Hello this is a string\n1234", -1);
2037bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  (* func) ("Hello this is a string\n12345", -1);
2047bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  (* func) ("", 0);
2057bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  (* func) ("1", 1);
2067bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  (* func) ("12", 2);
2077bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  (* func) ("123", 3);
2087bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  (* func) ("1234", 4);
2097bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  (* func) ("12345", 5);
2107bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  (* func) ("", 1);
2117bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  (* func) ("1", 2);
2127bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  (* func) ("12", 3);
2137bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  (* func) ("123", 4);
2147bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  (* func) ("1234", 5);
2157bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  (* func) ("12345", 6);
2167bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  {
2177bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    unsigned char buf[512];
2187bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    int i;
2197bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
2207bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    i = 0;
2217bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    while (i < _DBUS_N_ELEMENTS (buf))
2227bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington      {
2237bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington        buf[i] = i;
2247bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington        ++i;
2257bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington      }
2267bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    i = 0;
2277bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    while (i < _DBUS_N_ELEMENTS (buf))
2287bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington      {
2297bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington        (* func) (buf, i);
2307bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington        ++i;
2317bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington      }
2327bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  }
2337bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington}
2347bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
2357bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington#ifdef DBUS_BUILD_TESTS
2367bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington/* The max length thing is sort of a historical artifact
2377bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * from a feature that turned out to be dumb; perhaps
2387bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * we should purge it entirely. The problem with
2397bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * the feature is that it looks like memory allocation
2407bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * failure, but is not a transient or resolvable failure.
2417bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington */
2427bf62e31a3c820852271768fafc04ba95c31a19fHavoc Penningtonstatic void
2437bf62e31a3c820852271768fafc04ba95c31a19fHavoc Penningtonset_max_length (DBusString *str,
2447bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington                int         max_length)
2457bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington{
2467bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  DBusRealString *real;
2477bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
2487bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  real = (DBusRealString*) str;
2497bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
2507bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  real->max_length = max_length;
2517bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington}
2527bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington#endif /* DBUS_BUILD_TESTS */
2537bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
2547bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington/**
2557bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * @ingroup DBusStringInternals
2567bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * Unit test for DBusString.
2577bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington *
2587bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * @todo Need to write tests for _dbus_string_copy() and
2597bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * _dbus_string_move() moving to/from each of start/middle/end of a
2607bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * string. Also need tests for _dbus_string_move_len ()
2617bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington *
2627bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington * @returns #TRUE on success.
2637bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington */
2647bf62e31a3c820852271768fafc04ba95c31a19fHavoc Penningtondbus_bool_t
2657bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington_dbus_string_test (void)
2667bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington{
2677bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  DBusString str;
2687bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  DBusString other;
2697bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  int i, end;
2707bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  long v;
2717bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  double d;
2727bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  int lens[] = { 0, 1, 2, 3, 4, 5, 10, 16, 17, 18, 25, 31, 32, 33, 34, 35, 63, 64, 65, 66, 67, 68, 69, 70, 71, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136 };
2737bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  char *s;
2747bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  dbus_unichar_t ch;
2757bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
2767bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  i = 0;
2777bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  while (i < _DBUS_N_ELEMENTS (lens))
2787bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    {
2797bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington      if (!_dbus_string_init (&str))
2807bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington        _dbus_assert_not_reached ("failed to init string");
2817bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
2827bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington      set_max_length (&str, lens[i]);
2837bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
2847bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington      test_max_len (&str, lens[i]);
2857bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington      _dbus_string_free (&str);
2867bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
2877bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington      ++i;
2887bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    }
2897bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
2907bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  /* Test shortening and setting length */
2917bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  i = 0;
2927bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  while (i < _DBUS_N_ELEMENTS (lens))
2937bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    {
2947bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington      int j;
2957bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
2967bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington      if (!_dbus_string_init (&str))
2977bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington        _dbus_assert_not_reached ("failed to init string");
2987bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
2997bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington      set_max_length (&str, lens[i]);
3007bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
3017bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington      if (!_dbus_string_set_length (&str, lens[i]))
3027bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington        _dbus_assert_not_reached ("failed to set string length");
3037bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
3047bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington      j = lens[i];
3057bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington      while (j > 0)
3067bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington        {
3077bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington          _dbus_assert (_dbus_string_get_length (&str) == j);
3087bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington          if (j > 0)
3097bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington            {
3107bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington              _dbus_string_shorten (&str, 1);
3117bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington              _dbus_assert (_dbus_string_get_length (&str) == (j - 1));
3127bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington            }
3137bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington          --j;
3147bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington        }
3157bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
3167bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington      _dbus_string_free (&str);
3177bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
3187bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington      ++i;
3197bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    }
3207bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
3218f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington  /* Test equality */
3228f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington  if (!_dbus_string_init (&str))
3238f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington    _dbus_assert_not_reached ("oom");
3248f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington
3258f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington  if (!_dbus_string_append (&str, "Hello World"))
3268f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington    _dbus_assert_not_reached ("oom");
3278f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington
3288f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington  _dbus_string_init_const (&other, "H");
3298f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington  _dbus_assert (_dbus_string_equal_substring (&str, 0, 1, &other, 0));
3308f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington  _dbus_assert (_dbus_string_equal_substring (&str, 1, 0, &other, 1));
3318f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington  _dbus_string_init_const (&other, "Hello");
3328f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington  _dbus_assert (_dbus_string_equal_substring (&str, 0, 5, &other, 0));
3338f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington  _dbus_assert (_dbus_string_equal_substring (&str, 1, 4, &other, 1));
3348f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington  _dbus_assert (_dbus_string_equal_substring (&str, 2, 3, &other, 2));
3358f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington  _dbus_assert (_dbus_string_equal_substring (&str, 3, 2, &other, 3));
3368f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington  _dbus_assert (_dbus_string_equal_substring (&str, 4, 1, &other, 4));
3378f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington  _dbus_assert (_dbus_string_equal_substring (&str, 5, 0, &other, 5));
3388f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington
3398f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington  _dbus_assert (_dbus_string_equal_substring (&other, 0, 5, &str, 0));
3408f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington  _dbus_assert (_dbus_string_equal_substring (&other, 1, 4, &str, 1));
3418f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington  _dbus_assert (_dbus_string_equal_substring (&other, 2, 3, &str, 2));
3428f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington  _dbus_assert (_dbus_string_equal_substring (&other, 3, 2, &str, 3));
3438f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington  _dbus_assert (_dbus_string_equal_substring (&other, 4, 1, &str, 4));
3448f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington  _dbus_assert (_dbus_string_equal_substring (&other, 5, 0, &str, 5));
3458f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington
3468f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington
3478f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington  _dbus_string_init_const (&other, "World");
3488f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington  _dbus_assert (_dbus_string_equal_substring (&str, 6,  5, &other, 0));
3498f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington  _dbus_assert (_dbus_string_equal_substring (&str, 7,  4, &other, 1));
3508f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington  _dbus_assert (_dbus_string_equal_substring (&str, 8,  3, &other, 2));
3518f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington  _dbus_assert (_dbus_string_equal_substring (&str, 9,  2, &other, 3));
3528f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington  _dbus_assert (_dbus_string_equal_substring (&str, 10, 1, &other, 4));
3538f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington  _dbus_assert (_dbus_string_equal_substring (&str, 11, 0, &other, 5));
3548f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington
3558f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington  _dbus_assert (_dbus_string_equal_substring (&other, 0, 5, &str, 6));
3568f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington  _dbus_assert (_dbus_string_equal_substring (&other, 1, 4, &str, 7));
3578f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington  _dbus_assert (_dbus_string_equal_substring (&other, 2, 3, &str, 8));
3588f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington  _dbus_assert (_dbus_string_equal_substring (&other, 3, 2, &str, 9));
3598f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington  _dbus_assert (_dbus_string_equal_substring (&other, 4, 1, &str, 10));
3608f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington  _dbus_assert (_dbus_string_equal_substring (&other, 5, 0, &str, 11));
3618f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington
3628f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington  _dbus_string_free (&str);
3638f04e1e01f51fa9bef564dbaf29be59694407d21Havoc Pennington
3647bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  /* Test appending data */
3657bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_init (&str))
3667bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("failed to init string");
3677bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
3687bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  i = 0;
3697bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  while (i < 10)
3707bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    {
3717bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington      if (!_dbus_string_append (&str, "a"))
3727bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington        _dbus_assert_not_reached ("failed to append string to string\n");
3737bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
3747bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington      _dbus_assert (_dbus_string_get_length (&str) == i * 2 + 1);
3757bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
3767bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington      if (!_dbus_string_append_byte (&str, 'b'))
3777bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington        _dbus_assert_not_reached ("failed to append byte to string\n");
3787bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
3797bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington      _dbus_assert (_dbus_string_get_length (&str) == i * 2 + 2);
3807bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
3817bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington      ++i;
3827bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    }
3837bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
3847bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_string_free (&str);
3857bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
3867bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  /* Check steal_data */
3877bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
3887bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_init (&str))
3897bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("failed to init string");
3907bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
3917bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_append (&str, "Hello World"))
3927bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("could not append to string");
3937bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
3947bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  i = _dbus_string_get_length (&str);
3957bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
3967bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_steal_data (&str, &s))
3977bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("failed to steal data");
3987bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
3997bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_get_length (&str) == 0);
4007bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (((int)strlen (s)) == i);
4017bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
4027bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  dbus_free (s);
4037bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
4047bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  /* Check move */
4057bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
4067bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_append (&str, "Hello World"))
4077bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("could not append to string");
4087bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
4097bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  i = _dbus_string_get_length (&str);
4107bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
4117bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_init (&other))
4127bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("could not init string");
4137bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
4147bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_move (&str, 0, &other, 0))
4157bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("could not move");
4167bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
4177bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_get_length (&str) == 0);
4187bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_get_length (&other) == i);
4197bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
4207bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_append (&str, "Hello World"))
4217bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("could not append to string");
4227bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
4237bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_move (&str, 0, &other, _dbus_string_get_length (&other)))
4247bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("could not move");
4257bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
4267bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_get_length (&str) == 0);
4277bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_get_length (&other) == i * 2);
4287bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
4297bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    if (!_dbus_string_append (&str, "Hello World"))
4307bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("could not append to string");
4317bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
4327bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_move (&str, 0, &other, _dbus_string_get_length (&other) / 2))
4337bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("could not move");
4347bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
4357bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_get_length (&str) == 0);
4367bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_get_length (&other) == i * 3);
4377bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
4387bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_string_free (&other);
4397bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
4407bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  /* Check copy */
4417bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
4427bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_append (&str, "Hello World"))
4437bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("could not append to string");
4447bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
4457bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  i = _dbus_string_get_length (&str);
4467bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
4477bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_init (&other))
4487bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("could not init string");
4497bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
4507bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_copy (&str, 0, &other, 0))
4517bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("could not copy");
4527bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
4537bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_get_length (&str) == i);
4547bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_get_length (&other) == i);
4557bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
4567bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_copy (&str, 0, &other, _dbus_string_get_length (&other)))
4577bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("could not copy");
4587bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
4597bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_get_length (&str) == i);
4607bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_get_length (&other) == i * 2);
4617bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_equal_c_str (&other,
4627bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington                                          "Hello WorldHello World"));
4637bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
4647bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_copy (&str, 0, &other, _dbus_string_get_length (&other) / 2))
4657bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("could not copy");
4667bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
4677bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_get_length (&str) == i);
4687bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_get_length (&other) == i * 3);
4697bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_equal_c_str (&other,
4707bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington                                          "Hello WorldHello WorldHello World"));
4717bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
4727bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_string_free (&str);
4737bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_string_free (&other);
4747bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
4757bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  /* Check replace */
4767bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
4777bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_init (&str))
4787bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("failed to init string");
4797bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
4807bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_append (&str, "Hello World"))
4817bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("could not append to string");
4827bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
4837bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  i = _dbus_string_get_length (&str);
4847bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
4857bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_init (&other))
4867bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("could not init string");
4877bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
4887bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_replace_len (&str, 0, _dbus_string_get_length (&str),
4897bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington                                 &other, 0, _dbus_string_get_length (&other)))
4907bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("could not replace");
4917bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
4927bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_get_length (&str) == i);
4937bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_get_length (&other) == i);
4947bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_equal_c_str (&other, "Hello World"));
4957bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
4967bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_replace_len (&str, 0, _dbus_string_get_length (&str),
4977bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington                                 &other, 5, 1))
4987bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("could not replace center space");
4997bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
5007bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_get_length (&str) == i);
5017bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_get_length (&other) == i * 2 - 1);
5027bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_equal_c_str (&other,
5037bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington                                          "HelloHello WorldWorld"));
5047bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
5057bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
5067bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_replace_len (&str, 1, 1,
5077bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington                                 &other,
5087bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington                                 _dbus_string_get_length (&other) - 1,
5097bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington                                 1))
5107bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("could not replace end character");
5117bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
5127bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_get_length (&str) == i);
5137bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_get_length (&other) == i * 2 - 1);
5147bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_equal_c_str (&other,
5157bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington                                          "HelloHello WorldWorle"));
5167bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
5177bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_string_free (&str);
5187bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_string_free (&other);
5197bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
5207bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  /* Check append/get unichar */
5217bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
5227bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_init (&str))
5237bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("failed to init string");
5247bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
5257bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  ch = 0;
5267bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_append_unichar (&str, 0xfffc))
5277bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("failed to append unichar");
5287bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
5297bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_string_get_unichar (&str, 0, &ch, &i);
5307bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
5317bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (ch == 0xfffc);
5327bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (i == _dbus_string_get_length (&str));
5337bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
5347bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_string_free (&str);
5357bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
5367bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  /* Check insert/set/get byte */
5377bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
5387bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_init (&str))
5397bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("failed to init string");
5407bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
5417bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_append (&str, "Hello"))
5427bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("failed to append Hello");
5437bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
5447bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_get_byte (&str, 0) == 'H');
5457bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_get_byte (&str, 1) == 'e');
5467bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_get_byte (&str, 2) == 'l');
5477bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_get_byte (&str, 3) == 'l');
5487bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_get_byte (&str, 4) == 'o');
5497bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
5507bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_string_set_byte (&str, 1, 'q');
5517bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_get_byte (&str, 1) == 'q');
5527bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
5537bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_insert_bytes (&str, 0, 1, 255))
5547bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("can't insert byte");
5557bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
5567bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_insert_bytes (&str, 2, 4, 'Z'))
5577bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("can't insert byte");
5587bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
5597bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_insert_bytes (&str, _dbus_string_get_length (&str), 1, 'W'))
5607bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("can't insert byte");
5617bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
5627bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_get_byte (&str, 0) == 255);
5637bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_get_byte (&str, 1) == 'H');
5647bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_get_byte (&str, 2) == 'Z');
5657bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_get_byte (&str, 3) == 'Z');
5667bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_get_byte (&str, 4) == 'Z');
5677bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_get_byte (&str, 5) == 'Z');
5687bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_get_byte (&str, 6) == 'q');
5697bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_get_byte (&str, 7) == 'l');
5707bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_get_byte (&str, 8) == 'l');
5717bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_get_byte (&str, 9) == 'o');
5727bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (_dbus_string_get_byte (&str, 10) == 'W');
5737bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
5747bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_string_free (&str);
5757bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
5767bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  /* Check append/parse int/double */
5777bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
5787bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_init (&str))
5797bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("failed to init string");
5807bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
5817bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_append_int (&str, 27))
5827bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("failed to append int");
5837bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
5847bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  i = _dbus_string_get_length (&str);
5857bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
5867bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_parse_int (&str, 0, &v, &end))
5877bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("failed to parse int");
5887bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
5897bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (v == 27);
5907bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (end == i);
5917bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
5927bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_string_free (&str);
5937bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
5947bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_init (&str))
5957bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("failed to init string");
5967bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
5977bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_append_double (&str, 50.3))
5987bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("failed to append float");
5997bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
6007bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  i = _dbus_string_get_length (&str);
6017bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
6027bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_parse_double (&str, 0, &d, &end))
6037bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("failed to parse float");
6047bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
6057bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (d > (50.3 - 1e-6) && d < (50.3 + 1e-6));
6067bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (end == i);
6077bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
6087bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_string_free (&str);
6097bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
6107bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  /* Test find */
6117bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_init (&str))
6127bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("failed to init string");
6137bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
6147bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_append (&str, "Hello"))
6157bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("couldn't append to string");
6167bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
6177bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_find (&str, 0, "He", &i))
6187bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("didn't find 'He'");
6197bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (i == 0);
6207bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
6217bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_find (&str, 0, "Hello", &i))
6227bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("didn't find 'Hello'");
6237bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (i == 0);
6247bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
6257bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_find (&str, 0, "ello", &i))
6267bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("didn't find 'ello'");
6277bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (i == 1);
6287bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
6297bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_find (&str, 0, "lo", &i))
6307bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("didn't find 'lo'");
6317bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (i == 3);
6327bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
6337bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_find (&str, 2, "lo", &i))
6347bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("didn't find 'lo'");
6357bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (i == 3);
6367bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
6377bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (_dbus_string_find (&str, 4, "lo", &i))
6387bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("did find 'lo'");
6397bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
6407bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_find (&str, 0, "l", &i))
6417bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("didn't find 'l'");
6427bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (i == 2);
6437bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
6447bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_find (&str, 0, "H", &i))
6457bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("didn't find 'H'");
6467bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (i == 0);
6477bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
6487bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_find (&str, 0, "", &i))
6497bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("didn't find ''");
6507bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (i == 0);
6517bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
6527bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (_dbus_string_find (&str, 0, "Hello!", NULL))
6537bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("Did find 'Hello!'");
6547bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
6557bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (_dbus_string_find (&str, 0, "Oh, Hello", NULL))
6567bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("Did find 'Oh, Hello'");
6577bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
6587bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (_dbus_string_find (&str, 0, "ill", NULL))
6597bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("Did find 'ill'");
6607bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
6617bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (_dbus_string_find (&str, 0, "q", NULL))
6627bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("Did find 'q'");
6637bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
6647bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_find_to (&str, 0, 2, "He", NULL))
6657bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("Didn't find 'He'");
6667bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
6677bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (_dbus_string_find_to (&str, 0, 2, "Hello", NULL))
6687bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("Did find 'Hello'");
6697bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
6707bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_find_byte_backward (&str, _dbus_string_get_length (&str), 'H', &i))
6717bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("Did not find 'H'");
6727bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (i == 0);
6737bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
6747bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_find_byte_backward (&str, _dbus_string_get_length (&str), 'o', &i))
6757bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("Did not find 'o'");
6767bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (i == _dbus_string_get_length (&str) - 1);
6777bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
6787bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (_dbus_string_find_byte_backward (&str, _dbus_string_get_length (&str) - 1, 'o', &i))
6797bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("Did find 'o'");
6807bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (i == -1);
6817bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
6827bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (_dbus_string_find_byte_backward (&str, 1, 'e', &i))
6837bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("Did find 'e'");
6847bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (i == -1);
6857bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
6867bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_find_byte_backward (&str, 2, 'e', &i))
6877bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("Didn't find 'e'");
6887bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (i == 1);
6897bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
6907bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_string_free (&str);
6917bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
6927bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  /* Hex encoding */
6937bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_string_init_const (&str, "cafebabe, this is a bogus hex string");
6947bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_init (&other))
6957bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("could not init string");
6967bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
6977bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  if (!_dbus_string_hex_decode (&str, 0, &end, &other, 0))
6987bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington    _dbus_assert_not_reached ("deccoded bogus hex string with no error");
6997bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
7007bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_assert (end == 8);
7017bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
7027bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_string_free (&other);
7037bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
7047bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  test_roundtrips (test_hex_roundtrip);
7057bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
7067bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington  _dbus_string_free (&str);
707cb39e60e1639fb982a46aa1625e3adec2bf0df46Ralf Habacker
708cb39e60e1639fb982a46aa1625e3adec2bf0df46Ralf Habacker  {
709a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    int found, found_len;
710cb39e60e1639fb982a46aa1625e3adec2bf0df46Ralf Habacker
711a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    _dbus_string_init_const (&str, "012\r\n567\n90");
712a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington
713a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    if (!_dbus_string_find_eol (&str, 0, &found, &found_len) || found != 3 || found_len != 2)
714a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington      _dbus_assert_not_reached ("Did not find '\\r\\n'");
715a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    if (found != 3 || found_len != 2)
716a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington      _dbus_assert_not_reached ("invalid return values");
717a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington
718a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    if (!_dbus_string_find_eol (&str, 5, &found, &found_len))
719a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington      _dbus_assert_not_reached ("Did not find '\\n'");
720a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    if (found != 8 || found_len != 1)
721a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington      _dbus_assert_not_reached ("invalid return values");
722a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington
723a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    if (_dbus_string_find_eol (&str, 9, &found, &found_len))
724a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington      _dbus_assert_not_reached ("Found not expected '\\n'");
725a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    else if (found != 11 || found_len != 0)
726a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington      _dbus_assert_not_reached ("invalid return values '\\n'");
727a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington
728a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    found = -1;
729a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    found_len = -1;
730a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    _dbus_string_init_const (&str, "");
731a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    if (_dbus_string_find_eol (&str, 0, &found, &found_len))
732a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington      _dbus_assert_not_reached ("found an eol in an empty string");
733a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    _dbus_assert (found == 0);
734a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    _dbus_assert (found_len == 0);
735a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington
736a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    found = -1;
737a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    found_len = -1;
738a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    _dbus_string_init_const (&str, "foobar");
739a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    if (_dbus_string_find_eol (&str, 0, &found, &found_len))
740a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington      _dbus_assert_not_reached ("found eol in string that lacks one");
741a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    _dbus_assert (found == 6);
742a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    _dbus_assert (found_len == 0);
743a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington
744a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    found = -1;
745a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    found_len = -1;
746a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    _dbus_string_init_const (&str, "foobar\n");
747a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    if (!_dbus_string_find_eol (&str, 0, &found, &found_len))
748a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington      _dbus_assert_not_reached ("did not find eol in string that has one at end");
749a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    _dbus_assert (found == 6);
750a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    _dbus_assert (found_len == 1);
751a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington  }
752cb39e60e1639fb982a46aa1625e3adec2bf0df46Ralf Habacker
753a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington  {
754a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    DBusString line;
755cb39e60e1639fb982a46aa1625e3adec2bf0df46Ralf Habacker
756a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington#define FIRST_LINE "this is a line"
757a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington#define SECOND_LINE "this is a second line"
758a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    /* third line is empty */
759a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington#define THIRD_LINE ""
760a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington#define FOURTH_LINE "this is a fourth line"
761a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington
762a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    if (!_dbus_string_init (&str))
763a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington      _dbus_assert_not_reached ("no memory");
764cb39e60e1639fb982a46aa1625e3adec2bf0df46Ralf Habacker
765a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    if (!_dbus_string_append (&str, FIRST_LINE "\n" SECOND_LINE "\r\n" THIRD_LINE "\n" FOURTH_LINE))
766a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington      _dbus_assert_not_reached ("no memory");
767a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington
768a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    if (!_dbus_string_init (&line))
769a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington      _dbus_assert_not_reached ("no memory");
770a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington
771a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    if (!_dbus_string_pop_line (&str, &line))
772a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington      _dbus_assert_not_reached ("failed to pop first line");
773cb39e60e1639fb982a46aa1625e3adec2bf0df46Ralf Habacker
774a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    _dbus_assert (_dbus_string_equal_c_str (&line, FIRST_LINE));
775a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington
776a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    if (!_dbus_string_pop_line (&str, &line))
777a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington      _dbus_assert_not_reached ("failed to pop second line");
778cb39e60e1639fb982a46aa1625e3adec2bf0df46Ralf Habacker
779a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    _dbus_assert (_dbus_string_equal_c_str (&line, SECOND_LINE));
780a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington
781a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    if (!_dbus_string_pop_line (&str, &line))
782a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington      _dbus_assert_not_reached ("failed to pop third line");
783cb39e60e1639fb982a46aa1625e3adec2bf0df46Ralf Habacker
784a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    _dbus_assert (_dbus_string_equal_c_str (&line, THIRD_LINE));
785a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington
786a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    if (!_dbus_string_pop_line (&str, &line))
787a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington      _dbus_assert_not_reached ("failed to pop fourth line");
788cb39e60e1639fb982a46aa1625e3adec2bf0df46Ralf Habacker
789a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    _dbus_assert (_dbus_string_equal_c_str (&line, FOURTH_LINE));
790a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington
791a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    _dbus_string_free (&str);
792a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington    _dbus_string_free (&line);
793a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington  }
7948c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie
7958c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie  {
7968c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie    if (!_dbus_string_init (&str))
7978c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie      _dbus_assert_not_reached ("no memory");
7988c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie
7998c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie    for (i = 0; i < 10000; i++)
8008c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie      if (!_dbus_string_append (&str, "abcdefghijklmnopqrstuvwxyz"))
8018c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie        _dbus_assert_not_reached ("no memory");
8028c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie
8038c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie    if (!_dbus_string_set_length (&str, 10))
8048c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie      _dbus_assert_not_reached ("failed to set length");
8058c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie
8068c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie    /* actually compact */
8078c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie    if (!_dbus_string_compact (&str, 2048))
8088c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie      _dbus_assert_not_reached ("failed to compact after set_length");
8098c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie
8108c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie    /* peek inside to make sure it worked */
8118c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie    if (((DBusRealString *)&str)->allocated > 30)
8128c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie      _dbus_assert_not_reached ("compacting string didn't do anything");
8138c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie
8148c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie    if (!_dbus_string_equal_c_str (&str, "abcdefghij"))
8158c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie      _dbus_assert_not_reached ("unexpected content after compact");
8168c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie
8178c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie    /* compact nothing */
8188c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie    if (!_dbus_string_compact (&str, 2048))
8198c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie      _dbus_assert_not_reached ("failed to compact 2nd time");
8208c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie
8218c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie    if (!_dbus_string_equal_c_str (&str, "abcdefghij"))
8228c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie      _dbus_assert_not_reached ("unexpected content after 2nd compact");
8238c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie
8248c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie    /* and make sure it still works...*/
8258c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie    if (!_dbus_string_append (&str, "123456"))
8268c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie      _dbus_assert_not_reached ("failed to append after compact");
8278c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie
8288c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie    if (!_dbus_string_equal_c_str (&str, "abcdefghij123456"))
8298c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie      _dbus_assert_not_reached ("unexpected content after append");
8308c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie
8318c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie    /* after growing automatically, this should do nothing */
8328c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie    if (!_dbus_string_compact (&str, 20000))
8338c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie      _dbus_assert_not_reached ("failed to compact after grow");
8348c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie
8358c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie    /* but this one will do something */
8368c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie    if (!_dbus_string_compact (&str, 0))
8378c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie      _dbus_assert_not_reached ("failed to compact after grow");
8388c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie
8398c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie    if (!_dbus_string_equal_c_str (&str, "abcdefghij123456"))
8408c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie      _dbus_assert_not_reached ("unexpected content");
8418c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie
8428c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie    if (!_dbus_string_append (&str, "!@#$%"))
8438c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie      _dbus_assert_not_reached ("failed to append after compact");
8448c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie
8458c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie    if (!_dbus_string_equal_c_str (&str, "abcdefghij123456!@#$%"))
8468c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie      _dbus_assert_not_reached ("unexpected content");
8478c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie
8488c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie    _dbus_string_free (&str);
8498c6b0ab3f7e437362112eeaf83a566475b85d27cRyan Lortie  }
8500e3ec9cec0f6740acd39d6e6983f419e20461282Ray Strode
8510e3ec9cec0f6740acd39d6e6983f419e20461282Ray Strode  {
8520e3ec9cec0f6740acd39d6e6983f419e20461282Ray Strode    const char two_strings[] = "one\ttwo";
8530e3ec9cec0f6740acd39d6e6983f419e20461282Ray Strode
8540e3ec9cec0f6740acd39d6e6983f419e20461282Ray Strode    if (!_dbus_string_init (&str))
8550e3ec9cec0f6740acd39d6e6983f419e20461282Ray Strode      _dbus_assert_not_reached ("no memory");
8560e3ec9cec0f6740acd39d6e6983f419e20461282Ray Strode
8570e3ec9cec0f6740acd39d6e6983f419e20461282Ray Strode    if (!_dbus_string_init (&other))
8580e3ec9cec0f6740acd39d6e6983f419e20461282Ray Strode      _dbus_assert_not_reached ("no memory");
8590e3ec9cec0f6740acd39d6e6983f419e20461282Ray Strode
8600e3ec9cec0f6740acd39d6e6983f419e20461282Ray Strode    if (!_dbus_string_append (&str, two_strings))
8610e3ec9cec0f6740acd39d6e6983f419e20461282Ray Strode      _dbus_assert_not_reached ("no memory");
8620e3ec9cec0f6740acd39d6e6983f419e20461282Ray Strode
8630e3ec9cec0f6740acd39d6e6983f419e20461282Ray Strode    if (!_dbus_string_split_on_byte (&str, '\t', &other))
8640e3ec9cec0f6740acd39d6e6983f419e20461282Ray Strode      _dbus_assert_not_reached ("no memory or delimiter not found");
8650e3ec9cec0f6740acd39d6e6983f419e20461282Ray Strode
8660e3ec9cec0f6740acd39d6e6983f419e20461282Ray Strode    if (strcmp (_dbus_string_get_data (&str), "one") != 0)
8670e3ec9cec0f6740acd39d6e6983f419e20461282Ray Strode      _dbus_assert_not_reached ("left side after split on tab is wrong");
8680e3ec9cec0f6740acd39d6e6983f419e20461282Ray Strode
8690e3ec9cec0f6740acd39d6e6983f419e20461282Ray Strode    if (strcmp (_dbus_string_get_data (&other), "two") != 0)
8700e3ec9cec0f6740acd39d6e6983f419e20461282Ray Strode      _dbus_assert_not_reached ("right side after split on tab is wrong");
8710e3ec9cec0f6740acd39d6e6983f419e20461282Ray Strode
8720e3ec9cec0f6740acd39d6e6983f419e20461282Ray Strode    _dbus_string_free (&str);
8730e3ec9cec0f6740acd39d6e6983f419e20461282Ray Strode    _dbus_string_free (&other);
8740e3ec9cec0f6740acd39d6e6983f419e20461282Ray Strode  }
875a06c771d2b931f0e5ae600d22a3e07208f16b0a3Ralf Habacker
876a06c771d2b931f0e5ae600d22a3e07208f16b0a3Ralf Habacker  {
877a06c771d2b931f0e5ae600d22a3e07208f16b0a3Ralf Habacker    const char upper_string[] = "TOUPPERSTRING";
878a06c771d2b931f0e5ae600d22a3e07208f16b0a3Ralf Habacker    const char lower_string[] = "toupperstring";
879a06c771d2b931f0e5ae600d22a3e07208f16b0a3Ralf Habacker    const char lower2_string[] = "toupperSTRING";
880a06c771d2b931f0e5ae600d22a3e07208f16b0a3Ralf Habacker
881a06c771d2b931f0e5ae600d22a3e07208f16b0a3Ralf Habacker    if (!_dbus_string_init (&str))
882a06c771d2b931f0e5ae600d22a3e07208f16b0a3Ralf Habacker      _dbus_assert_not_reached ("no memory");
883a06c771d2b931f0e5ae600d22a3e07208f16b0a3Ralf Habacker
884a06c771d2b931f0e5ae600d22a3e07208f16b0a3Ralf Habacker    if (!_dbus_string_append (&str, upper_string))
885a06c771d2b931f0e5ae600d22a3e07208f16b0a3Ralf Habacker      _dbus_assert_not_reached ("no memory");
886a06c771d2b931f0e5ae600d22a3e07208f16b0a3Ralf Habacker
887a06c771d2b931f0e5ae600d22a3e07208f16b0a3Ralf Habacker    _dbus_string_tolower_ascii (&str, 0, _dbus_string_get_length(&str));
888a06c771d2b931f0e5ae600d22a3e07208f16b0a3Ralf Habacker
889a06c771d2b931f0e5ae600d22a3e07208f16b0a3Ralf Habacker    if (!_dbus_string_equal_c_str (&str, lower_string))
890a06c771d2b931f0e5ae600d22a3e07208f16b0a3Ralf Habacker      _dbus_assert_not_reached ("_dbus_string_tolower_ascii failed");
891a06c771d2b931f0e5ae600d22a3e07208f16b0a3Ralf Habacker
892a06c771d2b931f0e5ae600d22a3e07208f16b0a3Ralf Habacker    _dbus_string_free (&str);
893a06c771d2b931f0e5ae600d22a3e07208f16b0a3Ralf Habacker
894a06c771d2b931f0e5ae600d22a3e07208f16b0a3Ralf Habacker    if (!_dbus_string_init (&str))
895a06c771d2b931f0e5ae600d22a3e07208f16b0a3Ralf Habacker      _dbus_assert_not_reached ("no memory");
896a06c771d2b931f0e5ae600d22a3e07208f16b0a3Ralf Habacker
897a06c771d2b931f0e5ae600d22a3e07208f16b0a3Ralf Habacker    if (!_dbus_string_append (&str, upper_string))
898a06c771d2b931f0e5ae600d22a3e07208f16b0a3Ralf Habacker      _dbus_assert_not_reached ("no memory");
899a06c771d2b931f0e5ae600d22a3e07208f16b0a3Ralf Habacker
900a06c771d2b931f0e5ae600d22a3e07208f16b0a3Ralf Habacker    _dbus_string_tolower_ascii (&str, 0, 7);
901a06c771d2b931f0e5ae600d22a3e07208f16b0a3Ralf Habacker
902a06c771d2b931f0e5ae600d22a3e07208f16b0a3Ralf Habacker    if (!_dbus_string_equal_c_str (&str, lower2_string))
903a06c771d2b931f0e5ae600d22a3e07208f16b0a3Ralf Habacker      _dbus_assert_not_reached ("_dbus_string_tolower_ascii failed in partial conversion");
904a06c771d2b931f0e5ae600d22a3e07208f16b0a3Ralf Habacker
905a06c771d2b931f0e5ae600d22a3e07208f16b0a3Ralf Habacker    _dbus_string_free (&str);
906a06c771d2b931f0e5ae600d22a3e07208f16b0a3Ralf Habacker  }
907a06c771d2b931f0e5ae600d22a3e07208f16b0a3Ralf Habacker
90847e37899a3daf33ab799f674c2dc8ce869cdd5faRalf Habacker  {
90947e37899a3daf33ab799f674c2dc8ce869cdd5faRalf Habacker    const char lower_string[] = "toupperstring";
91047e37899a3daf33ab799f674c2dc8ce869cdd5faRalf Habacker    const char upper_string[] = "TOUPPERSTRING";
91147e37899a3daf33ab799f674c2dc8ce869cdd5faRalf Habacker    const char upper2_string[] = "TOUPPERstring";
91247e37899a3daf33ab799f674c2dc8ce869cdd5faRalf Habacker
91347e37899a3daf33ab799f674c2dc8ce869cdd5faRalf Habacker    if (!_dbus_string_init (&str))
91447e37899a3daf33ab799f674c2dc8ce869cdd5faRalf Habacker      _dbus_assert_not_reached ("no memory");
91547e37899a3daf33ab799f674c2dc8ce869cdd5faRalf Habacker
91647e37899a3daf33ab799f674c2dc8ce869cdd5faRalf Habacker    if (!_dbus_string_append (&str, lower_string))
91747e37899a3daf33ab799f674c2dc8ce869cdd5faRalf Habacker      _dbus_assert_not_reached ("no memory");
91847e37899a3daf33ab799f674c2dc8ce869cdd5faRalf Habacker
91947e37899a3daf33ab799f674c2dc8ce869cdd5faRalf Habacker    _dbus_string_toupper_ascii (&str, 0, _dbus_string_get_length(&str));
92047e37899a3daf33ab799f674c2dc8ce869cdd5faRalf Habacker
92147e37899a3daf33ab799f674c2dc8ce869cdd5faRalf Habacker    if (!_dbus_string_equal_c_str (&str, upper_string))
92247e37899a3daf33ab799f674c2dc8ce869cdd5faRalf Habacker      _dbus_assert_not_reached ("_dbus_string_toupper_ascii failed");
92347e37899a3daf33ab799f674c2dc8ce869cdd5faRalf Habacker
92447e37899a3daf33ab799f674c2dc8ce869cdd5faRalf Habacker    _dbus_string_free (&str);
92547e37899a3daf33ab799f674c2dc8ce869cdd5faRalf Habacker
92647e37899a3daf33ab799f674c2dc8ce869cdd5faRalf Habacker    if (!_dbus_string_init (&str))
92747e37899a3daf33ab799f674c2dc8ce869cdd5faRalf Habacker      _dbus_assert_not_reached ("no memory");
92847e37899a3daf33ab799f674c2dc8ce869cdd5faRalf Habacker
92947e37899a3daf33ab799f674c2dc8ce869cdd5faRalf Habacker    if (!_dbus_string_append (&str, lower_string))
93047e37899a3daf33ab799f674c2dc8ce869cdd5faRalf Habacker      _dbus_assert_not_reached ("no memory");
93147e37899a3daf33ab799f674c2dc8ce869cdd5faRalf Habacker
93247e37899a3daf33ab799f674c2dc8ce869cdd5faRalf Habacker    _dbus_string_toupper_ascii (&str, 0, 7);
93347e37899a3daf33ab799f674c2dc8ce869cdd5faRalf Habacker
93447e37899a3daf33ab799f674c2dc8ce869cdd5faRalf Habacker    if (!_dbus_string_equal_c_str (&str, upper2_string))
93547e37899a3daf33ab799f674c2dc8ce869cdd5faRalf Habacker      _dbus_assert_not_reached ("_dbus_string_toupper_ascii failed in partial conversion");
93647e37899a3daf33ab799f674c2dc8ce869cdd5faRalf Habacker
93747e37899a3daf33ab799f674c2dc8ce869cdd5faRalf Habacker    _dbus_string_free (&str);
93847e37899a3daf33ab799f674c2dc8ce869cdd5faRalf Habacker  }
93947e37899a3daf33ab799f674c2dc8ce869cdd5faRalf Habacker
940a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington  return TRUE;
941a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington}
942cb39e60e1639fb982a46aa1625e3adec2bf0df46Ralf Habacker
943a789b7b38cb4f4540a41444cbd64bf7ada2d60d2Havoc Pennington#endif /* DBUS_BUILD_TESTS */
944