Sophie

Sophie

distrib > Mandriva > 2007.0 > x86_64 > media > main-release > by-pkgid > 926d2d1e3111287cee1b0a4fad4fb4f6 > files > 127

lib64dbus-1_3-devel-0.92-6mdv2007.0.x86_64.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>dbus-string.c Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.2.15 -->
<center>
<a class="qindex" href="index.html">Main Page</a> &nbsp; <a class="qindex" href="modules.html">Modules</a> &nbsp; <a class="qindex" href="annotated.html">Data Structures</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Data Fields</a> &nbsp; <a class="qindex" href="pages.html">Related Pages</a> &nbsp; </center>
<hr><h1>dbus-string.c</h1><div class="fragment"><pre>00001 <font class="comment">/* -*- mode: C; c-file-style: "gnu" -*- */</font>
00002 <font class="comment">/* dbus-string.c String utility class (internal to D-BUS implementation)</font>
00003 <font class="comment"> * </font>
00004 <font class="comment"> * Copyright (C) 2002, 2003 Red Hat, Inc.</font>
00005 <font class="comment"> *</font>
00006 <font class="comment"> * Licensed under the Academic Free License version 2.0</font>
00007 <font class="comment"> * </font>
00008 <font class="comment"> * This program is free software; you can redistribute it and/or modify</font>
00009 <font class="comment"> * it under the terms of the GNU General Public License as published by</font>
00010 <font class="comment"> * the Free Software Foundation; either version 2 of the License, or</font>
00011 <font class="comment"> * (at your option) any later version.</font>
00012 <font class="comment"> *</font>
00013 <font class="comment"> * This program is distributed in the hope that it will be useful,</font>
00014 <font class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</font>
00015 <font class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</font>
00016 <font class="comment"> * GNU General Public License for more details.</font>
00017 <font class="comment"> * </font>
00018 <font class="comment"> * You should have received a copy of the GNU General Public License</font>
00019 <font class="comment"> * along with this program; if not, write to the Free Software</font>
00020 <font class="comment"> * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA</font>
00021 <font class="comment"> *</font>
00022 <font class="comment"> */</font>
00023 
00024 <font class="preprocessor">#include "dbus-internals.h"</font>
00025 <font class="preprocessor">#include "dbus-string.h"</font>
00026 <font class="comment">/* we allow a system header here, for speed/convenience */</font>
00027 <font class="preprocessor">#include &lt;string.h&gt;</font>
00028 <font class="comment">/* for vsnprintf */</font>
00029 <font class="preprocessor">#include &lt;stdio.h&gt;</font>
00030 <font class="preprocessor">#include "dbus-marshal.h"</font>
00031 <font class="preprocessor">#define DBUS_CAN_USE_DBUS_STRING_PRIVATE 1</font>
00032 <font class="preprocessor"></font><font class="preprocessor">#include "dbus-string-private.h"</font>
00033 <font class="preprocessor">#include "dbus-protocol.h"</font>
00034 <font class="comment">/* for DBUS_VA_COPY */</font>
00035 <font class="preprocessor">#include "dbus-sysdeps.h"</font>
00036 
<a name="l00079"></a><a class="code" href="group__DBusStringInternals.html#a1">00079</a> <font class="preprocessor">#define ALLOCATION_PADDING 8</font>
00080 <font class="preprocessor"></font>
<a name="l00085"></a><a class="code" href="group__DBusStringInternals.html#a2">00085</a> <font class="preprocessor">#define MAX_MAX_LENGTH (_DBUS_INT_MAX - ALLOCATION_PADDING)</font>
00086 <font class="preprocessor"></font>
<a name="l00092"></a><a class="code" href="group__DBusStringInternals.html#a3">00092</a> <font class="preprocessor">#define DBUS_GENERIC_STRING_PREAMBLE(real) _dbus_assert ((real) != NULL); _dbus_assert (!(real)-&gt;invalid); _dbus_assert ((real)-&gt;len &gt;= 0); _dbus_assert ((real)-&gt;allocated &gt;= 0); _dbus_assert ((real)-&gt;max_length &gt;= 0); _dbus_assert ((real)-&gt;len &lt;= ((real)-&gt;allocated - ALLOCATION_PADDING)); _dbus_assert ((real)-&gt;len &lt;= (real)-&gt;max_length)</font>
00093 <font class="preprocessor"></font>
<a name="l00100"></a><a class="code" href="group__DBusStringInternals.html#a4">00100</a> <font class="preprocessor">#define DBUS_STRING_PREAMBLE(str) DBusRealString *real = (DBusRealString*) str; \</font>
00101 <font class="preprocessor">  DBUS_GENERIC_STRING_PREAMBLE (real);                                          \</font>
00102 <font class="preprocessor">  _dbus_assert (!(real)-&gt;constant);                                             \</font>
00103 <font class="preprocessor">  _dbus_assert (!(real)-&gt;locked)</font>
00104 <font class="preprocessor"></font>
<a name="l00112"></a><a class="code" href="group__DBusStringInternals.html#a5">00112</a> <font class="preprocessor">#define DBUS_LOCKED_STRING_PREAMBLE(str) DBusRealString *real = (DBusRealString*) str; \</font>
00113 <font class="preprocessor">  DBUS_GENERIC_STRING_PREAMBLE (real);                                                 \</font>
00114 <font class="preprocessor">  _dbus_assert (!(real)-&gt;constant)</font>
00115 <font class="preprocessor"></font>
<a name="l00121"></a><a class="code" href="group__DBusStringInternals.html#a6">00121</a> <font class="preprocessor">#define DBUS_CONST_STRING_PREAMBLE(str) const DBusRealString *real = (DBusRealString*) str; \</font>
00122 <font class="preprocessor">  DBUS_GENERIC_STRING_PREAMBLE (real)</font>
00123 <font class="preprocessor"></font>
00131 <font class="keyword">static</font> <font class="keywordtype">void</font>
00132 fixup_alignment (<a class="code" href="structDBusRealString.html">DBusRealString</a> *real)
00133 {
00134   <font class="keywordtype">char</font> *aligned;
00135   <font class="keywordtype">char</font> *real_block;
00136   <font class="keywordtype">unsigned</font> <font class="keywordtype">int</font> old_align_offset;
00137 
00138   <font class="comment">/* we have to have extra space in real-&gt;allocated for the align offset and nul byte */</font>
00139   _dbus_assert (real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a> &lt;= real-&gt;<a class="code" href="structDBusRealString.html#m2">allocated</a> - ALLOCATION_PADDING);
00140   
00141   old_align_offset = real-&gt;<a class="code" href="structDBusRealString.html#m7">align_offset</a>;
00142   real_block = real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> - old_align_offset;
00143   
00144   aligned = _DBUS_ALIGN_ADDRESS (real_block, 8);
00145 
00146   real-&gt;<a class="code" href="structDBusRealString.html#m7">align_offset</a> = aligned - real_block;
00147   real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> = aligned;
00148   
00149   <font class="keywordflow">if</font> (old_align_offset != real-&gt;<a class="code" href="structDBusRealString.html#m7">align_offset</a>)
00150     {
00151       <font class="comment">/* Here comes the suck */</font>
00152       memmove (real_block + real-&gt;<a class="code" href="structDBusRealString.html#m7">align_offset</a>,
00153                real_block + old_align_offset,
00154                real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a> + 1);
00155     }
00156 
00157   _dbus_assert (real-&gt;<a class="code" href="structDBusRealString.html#m7">align_offset</a> &lt; 8);
00158   _dbus_assert (_DBUS_ALIGN_ADDRESS (real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a>, 8) == real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a>);
00159 }
00160 
00161 <font class="keyword">static</font> <font class="keywordtype">void</font>
00162 undo_alignment (<a class="code" href="structDBusRealString.html">DBusRealString</a> *real)
00163 {
00164   <font class="keywordflow">if</font> (real-&gt;<a class="code" href="structDBusRealString.html#m7">align_offset</a> != 0)
00165     {
00166       memmove (real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> - real-&gt;<a class="code" href="structDBusRealString.html#m7">align_offset</a>,
00167                real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a>,
00168                real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a> + 1);
00169 
00170       real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> = real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> - real-&gt;<a class="code" href="structDBusRealString.html#m7">align_offset</a>;
00171       real-&gt;<a class="code" href="structDBusRealString.html#m7">align_offset</a> = 0;
00172     }
00173 }
00174 
00184 dbus_bool_t
<a name="l00185"></a><a class="code" href="group__DBusString.html#a2">00185</a> _dbus_string_init_preallocated (<a class="code" href="structDBusString.html">DBusString</a> *str,
00186                                 <font class="keywordtype">int</font>         allocate_size)
00187 {
00188   <a class="code" href="structDBusRealString.html">DBusRealString</a> *real;
00189   
00190   _dbus_assert (str != NULL);
00191 
00192   _dbus_assert (<font class="keyword">sizeof</font> (<a class="code" href="structDBusString.html">DBusString</a>) == <font class="keyword">sizeof</font> (<a class="code" href="structDBusRealString.html">DBusRealString</a>));
00193   
00194   real = (<a class="code" href="structDBusRealString.html">DBusRealString</a>*) str;
00195 
00196   <font class="comment">/* It's very important not to touch anything</font>
00197 <font class="comment">   * other than real-&gt;str if we're going to fail,</font>
00198 <font class="comment">   * since we also use this function to reset</font>
00199 <font class="comment">   * an existing string, e.g. in _dbus_string_steal_data()</font>
00200 <font class="comment">   */</font>
00201   
00202   real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> = dbus_malloc (ALLOCATION_PADDING + allocate_size);
00203   <font class="keywordflow">if</font> (real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> == NULL)
00204     <font class="keywordflow">return</font> FALSE;  
00205   
00206   real-&gt;<a class="code" href="structDBusRealString.html#m2">allocated</a> = ALLOCATION_PADDING + allocate_size;
00207   real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a> = 0;
00208   real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a>[real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a>] = <font class="charliteral">'\0'</font>;
00209   
00210   real-&gt;<a class="code" href="structDBusRealString.html#m3">max_length</a> = MAX_MAX_LENGTH;
00211   real-&gt;<a class="code" href="structDBusRealString.html#m4">constant</a> = FALSE;
00212   real-&gt;<a class="code" href="structDBusRealString.html#m5">locked</a> = FALSE;
00213   real-&gt;<a class="code" href="structDBusRealString.html#m6">invalid</a> = FALSE;
00214   real-&gt;<a class="code" href="structDBusRealString.html#m7">align_offset</a> = 0;
00215   
00216   fixup_alignment (real);
00217   
00218   <font class="keywordflow">return</font> TRUE;
00219 }
00220 
00228 dbus_bool_t
<a name="l00229"></a><a class="code" href="group__DBusString.html#a3">00229</a> _dbus_string_init (<a class="code" href="structDBusString.html">DBusString</a> *str)
00230 {
00231   <font class="keywordflow">return</font> _dbus_string_init_preallocated (str, 0);
00232 }
00233 
00234 <font class="comment">/* The max length thing is sort of a historical artifact</font>
00235 <font class="comment"> * from a feature that turned out to be dumb; perhaps</font>
00236 <font class="comment"> * we should purge it entirely. The problem with</font>
00237 <font class="comment"> * the feature is that it looks like memory allocation</font>
00238 <font class="comment"> * failure, but is not a transient or resolvable failure.</font>
00239 <font class="comment"> */</font>
00240 <font class="keyword">static</font> <font class="keywordtype">void</font>
00241 set_max_length (<a class="code" href="structDBusString.html">DBusString</a> *str,
00242                 <font class="keywordtype">int</font>         max_length)
00243 {
00244   <a class="code" href="structDBusRealString.html">DBusRealString</a> *real;
00245   
00246   real = (<a class="code" href="structDBusRealString.html">DBusRealString</a>*) str;
00247 
00248   real-&gt;<a class="code" href="structDBusRealString.html#m3">max_length</a> = max_length;
00249 }
00250 
00260 <font class="keywordtype">void</font>
<a name="l00261"></a><a class="code" href="group__DBusString.html#a5">00261</a> _dbus_string_init_const (<a class="code" href="structDBusString.html">DBusString</a> *str,
00262                          <font class="keyword">const</font> <font class="keywordtype">char</font> *value)
00263 {
00264   _dbus_assert (value != NULL);
00265   
00266   _dbus_string_init_const_len (str, value,
00267                                strlen (value));
00268 }
00269 
00280 <font class="keywordtype">void</font>
<a name="l00281"></a><a class="code" href="group__DBusString.html#a6">00281</a> _dbus_string_init_const_len (<a class="code" href="structDBusString.html">DBusString</a> *str,
00282                              <font class="keyword">const</font> <font class="keywordtype">char</font> *value,
00283                              <font class="keywordtype">int</font>         len)
00284 {
00285   <a class="code" href="structDBusRealString.html">DBusRealString</a> *real;
00286   
00287   _dbus_assert (str != NULL);
00288   _dbus_assert (value != NULL);
00289   _dbus_assert (len &lt;= MAX_MAX_LENGTH);
00290   _dbus_assert (len &gt;= 0);
00291   
00292   real = (<a class="code" href="structDBusRealString.html">DBusRealString</a>*) str;
00293   
00294   real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> = (<font class="keywordtype">char</font>*) value;
00295   real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a> = len;
00296   real-&gt;<a class="code" href="structDBusRealString.html#m2">allocated</a> = real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a> + ALLOCATION_PADDING; <font class="comment">/* a lie, just to avoid special-case assertions... */</font>
00297   real-&gt;<a class="code" href="structDBusRealString.html#m3">max_length</a> = real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a> + 1;
00298   real-&gt;<a class="code" href="structDBusRealString.html#m4">constant</a> = TRUE;
00299   real-&gt;<a class="code" href="structDBusRealString.html#m6">invalid</a> = FALSE;
00300 
00301   <font class="comment">/* We don't require const strings to be 8-byte aligned as the</font>
00302 <font class="comment">   * memory is coming from elsewhere.</font>
00303 <font class="comment">   */</font>
00304 }
00305 
00311 <font class="keywordtype">void</font>
<a name="l00312"></a><a class="code" href="group__DBusString.html#a7">00312</a> _dbus_string_free (<a class="code" href="structDBusString.html">DBusString</a> *str)
00313 {
00314   <a class="code" href="structDBusRealString.html">DBusRealString</a> *real = (<a class="code" href="structDBusRealString.html">DBusRealString</a>*) str;
00315   DBUS_GENERIC_STRING_PREAMBLE (real);
00316   
00317   <font class="keywordflow">if</font> (real-&gt;<a class="code" href="structDBusRealString.html#m4">constant</a>)
00318     <font class="keywordflow">return</font>;
00319   dbus_free (real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> - real-&gt;<a class="code" href="structDBusRealString.html#m7">align_offset</a>);
00320 
00321   real-&gt;<a class="code" href="structDBusRealString.html#m6">invalid</a> = TRUE;
00322 }
00323 
00324 <font class="preprocessor">#ifdef DBUS_BUILD_TESTS</font>
00325 <font class="preprocessor"></font><font class="comment">/* Not using this feature at the moment,</font>
00326 <font class="comment"> * so marked DBUS_BUILD_TESTS-only</font>
00327 <font class="comment"> */</font>
00337 <font class="keywordtype">void</font>
<a name="l00338"></a><a class="code" href="group__DBusString.html#a8">00338</a> _dbus_string_lock (<a class="code" href="structDBusString.html">DBusString</a> *str)
00339 {  
00340   DBUS_LOCKED_STRING_PREAMBLE (str); <font class="comment">/* can lock multiple times */</font>
00341 
00342   real-&gt;locked = TRUE;
00343 
00344   <font class="comment">/* Try to realloc to avoid excess memory usage, since</font>
00345 <font class="comment">   * we know we won't change the string further</font>
00346 <font class="comment">   */</font>
00347 <font class="preprocessor">#define MAX_WASTE 48</font>
00348 <font class="preprocessor"></font>  <font class="keywordflow">if</font> (real-&gt;allocated - MAX_WASTE &gt; real-&gt;len)
00349     {
00350       <font class="keywordtype">char</font> *new_str;
00351       <font class="keywordtype">int</font> new_allocated;
00352 
00353       new_allocated = real-&gt;len + ALLOCATION_PADDING;
00354 
00355       new_str = dbus_realloc (real-&gt;str - real-&gt;align_offset,
00356                               new_allocated);
00357       <font class="keywordflow">if</font> (new_str != NULL)
00358         {
00359           real-&gt;str = new_str + real-&gt;align_offset;
00360           real-&gt;allocated = new_allocated;
00361           fixup_alignment (real);
00362         }
00363     }
00364 }
00365 <font class="preprocessor">#endif </font><font class="comment">/* DBUS_BUILD_TESTS */</font>
00366 
00367 <font class="keyword">static</font> dbus_bool_t
00368 reallocate_for_length (<a class="code" href="structDBusRealString.html">DBusRealString</a> *real,
00369                        <font class="keywordtype">int</font>             new_length)
00370 {
00371   <font class="keywordtype">int</font> new_allocated;
00372   <font class="keywordtype">char</font> *new_str;
00373 
00374   <font class="comment">/* at least double our old allocation to avoid O(n), avoiding</font>
00375 <font class="comment">   * overflow</font>
00376 <font class="comment">   */</font>
00377   <font class="keywordflow">if</font> (real-&gt;<a class="code" href="structDBusRealString.html#m2">allocated</a> &gt; (MAX_MAX_LENGTH + ALLOCATION_PADDING) / 2)
00378     new_allocated = MAX_MAX_LENGTH + ALLOCATION_PADDING;
00379   <font class="keywordflow">else</font>
00380     new_allocated = real-&gt;<a class="code" href="structDBusRealString.html#m2">allocated</a> * 2;
00381 
00382   <font class="comment">/* if you change the code just above here, run the tests without</font>
00383 <font class="comment">   * the following before you commit</font>
00384 <font class="comment">   */</font>
00385 <font class="preprocessor">#ifdef DBUS_BUILD_TESTS</font>
00386 <font class="preprocessor"></font>  new_allocated = 0; <font class="comment">/* ensure a realloc every time so that we go</font>
00387 <font class="comment">                      * through all malloc failure codepaths</font>
00388 <font class="comment">                      */</font>
00389 <font class="preprocessor">#endif</font>
00390 <font class="preprocessor"></font>      
00391   <font class="comment">/* But be sure we always alloc at least space for the new length */</font>
00392   new_allocated = MAX (new_allocated, new_length + ALLOCATION_PADDING);
00393 
00394   _dbus_assert (new_allocated &gt;= real-&gt;<a class="code" href="structDBusRealString.html#m2">allocated</a>); <font class="comment">/* code relies on this */</font>
00395   new_str = dbus_realloc (real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> - real-&gt;<a class="code" href="structDBusRealString.html#m7">align_offset</a>, new_allocated);
00396   <font class="keywordflow">if</font> (new_str == NULL)
00397     <font class="keywordflow">return</font> FALSE;
00398 
00399   real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> = new_str + real-&gt;<a class="code" href="structDBusRealString.html#m7">align_offset</a>;
00400   real-&gt;<a class="code" href="structDBusRealString.html#m2">allocated</a> = new_allocated;
00401   fixup_alignment (real);
00402 
00403   <font class="keywordflow">return</font> TRUE;
00404 }
00405 
00406 <font class="keyword">static</font> dbus_bool_t
00407 set_length (<a class="code" href="structDBusRealString.html">DBusRealString</a> *real,
00408             <font class="keywordtype">int</font>             new_length)
00409 {
00410   <font class="comment">/* Note, we are setting the length not including nul termination */</font>
00411 
00412   <font class="comment">/* exceeding max length is the same as failure to allocate memory */</font>
00413   <font class="keywordflow">if</font> (new_length &gt; real-&gt;<a class="code" href="structDBusRealString.html#m3">max_length</a>)
00414     <font class="keywordflow">return</font> FALSE;
00415   <font class="keywordflow">else</font> <font class="keywordflow">if</font> (new_length &gt; (real-&gt;<a class="code" href="structDBusRealString.html#m2">allocated</a> - ALLOCATION_PADDING) &amp;&amp;
00416            !reallocate_for_length (real, new_length))
00417     <font class="keywordflow">return</font> FALSE;
00418   <font class="keywordflow">else</font>
00419     {
00420       real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a> = new_length;
00421       real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a>[real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a>] = <font class="charliteral">'\0'</font>;
00422       <font class="keywordflow">return</font> TRUE;
00423     }
00424 }
00425 
00426 <font class="keyword">static</font> dbus_bool_t
00427 open_gap (<font class="keywordtype">int</font>             len,
00428           <a class="code" href="structDBusRealString.html">DBusRealString</a> *dest,
00429           <font class="keywordtype">int</font>             insert_at)
00430 {
00431   <font class="keywordflow">if</font> (len == 0)
00432     <font class="keywordflow">return</font> TRUE;
00433 
00434   <font class="keywordflow">if</font> (len &gt; dest-&gt;<a class="code" href="structDBusRealString.html#m3">max_length</a> - dest-&gt;<a class="code" href="structDBusRealString.html#m1">len</a>)
00435     <font class="keywordflow">return</font> FALSE; <font class="comment">/* detected overflow of dest-&gt;len + len below */</font>
00436   
00437   <font class="keywordflow">if</font> (!set_length (dest, dest-&gt;<a class="code" href="structDBusRealString.html#m1">len</a> + len))
00438     <font class="keywordflow">return</font> FALSE;
00439 
00440   memmove (dest-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> + insert_at + len, 
00441            dest-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> + insert_at,
00442            dest-&gt;<a class="code" href="structDBusRealString.html#m1">len</a> - len - insert_at);
00443 
00444   <font class="keywordflow">return</font> TRUE;
00445 }
00446 
00458 <font class="keywordtype">char</font>*
<a name="l00459"></a><a class="code" href="group__DBusString.html#a12">00459</a> _dbus_string_get_data (<a class="code" href="structDBusString.html">DBusString</a> *str)
00460 {
00461   DBUS_STRING_PREAMBLE (str);
00462   
00463   <font class="keywordflow">return</font> real-&gt;str;
00464 }
00465 
00472 <font class="keyword">const</font> <font class="keywordtype">char</font>*
<a name="l00473"></a><a class="code" href="group__DBusString.html#a13">00473</a> _dbus_string_get_const_data (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>  *str)
00474 {
00475   DBUS_CONST_STRING_PREAMBLE (str);
00476   
00477   <font class="keywordflow">return</font> real-&gt;str;
00478 }
00479 
00493 <font class="keywordtype">char</font>*
<a name="l00494"></a><a class="code" href="group__DBusString.html#a14">00494</a> _dbus_string_get_data_len (<a class="code" href="structDBusString.html">DBusString</a> *str,
00495                            <font class="keywordtype">int</font>         start,
00496                            <font class="keywordtype">int</font>         len)
00497 {
00498   DBUS_STRING_PREAMBLE (str);
00499   _dbus_assert (start &gt;= 0);
00500   _dbus_assert (len &gt;= 0);
00501   _dbus_assert (start &lt;= real-&gt;len);
00502   _dbus_assert (len &lt;= real-&gt;len - start);
00503   
00504   <font class="keywordflow">return</font> real-&gt;str + start;
00505 }
00506 
00515 <font class="keyword">const</font> <font class="keywordtype">char</font>*
<a name="l00516"></a><a class="code" href="group__DBusString.html#a15">00516</a> _dbus_string_get_const_data_len (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>  *str,
00517                                  <font class="keywordtype">int</font>                start,
00518                                  <font class="keywordtype">int</font>                len)
00519 {
00520   DBUS_CONST_STRING_PREAMBLE (str);
00521   _dbus_assert (start &gt;= 0);
00522   _dbus_assert (len &gt;= 0);
00523   _dbus_assert (start &lt;= real-&gt;len);
00524   _dbus_assert (len &lt;= real-&gt;len - start);
00525   
00526   <font class="keywordflow">return</font> real-&gt;str + start;
00527 }
00528 
00536 <font class="keywordtype">void</font>
<a name="l00537"></a><a class="code" href="group__DBusString.html#a16">00537</a> _dbus_string_set_byte (<a class="code" href="structDBusString.html">DBusString</a>    *str,
00538                        <font class="keywordtype">int</font>            i,
00539                        <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>  byte)
00540 {
00541   DBUS_STRING_PREAMBLE (str);
00542   _dbus_assert (i &lt; real-&gt;len);
00543   _dbus_assert (i &gt;= 0);
00544   
00545   real-&gt;str[i] = byte;
00546 }
00547 
00557 <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>
<a name="l00558"></a><a class="code" href="group__DBusString.html#a17">00558</a> _dbus_string_get_byte (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>  *str,
00559                        <font class="keywordtype">int</font>                start)
00560 {
00561   DBUS_CONST_STRING_PREAMBLE (str);
00562   _dbus_assert (start &lt;= real-&gt;len);
00563   _dbus_assert (start &gt;= 0);
00564   
00565   <font class="keywordflow">return</font> real-&gt;str[start];
00566 }
00567 
00578 dbus_bool_t
<a name="l00579"></a><a class="code" href="group__DBusString.html#a18">00579</a> _dbus_string_insert_bytes (<a class="code" href="structDBusString.html">DBusString</a>   *str,
00580                            <font class="keywordtype">int</font>           i,
00581                            <font class="keywordtype">int</font>           n_bytes,
00582                            <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> byte)
00583 {
00584   DBUS_STRING_PREAMBLE (str);
00585   _dbus_assert (i &lt;= real-&gt;len);
00586   _dbus_assert (i &gt;= 0);
00587   _dbus_assert (n_bytes &gt;= 0);
00588 
00589   <font class="keywordflow">if</font> (n_bytes == 0)
00590     <font class="keywordflow">return</font> TRUE;
00591   
00592   <font class="keywordflow">if</font> (!open_gap (n_bytes, real, i))
00593     <font class="keywordflow">return</font> FALSE;
00594   
00595   memset (real-&gt;str + i, byte, n_bytes);
00596 
00597   <font class="keywordflow">return</font> TRUE;
00598 }
00599 
00610 dbus_bool_t
<a name="l00611"></a><a class="code" href="group__DBusString.html#a19">00611</a> _dbus_string_steal_data (<a class="code" href="structDBusString.html">DBusString</a>        *str,
00612                          <font class="keywordtype">char</font>             **data_return)
00613 {
00614   <font class="keywordtype">int</font> old_max_length;
00615   DBUS_STRING_PREAMBLE (str);
00616   _dbus_assert (data_return != NULL);
00617 
00618   undo_alignment (real);
00619   
00620   *data_return = real-&gt;str;
00621 
00622   old_max_length = real-&gt;max_length;
00623   
00624   <font class="comment">/* reset the string */</font>
00625   <font class="keywordflow">if</font> (!_dbus_string_init (str))
00626     {
00627       <font class="comment">/* hrm, put it back then */</font>
00628       real-&gt;str = *data_return;
00629       *data_return = NULL;
00630       fixup_alignment (real);
00631       <font class="keywordflow">return</font> FALSE;
00632     }
00633 
00634   real-&gt;max_length = old_max_length;
00635 
00636   <font class="keywordflow">return</font> TRUE;
00637 }
00638 
00654 dbus_bool_t
<a name="l00655"></a><a class="code" href="group__DBusString.html#a20">00655</a> _dbus_string_steal_data_len (<a class="code" href="structDBusString.html">DBusString</a>        *str,
00656                              <font class="keywordtype">char</font>             **data_return,
00657                              <font class="keywordtype">int</font>                start,
00658                              <font class="keywordtype">int</font>                len)
00659 {
00660   <a class="code" href="structDBusString.html">DBusString</a> dest;
00661   DBUS_STRING_PREAMBLE (str);
00662   _dbus_assert (data_return != NULL);
00663   _dbus_assert (start &gt;= 0);
00664   _dbus_assert (len &gt;= 0);
00665   _dbus_assert (start &lt;= real-&gt;len);
00666   _dbus_assert (len &lt;= real-&gt;len - start);
00667 
00668   <font class="keywordflow">if</font> (!_dbus_string_init (&amp;dest))
00669     <font class="keywordflow">return</font> FALSE;
00670 
00671   set_max_length (&amp;dest, real-&gt;max_length);
00672   
00673   <font class="keywordflow">if</font> (!_dbus_string_move_len (str, start, len, &amp;dest, 0))
00674     {
00675       _dbus_string_free (&amp;dest);
00676       <font class="keywordflow">return</font> FALSE;
00677     }
00678 
00679   _dbus_warn (<font class="stringliteral">"Broken code in _dbus_string_steal_data_len(), see @todo, FIXME\n"</font>);
00680   <font class="keywordflow">if</font> (!_dbus_string_steal_data (&amp;dest, data_return))
00681     {
00682       _dbus_string_free (&amp;dest);
00683       <font class="keywordflow">return</font> FALSE;
00684     }
00685 
00686   _dbus_string_free (&amp;dest);
00687   <font class="keywordflow">return</font> TRUE;
00688 }
00689 
00690 
00698 dbus_bool_t
<a name="l00699"></a><a class="code" href="group__DBusString.html#a21">00699</a> _dbus_string_copy_data (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>  *str,
00700                         <font class="keywordtype">char</font>             **data_return)
00701 {
00702   DBUS_CONST_STRING_PREAMBLE (str);
00703   _dbus_assert (data_return != NULL);
00704   
00705   *data_return = dbus_malloc (real-&gt;len + 1);
00706   <font class="keywordflow">if</font> (*data_return == NULL)
00707     <font class="keywordflow">return</font> FALSE;
00708 
00709   memcpy (*data_return, real-&gt;str, real-&gt;len + 1);
00710 
00711   <font class="keywordflow">return</font> TRUE;
00712 }
00713 
00723 dbus_bool_t
<a name="l00724"></a><a class="code" href="group__DBusString.html#a22">00724</a> _dbus_string_copy_data_len (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>  *str,
00725                             <font class="keywordtype">char</font>             **data_return,
00726                             <font class="keywordtype">int</font>                start,
00727                             <font class="keywordtype">int</font>                len)
00728 {
00729   <a class="code" href="structDBusString.html">DBusString</a> dest;
00730 
00731   DBUS_CONST_STRING_PREAMBLE (str);
00732   _dbus_assert (data_return != NULL);
00733   _dbus_assert (start &gt;= 0);
00734   _dbus_assert (len &gt;= 0);
00735   _dbus_assert (start &lt;= real-&gt;len);
00736   _dbus_assert (len &lt;= real-&gt;len - start);
00737 
00738   <font class="keywordflow">if</font> (!_dbus_string_init (&amp;dest))
00739     <font class="keywordflow">return</font> FALSE;
00740 
00741   set_max_length (&amp;dest, real-&gt;max_length);
00742 
00743   <font class="keywordflow">if</font> (!_dbus_string_copy_len (str, start, len, &amp;dest, 0))
00744     {
00745       _dbus_string_free (&amp;dest);
00746       <font class="keywordflow">return</font> FALSE;
00747     }
00748 
00749   <font class="keywordflow">if</font> (!_dbus_string_steal_data (&amp;dest, data_return))
00750     {
00751       _dbus_string_free (&amp;dest);
00752       <font class="keywordflow">return</font> FALSE;
00753     }
00754 
00755   _dbus_string_free (&amp;dest);
00756   <font class="keywordflow">return</font> TRUE;
00757 }
00758 
00764 <font class="keywordtype">int</font>
<a name="l00765"></a><a class="code" href="group__DBusString.html#a23">00765</a> _dbus_string_get_length (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>  *str)
00766 {
00767   DBUS_CONST_STRING_PREAMBLE (str);
00768   
00769   <font class="keywordflow">return</font> real-&gt;len;
00770 }
00771 
00784 dbus_bool_t
<a name="l00785"></a><a class="code" href="group__DBusString.html#a24">00785</a> _dbus_string_lengthen (<a class="code" href="structDBusString.html">DBusString</a> *str,
00786                        <font class="keywordtype">int</font>         additional_length)
00787 {
00788   DBUS_STRING_PREAMBLE (str);  
00789   _dbus_assert (additional_length &gt;= 0);
00790 
00791   <font class="keywordflow">if</font> (additional_length &gt; real-&gt;max_length - real-&gt;len)
00792     <font class="keywordflow">return</font> FALSE; <font class="comment">/* would overflow */</font>
00793   
00794   <font class="keywordflow">return</font> set_length (real,
00795                      real-&gt;len + additional_length);
00796 }
00797 
00804 <font class="keywordtype">void</font>
<a name="l00805"></a><a class="code" href="group__DBusString.html#a25">00805</a> _dbus_string_shorten (<a class="code" href="structDBusString.html">DBusString</a> *str,
00806                       <font class="keywordtype">int</font>         length_to_remove)
00807 {
00808   DBUS_STRING_PREAMBLE (str);
00809   _dbus_assert (length_to_remove &gt;= 0);
00810   _dbus_assert (length_to_remove &lt;= real-&gt;len);
00811 
00812   set_length (real,
00813               real-&gt;len - length_to_remove);
00814 }
00815 
00826 dbus_bool_t
<a name="l00827"></a><a class="code" href="group__DBusString.html#a26">00827</a> _dbus_string_set_length (<a class="code" href="structDBusString.html">DBusString</a> *str,
00828                          <font class="keywordtype">int</font>         length)
00829 {
00830   DBUS_STRING_PREAMBLE (str);
00831   _dbus_assert (length &gt;= 0);
00832 
00833   <font class="keywordflow">return</font> set_length (real, length);
00834 }
00835 
00836 <font class="keyword">static</font> dbus_bool_t
00837 align_length_then_lengthen (<a class="code" href="structDBusString.html">DBusString</a> *str,
00838                             <font class="keywordtype">int</font>         alignment,
00839                             <font class="keywordtype">int</font>         then_lengthen_by)
00840 {
00841   <font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> new_len; <font class="comment">/* ulong to avoid _DBUS_ALIGN_VALUE overflow */</font>
00842   <font class="keywordtype">int</font> delta;
00843   DBUS_STRING_PREAMBLE (str);
00844   _dbus_assert (alignment &gt;= 1);
00845   _dbus_assert (alignment &lt;= 8); /* it has to be a bug if &gt; 8 */
00846 
00847   new_len = _DBUS_ALIGN_VALUE (real-&gt;len, alignment);
00848   <font class="keywordflow">if</font> (new_len &gt; (<font class="keywordtype">unsigned</font> <font class="keywordtype">long</font>) real-&gt;max_length - then_lengthen_by)
00849     <font class="keywordflow">return</font> FALSE;
00850   new_len += then_lengthen_by;
00851   
00852   delta = new_len - real-&gt;len;
00853   _dbus_assert (delta &gt;= 0);
00854 
00855   <font class="keywordflow">if</font> (delta == 0)
00856     <font class="keywordflow">return</font> TRUE;
00857 
00858   <font class="keywordflow">if</font> (!set_length (real, new_len))
00859     <font class="keywordflow">return</font> FALSE;
00860 
00861   <font class="comment">/* delta == padding + then_lengthen_by</font>
00862 <font class="comment">   * new_len == old_len + padding + then_lengthen_by</font>
00863 <font class="comment">   */</font>
00864   <font class="keywordflow">if</font> (then_lengthen_by &lt; delta)
00865     {
00866       <font class="keywordtype">unsigned</font> <font class="keywordtype">int</font> i;
00867       i = new_len - delta;
00868       <font class="keywordflow">while</font> (i &lt; (new_len - then_lengthen_by))
00869         {
00870           real-&gt;str[i] = <font class="charliteral">'\0'</font>;
00871           ++i;
00872         }
00873     }
00874       
00875   <font class="keywordflow">return</font> TRUE;
00876 }
00877 
00886 dbus_bool_t
<a name="l00887"></a><a class="code" href="group__DBusString.html#a28">00887</a> _dbus_string_align_length (<a class="code" href="structDBusString.html">DBusString</a> *str,
00888                            <font class="keywordtype">int</font>         alignment)
00889 {
00890   <font class="keywordflow">return</font> align_length_then_lengthen (str, alignment, 0);
00891 }
00892 
00893 <font class="keyword">static</font> dbus_bool_t
00894 append (<a class="code" href="structDBusRealString.html">DBusRealString</a> *real,
00895         <font class="keyword">const</font> <font class="keywordtype">char</font>     *buffer,
00896         <font class="keywordtype">int</font>             buffer_len)
00897 {
00898   <font class="keywordflow">if</font> (buffer_len == 0)
00899     <font class="keywordflow">return</font> TRUE;
00900 
00901   <font class="keywordflow">if</font> (!_dbus_string_lengthen ((<a class="code" href="structDBusString.html">DBusString</a>*)real, buffer_len))
00902     <font class="keywordflow">return</font> FALSE;
00903 
00904   memcpy (real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> + (real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a> - buffer_len),
00905           buffer,
00906           buffer_len);
00907 
00908   <font class="keywordflow">return</font> TRUE;
00909 }
00910 
00918 dbus_bool_t
<a name="l00919"></a><a class="code" href="group__DBusString.html#a30">00919</a> _dbus_string_append (<a class="code" href="structDBusString.html">DBusString</a> *str,
00920                      <font class="keyword">const</font> <font class="keywordtype">char</font> *buffer)
00921 {
00922   <font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> buffer_len;
00923   
00924   DBUS_STRING_PREAMBLE (str);
00925   _dbus_assert (buffer != NULL);
00926   
00927   buffer_len = strlen (buffer);
00928   <font class="keywordflow">if</font> (buffer_len &gt; (<font class="keywordtype">unsigned</font> <font class="keywordtype">long</font>) real-&gt;<a class="code" href="structDBusRealString.html#m3">max_length</a>)
00929     <font class="keywordflow">return</font> FALSE;
00930   
00931   <font class="keywordflow">return</font> append (real, buffer, buffer_len);
00932 }
00933 
00942 dbus_bool_t
<a name="l00943"></a><a class="code" href="group__DBusString.html#a31">00943</a> _dbus_string_append_4_aligned (<a class="code" href="structDBusString.html">DBusString</a>         *str,
00944                                <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> octets[4])
00945 {
00946   dbus_uint32_t *p;
00947   DBUS_STRING_PREAMBLE (str);
00948   
00949   <font class="keywordflow">if</font> (!align_length_then_lengthen (str, 4, 4))
00950     <font class="keywordflow">return</font> FALSE;
00951 
00952   p = (dbus_uint32_t*) (real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> + (real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a> - 4));
00953   *p = *((dbus_uint32_t*)octets);
00954 
00955   <font class="keywordflow">return</font> TRUE;
00956 }
00957 
00966 dbus_bool_t
<a name="l00967"></a><a class="code" href="group__DBusString.html#a32">00967</a> _dbus_string_append_8_aligned (<a class="code" href="structDBusString.html">DBusString</a>         *str,
00968                                <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> octets[8])
00969 {
00970 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
00971 <font class="preprocessor"></font>  dbus_uint64_t *p;
00972   DBUS_STRING_PREAMBLE (str);
00973   
00974   <font class="keywordflow">if</font> (!align_length_then_lengthen (str, 8, 8))
00975     <font class="keywordflow">return</font> FALSE;
00976 
00977   p = (dbus_uint64_t*) (real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> + (real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a> - 8));
00978   *p = *((dbus_uint64_t*)octets);
00979 <font class="preprocessor">#else</font>
00980 <font class="preprocessor"></font>  <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *p;
00981   DBUS_STRING_PREAMBLE (str);
00982   
00983   <font class="keywordflow">if</font> (!align_length_then_lengthen (str, 8, 8))
00984     <font class="keywordflow">return</font> FALSE;
00985 
00986   p = real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> + (real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a> - 8);
00987   
00988   *p++ = octets[0];
00989   *p++ = octets[1];
00990   *p++ = octets[2];
00991   *p++ = octets[3];
00992   *p++ = octets[4];
00993   *p++ = octets[5];
00994   *p++ = octets[6];
00995   *p++ = octets[7];
00996   _dbus_assert (p == (real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> + real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a>));
00997 <font class="preprocessor">#endif</font>
00998 <font class="preprocessor"></font>
00999   <font class="keywordflow">return</font> TRUE;
01000 }
01001 
01011 dbus_bool_t
<a name="l01012"></a><a class="code" href="group__DBusString.html#a33">01012</a> _dbus_string_append_printf_valist  (<a class="code" href="structDBusString.html">DBusString</a>        *str,
01013                                     <font class="keyword">const</font> <font class="keywordtype">char</font>        *format,
01014                                     va_list            args)
01015 {
01016   <font class="keywordtype">int</font> len;
01017   <font class="keywordtype">char</font> c;
01018   va_list args_copy;
01019 
01020   DBUS_STRING_PREAMBLE (str);
01021 
01022   DBUS_VA_COPY (args_copy, args);
01023 
01024   <font class="comment">/* Measure the message length without terminating nul */</font>
01025   len = vsnprintf (&amp;c, 1, format, args);
01026 
01027   <font class="keywordflow">if</font> (!_dbus_string_lengthen (str, len))
01028     {
01029       <font class="comment">/* don't leak the copy */</font>
01030       va_end (args_copy);
01031       <font class="keywordflow">return</font> FALSE;
01032     }
01033   
01034   vsprintf (real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> + (real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a> - len),
01035             format, args_copy);
01036 
01037   va_end (args_copy);
01038 
01039   <font class="keywordflow">return</font> TRUE;
01040 }
01041 
01050 dbus_bool_t
<a name="l01051"></a><a class="code" href="group__DBusString.html#a34">01051</a> _dbus_string_append_printf (<a class="code" href="structDBusString.html">DBusString</a>        *str,
01052                             <font class="keyword">const</font> <font class="keywordtype">char</font>        *format,
01053                             ...)
01054 {
01055   va_list args;
01056   dbus_bool_t retval;
01057   
01058   va_start (args, format);
01059   retval = _dbus_string_append_printf_valist (str, format, args);
01060   va_end (args);
01061 
01062   <font class="keywordflow">return</font> retval;
01063 }
01064 
01073 dbus_bool_t
<a name="l01074"></a><a class="code" href="group__DBusString.html#a35">01074</a> _dbus_string_append_len (<a class="code" href="structDBusString.html">DBusString</a> *str,
01075                          <font class="keyword">const</font> <font class="keywordtype">char</font> *buffer,
01076                          <font class="keywordtype">int</font>         len)
01077 {
01078   DBUS_STRING_PREAMBLE (str);
01079   _dbus_assert (buffer != NULL);
01080   _dbus_assert (len &gt;= 0);
01081 
01082   <font class="keywordflow">return</font> append (real, buffer, len);
01083 }
01084 
01093 dbus_bool_t
<a name="l01094"></a><a class="code" href="group__DBusString.html#a36">01094</a> _dbus_string_append_byte (<a class="code" href="structDBusString.html">DBusString</a>    *str,
01095                           <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>  byte)
01096 {
01097   DBUS_STRING_PREAMBLE (str);
01098 
01099   <font class="keywordflow">if</font> (!set_length (real, real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a> + 1))
01100     <font class="keywordflow">return</font> FALSE;
01101 
01102   real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a>[real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a>-1] = byte;
01103 
01104   <font class="keywordflow">return</font> TRUE;
01105 }
01106 
01114 dbus_bool_t
<a name="l01115"></a><a class="code" href="group__DBusString.html#a37">01115</a> _dbus_string_append_unichar (<a class="code" href="structDBusString.html">DBusString</a>    *str,
01116                              dbus_unichar_t ch)
01117 {
01118   <font class="keywordtype">int</font> len;
01119   <font class="keywordtype">int</font> first;
01120   <font class="keywordtype">int</font> i;
01121   <font class="keywordtype">char</font> *out;
01122   
01123   DBUS_STRING_PREAMBLE (str);
01124 
01125   <font class="comment">/* this code is from GLib but is pretty standard I think */</font>
01126   
01127   len = 0;
01128   
01129   <font class="keywordflow">if</font> (ch &lt; 0x80)
01130     {
01131       first = 0;
01132       len = 1;
01133     }
01134   <font class="keywordflow">else</font> <font class="keywordflow">if</font> (ch &lt; 0x800)
01135     {
01136       first = 0xc0;
01137       len = 2;
01138     }
01139   <font class="keywordflow">else</font> <font class="keywordflow">if</font> (ch &lt; 0x10000)
01140     {
01141       first = 0xe0;
01142       len = 3;
01143     }
01144    <font class="keywordflow">else</font> <font class="keywordflow">if</font> (ch &lt; 0x200000)
01145     {
01146       first = 0xf0;
01147       len = 4;
01148     }
01149   <font class="keywordflow">else</font> <font class="keywordflow">if</font> (ch &lt; 0x4000000)
01150     {
01151       first = 0xf8;
01152       len = 5;
01153     }
01154   <font class="keywordflow">else</font>
01155     {
01156       first = 0xfc;
01157       len = 6;
01158     }
01159 
01160   <font class="keywordflow">if</font> (len &gt; (real-&gt;<a class="code" href="structDBusRealString.html#m3">max_length</a> - real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a>))
01161     <font class="keywordflow">return</font> FALSE; <font class="comment">/* real-&gt;len + len would overflow */</font>
01162   
01163   <font class="keywordflow">if</font> (!set_length (real, real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a> + len))
01164     <font class="keywordflow">return</font> FALSE;
01165 
01166   out = real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> + (real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a> - len);
01167   
01168   <font class="keywordflow">for</font> (i = len - 1; i &gt; 0; --i)
01169     {
01170       out[i] = (ch &amp; 0x3f) | 0x80;
01171       ch &gt;&gt;= 6;
01172     }
01173   out[0] = ch | first;
01174 
01175   <font class="keywordflow">return</font> TRUE;
01176 }
01177 
01178 <font class="keyword">static</font> <font class="keywordtype">void</font>
01179 <font class="keyword">delete</font> (<a class="code" href="structDBusRealString.html">DBusRealString</a> *real,
01180         <font class="keywordtype">int</font>             start,
01181         <font class="keywordtype">int</font>             len)
01182 {
01183   <font class="keywordflow">if</font> (len == 0)
01184     <font class="keywordflow">return</font>;
01185   
01186   memmove (real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> + start, real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> + start + len, real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a> - (start + len));
01187   real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a> -= len;
01188   real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a>[real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a>] = <font class="charliteral">'\0'</font>;
01189 }
01190 
01200 <font class="keywordtype">void</font>
<a name="l01201"></a><a class="code" href="group__DBusString.html#a39">01201</a> _dbus_string_delete (<a class="code" href="structDBusString.html">DBusString</a>       *str,
01202                      <font class="keywordtype">int</font>               start,
01203                      <font class="keywordtype">int</font>               len)
01204 {
01205   DBUS_STRING_PREAMBLE (str);
01206   _dbus_assert (start &gt;= 0);
01207   _dbus_assert (len &gt;= 0);
01208   _dbus_assert (start &lt;= real-&gt;len);
01209   _dbus_assert (len &lt;= real-&gt;len - start);
01210   
01211   <font class="keyword">delete</font> (real, start, len);
01212 }
01213 
01214 <font class="keyword">static</font> dbus_bool_t
01215 copy (<a class="code" href="structDBusRealString.html">DBusRealString</a> *source,
01216       <font class="keywordtype">int</font>             start,
01217       <font class="keywordtype">int</font>             len,
01218       <a class="code" href="structDBusRealString.html">DBusRealString</a> *dest,
01219       <font class="keywordtype">int</font>             insert_at)
01220 {
01221   <font class="keywordflow">if</font> (len == 0)
01222     <font class="keywordflow">return</font> TRUE;
01223 
01224   <font class="keywordflow">if</font> (!open_gap (len, dest, insert_at))
01225     <font class="keywordflow">return</font> FALSE;
01226   
01227   memcpy (dest-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> + insert_at,
01228           source-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> + start,
01229           len);
01230 
01231   <font class="keywordflow">return</font> TRUE;
01232 }
01233 
<a name="l01243"></a><a class="code" href="group__DBusString.html#a83">01243</a> <font class="preprocessor">#define DBUS_STRING_COPY_PREAMBLE(source, start, dest, insert_at)       \</font>
01244 <font class="preprocessor">  DBusRealString *real_source = (DBusRealString*) source;               \</font>
01245 <font class="preprocessor">  DBusRealString *real_dest = (DBusRealString*) dest;                   \</font>
01246 <font class="preprocessor">  _dbus_assert ((source) != (dest));                                    \</font>
01247 <font class="preprocessor">  DBUS_GENERIC_STRING_PREAMBLE (real_source);                           \</font>
01248 <font class="preprocessor">  DBUS_GENERIC_STRING_PREAMBLE (real_dest);                             \</font>
01249 <font class="preprocessor">  _dbus_assert (!real_dest-&gt;constant);                                  \</font>
01250 <font class="preprocessor">  _dbus_assert (!real_dest-&gt;locked);                                    \</font>
01251 <font class="preprocessor">  _dbus_assert ((start) &gt;= 0);                                          \</font>
01252 <font class="preprocessor">  _dbus_assert ((start) &lt;= real_source-&gt;len);                           \</font>
01253 <font class="preprocessor">  _dbus_assert ((insert_at) &gt;= 0);                                      \</font>
01254 <font class="preprocessor">  _dbus_assert ((insert_at) &lt;= real_dest-&gt;len)</font>
01255 <font class="preprocessor"></font>
01266 dbus_bool_t
<a name="l01267"></a><a class="code" href="group__DBusString.html#a41">01267</a> _dbus_string_move (<a class="code" href="structDBusString.html">DBusString</a>       *source,
01268                    <font class="keywordtype">int</font>               start,
01269                    <a class="code" href="structDBusString.html">DBusString</a>       *dest,
01270                    <font class="keywordtype">int</font>               insert_at)
01271 {
01272   <a class="code" href="structDBusRealString.html">DBusRealString</a> *real_source = (<a class="code" href="structDBusRealString.html">DBusRealString</a>*) source;
01273   _dbus_assert (start &lt;= real_source-&gt;len);
01274   
01275   <font class="keywordflow">return</font> _dbus_string_move_len (source, start,
01276                                 real_source-&gt;<a class="code" href="structDBusRealString.html#m1">len</a> - start,
01277                                 dest, insert_at);
01278 }
01279 
01290 dbus_bool_t
<a name="l01291"></a><a class="code" href="group__DBusString.html#a42">01291</a> _dbus_string_copy (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *source,
01292                    <font class="keywordtype">int</font>               start,
01293                    <a class="code" href="structDBusString.html">DBusString</a>       *dest,
01294                    <font class="keywordtype">int</font>               insert_at)
01295 {
01296   DBUS_STRING_COPY_PREAMBLE (source, start, dest, insert_at);
01297 
01298   <font class="keywordflow">return</font> copy (real_source, start,
01299                real_source-&gt;len - start,
01300                real_dest,
01301                insert_at);
01302 }
01303 
01318 dbus_bool_t
<a name="l01319"></a><a class="code" href="group__DBusString.html#a43">01319</a> _dbus_string_move_len (<a class="code" href="structDBusString.html">DBusString</a>       *source,
01320                        <font class="keywordtype">int</font>               start,
01321                        <font class="keywordtype">int</font>               len,
01322                        <a class="code" href="structDBusString.html">DBusString</a>       *dest,
01323                        <font class="keywordtype">int</font>               insert_at)
01324 
01325 {
01326   DBUS_STRING_COPY_PREAMBLE (source, start, dest, insert_at);
01327   _dbus_assert (len &gt;= 0);
01328   _dbus_assert ((start + len) &lt;= real_source-&gt;len);
01329 
01330 
01331   <font class="keywordflow">if</font> (len == 0)
01332     {
01333       <font class="keywordflow">return</font> TRUE;
01334     }
01335   <font class="keywordflow">else</font> <font class="keywordflow">if</font> (start == 0 &amp;&amp;
01336            len == real_source-&gt;len &amp;&amp;
01337            real_dest-&gt;len == 0)
01338     {
01339       <font class="comment">/* Short-circuit moving an entire existing string to an empty string</font>
01340 <font class="comment">       * by just swapping the buffers.</font>
01341 <font class="comment">       */</font>
01342       <font class="comment">/* we assume -&gt;constant doesn't matter as you can't have</font>
01343 <font class="comment">       * a constant string involved in a move.</font>
01344 <font class="comment">       */</font>
01345 <font class="preprocessor">#define ASSIGN_DATA(a, b) do {                  \</font>
01346 <font class="preprocessor">        (a)-&gt;str = (b)-&gt;str;                    \</font>
01347 <font class="preprocessor">        (a)-&gt;len = (b)-&gt;len;                    \</font>
01348 <font class="preprocessor">        (a)-&gt;allocated = (b)-&gt;allocated;        \</font>
01349 <font class="preprocessor">        (a)-&gt;align_offset = (b)-&gt;align_offset;  \</font>
01350 <font class="preprocessor">      } while (0)</font>
01351 <font class="preprocessor"></font>      
01352       <a class="code" href="structDBusRealString.html">DBusRealString</a> tmp;
01353 
01354       ASSIGN_DATA (&amp;tmp, real_source);
01355       ASSIGN_DATA (real_source, real_dest);
01356       ASSIGN_DATA (real_dest, &amp;tmp);
01357 
01358       <font class="keywordflow">return</font> TRUE;
01359     }
01360   <font class="keywordflow">else</font>
01361     {
01362       <font class="keywordflow">if</font> (!copy (real_source, start, len,
01363                  real_dest,
01364                  insert_at))
01365         <font class="keywordflow">return</font> FALSE;
01366       
01367       <font class="keyword">delete</font> (real_source, start,
01368               len);
01369       
01370       <font class="keywordflow">return</font> TRUE;
01371     }
01372 }
01373 
01385 dbus_bool_t
<a name="l01386"></a><a class="code" href="group__DBusString.html#a44">01386</a> _dbus_string_copy_len (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *source,
01387                        <font class="keywordtype">int</font>               start,
01388                        <font class="keywordtype">int</font>               len,
01389                        <a class="code" href="structDBusString.html">DBusString</a>       *dest,
01390                        <font class="keywordtype">int</font>               insert_at)
01391 {
01392   DBUS_STRING_COPY_PREAMBLE (source, start, dest, insert_at);
01393   _dbus_assert (len &gt;= 0);
01394   _dbus_assert (start &lt;= real_source-&gt;len);
01395   _dbus_assert (len &lt;= real_source-&gt;len - start);
01396   
01397   <font class="keywordflow">return</font> copy (real_source, start, len,
01398                real_dest,
01399                insert_at);
01400 }
01401 
01423 dbus_bool_t
<a name="l01424"></a><a class="code" href="group__DBusString.html#a45">01424</a> _dbus_string_replace_len (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *source,
01425                           <font class="keywordtype">int</font>               start,
01426                           <font class="keywordtype">int</font>               len,
01427                           <a class="code" href="structDBusString.html">DBusString</a>       *dest,
01428                           <font class="keywordtype">int</font>               replace_at,
01429                           <font class="keywordtype">int</font>               replace_len)
01430 {
01431   DBUS_STRING_COPY_PREAMBLE (source, start, dest, replace_at);
01432   _dbus_assert (len &gt;= 0);
01433   _dbus_assert (start &lt;= real_source-&gt;len);
01434   _dbus_assert (len &lt;= real_source-&gt;len - start);
01435   _dbus_assert (replace_at &gt;= 0);
01436   _dbus_assert (replace_at &lt;= real_dest-&gt;len);
01437   _dbus_assert (replace_len &lt;= real_dest-&gt;len - replace_at);
01438 
01439   <font class="keywordflow">if</font> (!copy (real_source, start, len,
01440              real_dest, replace_at))
01441     <font class="keywordflow">return</font> FALSE;
01442 
01443   <font class="keyword">delete</font> (real_dest, replace_at + len, replace_len);
01444 
01445   <font class="keywordflow">return</font> TRUE;
01446 }
01447 
01448 <font class="comment">/* Unicode macros and utf8_validate() from GLib Owen Taylor, Havoc</font>
01449 <font class="comment"> * Pennington, and Tom Tromey are the authors and authorized relicense.</font>
01450 <font class="comment"> */</font>
01451 
<a name="l01457"></a><a class="code" href="group__DBusString.html#a84">01457</a> <font class="preprocessor">#define UTF8_COMPUTE(Char, Mask, Len)                                         \</font>
01458 <font class="preprocessor">  if (Char &lt; 128)                                                             \</font>
01459 <font class="preprocessor">    {                                                                         \</font>
01460 <font class="preprocessor">      Len = 1;                                                                \</font>
01461 <font class="preprocessor">      Mask = 0x7f;                                                            \</font>
01462 <font class="preprocessor">    }                                                                         \</font>
01463 <font class="preprocessor">  else if ((Char &amp; 0xe0) == 0xc0)                                             \</font>
01464 <font class="preprocessor">    {                                                                         \</font>
01465 <font class="preprocessor">      Len = 2;                                                                \</font>
01466 <font class="preprocessor">      Mask = 0x1f;                                                            \</font>
01467 <font class="preprocessor">    }                                                                         \</font>
01468 <font class="preprocessor">  else if ((Char &amp; 0xf0) == 0xe0)                                             \</font>
01469 <font class="preprocessor">    {                                                                         \</font>
01470 <font class="preprocessor">      Len = 3;                                                                \</font>
01471 <font class="preprocessor">      Mask = 0x0f;                                                            \</font>
01472 <font class="preprocessor">    }                                                                         \</font>
01473 <font class="preprocessor">  else if ((Char &amp; 0xf8) == 0xf0)                                             \</font>
01474 <font class="preprocessor">    {                                                                         \</font>
01475 <font class="preprocessor">      Len = 4;                                                                \</font>
01476 <font class="preprocessor">      Mask = 0x07;                                                            \</font>
01477 <font class="preprocessor">    }                                                                         \</font>
01478 <font class="preprocessor">  else if ((Char &amp; 0xfc) == 0xf8)                                             \</font>
01479 <font class="preprocessor">    {                                                                         \</font>
01480 <font class="preprocessor">      Len = 5;                                                                \</font>
01481 <font class="preprocessor">      Mask = 0x03;                                                            \</font>
01482 <font class="preprocessor">    }                                                                         \</font>
01483 <font class="preprocessor">  else if ((Char &amp; 0xfe) == 0xfc)                                             \</font>
01484 <font class="preprocessor">    {                                                                         \</font>
01485 <font class="preprocessor">      Len = 6;                                                                \</font>
01486 <font class="preprocessor">      Mask = 0x01;                                                            \</font>
01487 <font class="preprocessor">    }                                                                         \</font>
01488 <font class="preprocessor">  else                                                                        \</font>
01489 <font class="preprocessor">    Len = -1;</font>
01490 <font class="preprocessor"></font>
<a name="l01495"></a><a class="code" href="group__DBusString.html#a85">01495</a> <font class="preprocessor">#define UTF8_LENGTH(Char)              \</font>
01496 <font class="preprocessor">  ((Char) &lt; 0x80 ? 1 :                 \</font>
01497 <font class="preprocessor">   ((Char) &lt; 0x800 ? 2 :               \</font>
01498 <font class="preprocessor">    ((Char) &lt; 0x10000 ? 3 :            \</font>
01499 <font class="preprocessor">     ((Char) &lt; 0x200000 ? 4 :          \</font>
01500 <font class="preprocessor">      ((Char) &lt; 0x4000000 ? 5 : 6)))))</font>
01501 <font class="preprocessor"></font>   
<a name="l01511"></a><a class="code" href="group__DBusString.html#a86">01511</a> <font class="preprocessor">#define UTF8_GET(Result, Chars, Count, Mask, Len)                             \</font>
01512 <font class="preprocessor">  (Result) = (Chars)[0] &amp; (Mask);                                             \</font>
01513 <font class="preprocessor">  for ((Count) = 1; (Count) &lt; (Len); ++(Count))                               \</font>
01514 <font class="preprocessor">    {                                                                         \</font>
01515 <font class="preprocessor">      if (((Chars)[(Count)] &amp; 0xc0) != 0x80)                                  \</font>
01516 <font class="preprocessor">        {                                                                     \</font>
01517 <font class="preprocessor">          (Result) = -1;                                                      \</font>
01518 <font class="preprocessor">          break;                                                              \</font>
01519 <font class="preprocessor">        }                                                                     \</font>
01520 <font class="preprocessor">      (Result) &lt;&lt;= 6;                                                         \</font>
01521 <font class="preprocessor">      (Result) |= ((Chars)[(Count)] &amp; 0x3f);                                  \</font>
01522 <font class="preprocessor">    }</font>
01523 <font class="preprocessor"></font>
<a name="l01529"></a><a class="code" href="group__DBusString.html#a87">01529</a> <font class="preprocessor">#define UNICODE_VALID(Char)                   \</font>
01530 <font class="preprocessor">    ((Char) &lt; 0x110000 &amp;&amp;                     \</font>
01531 <font class="preprocessor">     (((Char) &amp; 0xFFFFF800) != 0xD800) &amp;&amp;     \</font>
01532 <font class="preprocessor">     ((Char) &lt; 0xFDD0 || (Char) &gt; 0xFDEF) &amp;&amp;  \</font>
01533 <font class="preprocessor">     ((Char) &amp; 0xFFFF) != 0xFFFF)</font>
01534 <font class="preprocessor"></font>
01545 <font class="keywordtype">void</font>
<a name="l01546"></a><a class="code" href="group__DBusString.html#a46">01546</a> _dbus_string_get_unichar (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *str,
01547                           <font class="keywordtype">int</font>               start,
01548                           dbus_unichar_t   *ch_return,
01549                           <font class="keywordtype">int</font>              *end_return)
01550 {
01551   <font class="keywordtype">int</font> i, mask, len;
01552   dbus_unichar_t result;
01553   <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> c;
01554   <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *p;
01555   DBUS_CONST_STRING_PREAMBLE (str);
01556   _dbus_assert (start &gt;= 0);
01557   _dbus_assert (start &lt;= real-&gt;len);
01558   
01559   <font class="keywordflow">if</font> (ch_return)
01560     *ch_return = 0;
01561   <font class="keywordflow">if</font> (end_return)
01562     *end_return = real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a>;
01563   
01564   mask = 0;
01565   p = real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> + start;
01566   c = *p;
01567   
01568   UTF8_COMPUTE (c, mask, len);
01569   <font class="keywordflow">if</font> (len == -1)
01570     <font class="keywordflow">return</font>;
01571   UTF8_GET (result, p, i, mask, len);
01572 
01573   <font class="keywordflow">if</font> (result == (dbus_unichar_t)-1)
01574     <font class="keywordflow">return</font>;
01575 
01576   <font class="keywordflow">if</font> (ch_return)
01577     *ch_return = result;
01578   <font class="keywordflow">if</font> (end_return)
01579     *end_return = start + len;
01580 }
01581 
01596 dbus_bool_t
<a name="l01597"></a><a class="code" href="group__DBusString.html#a47">01597</a> _dbus_string_find (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *str,
01598                    <font class="keywordtype">int</font>               start,
01599                    <font class="keyword">const</font> <font class="keywordtype">char</font>       *substr,
01600                    <font class="keywordtype">int</font>              *found)
01601 {
01602   <font class="keywordflow">return</font> _dbus_string_find_to (str, start,
01603                                ((<font class="keyword">const</font> <a class="code" href="structDBusRealString.html">DBusRealString</a>*)str)-&gt;len,
01604                                substr, found);
01605 }
01606 
01623 dbus_bool_t
<a name="l01624"></a><a class="code" href="group__DBusString.html#a48">01624</a> _dbus_string_find_to (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *str,
01625                       <font class="keywordtype">int</font>               start,
01626                       <font class="keywordtype">int</font>               end,
01627                       <font class="keyword">const</font> <font class="keywordtype">char</font>       *substr,
01628                       <font class="keywordtype">int</font>              *found)
01629 {
01630   <font class="keywordtype">int</font> i;
01631   DBUS_CONST_STRING_PREAMBLE (str);
01632   _dbus_assert (substr != NULL);
01633   _dbus_assert (start &lt;= real-&gt;len);
01634   _dbus_assert (start &gt;= 0);
01635   _dbus_assert (substr != NULL);
01636   _dbus_assert (end &lt;= real-&gt;len);
01637   _dbus_assert (start &lt;= end);
01638 
01639   <font class="comment">/* we always "find" an empty string */</font>
01640   <font class="keywordflow">if</font> (*substr == <font class="charliteral">'\0'</font>)
01641     {
01642       <font class="keywordflow">if</font> (found)
01643         *found = start;
01644       <font class="keywordflow">return</font> TRUE;
01645     }
01646 
01647   i = start;
01648   <font class="keywordflow">while</font> (i &lt; end)
01649     {
01650       <font class="keywordflow">if</font> (real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a>[i] == substr[0])
01651         {
01652           <font class="keywordtype">int</font> j = i + 1;
01653           
01654           <font class="keywordflow">while</font> (j &lt; end)
01655             {
01656               <font class="keywordflow">if</font> (substr[j - i] == <font class="charliteral">'\0'</font>)
01657                 <font class="keywordflow">break</font>;
01658               <font class="keywordflow">else</font> <font class="keywordflow">if</font> (real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a>[j] != substr[j - i])
01659                 <font class="keywordflow">break</font>;
01660               
01661               ++j;
01662             }
01663 
01664           <font class="keywordflow">if</font> (substr[j - i] == <font class="charliteral">'\0'</font>)
01665             {
01666               <font class="keywordflow">if</font> (found)
01667                 *found = i;
01668               <font class="keywordflow">return</font> TRUE;
01669             }
01670         }
01671       
01672       ++i;
01673     }
01674 
01675   <font class="keywordflow">if</font> (found)
01676     *found = end;
01677   
01678   <font class="keywordflow">return</font> FALSE;  
01679 }
01680 
01691 dbus_bool_t
<a name="l01692"></a><a class="code" href="group__DBusString.html#a49">01692</a> _dbus_string_find_byte_backward (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>  *str,
01693                                  <font class="keywordtype">int</font>                start,
01694                                  <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>      byte,
01695                                  <font class="keywordtype">int</font>               *found)
01696 {
01697   <font class="keywordtype">int</font> i;
01698   DBUS_CONST_STRING_PREAMBLE (str);
01699   _dbus_assert (start &lt;= real-&gt;len);
01700   _dbus_assert (start &gt;= 0);
01701   _dbus_assert (found != NULL);
01702 
01703   i = start - 1;
01704   <font class="keywordflow">while</font> (i &gt;= 0)
01705     {
01706       <font class="keywordflow">if</font> (real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a>[i] == byte)
01707         <font class="keywordflow">break</font>;
01708       
01709       --i;
01710     }
01711 
01712   <font class="keywordflow">if</font> (found)
01713     *found = i;
01714 
01715   <font class="keywordflow">return</font> i &gt;= 0;
01716 }
01717 
01728 dbus_bool_t
<a name="l01729"></a><a class="code" href="group__DBusString.html#a50">01729</a> _dbus_string_find_blank (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *str,
01730                          <font class="keywordtype">int</font>               start,
01731                          <font class="keywordtype">int</font>              *found)
01732 {
01733   <font class="keywordtype">int</font> i;
01734   DBUS_CONST_STRING_PREAMBLE (str);
01735   _dbus_assert (start &lt;= real-&gt;len);
01736   _dbus_assert (start &gt;= 0);
01737   
01738   i = start;
01739   <font class="keywordflow">while</font> (i &lt; real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a>)
01740     {
01741       <font class="keywordflow">if</font> (real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a>[i] == <font class="charliteral">' '</font> ||
01742           real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a>[i] == <font class="charliteral">'\t'</font>)
01743         {
01744           <font class="keywordflow">if</font> (found)
01745             *found = i;
01746           <font class="keywordflow">return</font> TRUE;
01747         }
01748       
01749       ++i;
01750     }
01751 
01752   <font class="keywordflow">if</font> (found)
01753     *found = real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a>;
01754   
01755   <font class="keywordflow">return</font> FALSE;
01756 }
01757 
01766 <font class="keywordtype">void</font>
<a name="l01767"></a><a class="code" href="group__DBusString.html#a51">01767</a> _dbus_string_skip_blank (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *str,
01768                          <font class="keywordtype">int</font>               start,
01769                          <font class="keywordtype">int</font>              *end)
01770 {
01771   <font class="keywordtype">int</font> i;
01772   DBUS_CONST_STRING_PREAMBLE (str);
01773   _dbus_assert (start &lt;= real-&gt;len);
01774   _dbus_assert (start &gt;= 0);
01775   
01776   i = start;
01777   <font class="keywordflow">while</font> (i &lt; real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a>)
01778     {
01779       <font class="keywordflow">if</font> (!(real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a>[i] == <font class="charliteral">' '</font> ||
01780             real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a>[i] == <font class="charliteral">'\t'</font>))
01781         <font class="keywordflow">break</font>;
01782       
01783       ++i;
01784     }
01785 
01786   _dbus_assert (i == real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a> || !(real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a>[i] == <font class="charliteral">' '</font> ||
01787                                     real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a>[i] == <font class="charliteral">'\t'</font>));
01788   
01789   <font class="keywordflow">if</font> (end)
01790     *end = i;
01791 }
01792 
01801 <font class="keywordtype">void</font>
<a name="l01802"></a><a class="code" href="group__DBusString.html#a52">01802</a> _dbus_string_skip_white (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *str,
01803                          <font class="keywordtype">int</font>               start,
01804                          <font class="keywordtype">int</font>              *end)
01805 {
01806   <font class="keywordtype">int</font> i;
01807   DBUS_CONST_STRING_PREAMBLE (str);
01808   _dbus_assert (start &lt;= real-&gt;len);
01809   _dbus_assert (start &gt;= 0);
01810   
01811   i = start;
01812   <font class="keywordflow">while</font> (i &lt; real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a>)
01813     {
01814       <font class="keywordflow">if</font> (!(real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a>[i] == <font class="charliteral">' '</font> ||
01815             real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a>[i] == <font class="charliteral">'\n'</font> ||
01816             real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a>[i] == <font class="charliteral">'\r'</font> ||
01817             real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a>[i] == <font class="charliteral">'\t'</font>))
01818         <font class="keywordflow">break</font>;
01819       
01820       ++i;
01821     }
01822 
01823   _dbus_assert (i == real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a> || !(real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a>[i] == <font class="charliteral">' '</font> ||
01824                                     real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a>[i] == <font class="charliteral">'\t'</font>));
01825   
01826   <font class="keywordflow">if</font> (end)
01827     *end = i;
01828 }
01829 
01845 dbus_bool_t
<a name="l01846"></a><a class="code" href="group__DBusString.html#a53">01846</a> _dbus_string_pop_line (<a class="code" href="structDBusString.html">DBusString</a> *source,
01847                        <a class="code" href="structDBusString.html">DBusString</a> *dest)
01848 {
01849   <font class="keywordtype">int</font> eol;
01850   dbus_bool_t have_newline;
01851   
01852   _dbus_string_set_length (dest, 0);
01853   
01854   eol = 0;
01855   <font class="keywordflow">if</font> (_dbus_string_find (source, 0, <font class="stringliteral">"\n"</font>, &amp;eol))
01856     {
01857       have_newline = TRUE;
01858       eol += 1; <font class="comment">/* include newline */</font>
01859     }
01860   <font class="keywordflow">else</font>
01861     {
01862       eol = _dbus_string_get_length (source);
01863       have_newline = FALSE;
01864     }
01865 
01866   <font class="keywordflow">if</font> (eol == 0)
01867     <font class="keywordflow">return</font> FALSE; <font class="comment">/* eof */</font>
01868   
01869   <font class="keywordflow">if</font> (!_dbus_string_move_len (source, 0, eol,
01870                               dest, 0))
01871     {
01872       <font class="keywordflow">return</font> FALSE;
01873     }
01874 
01875   <font class="comment">/* dump the newline and the \r if we have one */</font>
01876   <font class="keywordflow">if</font> (have_newline)
01877     {
01878       dbus_bool_t have_cr;
01879       
01880       _dbus_assert (_dbus_string_get_length (dest) &gt; 0);
01881 
01882       <font class="keywordflow">if</font> (_dbus_string_get_length (dest) &gt; 1 &amp;&amp;
01883           _dbus_string_get_byte (dest,
01884                                  _dbus_string_get_length (dest) - 2) == <font class="charliteral">'\r'</font>)
01885         have_cr = TRUE;
01886       <font class="keywordflow">else</font>
01887         have_cr = FALSE;
01888         
01889       _dbus_string_set_length (dest,
01890                                _dbus_string_get_length (dest) -
01891                                (have_cr ? 2 : 1));
01892     }
01893   
01894   <font class="keywordflow">return</font> TRUE;
01895 }
01896 
01903 <font class="keywordtype">void</font>
<a name="l01904"></a><a class="code" href="group__DBusString.html#a54">01904</a> _dbus_string_delete_first_word (<a class="code" href="structDBusString.html">DBusString</a> *str)
01905 {
01906   <font class="keywordtype">int</font> i;
01907   
01908   <font class="keywordflow">if</font> (_dbus_string_find_blank (str, 0, &amp;i))
01909     _dbus_string_skip_blank (str, i, &amp;i);
01910 
01911   _dbus_string_delete (str, 0, i);
01912 }
01913 
01919 <font class="keywordtype">void</font>
<a name="l01920"></a><a class="code" href="group__DBusString.html#a55">01920</a> _dbus_string_delete_leading_blanks (<a class="code" href="structDBusString.html">DBusString</a> *str)
01921 {
01922   <font class="keywordtype">int</font> i;
01923   
01924   _dbus_string_skip_blank (str, 0, &amp;i);
01925 
01926   <font class="keywordflow">if</font> (i &gt; 0)
01927     _dbus_string_delete (str, 0, i);
01928 }
01929 
01939 dbus_bool_t
<a name="l01940"></a><a class="code" href="group__DBusString.html#a56">01940</a> _dbus_string_equal (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *a,
01941                     <font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *b)
01942 {
01943   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *ap;
01944   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *bp;
01945   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *a_end;
01946   <font class="keyword">const</font> <a class="code" href="structDBusRealString.html">DBusRealString</a> *real_a = (<font class="keyword">const</font> <a class="code" href="structDBusRealString.html">DBusRealString</a>*) a;
01947   <font class="keyword">const</font> <a class="code" href="structDBusRealString.html">DBusRealString</a> *real_b = (<font class="keyword">const</font> <a class="code" href="structDBusRealString.html">DBusRealString</a>*) b;
01948   DBUS_GENERIC_STRING_PREAMBLE (real_a);
01949   DBUS_GENERIC_STRING_PREAMBLE (real_b);
01950 
01951   <font class="keywordflow">if</font> (real_a-&gt;<a class="code" href="structDBusRealString.html#m1">len</a> != real_b-&gt;<a class="code" href="structDBusRealString.html#m1">len</a>)
01952     <font class="keywordflow">return</font> FALSE;
01953 
01954   ap = real_a-&gt;<a class="code" href="structDBusRealString.html#m0">str</a>;
01955   bp = real_b-&gt;<a class="code" href="structDBusRealString.html#m0">str</a>;
01956   a_end = real_a-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> + real_a-&gt;<a class="code" href="structDBusRealString.html#m1">len</a>;
01957   <font class="keywordflow">while</font> (ap != a_end)
01958     {
01959       <font class="keywordflow">if</font> (*ap != *bp)
01960         <font class="keywordflow">return</font> FALSE;
01961       
01962       ++ap;
01963       ++bp;
01964     }
01965 
01966   <font class="keywordflow">return</font> TRUE;
01967 }
01968 
01981 dbus_bool_t
<a name="l01982"></a><a class="code" href="group__DBusString.html#a57">01982</a> _dbus_string_equal_len (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *a,
01983                         <font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *b,
01984                         <font class="keywordtype">int</font>               len)
01985 {
01986   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *ap;
01987   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *bp;
01988   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *a_end;
01989   <font class="keyword">const</font> <a class="code" href="structDBusRealString.html">DBusRealString</a> *real_a = (<font class="keyword">const</font> <a class="code" href="structDBusRealString.html">DBusRealString</a>*) a;
01990   <font class="keyword">const</font> <a class="code" href="structDBusRealString.html">DBusRealString</a> *real_b = (<font class="keyword">const</font> <a class="code" href="structDBusRealString.html">DBusRealString</a>*) b;
01991   DBUS_GENERIC_STRING_PREAMBLE (real_a);
01992   DBUS_GENERIC_STRING_PREAMBLE (real_b);
01993 
01994   <font class="keywordflow">if</font> (real_a-&gt;<a class="code" href="structDBusRealString.html#m1">len</a> != real_b-&gt;<a class="code" href="structDBusRealString.html#m1">len</a> &amp;&amp;
01995       (real_a-&gt;<a class="code" href="structDBusRealString.html#m1">len</a> &lt; len || real_b-&gt;<a class="code" href="structDBusRealString.html#m1">len</a> &lt; len))
01996     <font class="keywordflow">return</font> FALSE;
01997 
01998   ap = real_a-&gt;<a class="code" href="structDBusRealString.html#m0">str</a>;
01999   bp = real_b-&gt;<a class="code" href="structDBusRealString.html#m0">str</a>;
02000   a_end = real_a-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> + MIN (real_a-&gt;<a class="code" href="structDBusRealString.html#m1">len</a>, len);
02001   <font class="keywordflow">while</font> (ap != a_end)
02002     {
02003       <font class="keywordflow">if</font> (*ap != *bp)
02004         <font class="keywordflow">return</font> FALSE;
02005       
02006       ++ap;
02007       ++bp;
02008     }
02009 
02010   <font class="keywordflow">return</font> TRUE;
02011 }
02012 
02020 dbus_bool_t
<a name="l02021"></a><a class="code" href="group__DBusString.html#a58">02021</a> _dbus_string_equal_c_str (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *a,
02022                           <font class="keyword">const</font> <font class="keywordtype">char</font>       *c_str)
02023 {
02024   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *ap;
02025   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *bp;
02026   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *a_end;
02027   <font class="keyword">const</font> <a class="code" href="structDBusRealString.html">DBusRealString</a> *real_a = (<font class="keyword">const</font> <a class="code" href="structDBusRealString.html">DBusRealString</a>*) a;
02028   DBUS_GENERIC_STRING_PREAMBLE (real_a);
02029   _dbus_assert (c_str != NULL);
02030   
02031   ap = real_a-&gt;<a class="code" href="structDBusRealString.html#m0">str</a>;
02032   bp = (<font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>*) c_str;
02033   a_end = real_a-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> + real_a-&gt;<a class="code" href="structDBusRealString.html#m1">len</a>;
02034   <font class="keywordflow">while</font> (ap != a_end &amp;&amp; *bp)
02035     {
02036       <font class="keywordflow">if</font> (*ap != *bp)
02037         <font class="keywordflow">return</font> FALSE;
02038       
02039       ++ap;
02040       ++bp;
02041     }
02042 
02043   <font class="keywordflow">if</font> (ap != a_end || *bp)
02044     <font class="keywordflow">return</font> FALSE;
02045   
02046   <font class="keywordflow">return</font> TRUE;
02047 }
02048 
02056 dbus_bool_t
<a name="l02057"></a><a class="code" href="group__DBusString.html#a59">02057</a> _dbus_string_starts_with_c_str (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *a,
02058                                 <font class="keyword">const</font> <font class="keywordtype">char</font>       *c_str)
02059 {
02060   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *ap;
02061   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *bp;
02062   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *a_end;
02063   <font class="keyword">const</font> <a class="code" href="structDBusRealString.html">DBusRealString</a> *real_a = (<font class="keyword">const</font> <a class="code" href="structDBusRealString.html">DBusRealString</a>*) a;
02064   DBUS_GENERIC_STRING_PREAMBLE (real_a);
02065   _dbus_assert (c_str != NULL);
02066   
02067   ap = real_a-&gt;<a class="code" href="structDBusRealString.html#m0">str</a>;
02068   bp = (<font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>*) c_str;
02069   a_end = real_a-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> + real_a-&gt;<a class="code" href="structDBusRealString.html#m1">len</a>;
02070   <font class="keywordflow">while</font> (ap != a_end &amp;&amp; *bp)
02071     {
02072       <font class="keywordflow">if</font> (*ap != *bp)
02073         <font class="keywordflow">return</font> FALSE;
02074       
02075       ++ap;
02076       ++bp;
02077     }
02078 
02079   <font class="keywordflow">if</font> (*bp == <font class="charliteral">'\0'</font>)
02080     <font class="keywordflow">return</font> TRUE;
02081   <font class="keywordflow">else</font>
02082     <font class="keywordflow">return</font> FALSE;
02083 }
02084 
02094 dbus_bool_t
<a name="l02095"></a><a class="code" href="group__DBusString.html#a60">02095</a> _dbus_string_ends_with_c_str (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *a,
02096                               <font class="keyword">const</font> <font class="keywordtype">char</font>       *c_str)
02097 {
02098   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *ap;
02099   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *bp;
02100   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *a_end;
02101   <font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> c_str_len;
02102   <font class="keyword">const</font> <a class="code" href="structDBusRealString.html">DBusRealString</a> *real_a = (<font class="keyword">const</font> <a class="code" href="structDBusRealString.html">DBusRealString</a>*) a;
02103   DBUS_GENERIC_STRING_PREAMBLE (real_a);
02104   _dbus_assert (c_str != NULL);
02105   
02106   c_str_len = strlen (c_str);
02107   <font class="keywordflow">if</font> (((<font class="keywordtype">unsigned</font> <font class="keywordtype">long</font>)real_a-&gt;<a class="code" href="structDBusRealString.html#m1">len</a>) &lt; c_str_len)
02108     <font class="keywordflow">return</font> FALSE;
02109   
02110   ap = real_a-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> + (real_a-&gt;<a class="code" href="structDBusRealString.html#m1">len</a> - c_str_len);
02111   bp = (<font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>*) c_str;
02112   a_end = real_a-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> + real_a-&gt;<a class="code" href="structDBusRealString.html#m1">len</a>;
02113   <font class="keywordflow">while</font> (ap != a_end)
02114     {
02115       <font class="keywordflow">if</font> (*ap != *bp)
02116         <font class="keywordflow">return</font> FALSE;
02117       
02118       ++ap;
02119       ++bp;
02120     }
02121 
02122   _dbus_assert (*ap == <font class="charliteral">'\0'</font>);
02123   _dbus_assert (*bp == <font class="charliteral">'\0'</font>);
02124   
02125   <font class="keywordflow">return</font> TRUE;
02126 }
02127 
02138 dbus_bool_t
<a name="l02139"></a><a class="code" href="group__DBusString.html#a61">02139</a> _dbus_string_hex_encode (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *source,
02140                          <font class="keywordtype">int</font>               start,
02141                          <a class="code" href="structDBusString.html">DBusString</a>       *dest,
02142                          <font class="keywordtype">int</font>               insert_at)
02143 {
02144   <a class="code" href="structDBusString.html">DBusString</a> result;
02145   <font class="keyword">const</font> <font class="keywordtype">char</font> hexdigits[16] = {
02146     <font class="charliteral">'0'</font>, <font class="charliteral">'1'</font>, <font class="charliteral">'2'</font>, <font class="charliteral">'3'</font>, <font class="charliteral">'4'</font>, <font class="charliteral">'5'</font>, <font class="charliteral">'6'</font>, <font class="charliteral">'7'</font>, <font class="charliteral">'8'</font>, <font class="charliteral">'9'</font>,
02147     <font class="charliteral">'a'</font>, <font class="charliteral">'b'</font>, <font class="charliteral">'c'</font>, <font class="charliteral">'d'</font>, <font class="charliteral">'e'</font>, <font class="charliteral">'f'</font>
02148   };
02149   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *p;
02150   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *end;
02151   dbus_bool_t retval;
02152   
02153   _dbus_assert (start &lt;= _dbus_string_get_length (source));
02154 
02155   <font class="keywordflow">if</font> (!_dbus_string_init (&amp;result))
02156     <font class="keywordflow">return</font> FALSE;
02157 
02158   retval = FALSE;
02159   
02160   p = (<font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>*) _dbus_string_get_const_data (source);
02161   end = p + _dbus_string_get_length (source);
02162   p += start;
02163   
02164   <font class="keywordflow">while</font> (p != end)
02165     {
02166       <font class="keywordflow">if</font> (!_dbus_string_append_byte (&amp;result,
02167                                      hexdigits[(*p &gt;&gt; 4)]))
02168         <font class="keywordflow">goto</font> out;
02169       
02170       <font class="keywordflow">if</font> (!_dbus_string_append_byte (&amp;result,
02171                                      hexdigits[(*p &amp; 0x0f)]))
02172         <font class="keywordflow">goto</font> out;
02173 
02174       ++p;
02175     }
02176 
02177   <font class="keywordflow">if</font> (!_dbus_string_move (&amp;result, 0, dest, insert_at))
02178     <font class="keywordflow">goto</font> out;
02179 
02180   retval = TRUE;
02181 
02182  out:
02183   _dbus_string_free (&amp;result);
02184   <font class="keywordflow">return</font> retval;
02185 }
02186 
02197 dbus_bool_t
<a name="l02198"></a><a class="code" href="group__DBusString.html#a62">02198</a> _dbus_string_hex_decode (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *source,
02199                          <font class="keywordtype">int</font>               start,
02200                          <font class="keywordtype">int</font>              *end_return,
02201                          <a class="code" href="structDBusString.html">DBusString</a>       *dest,
02202                          <font class="keywordtype">int</font>               insert_at)
02203 {
02204   <a class="code" href="structDBusString.html">DBusString</a> result;
02205   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *p;
02206   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *end;
02207   dbus_bool_t retval;
02208   dbus_bool_t high_bits;
02209   
02210   _dbus_assert (start &lt;= _dbus_string_get_length (source));
02211 
02212   <font class="keywordflow">if</font> (!_dbus_string_init (&amp;result))
02213     <font class="keywordflow">return</font> FALSE;
02214 
02215   retval = FALSE;
02216 
02217   high_bits = TRUE;
02218   p = (<font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>*) _dbus_string_get_const_data (source);
02219   end = p + _dbus_string_get_length (source);
02220   p += start;
02221   
02222   <font class="keywordflow">while</font> (p != end)
02223     {
02224       <font class="keywordtype">unsigned</font> <font class="keywordtype">int</font> val;
02225 
02226       <font class="keywordflow">switch</font> (*p)
02227         {
02228         <font class="keywordflow">case</font> <font class="charliteral">'0'</font>:
02229           val = 0;
02230           <font class="keywordflow">break</font>;
02231         <font class="keywordflow">case</font> <font class="charliteral">'1'</font>:
02232           val = 1;
02233           <font class="keywordflow">break</font>;
02234         <font class="keywordflow">case</font> <font class="charliteral">'2'</font>:
02235           val = 2;
02236           <font class="keywordflow">break</font>;
02237         <font class="keywordflow">case</font> <font class="charliteral">'3'</font>:
02238           val = 3;
02239           <font class="keywordflow">break</font>;
02240         <font class="keywordflow">case</font> <font class="charliteral">'4'</font>:
02241           val = 4;
02242           <font class="keywordflow">break</font>;
02243         <font class="keywordflow">case</font> <font class="charliteral">'5'</font>:
02244           val = 5;
02245           <font class="keywordflow">break</font>;
02246         <font class="keywordflow">case</font> <font class="charliteral">'6'</font>:
02247           val = 6;
02248           <font class="keywordflow">break</font>;
02249         <font class="keywordflow">case</font> <font class="charliteral">'7'</font>:
02250           val = 7;
02251           <font class="keywordflow">break</font>;
02252         <font class="keywordflow">case</font> <font class="charliteral">'8'</font>:
02253           val = 8;
02254           <font class="keywordflow">break</font>;
02255         <font class="keywordflow">case</font> <font class="charliteral">'9'</font>:
02256           val = 9;
02257           <font class="keywordflow">break</font>;
02258         <font class="keywordflow">case</font> <font class="charliteral">'a'</font>:
02259         <font class="keywordflow">case</font> <font class="charliteral">'A'</font>:
02260           val = 10;
02261           <font class="keywordflow">break</font>;
02262         <font class="keywordflow">case</font> <font class="charliteral">'b'</font>:
02263         <font class="keywordflow">case</font> <font class="charliteral">'B'</font>:
02264           val = 11;
02265           <font class="keywordflow">break</font>;
02266         <font class="keywordflow">case</font> <font class="charliteral">'c'</font>:
02267         <font class="keywordflow">case</font> <font class="charliteral">'C'</font>:
02268           val = 12;
02269           <font class="keywordflow">break</font>;
02270         <font class="keywordflow">case</font> <font class="charliteral">'d'</font>:
02271         <font class="keywordflow">case</font> <font class="charliteral">'D'</font>:
02272           val = 13;
02273           <font class="keywordflow">break</font>;
02274         <font class="keywordflow">case</font> <font class="charliteral">'e'</font>:
02275         <font class="keywordflow">case</font> <font class="charliteral">'E'</font>:
02276           val = 14;
02277           <font class="keywordflow">break</font>;
02278         <font class="keywordflow">case</font> <font class="charliteral">'f'</font>:
02279         <font class="keywordflow">case</font> <font class="charliteral">'F'</font>:
02280           val = 15;
02281           <font class="keywordflow">break</font>;
02282         <font class="keywordflow">default</font>:
02283           <font class="keywordflow">goto</font> done;
02284         }
02285 
02286       <font class="keywordflow">if</font> (high_bits)
02287         {
02288           <font class="keywordflow">if</font> (!_dbus_string_append_byte (&amp;result,
02289                                          val &lt;&lt; 4))
02290             <font class="keywordflow">goto</font> out;
02291         }
02292       <font class="keywordflow">else</font>
02293         {
02294           <font class="keywordtype">int</font> len;
02295           <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> b;
02296 
02297           len = _dbus_string_get_length (&amp;result);
02298           
02299           b = _dbus_string_get_byte (&amp;result, len - 1);
02300 
02301           b |= val;
02302 
02303           _dbus_string_set_byte (&amp;result, len - 1, b);
02304         }
02305 
02306       high_bits = !high_bits;
02307 
02308       ++p;
02309     }
02310 
02311  done:
02312   <font class="keywordflow">if</font> (!_dbus_string_move (&amp;result, 0, dest, insert_at))
02313     <font class="keywordflow">goto</font> out;
02314 
02315   <font class="keywordflow">if</font> (end_return)
02316     *end_return = p - (<font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>*) _dbus_string_get_const_data (source);
02317 
02318   retval = TRUE;
02319   
02320  out:
02321   _dbus_string_free (&amp;result);  
02322   <font class="keywordflow">return</font> retval;
02323 }
02324 
02338 dbus_bool_t
<a name="l02339"></a><a class="code" href="group__DBusString.html#a63">02339</a> _dbus_string_validate_ascii (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *str,
02340                              <font class="keywordtype">int</font>               start,
02341                              <font class="keywordtype">int</font>               len)
02342 {
02343   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *s;
02344   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *end;
02345   DBUS_CONST_STRING_PREAMBLE (str);
02346   _dbus_assert (start &gt;= 0);
02347   _dbus_assert (start &lt;= real-&gt;len);
02348   _dbus_assert (len &gt;= 0);
02349   
02350   <font class="keywordflow">if</font> (len &gt; real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a> - start)
02351     <font class="keywordflow">return</font> FALSE;
02352   
02353   s = real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> + start;
02354   end = s + len;
02355   <font class="keywordflow">while</font> (s != end)
02356     {
02357       <font class="keywordflow">if</font> (_DBUS_UNLIKELY (*s == <font class="charliteral">'\0'</font> ||
02358                           ((*s &amp; ~0x7f) != 0)))
02359         <font class="keywordflow">return</font> FALSE;
02360         
02361       ++s;
02362     }
02363   
02364   <font class="keywordflow">return</font> TRUE;
02365 }
02366 
02382 dbus_bool_t
<a name="l02383"></a><a class="code" href="group__DBusString.html#a64">02383</a> _dbus_string_validate_utf8  (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *str,
02384                              <font class="keywordtype">int</font>               start,
02385                              <font class="keywordtype">int</font>               len)
02386 {
02387   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *p;
02388   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *end;
02389   DBUS_CONST_STRING_PREAMBLE (str);
02390   _dbus_assert (start &gt;= 0);
02391   _dbus_assert (start &lt;= real-&gt;len);
02392   _dbus_assert (len &gt;= 0);
02393 
02394   <font class="comment">/* we are doing _DBUS_UNLIKELY() here which might be</font>
02395 <font class="comment">   * dubious in a generic library like GLib, but in D-BUS</font>
02396 <font class="comment">   * we know we're validating messages and that it would</font>
02397 <font class="comment">   * only be evil/broken apps that would have invalid</font>
02398 <font class="comment">   * UTF-8. Also, this function seems to be a performance</font>
02399 <font class="comment">   * bottleneck in profiles.</font>
02400 <font class="comment">   */</font>
02401   
02402   <font class="keywordflow">if</font> (_DBUS_UNLIKELY (len &gt; real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a> - start))
02403     <font class="keywordflow">return</font> FALSE;
02404   
02405   p = real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> + start;
02406   end = p + len;
02407   
02408   <font class="keywordflow">while</font> (p &lt; end)
02409     {
02410       <font class="keywordtype">int</font> i, mask = 0, char_len;
02411       dbus_unichar_t result;
02412       <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> c = (<font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>) *p;
02413       
02414       UTF8_COMPUTE (c, mask, char_len);
02415 
02416       <font class="keywordflow">if</font> (_DBUS_UNLIKELY (char_len == -1))
02417         <font class="keywordflow">break</font>;
02418 
02419       <font class="comment">/* check that the expected number of bytes exists in the remaining length */</font>
02420       <font class="keywordflow">if</font> (_DBUS_UNLIKELY ((end - p) &lt; char_len))
02421         <font class="keywordflow">break</font>;
02422         
02423       UTF8_GET (result, p, i, mask, char_len);
02424 
02425       <font class="keywordflow">if</font> (_DBUS_UNLIKELY (UTF8_LENGTH (result) != char_len)) <font class="comment">/* Check for overlong UTF-8 */</font>
02426         <font class="keywordflow">break</font>;
02427 
02428       <font class="keywordflow">if</font> (_DBUS_UNLIKELY (result == (dbus_unichar_t)-1))
02429         <font class="keywordflow">break</font>;
02430 
02431       <font class="keywordflow">if</font> (_DBUS_UNLIKELY (!UNICODE_VALID (result)))
02432         <font class="keywordflow">break</font>;
02433       
02434       p += char_len;
02435     }
02436 
02437   <font class="comment">/* See that we covered the entire length if a length was</font>
02438 <font class="comment">   * passed in</font>
02439 <font class="comment">   */</font>
02440   <font class="keywordflow">if</font> (_DBUS_UNLIKELY (p != end))
02441     <font class="keywordflow">return</font> FALSE;
02442   <font class="keywordflow">else</font>
02443     <font class="keywordflow">return</font> TRUE;
02444 }
02445 
02459 dbus_bool_t
<a name="l02460"></a><a class="code" href="group__DBusString.html#a65">02460</a> _dbus_string_validate_nul (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *str,
02461                            <font class="keywordtype">int</font>               start,
02462                            <font class="keywordtype">int</font>               len)
02463 {
02464   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *s;
02465   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *end;
02466   DBUS_CONST_STRING_PREAMBLE (str);
02467   _dbus_assert (start &gt;= 0);
02468   _dbus_assert (len &gt;= 0);
02469   _dbus_assert (start &lt;= real-&gt;len);
02470   
02471   <font class="keywordflow">if</font> (len &gt; real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a> - start)
02472     <font class="keywordflow">return</font> FALSE;
02473   
02474   s = real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> + start;
02475   end = s + len;
02476   <font class="keywordflow">while</font> (s != end)
02477     {
02478       <font class="keywordflow">if</font> (_DBUS_UNLIKELY (*s != <font class="charliteral">'\0'</font>))
02479         <font class="keywordflow">return</font> FALSE;
02480       ++s;
02481     }
02482   
02483   <font class="keywordflow">return</font> TRUE;
02484 }
02485 
02503 dbus_bool_t
<a name="l02504"></a><a class="code" href="group__DBusString.html#a66">02504</a> _dbus_string_validate_path (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>  *str,
02505                             <font class="keywordtype">int</font>                start,
02506                             <font class="keywordtype">int</font>                len)
02507 {
02508   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *s;
02509   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *end;
02510   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *last_slash;
02511   
02512   DBUS_CONST_STRING_PREAMBLE (str);
02513   _dbus_assert (start &gt;= 0);
02514   _dbus_assert (len &gt;= 0);
02515   _dbus_assert (start &lt;= real-&gt;len);
02516   
02517   <font class="keywordflow">if</font> (len &gt; real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a> - start)
02518     <font class="keywordflow">return</font> FALSE;
02519 
02520   <font class="keywordflow">if</font> (len &gt; DBUS_MAXIMUM_NAME_LENGTH)
02521     <font class="keywordflow">return</font> FALSE;
02522 
02523   <font class="keywordflow">if</font> (len == 0)
02524     <font class="keywordflow">return</font> FALSE;
02525 
02526   s = real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> + start;
02527   end = s + len;
02528 
02529   <font class="keywordflow">if</font> (*s != <font class="charliteral">'/'</font>)
02530     <font class="keywordflow">return</font> FALSE;
02531   last_slash = s;
02532   ++s;
02533   
02534   <font class="keywordflow">while</font> (s != end)
02535     {
02536       <font class="keywordflow">if</font> (*s == <font class="charliteral">'/'</font>)
02537         {
02538           <font class="keywordflow">if</font> ((s - last_slash) &lt; 2)
02539             <font class="keywordflow">return</font> FALSE; <font class="comment">/* no empty path components allowed */</font>
02540 
02541           last_slash = s;
02542         }
02543       
02544       ++s;
02545     }
02546 
02547   <font class="keywordflow">if</font> ((end - last_slash) &lt; 2 &amp;&amp;
02548       len &gt; 1)
02549     <font class="keywordflow">return</font> FALSE; <font class="comment">/* trailing slash not allowed unless the string is "/" */</font>
02550   
02551   <font class="keywordflow">return</font> TRUE;
02552 }
02553 
<a name="l02558"></a><a class="code" href="group__DBusString.html#a88">02558</a> <font class="preprocessor">#define VALID_INITIAL_NAME_CHARACTER(c)         \</font>
02559 <font class="preprocessor">  ( ((c) &gt;= 'A' &amp;&amp; (c) &lt;= 'Z') ||               \</font>
02560 <font class="preprocessor">    ((c) &gt;= 'a' &amp;&amp; (c) &lt;= 'z') ||               \</font>
02561 <font class="preprocessor">    ((c) == '_') )</font>
02562 <font class="preprocessor"></font>
<a name="l02567"></a><a class="code" href="group__DBusString.html#a89">02567</a> <font class="preprocessor">#define VALID_NAME_CHARACTER(c)                 \</font>
02568 <font class="preprocessor">  ( ((c) &gt;= '0' &amp;&amp; (c) &lt;= '9') ||               \</font>
02569 <font class="preprocessor">    ((c) &gt;= 'A' &amp;&amp; (c) &lt;= 'Z') ||               \</font>
02570 <font class="preprocessor">    ((c) &gt;= 'a' &amp;&amp; (c) &lt;= 'z') ||               \</font>
02571 <font class="preprocessor">    ((c) == '_') )</font>
02572 <font class="preprocessor"></font>
02586 dbus_bool_t
<a name="l02587"></a><a class="code" href="group__DBusString.html#a67">02587</a> _dbus_string_validate_interface (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>  *str,
02588                                  <font class="keywordtype">int</font>                start,
02589                                  <font class="keywordtype">int</font>                len)
02590 {  
02591   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *s;
02592   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *end;
02593   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *iface;
02594   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *last_dot;
02595   
02596   DBUS_CONST_STRING_PREAMBLE (str);
02597   _dbus_assert (start &gt;= 0);
02598   _dbus_assert (len &gt;= 0);
02599   _dbus_assert (start &lt;= real-&gt;len);
02600   
02601   <font class="keywordflow">if</font> (len &gt; real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a> - start)
02602     <font class="keywordflow">return</font> FALSE;
02603 
02604   <font class="keywordflow">if</font> (len &gt; DBUS_MAXIMUM_NAME_LENGTH)
02605     <font class="keywordflow">return</font> FALSE;
02606 
02607   <font class="keywordflow">if</font> (len == 0)
02608     <font class="keywordflow">return</font> FALSE;
02609 
02610   last_dot = NULL;
02611   iface = real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> + start;
02612   end = iface + len;
02613   s = iface;
02614 
02615   <font class="comment">/* check special cases of first char so it doesn't have to be done</font>
02616 <font class="comment">   * in the loop. Note we know len &gt; 0</font>
02617 <font class="comment">   */</font>
02618   <font class="keywordflow">if</font> (_DBUS_UNLIKELY (*s == <font class="charliteral">'.'</font>)) <font class="comment">/* disallow starting with a . */</font>
02619     <font class="keywordflow">return</font> FALSE;
02620   <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_DBUS_UNLIKELY (!VALID_INITIAL_NAME_CHARACTER (*s)))
02621     <font class="keywordflow">return</font> FALSE;
02622   <font class="keywordflow">else</font>
02623     ++s;
02624   
02625   <font class="keywordflow">while</font> (s != end)
02626     {
02627       <font class="keywordflow">if</font> (*s == <font class="charliteral">'.'</font>)
02628         {
02629           <font class="keywordflow">if</font> (_DBUS_UNLIKELY ((s + 1) == end))
02630             <font class="keywordflow">return</font> FALSE;
02631           <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_DBUS_UNLIKELY (!VALID_INITIAL_NAME_CHARACTER (*(s + 1))))
02632             <font class="keywordflow">return</font> FALSE;
02633           last_dot = s;
02634           ++s; <font class="comment">/* we just validated the next char, so skip two */</font>
02635         }
02636       <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_DBUS_UNLIKELY (!VALID_NAME_CHARACTER (*s)))
02637         {
02638           <font class="keywordflow">return</font> FALSE;
02639         }
02640       
02641       ++s;
02642     }
02643 
02644   <font class="keywordflow">if</font> (_DBUS_UNLIKELY (last_dot == NULL))
02645     <font class="keywordflow">return</font> FALSE;
02646   
02647   <font class="keywordflow">return</font> TRUE;
02648 }
02649 
02663 dbus_bool_t
<a name="l02664"></a><a class="code" href="group__DBusString.html#a68">02664</a> _dbus_string_validate_member (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>  *str,
02665                               <font class="keywordtype">int</font>                start,
02666                               <font class="keywordtype">int</font>                len)
02667 {
02668   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *s;
02669   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *end;
02670   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *member;
02671   
02672   DBUS_CONST_STRING_PREAMBLE (str);
02673   _dbus_assert (start &gt;= 0);
02674   _dbus_assert (len &gt;= 0);
02675   _dbus_assert (start &lt;= real-&gt;len);
02676   
02677   <font class="keywordflow">if</font> (len &gt; real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a> - start)
02678     <font class="keywordflow">return</font> FALSE;
02679 
02680   <font class="keywordflow">if</font> (len &gt; DBUS_MAXIMUM_NAME_LENGTH)
02681     <font class="keywordflow">return</font> FALSE;
02682 
02683   <font class="keywordflow">if</font> (len == 0)
02684     <font class="keywordflow">return</font> FALSE;
02685 
02686   member = real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> + start;
02687   end = member + len;
02688   s = member;
02689 
02690   <font class="comment">/* check special cases of first char so it doesn't have to be done</font>
02691 <font class="comment">   * in the loop. Note we know len &gt; 0</font>
02692 <font class="comment">   */</font>
02693 
02694   <font class="keywordflow">if</font> (_DBUS_UNLIKELY (!VALID_INITIAL_NAME_CHARACTER (*s)))
02695     <font class="keywordflow">return</font> FALSE;
02696   <font class="keywordflow">else</font>
02697     ++s;
02698   
02699   <font class="keywordflow">while</font> (s != end)
02700     {
02701       <font class="keywordflow">if</font> (_DBUS_UNLIKELY (!VALID_NAME_CHARACTER (*s)))
02702         {
02703           <font class="keywordflow">return</font> FALSE;
02704         }
02705       
02706       ++s;
02707     }
02708   
02709   <font class="keywordflow">return</font> TRUE;
02710 }
02711 
02725 dbus_bool_t
<a name="l02726"></a><a class="code" href="group__DBusString.html#a69">02726</a> _dbus_string_validate_error_name (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>  *str,
02727                                   <font class="keywordtype">int</font>                start,
02728                                   <font class="keywordtype">int</font>                len)
02729 {
02730   <font class="comment">/* Same restrictions as interface name at the moment */</font>
02731   <font class="keywordflow">return</font> _dbus_string_validate_interface (str, start, len);
02732 }
02733 
02734 <font class="comment">/* This assumes the first char exists and is ':' */</font>
02735 <font class="keyword">static</font> dbus_bool_t
02736 _dbus_string_validate_base_service (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>  *str,
02737                                     <font class="keywordtype">int</font>                start,
02738                                     <font class="keywordtype">int</font>                len)
02739 {
02740   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *s;
02741   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *end;
02742   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *service;
02743   
02744   DBUS_CONST_STRING_PREAMBLE (str);
02745   _dbus_assert (start &gt;= 0);
02746   _dbus_assert (len &gt;= 0);
02747   _dbus_assert (start &lt;= real-&gt;len);
02748   
02749   <font class="keywordflow">if</font> (len &gt; real-&gt;<a class="code" href="structDBusRealString.html#m1">len</a> - start)
02750     <font class="keywordflow">return</font> FALSE;
02751 
02752   <font class="keywordflow">if</font> (len &gt; DBUS_MAXIMUM_NAME_LENGTH)
02753     <font class="keywordflow">return</font> FALSE;
02754 
02755   _dbus_assert (len &gt; 0);
02756 
02757   service = real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> + start;
02758   end = service + len;
02759   _dbus_assert (*service == <font class="charliteral">':'</font>);
02760   s = service + 1;
02761   
02762   <font class="keywordflow">while</font> (s != end)
02763     {
02764       <font class="keywordflow">if</font> (*s == <font class="charliteral">'.'</font>)
02765         {
02766           <font class="keywordflow">if</font> (_DBUS_UNLIKELY ((s + 1) == end))
02767             <font class="keywordflow">return</font> FALSE;
02768           <font class="keywordflow">if</font> (_DBUS_UNLIKELY (!VALID_NAME_CHARACTER (*(s + 1))))
02769             <font class="keywordflow">return</font> FALSE;
02770           ++s; <font class="comment">/* we just validated the next char, so skip two */</font>
02771         }
02772       <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_DBUS_UNLIKELY (!VALID_NAME_CHARACTER (*s)))
02773         {
02774           <font class="keywordflow">return</font> FALSE;
02775         }
02776       
02777       ++s;
02778     }
02779   
02780   <font class="keywordflow">return</font> TRUE;
02781 }
02782 
02796 dbus_bool_t
<a name="l02797"></a><a class="code" href="group__DBusString.html#a71">02797</a> _dbus_string_validate_service (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>  *str,
02798                                <font class="keywordtype">int</font>                start,
02799                                <font class="keywordtype">int</font>                len)
02800 {
02801   <font class="keywordflow">if</font> (_DBUS_UNLIKELY (len == 0))
02802     <font class="keywordflow">return</font> FALSE;
02803   <font class="keywordflow">if</font> (_dbus_string_get_byte (str, start) == <font class="charliteral">':'</font>)
02804     <font class="keywordflow">return</font> _dbus_string_validate_base_service (str, start, len);
02805   <font class="keywordflow">else</font>
02806     <font class="keywordflow">return</font> _dbus_string_validate_interface (str, start, len);
02807 }
02808 
02814 <font class="keywordtype">void</font>
<a name="l02815"></a><a class="code" href="group__DBusString.html#a72">02815</a> _dbus_string_zero (<a class="code" href="structDBusString.html">DBusString</a> *str)
02816 {
02817   DBUS_STRING_PREAMBLE (str);
02818 
02819   memset (real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> - real-&gt;<a class="code" href="structDBusRealString.html#m7">align_offset</a>, <font class="charliteral">'\0'</font>, real-&gt;<a class="code" href="structDBusRealString.html#m2">allocated</a>);
02820 }
02823 <font class="preprocessor">#ifdef DBUS_BUILD_TESTS</font>
02824 <font class="preprocessor"></font><font class="preprocessor">#include "dbus-test.h"</font>
02825 <font class="preprocessor">#include &lt;stdio.h&gt;</font>
02826 
02840 dbus_bool_t
02841 _dbus_string_parse_basic_type (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>  *str,
02842                                <font class="keywordtype">char</font>               type,
02843                                <font class="keywordtype">int</font>                start,
02844                                <font class="keywordtype">void</font>              *value,
02845                                <font class="keywordtype">int</font>               *end_return)
02846 {
02847   <font class="keywordtype">int</font> end = start;
02848 
02849   <font class="keywordflow">switch</font> (type)
02850     {
02851     <font class="keywordflow">case</font> DBUS_TYPE_BOOLEAN:
02852       {
02853         <font class="keywordtype">int</font> len = _dbus_string_get_length (str) - start;
02854         <font class="keywordflow">if</font> (len &gt;= 5 &amp;&amp; _dbus_string_find_to (str, start, start + 5, <font class="stringliteral">"false"</font>, NULL))
02855           {
02856             end += 5;
02857             *(<font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *) value = TRUE;
02858           }
02859         <font class="keywordflow">else</font> <font class="keywordflow">if</font> (len &gt;= 4 &amp;&amp; _dbus_string_find_to (str, start, start + 4, <font class="stringliteral">"true"</font>, NULL))
02860           {
02861             end += 4;
02862             *(<font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *) value = FALSE;
02863           }
02864         <font class="keywordflow">else</font>
02865           _dbus_warn (<font class="stringliteral">"could not parse BOOLEAN\n"</font>);
02866         <font class="keywordflow">break</font>;
02867       }
02868     <font class="keywordflow">case</font> DBUS_TYPE_BYTE:
02869       {
02870         <font class="keywordtype">long</font> val = 0;
02871 
02872         <font class="keywordflow">if</font> (_dbus_string_get_byte (str, start) == <font class="charliteral">'\''</font> &amp;&amp;
02873             _dbus_string_get_length (str) &gt;= start + 4 &amp;&amp;
02874             _dbus_string_get_byte (str, start + 1) == <font class="charliteral">'\\'</font> &amp;&amp;
02875             _dbus_string_get_byte (str, start + 2) == <font class="charliteral">'\''</font> &amp;&amp;
02876             _dbus_string_get_byte (str, start + 3) == <font class="charliteral">'\''</font>)
02877           {
02878             val = <font class="charliteral">'\''</font>;
02879             end += 4;
02880           }
02881         <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_dbus_string_get_byte (str, start) == <font class="charliteral">'\''</font> &amp;&amp;
02882                  _dbus_string_get_length (str) &gt;= start + 3 &amp;&amp;
02883                  _dbus_string_get_byte (str, start + 2) == <font class="charliteral">'\''</font>)
02884           {
02885             val = _dbus_string_get_byte (str, start + 1);
02886             end += 3;
02887           }
02888         <font class="keywordflow">else</font>
02889           {
02890             <font class="keywordflow">if</font> (!_dbus_string_parse_int (str, start, &amp;val, &amp;end)) 
02891               _dbus_warn (<font class="stringliteral">"Failed to parse integer for BYTE\n"</font>);
02892           }
02893 
02894         <font class="keywordflow">if</font> (val &gt; 255)
02895           _dbus_warn (<font class="stringliteral">"A byte must be in range 0-255 not %ld\n"</font>, val);
02896 
02897         *(<font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *) value = val;
02898         <font class="keywordflow">break</font>;
02899       }
02900     <font class="keywordflow">case</font> DBUS_TYPE_INT32:
02901       {
02902         <font class="keywordtype">long</font> val;
02903         <font class="keywordflow">if</font> (_dbus_string_parse_int (str, start, &amp;val, &amp;end))
02904           *(dbus_int32_t *)value = val;
02905         <font class="keywordflow">break</font>;
02906       }
02907     <font class="keywordflow">case</font> DBUS_TYPE_UINT32:
02908       {
02909         <font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> val;
02910         <font class="keywordflow">if</font> (_dbus_string_parse_uint (str, start, &amp;val, &amp;end))
02911           *(dbus_uint32_t *)value = val;
02912         <font class="keywordflow">break</font>;
02913       }
02914 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
02915 <font class="preprocessor"></font>    <font class="keywordflow">case</font> DBUS_TYPE_INT64:
02916     <font class="keywordflow">case</font> DBUS_TYPE_UINT64: 
02917       <font class="comment">/* use stroll oull */</font>
02918       _dbus_assert_not_reached (<font class="stringliteral">"string -&gt; [u]int64 not supported yet"</font>);
02919       <font class="keywordflow">break</font>;
02920 <font class="preprocessor">#endif </font><font class="comment">/* DBUS_HAVE_INT64 */</font>
02921     <font class="keywordflow">case</font> DBUS_TYPE_DOUBLE:
02922       _dbus_string_parse_double (str, start, value, &amp;end);
02923       <font class="keywordflow">break</font>;
02924     <font class="keywordflow">default</font>:
02925       _dbus_assert_not_reached (<font class="stringliteral">"not a basic type"</font>);
02926       <font class="keywordflow">break</font>;
02927     }
02928   <font class="keywordflow">if</font> (end_return)
02929     *end_return = end;
02930 
02931   <font class="keywordflow">return</font> end != start;
02932 }
02933 
02934 <font class="keyword">static</font> <font class="keywordtype">void</font>
02935 test_max_len (<a class="code" href="structDBusString.html">DBusString</a> *str,
02936               <font class="keywordtype">int</font>         max_len)
02937 {
02938   <font class="keywordflow">if</font> (max_len &gt; 0)
02939     {
02940       <font class="keywordflow">if</font> (!_dbus_string_set_length (str, max_len - 1))
02941         _dbus_assert_not_reached (<font class="stringliteral">"setting len to one less than max should have worked"</font>);
02942     }
02943 
02944   <font class="keywordflow">if</font> (!_dbus_string_set_length (str, max_len))
02945     _dbus_assert_not_reached (<font class="stringliteral">"setting len to max len should have worked"</font>);
02946 
02947   <font class="keywordflow">if</font> (_dbus_string_set_length (str, max_len + 1))
02948     _dbus_assert_not_reached (<font class="stringliteral">"setting len to one more than max len should not have worked"</font>);
02949 
02950   <font class="keywordflow">if</font> (!_dbus_string_set_length (str, 0))
02951     _dbus_assert_not_reached (<font class="stringliteral">"setting len to zero should have worked"</font>);
02952 }
02953 
02954 <font class="keyword">static</font> <font class="keywordtype">void</font>
02955 test_hex_roundtrip (<font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *data,
02956                     <font class="keywordtype">int</font>                  len)
02957 {
02958   <a class="code" href="structDBusString.html">DBusString</a> orig;
02959   <a class="code" href="structDBusString.html">DBusString</a> encoded;
02960   <a class="code" href="structDBusString.html">DBusString</a> decoded;
02961   <font class="keywordtype">int</font> end;
02962 
02963   <font class="keywordflow">if</font> (len &lt; 0)
02964     len = strlen (data);
02965   
02966   <font class="keywordflow">if</font> (!_dbus_string_init (&amp;orig))
02967     _dbus_assert_not_reached (<font class="stringliteral">"could not init string"</font>);
02968 
02969   <font class="keywordflow">if</font> (!_dbus_string_init (&amp;encoded))
02970     _dbus_assert_not_reached (<font class="stringliteral">"could not init string"</font>);
02971   
02972   <font class="keywordflow">if</font> (!_dbus_string_init (&amp;decoded))
02973     _dbus_assert_not_reached (<font class="stringliteral">"could not init string"</font>);
02974 
02975   <font class="keywordflow">if</font> (!_dbus_string_append_len (&amp;orig, data, len))
02976     _dbus_assert_not_reached (<font class="stringliteral">"couldn't append orig data"</font>);
02977 
02978   <font class="keywordflow">if</font> (!_dbus_string_hex_encode (&amp;orig, 0, &amp;encoded, 0))
02979     _dbus_assert_not_reached (<font class="stringliteral">"could not encode"</font>);
02980 
02981   <font class="keywordflow">if</font> (!_dbus_string_hex_decode (&amp;encoded, 0, &amp;end, &amp;decoded, 0))
02982     _dbus_assert_not_reached (<font class="stringliteral">"could not decode"</font>);
02983     
02984   _dbus_assert (_dbus_string_get_length (&amp;encoded) == end);
02985 
02986   <font class="keywordflow">if</font> (!_dbus_string_equal (&amp;orig, &amp;decoded))
02987     {
02988       <font class="keyword">const</font> <font class="keywordtype">char</font> *s;
02989       
02990       printf (<font class="stringliteral">"Original string %d bytes encoded %d bytes decoded %d bytes\n"</font>,
02991               _dbus_string_get_length (&amp;orig),
02992               _dbus_string_get_length (&amp;encoded),
02993               _dbus_string_get_length (&amp;decoded));
02994       printf (<font class="stringliteral">"Original: %s\n"</font>, data);
02995       s = _dbus_string_get_const_data (&amp;decoded);
02996       printf (<font class="stringliteral">"Decoded: %s\n"</font>, s);
02997       _dbus_assert_not_reached (<font class="stringliteral">"original string not the same as string decoded from hex"</font>);
02998     }
02999   
03000   _dbus_string_free (&amp;orig);
03001   _dbus_string_free (&amp;encoded);
03002   _dbus_string_free (&amp;decoded);  
03003 }
03004 
03005 <font class="keyword">typedef</font> void (* TestRoundtripFunc) (<font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *data,
03006                                     <font class="keywordtype">int</font>                  len);
03007 <font class="keyword">static</font> <font class="keywordtype">void</font>
03008 test_roundtrips (TestRoundtripFunc func)
03009 {
03010   (* func) (<font class="stringliteral">"Hello this is a string\n"</font>, -1);
03011   (* func) (<font class="stringliteral">"Hello this is a string\n1"</font>, -1);
03012   (* func) (<font class="stringliteral">"Hello this is a string\n12"</font>, -1);
03013   (* func) (<font class="stringliteral">"Hello this is a string\n123"</font>, -1);
03014   (* func) (<font class="stringliteral">"Hello this is a string\n1234"</font>, -1);
03015   (* func) (<font class="stringliteral">"Hello this is a string\n12345"</font>, -1);
03016   (* func) (<font class="stringliteral">""</font>, 0);
03017   (* func) (<font class="stringliteral">"1"</font>, 1);
03018   (* func) (<font class="stringliteral">"12"</font>, 2);
03019   (* func) (<font class="stringliteral">"123"</font>, 3);
03020   (* func) (<font class="stringliteral">"1234"</font>, 4);
03021   (* func) (<font class="stringliteral">"12345"</font>, 5);
03022   (* func) (<font class="stringliteral">""</font>, 1);
03023   (* func) (<font class="stringliteral">"1"</font>, 2);
03024   (* func) (<font class="stringliteral">"12"</font>, 3);
03025   (* func) (<font class="stringliteral">"123"</font>, 4);
03026   (* func) (<font class="stringliteral">"1234"</font>, 5);
03027   (* func) (<font class="stringliteral">"12345"</font>, 6);
03028   {
03029     <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> buf[512];
03030     <font class="keywordtype">int</font> i;
03031     
03032     i = 0;
03033     <font class="keywordflow">while</font> (i &lt; _DBUS_N_ELEMENTS (buf))
03034       {
03035         buf[i] = i;
03036         ++i;
03037       }
03038     i = 0;
03039     <font class="keywordflow">while</font> (i &lt; _DBUS_N_ELEMENTS (buf))
03040       {
03041         (* func) (buf, i);
03042         ++i;
03043       }
03044   }
03045 }
03046 
03047 
03058 dbus_bool_t
<a name="l03059"></a><a class="code" href="group__DBusStringInternals.html#a0">03059</a> _dbus_string_test (<font class="keywordtype">void</font>)
03060 {
03061   <a class="code" href="structDBusString.html">DBusString</a> str;
03062   <a class="code" href="structDBusString.html">DBusString</a> other;
03063   <font class="keywordtype">int</font> i, end;
03064   <font class="keywordtype">long</font> v;
03065   <font class="keywordtype">double</font> d;
03066   <font class="keywordtype">int</font> 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 };
03067   <font class="keywordtype">char</font> *s;
03068   dbus_unichar_t ch;
03069   <font class="keyword">const</font> <font class="keywordtype">char</font> *valid_paths[] = {
03070     <font class="stringliteral">"/"</font>,
03071     <font class="stringliteral">"/foo/bar"</font>,
03072     <font class="stringliteral">"/foo"</font>,
03073     <font class="stringliteral">"/foo/bar/baz"</font>
03074   };
03075   <font class="keyword">const</font> <font class="keywordtype">char</font> *invalid_paths[] = {
03076     <font class="stringliteral">"bar"</font>,
03077     <font class="stringliteral">"bar/baz"</font>,
03078     <font class="stringliteral">"/foo/bar/"</font>,
03079     <font class="stringliteral">"/foo/"</font>
03080     <font class="stringliteral">"foo/"</font>,
03081     <font class="stringliteral">"boo//blah"</font>,
03082     <font class="stringliteral">"//"</font>,
03083     <font class="stringliteral">"</font>
03084 <font class="stringliteral">    "</font>foo
03085     <font class="stringliteral">"Hello World"</font>,
03086     <font class="stringliteral">""</font>,
03087     <font class="stringliteral">"   "</font>,
03088     <font class="stringliteral">"foo bar"</font>
03089   };
03090 
03091   <font class="keyword">const</font> <font class="keywordtype">char</font> *valid_interfaces[] = {
03092     <font class="stringliteral">"org.freedesktop.Foo"</font>,
03093     <font class="stringliteral">"Bar.Baz"</font>,
03094     <font class="stringliteral">"Blah.Blah.Blah.Blah.Blah"</font>,
03095     <font class="stringliteral">"a.b"</font>,
03096     <font class="stringliteral">"a.b.c.d.e.f.g"</font>,
03097     <font class="stringliteral">"a0.b1.c2.d3.e4.f5.g6"</font>,
03098     <font class="stringliteral">"abc123.foo27"</font>
03099   };
03100   <font class="keyword">const</font> <font class="keywordtype">char</font> *invalid_interfaces[] = {
03101     <font class="stringliteral">"."</font>,
03102     <font class="stringliteral">""</font>,
03103     <font class="stringliteral">".."</font>,
03104     <font class="stringliteral">".Foo.Bar"</font>,
03105     <font class="stringliteral">"..Foo.Bar"</font>,
03106     <font class="stringliteral">"Foo.Bar."</font>,
03107     <font class="stringliteral">"Foo.Bar.."</font>,
03108     <font class="stringliteral">"Foo"</font>,
03109     <font class="stringliteral">"9foo.bar.baz"</font>,
03110     <font class="stringliteral">"foo.bar..baz"</font>,
03111     <font class="stringliteral">"foo.bar...baz"</font>,
03112     <font class="stringliteral">"foo.bar.b..blah"</font>,
03113     <font class="stringliteral">":"</font>,
03114     <font class="stringliteral">":0-1"</font>,
03115     <font class="stringliteral">"10"</font>,
03116     <font class="stringliteral">":11.34324"</font>,
03117     <font class="stringliteral">"0.0.0"</font>,
03118     <font class="stringliteral">"0..0"</font>,
03119     <font class="stringliteral">"foo.Bar.%"</font>,
03120     <font class="stringliteral">"foo.Bar!!"</font>,
03121     <font class="stringliteral">"!Foo.bar.bz"</font>,
03122     <font class="stringliteral">"foo.$.blah"</font>,
03123     <font class="stringliteral">""</font>,
03124     <font class="stringliteral">"   "</font>,
03125     <font class="stringliteral">"foo bar"</font>
03126   };
03127 
03128   <font class="keyword">const</font> <font class="keywordtype">char</font> *valid_base_services[] = {
03129     <font class="stringliteral">":0"</font>,
03130     <font class="stringliteral">":a"</font>,
03131     <font class="stringliteral">":"</font>,
03132     <font class="stringliteral">":.a"</font>,
03133     <font class="stringliteral">":.1"</font>,
03134     <font class="stringliteral">":0.1"</font>,
03135     <font class="stringliteral">":000.2222"</font>,
03136     <font class="stringliteral">":.blah"</font>,
03137     <font class="stringliteral">":abce.freedesktop.blah"</font>
03138   };
03139   <font class="keyword">const</font> <font class="keywordtype">char</font> *invalid_base_services[] = {
03140     <font class="stringliteral">":-"</font>,
03141     <font class="stringliteral">":!"</font>,
03142     <font class="stringliteral">":0-10"</font>,
03143     <font class="stringliteral">":blah."</font>,
03144     <font class="stringliteral">":blah."</font>,
03145     <font class="stringliteral">":blah..org"</font>,
03146     <font class="stringliteral">":blah.org.."</font>,
03147     <font class="stringliteral">":..blah.org"</font>,
03148     <font class="stringliteral">""</font>,
03149     <font class="stringliteral">"   "</font>,
03150     <font class="stringliteral">"foo bar"</font>
03151   };
03152 
03153   <font class="keyword">const</font> <font class="keywordtype">char</font> *valid_members[] = {
03154     <font class="stringliteral">"Hello"</font>,
03155     <font class="stringliteral">"Bar"</font>,
03156     <font class="stringliteral">"foobar"</font>,
03157     <font class="stringliteral">"_foobar"</font>,
03158     <font class="stringliteral">"foo89"</font>
03159   };
03160 
03161   <font class="keyword">const</font> <font class="keywordtype">char</font> *invalid_members[] = {
03162     <font class="stringliteral">"9Hello"</font>,
03163     <font class="stringliteral">"10"</font>,
03164     <font class="stringliteral">"1"</font>,
03165     <font class="stringliteral">"foo-bar"</font>,
03166     <font class="stringliteral">"blah.org"</font>,
03167     <font class="stringliteral">".blah"</font>,
03168     <font class="stringliteral">"blah."</font>,
03169     <font class="stringliteral">"Hello."</font>,
03170     <font class="stringliteral">"!foo"</font>,
03171     <font class="stringliteral">""</font>,
03172     <font class="stringliteral">"   "</font>,
03173     <font class="stringliteral">"foo bar"</font>
03174   };
03175   
03176   i = 0;
03177   <font class="keywordflow">while</font> (i &lt; _DBUS_N_ELEMENTS (lens))
03178     {
03179       <font class="keywordflow">if</font> (!_dbus_string_init (&amp;str))
03180         _dbus_assert_not_reached (<font class="stringliteral">"failed to init string"</font>);
03181 
03182       set_max_length (&amp;str, lens[i]);
03183       
03184       test_max_len (&amp;str, lens[i]);
03185       _dbus_string_free (&amp;str);
03186 
03187       ++i;
03188     }
03189 
03190   <font class="comment">/* Test shortening and setting length */</font>
03191   i = 0;
03192   <font class="keywordflow">while</font> (i &lt; _DBUS_N_ELEMENTS (lens))
03193     {
03194       <font class="keywordtype">int</font> j;
03195       
03196       <font class="keywordflow">if</font> (!_dbus_string_init (&amp;str))
03197         _dbus_assert_not_reached (<font class="stringliteral">"failed to init string"</font>);
03198 
03199       set_max_length (&amp;str, lens[i]);
03200       
03201       <font class="keywordflow">if</font> (!_dbus_string_set_length (&amp;str, lens[i]))
03202         _dbus_assert_not_reached (<font class="stringliteral">"failed to set string length"</font>);
03203 
03204       j = lens[i];
03205       <font class="keywordflow">while</font> (j &gt; 0)
03206         {
03207           _dbus_assert (_dbus_string_get_length (&amp;str) == j);
03208           <font class="keywordflow">if</font> (j &gt; 0)
03209             {
03210               _dbus_string_shorten (&amp;str, 1);
03211               _dbus_assert (_dbus_string_get_length (&amp;str) == (j - 1));
03212             }
03213           --j;
03214         }
03215       
03216       _dbus_string_free (&amp;str);
03217 
03218       ++i;
03219     }
03220 
03221   <font class="comment">/* Test appending data */</font>
03222   <font class="keywordflow">if</font> (!_dbus_string_init (&amp;str))
03223     _dbus_assert_not_reached (<font class="stringliteral">"failed to init string"</font>);
03224 
03225   i = 0;
03226   <font class="keywordflow">while</font> (i &lt; 10)
03227     {
03228       <font class="keywordflow">if</font> (!_dbus_string_append (&amp;str, <font class="stringliteral">"a"</font>))
03229         _dbus_assert_not_reached (<font class="stringliteral">"failed to append string to string\n"</font>);
03230 
03231       _dbus_assert (_dbus_string_get_length (&amp;str) == i * 2 + 1);
03232 
03233       <font class="keywordflow">if</font> (!_dbus_string_append_byte (&amp;str, <font class="charliteral">'b'</font>))
03234         _dbus_assert_not_reached (<font class="stringliteral">"failed to append byte to string\n"</font>);
03235 
03236       _dbus_assert (_dbus_string_get_length (&amp;str) == i * 2 + 2);
03237                     
03238       ++i;
03239     }
03240 
03241   _dbus_string_free (&amp;str);
03242 
03243   <font class="comment">/* Check steal_data */</font>
03244   
03245   <font class="keywordflow">if</font> (!_dbus_string_init (&amp;str))
03246     _dbus_assert_not_reached (<font class="stringliteral">"failed to init string"</font>);
03247 
03248   <font class="keywordflow">if</font> (!_dbus_string_append (&amp;str, <font class="stringliteral">"Hello World"</font>))
03249     _dbus_assert_not_reached (<font class="stringliteral">"could not append to string"</font>);
03250 
03251   i = _dbus_string_get_length (&amp;str);
03252   
03253   <font class="keywordflow">if</font> (!_dbus_string_steal_data (&amp;str, &amp;s))
03254     _dbus_assert_not_reached (<font class="stringliteral">"failed to steal data"</font>);
03255 
03256   _dbus_assert (_dbus_string_get_length (&amp;str) == 0);
03257   _dbus_assert (((<font class="keywordtype">int</font>)strlen (s)) == i);
03258 
03259   dbus_free (s);
03260 
03261   <font class="comment">/* Check move */</font>
03262   
03263   <font class="keywordflow">if</font> (!_dbus_string_append (&amp;str, <font class="stringliteral">"Hello World"</font>))
03264     _dbus_assert_not_reached (<font class="stringliteral">"could not append to string"</font>);
03265 
03266   i = _dbus_string_get_length (&amp;str);
03267 
03268   <font class="keywordflow">if</font> (!_dbus_string_init (&amp;other))
03269     _dbus_assert_not_reached (<font class="stringliteral">"could not init string"</font>);
03270   
03271   <font class="keywordflow">if</font> (!_dbus_string_move (&amp;str, 0, &amp;other, 0))
03272     _dbus_assert_not_reached (<font class="stringliteral">"could not move"</font>);
03273 
03274   _dbus_assert (_dbus_string_get_length (&amp;str) == 0);
03275   _dbus_assert (_dbus_string_get_length (&amp;other) == i);
03276 
03277   <font class="keywordflow">if</font> (!_dbus_string_append (&amp;str, <font class="stringliteral">"Hello World"</font>))
03278     _dbus_assert_not_reached (<font class="stringliteral">"could not append to string"</font>);
03279   
03280   <font class="keywordflow">if</font> (!_dbus_string_move (&amp;str, 0, &amp;other, _dbus_string_get_length (&amp;other)))
03281     _dbus_assert_not_reached (<font class="stringliteral">"could not move"</font>);
03282 
03283   _dbus_assert (_dbus_string_get_length (&amp;str) == 0);
03284   _dbus_assert (_dbus_string_get_length (&amp;other) == i * 2);
03285 
03286     <font class="keywordflow">if</font> (!_dbus_string_append (&amp;str, <font class="stringliteral">"Hello World"</font>))
03287     _dbus_assert_not_reached (<font class="stringliteral">"could not append to string"</font>);
03288   
03289   <font class="keywordflow">if</font> (!_dbus_string_move (&amp;str, 0, &amp;other, _dbus_string_get_length (&amp;other) / 2))
03290     _dbus_assert_not_reached (<font class="stringliteral">"could not move"</font>);
03291 
03292   _dbus_assert (_dbus_string_get_length (&amp;str) == 0);
03293   _dbus_assert (_dbus_string_get_length (&amp;other) == i * 3);
03294   
03295   _dbus_string_free (&amp;other);
03296 
03297   <font class="comment">/* Check copy */</font>
03298   
03299   <font class="keywordflow">if</font> (!_dbus_string_append (&amp;str, <font class="stringliteral">"Hello World"</font>))
03300     _dbus_assert_not_reached (<font class="stringliteral">"could not append to string"</font>);
03301 
03302   i = _dbus_string_get_length (&amp;str);
03303   
03304   <font class="keywordflow">if</font> (!_dbus_string_init (&amp;other))
03305     _dbus_assert_not_reached (<font class="stringliteral">"could not init string"</font>);
03306   
03307   <font class="keywordflow">if</font> (!_dbus_string_copy (&amp;str, 0, &amp;other, 0))
03308     _dbus_assert_not_reached (<font class="stringliteral">"could not copy"</font>);
03309 
03310   _dbus_assert (_dbus_string_get_length (&amp;str) == i);
03311   _dbus_assert (_dbus_string_get_length (&amp;other) == i);
03312 
03313   <font class="keywordflow">if</font> (!_dbus_string_copy (&amp;str, 0, &amp;other, _dbus_string_get_length (&amp;other)))
03314     _dbus_assert_not_reached (<font class="stringliteral">"could not copy"</font>);
03315 
03316   _dbus_assert (_dbus_string_get_length (&amp;str) == i);
03317   _dbus_assert (_dbus_string_get_length (&amp;other) == i * 2);
03318   _dbus_assert (_dbus_string_equal_c_str (&amp;other,
03319                                           <font class="stringliteral">"Hello WorldHello World"</font>));
03320 
03321   <font class="keywordflow">if</font> (!_dbus_string_copy (&amp;str, 0, &amp;other, _dbus_string_get_length (&amp;other) / 2))
03322     _dbus_assert_not_reached (<font class="stringliteral">"could not copy"</font>);
03323 
03324   _dbus_assert (_dbus_string_get_length (&amp;str) == i);
03325   _dbus_assert (_dbus_string_get_length (&amp;other) == i * 3);
03326   _dbus_assert (_dbus_string_equal_c_str (&amp;other,
03327                                           <font class="stringliteral">"Hello WorldHello WorldHello World"</font>));
03328   
03329   _dbus_string_free (&amp;str);
03330   _dbus_string_free (&amp;other);
03331 
03332   <font class="comment">/* Check replace */</font>
03333 
03334   <font class="keywordflow">if</font> (!_dbus_string_init (&amp;str))
03335     _dbus_assert_not_reached (<font class="stringliteral">"failed to init string"</font>);
03336   
03337   <font class="keywordflow">if</font> (!_dbus_string_append (&amp;str, <font class="stringliteral">"Hello World"</font>))
03338     _dbus_assert_not_reached (<font class="stringliteral">"could not append to string"</font>);
03339 
03340   i = _dbus_string_get_length (&amp;str);
03341   
03342   <font class="keywordflow">if</font> (!_dbus_string_init (&amp;other))
03343     _dbus_assert_not_reached (<font class="stringliteral">"could not init string"</font>);
03344   
03345   <font class="keywordflow">if</font> (!_dbus_string_replace_len (&amp;str, 0, _dbus_string_get_length (&amp;str),
03346                                  &amp;other, 0, _dbus_string_get_length (&amp;other)))
03347     _dbus_assert_not_reached (<font class="stringliteral">"could not replace"</font>);
03348 
03349   _dbus_assert (_dbus_string_get_length (&amp;str) == i);
03350   _dbus_assert (_dbus_string_get_length (&amp;other) == i);
03351   _dbus_assert (_dbus_string_equal_c_str (&amp;other, <font class="stringliteral">"Hello World"</font>));
03352   
03353   <font class="keywordflow">if</font> (!_dbus_string_replace_len (&amp;str, 0, _dbus_string_get_length (&amp;str),
03354                                  &amp;other, 5, 1))
03355     _dbus_assert_not_reached (<font class="stringliteral">"could not replace center space"</font>);
03356 
03357   _dbus_assert (_dbus_string_get_length (&amp;str) == i);
03358   _dbus_assert (_dbus_string_get_length (&amp;other) == i * 2 - 1);
03359   _dbus_assert (_dbus_string_equal_c_str (&amp;other,
03360                                           <font class="stringliteral">"HelloHello WorldWorld"</font>));
03361 
03362   
03363   <font class="keywordflow">if</font> (!_dbus_string_replace_len (&amp;str, 1, 1,
03364                                  &amp;other,
03365                                  _dbus_string_get_length (&amp;other) - 1,
03366                                  1))
03367     _dbus_assert_not_reached (<font class="stringliteral">"could not replace end character"</font>);
03368   
03369   _dbus_assert (_dbus_string_get_length (&amp;str) == i);
03370   _dbus_assert (_dbus_string_get_length (&amp;other) == i * 2 - 1);
03371   _dbus_assert (_dbus_string_equal_c_str (&amp;other,
03372                                           <font class="stringliteral">"HelloHello WorldWorle"</font>));
03373   
03374   _dbus_string_free (&amp;str);
03375   _dbus_string_free (&amp;other);
03376   
03377   <font class="comment">/* Check append/get unichar */</font>
03378   
03379   <font class="keywordflow">if</font> (!_dbus_string_init (&amp;str))
03380     _dbus_assert_not_reached (<font class="stringliteral">"failed to init string"</font>);
03381 
03382   ch = 0;
03383   <font class="keywordflow">if</font> (!_dbus_string_append_unichar (&amp;str, 0xfffc))
03384     _dbus_assert_not_reached (<font class="stringliteral">"failed to append unichar"</font>);
03385 
03386   _dbus_string_get_unichar (&amp;str, 0, &amp;ch, &amp;i);
03387 
03388   _dbus_assert (ch == 0xfffc);
03389   _dbus_assert (i == _dbus_string_get_length (&amp;str));
03390 
03391   _dbus_string_free (&amp;str);
03392 
03393   <font class="comment">/* Check insert/set/get byte */</font>
03394   
03395   <font class="keywordflow">if</font> (!_dbus_string_init (&amp;str))
03396     _dbus_assert_not_reached (<font class="stringliteral">"failed to init string"</font>);
03397 
03398   <font class="keywordflow">if</font> (!_dbus_string_append (&amp;str, <font class="stringliteral">"Hello"</font>))
03399     _dbus_assert_not_reached (<font class="stringliteral">"failed to append Hello"</font>);
03400 
03401   _dbus_assert (_dbus_string_get_byte (&amp;str, 0) == <font class="charliteral">'H'</font>);
03402   _dbus_assert (_dbus_string_get_byte (&amp;str, 1) == <font class="charliteral">'e'</font>);
03403   _dbus_assert (_dbus_string_get_byte (&amp;str, 2) == <font class="charliteral">'l'</font>);
03404   _dbus_assert (_dbus_string_get_byte (&amp;str, 3) == <font class="charliteral">'l'</font>);
03405   _dbus_assert (_dbus_string_get_byte (&amp;str, 4) == <font class="charliteral">'o'</font>);
03406 
03407   _dbus_string_set_byte (&amp;str, 1, <font class="charliteral">'q'</font>);
03408   _dbus_assert (_dbus_string_get_byte (&amp;str, 1) == <font class="charliteral">'q'</font>);
03409 
03410   <font class="keywordflow">if</font> (!_dbus_string_insert_bytes (&amp;str, 0, 1, 255))
03411     _dbus_assert_not_reached (<font class="stringliteral">"can't insert byte"</font>);
03412 
03413   <font class="keywordflow">if</font> (!_dbus_string_insert_bytes (&amp;str, 2, 4, <font class="charliteral">'Z'</font>))
03414     _dbus_assert_not_reached (<font class="stringliteral">"can't insert byte"</font>);
03415 
03416   <font class="keywordflow">if</font> (!_dbus_string_insert_bytes (&amp;str, _dbus_string_get_length (&amp;str), 1, <font class="charliteral">'W'</font>))
03417     _dbus_assert_not_reached (<font class="stringliteral">"can't insert byte"</font>);
03418   
03419   _dbus_assert (_dbus_string_get_byte (&amp;str, 0) == 255);
03420   _dbus_assert (_dbus_string_get_byte (&amp;str, 1) == <font class="charliteral">'H'</font>);
03421   _dbus_assert (_dbus_string_get_byte (&amp;str, 2) == <font class="charliteral">'Z'</font>);
03422   _dbus_assert (_dbus_string_get_byte (&amp;str, 3) == <font class="charliteral">'Z'</font>);
03423   _dbus_assert (_dbus_string_get_byte (&amp;str, 4) == <font class="charliteral">'Z'</font>);
03424   _dbus_assert (_dbus_string_get_byte (&amp;str, 5) == <font class="charliteral">'Z'</font>);
03425   _dbus_assert (_dbus_string_get_byte (&amp;str, 6) == <font class="charliteral">'q'</font>);
03426   _dbus_assert (_dbus_string_get_byte (&amp;str, 7) == <font class="charliteral">'l'</font>);
03427   _dbus_assert (_dbus_string_get_byte (&amp;str, 8) == <font class="charliteral">'l'</font>);
03428   _dbus_assert (_dbus_string_get_byte (&amp;str, 9) == <font class="charliteral">'o'</font>);
03429   _dbus_assert (_dbus_string_get_byte (&amp;str, 10) == <font class="charliteral">'W'</font>);
03430 
03431   _dbus_string_free (&amp;str);
03432   
03433   <font class="comment">/* Check append/parse int/double */</font>
03434   
03435   <font class="keywordflow">if</font> (!_dbus_string_init (&amp;str))
03436     _dbus_assert_not_reached (<font class="stringliteral">"failed to init string"</font>);
03437 
03438   <font class="keywordflow">if</font> (!_dbus_string_append_int (&amp;str, 27))
03439     _dbus_assert_not_reached (<font class="stringliteral">"failed to append int"</font>);
03440 
03441   i = _dbus_string_get_length (&amp;str);
03442 
03443   <font class="keywordflow">if</font> (!_dbus_string_parse_int (&amp;str, 0, &amp;v, &amp;end))
03444     _dbus_assert_not_reached (<font class="stringliteral">"failed to parse int"</font>);
03445 
03446   _dbus_assert (v == 27);
03447   _dbus_assert (end == i);
03448 
03449   _dbus_string_free (&amp;str);
03450   
03451   <font class="keywordflow">if</font> (!_dbus_string_init (&amp;str))
03452     _dbus_assert_not_reached (<font class="stringliteral">"failed to init string"</font>);
03453   
03454   <font class="keywordflow">if</font> (!_dbus_string_append_double (&amp;str, 50.3))
03455     _dbus_assert_not_reached (<font class="stringliteral">"failed to append float"</font>);
03456 
03457   i = _dbus_string_get_length (&amp;str);
03458 
03459   <font class="keywordflow">if</font> (!_dbus_string_parse_double (&amp;str, 0, &amp;d, &amp;end))
03460     _dbus_assert_not_reached (<font class="stringliteral">"failed to parse float"</font>);
03461 
03462   _dbus_assert (d &gt; (50.3 - 1e-6) &amp;&amp; d &lt; (50.3 + 1e-6));
03463   _dbus_assert (end == i);
03464 
03465   _dbus_string_free (&amp;str);
03466 
03467   <font class="comment">/* Test find */</font>
03468   <font class="keywordflow">if</font> (!_dbus_string_init (&amp;str))
03469     _dbus_assert_not_reached (<font class="stringliteral">"failed to init string"</font>);
03470 
03471   <font class="keywordflow">if</font> (!_dbus_string_append (&amp;str, <font class="stringliteral">"Hello"</font>))
03472     _dbus_assert_not_reached (<font class="stringliteral">"couldn't append to string"</font>);
03473   
03474   <font class="keywordflow">if</font> (!_dbus_string_find (&amp;str, 0, <font class="stringliteral">"He"</font>, &amp;i))
03475     _dbus_assert_not_reached (<font class="stringliteral">"didn't find 'He'"</font>);
03476   _dbus_assert (i == 0);
03477 
03478   <font class="keywordflow">if</font> (!_dbus_string_find (&amp;str, 0, <font class="stringliteral">"Hello"</font>, &amp;i))
03479     _dbus_assert_not_reached (<font class="stringliteral">"didn't find 'Hello'"</font>);
03480   _dbus_assert (i == 0);
03481   
03482   <font class="keywordflow">if</font> (!_dbus_string_find (&amp;str, 0, <font class="stringliteral">"ello"</font>, &amp;i))
03483     _dbus_assert_not_reached (<font class="stringliteral">"didn't find 'ello'"</font>);
03484   _dbus_assert (i == 1);
03485 
03486   <font class="keywordflow">if</font> (!_dbus_string_find (&amp;str, 0, <font class="stringliteral">"lo"</font>, &amp;i))
03487     _dbus_assert_not_reached (<font class="stringliteral">"didn't find 'lo'"</font>);
03488   _dbus_assert (i == 3);
03489 
03490   <font class="keywordflow">if</font> (!_dbus_string_find (&amp;str, 2, <font class="stringliteral">"lo"</font>, &amp;i))
03491     _dbus_assert_not_reached (<font class="stringliteral">"didn't find 'lo'"</font>);
03492   _dbus_assert (i == 3);
03493 
03494   <font class="keywordflow">if</font> (_dbus_string_find (&amp;str, 4, <font class="stringliteral">"lo"</font>, &amp;i))
03495     _dbus_assert_not_reached (<font class="stringliteral">"did find 'lo'"</font>);
03496   
03497   <font class="keywordflow">if</font> (!_dbus_string_find (&amp;str, 0, <font class="stringliteral">"l"</font>, &amp;i))
03498     _dbus_assert_not_reached (<font class="stringliteral">"didn't find 'l'"</font>);
03499   _dbus_assert (i == 2);
03500 
03501   <font class="keywordflow">if</font> (!_dbus_string_find (&amp;str, 0, <font class="stringliteral">"H"</font>, &amp;i))
03502     _dbus_assert_not_reached (<font class="stringliteral">"didn't find 'H'"</font>);
03503   _dbus_assert (i == 0);
03504 
03505   <font class="keywordflow">if</font> (!_dbus_string_find (&amp;str, 0, <font class="stringliteral">""</font>, &amp;i))
03506     _dbus_assert_not_reached (<font class="stringliteral">"didn't find ''"</font>);
03507   _dbus_assert (i == 0);
03508   
03509   <font class="keywordflow">if</font> (_dbus_string_find (&amp;str, 0, <font class="stringliteral">"Hello!"</font>, NULL))
03510     _dbus_assert_not_reached (<font class="stringliteral">"Did find 'Hello!'"</font>);
03511 
03512   <font class="keywordflow">if</font> (_dbus_string_find (&amp;str, 0, <font class="stringliteral">"Oh, Hello"</font>, NULL))
03513     _dbus_assert_not_reached (<font class="stringliteral">"Did find 'Oh, Hello'"</font>);
03514   
03515   <font class="keywordflow">if</font> (_dbus_string_find (&amp;str, 0, <font class="stringliteral">"ill"</font>, NULL))
03516     _dbus_assert_not_reached (<font class="stringliteral">"Did find 'ill'"</font>);
03517 
03518   <font class="keywordflow">if</font> (_dbus_string_find (&amp;str, 0, <font class="stringliteral">"q"</font>, NULL))
03519     _dbus_assert_not_reached (<font class="stringliteral">"Did find 'q'"</font>);
03520 
03521   <font class="keywordflow">if</font> (!_dbus_string_find_to (&amp;str, 0, 2, <font class="stringliteral">"He"</font>, NULL))
03522     _dbus_assert_not_reached (<font class="stringliteral">"Didn't find 'He'"</font>);
03523 
03524   <font class="keywordflow">if</font> (_dbus_string_find_to (&amp;str, 0, 2, <font class="stringliteral">"Hello"</font>, NULL))
03525     _dbus_assert_not_reached (<font class="stringliteral">"Did find 'Hello'"</font>);
03526 
03527   <font class="keywordflow">if</font> (!_dbus_string_find_byte_backward (&amp;str, _dbus_string_get_length (&amp;str), <font class="charliteral">'H'</font>, &amp;i))
03528     _dbus_assert_not_reached (<font class="stringliteral">"Did not find 'H'"</font>);
03529   _dbus_assert (i == 0);
03530 
03531   <font class="keywordflow">if</font> (!_dbus_string_find_byte_backward (&amp;str, _dbus_string_get_length (&amp;str), <font class="charliteral">'o'</font>, &amp;i))
03532     _dbus_assert_not_reached (<font class="stringliteral">"Did not find 'o'"</font>);
03533   _dbus_assert (i == _dbus_string_get_length (&amp;str) - 1);
03534 
03535   <font class="keywordflow">if</font> (_dbus_string_find_byte_backward (&amp;str, _dbus_string_get_length (&amp;str) - 1, <font class="charliteral">'o'</font>, &amp;i))
03536     _dbus_assert_not_reached (<font class="stringliteral">"Did find 'o'"</font>);
03537   _dbus_assert (i == -1);
03538 
03539   <font class="keywordflow">if</font> (_dbus_string_find_byte_backward (&amp;str, 1, <font class="charliteral">'e'</font>, &amp;i))
03540     _dbus_assert_not_reached (<font class="stringliteral">"Did find 'e'"</font>);
03541   _dbus_assert (i == -1);
03542 
03543   <font class="keywordflow">if</font> (!_dbus_string_find_byte_backward (&amp;str, 2, <font class="charliteral">'e'</font>, &amp;i))
03544     _dbus_assert_not_reached (<font class="stringliteral">"Didn't find 'e'"</font>);
03545   _dbus_assert (i == 1);
03546   
03547   _dbus_string_free (&amp;str);
03548 
03549   <font class="comment">/* Hex encoding */</font>
03550   _dbus_string_init_const (&amp;str, <font class="stringliteral">"cafebabe, this is a bogus hex string"</font>);
03551   <font class="keywordflow">if</font> (!_dbus_string_init (&amp;other))
03552     _dbus_assert_not_reached (<font class="stringliteral">"could not init string"</font>);
03553 
03554   <font class="keywordflow">if</font> (!_dbus_string_hex_decode (&amp;str, 0, &amp;end, &amp;other, 0))
03555     _dbus_assert_not_reached (<font class="stringliteral">"deccoded bogus hex string with no error"</font>);
03556 
03557   _dbus_assert (end == 8);
03558 
03559   _dbus_string_free (&amp;other);
03560 
03561   test_roundtrips (test_hex_roundtrip);
03562 
03563   <font class="comment">/* Path validation */</font>
03564   i = 0;
03565   <font class="keywordflow">while</font> (i &lt; (int) _DBUS_N_ELEMENTS (valid_paths))
03566     {
03567       _dbus_string_init_const (&amp;str, valid_paths[i]);
03568 
03569       <font class="keywordflow">if</font> (!_dbus_string_validate_path (&amp;str, 0,
03570                                        _dbus_string_get_length (&amp;str)))
03571         {
03572           _dbus_warn (<font class="stringliteral">"Path \"%s\" should have been valid\n"</font>, valid_paths[i]);
03573           _dbus_assert_not_reached (<font class="stringliteral">"invalid path"</font>);
03574         }
03575       
03576       ++i;
03577     }
03578 
03579   i = 0;
03580   <font class="keywordflow">while</font> (i &lt; (int) _DBUS_N_ELEMENTS (invalid_paths))
03581     {
03582       _dbus_string_init_const (&amp;str, invalid_paths[i]);
03583       
03584       <font class="keywordflow">if</font> (_dbus_string_validate_path (&amp;str, 0,
03585                                       _dbus_string_get_length (&amp;str)))
03586         {
03587           _dbus_warn (<font class="stringliteral">"Path \"%s\" should have been invalid\n"</font>, invalid_paths[i]);
03588           _dbus_assert_not_reached (<font class="stringliteral">"valid path"</font>);
03589         }
03590       
03591       ++i;
03592     }
03593 
03594   <font class="comment">/* Interface validation */</font>
03595   i = 0;
03596   <font class="keywordflow">while</font> (i &lt; (int) _DBUS_N_ELEMENTS (valid_interfaces))
03597     {
03598       _dbus_string_init_const (&amp;str, valid_interfaces[i]);
03599 
03600       <font class="keywordflow">if</font> (!_dbus_string_validate_interface (&amp;str, 0,
03601                                             _dbus_string_get_length (&amp;str)))
03602         {
03603           _dbus_warn (<font class="stringliteral">"Interface \"%s\" should have been valid\n"</font>, valid_interfaces[i]);
03604           _dbus_assert_not_reached (<font class="stringliteral">"invalid interface"</font>);
03605         }
03606       
03607       ++i;
03608     }
03609 
03610   i = 0;
03611   <font class="keywordflow">while</font> (i &lt; (int) _DBUS_N_ELEMENTS (invalid_interfaces))
03612     {
03613       _dbus_string_init_const (&amp;str, invalid_interfaces[i]);
03614       
03615       <font class="keywordflow">if</font> (_dbus_string_validate_interface (&amp;str, 0,
03616                                            _dbus_string_get_length (&amp;str)))
03617         {
03618           _dbus_warn (<font class="stringliteral">"Interface \"%s\" should have been invalid\n"</font>, invalid_interfaces[i]);
03619           _dbus_assert_not_reached (<font class="stringliteral">"valid interface"</font>);
03620         }
03621       
03622       ++i;
03623     }
03624 
03625   <font class="comment">/* Service validation (check that valid interfaces are valid services,</font>
03626 <font class="comment">   * and invalid interfaces are invalid services except if they start with ':')</font>
03627 <font class="comment">   */</font>
03628   i = 0;
03629   <font class="keywordflow">while</font> (i &lt; (int) _DBUS_N_ELEMENTS (valid_interfaces))
03630     {
03631       _dbus_string_init_const (&amp;str, valid_interfaces[i]);
03632 
03633       <font class="keywordflow">if</font> (!_dbus_string_validate_service (&amp;str, 0,
03634                                           _dbus_string_get_length (&amp;str)))
03635         {
03636           _dbus_warn (<font class="stringliteral">"Service \"%s\" should have been valid\n"</font>, valid_interfaces[i]);
03637           _dbus_assert_not_reached (<font class="stringliteral">"invalid service"</font>);
03638         }
03639       
03640       ++i;
03641     }
03642 
03643   i = 0;
03644   <font class="keywordflow">while</font> (i &lt; (int) _DBUS_N_ELEMENTS (invalid_interfaces))
03645     {
03646       <font class="keywordflow">if</font> (invalid_interfaces[i][0] != <font class="charliteral">':'</font>)
03647         {
03648           _dbus_string_init_const (&amp;str, invalid_interfaces[i]);
03649           
03650           <font class="keywordflow">if</font> (_dbus_string_validate_service (&amp;str, 0,
03651                                              _dbus_string_get_length (&amp;str)))
03652             {
03653               _dbus_warn (<font class="stringliteral">"Service \"%s\" should have been invalid\n"</font>, invalid_interfaces[i]);
03654               _dbus_assert_not_reached (<font class="stringliteral">"valid service"</font>);
03655             }
03656         }
03657       
03658       ++i;
03659     }
03660 
03661   <font class="comment">/* Base service validation */</font>
03662   i = 0;
03663   <font class="keywordflow">while</font> (i &lt; (int) _DBUS_N_ELEMENTS (valid_base_services))
03664     {
03665       _dbus_string_init_const (&amp;str, valid_base_services[i]);
03666 
03667       <font class="keywordflow">if</font> (!_dbus_string_validate_service (&amp;str, 0,
03668                                           _dbus_string_get_length (&amp;str)))
03669         {
03670           _dbus_warn (<font class="stringliteral">"Service \"%s\" should have been valid\n"</font>, valid_base_services[i]);
03671           _dbus_assert_not_reached (<font class="stringliteral">"invalid base service"</font>);
03672         }
03673       
03674       ++i;
03675     }
03676 
03677   i = 0;
03678   <font class="keywordflow">while</font> (i &lt; (int) _DBUS_N_ELEMENTS (invalid_base_services))
03679     {
03680       _dbus_string_init_const (&amp;str, invalid_base_services[i]);
03681       
03682       <font class="keywordflow">if</font> (_dbus_string_validate_service (&amp;str, 0,
03683                                          _dbus_string_get_length (&amp;str)))
03684         {
03685           _dbus_warn (<font class="stringliteral">"Service \"%s\" should have been invalid\n"</font>, invalid_base_services[i]);
03686           _dbus_assert_not_reached (<font class="stringliteral">"valid base service"</font>);
03687         }
03688       
03689       ++i;
03690     }
03691 
03692 
03693   <font class="comment">/* Error name validation (currently identical to interfaces)</font>
03694 <font class="comment">   */</font>
03695   i = 0;
03696   <font class="keywordflow">while</font> (i &lt; (int) _DBUS_N_ELEMENTS (valid_interfaces))
03697     {
03698       _dbus_string_init_const (&amp;str, valid_interfaces[i]);
03699 
03700       <font class="keywordflow">if</font> (!_dbus_string_validate_error_name (&amp;str, 0,
03701                                              _dbus_string_get_length (&amp;str)))
03702         {
03703           _dbus_warn (<font class="stringliteral">"Error name \"%s\" should have been valid\n"</font>, valid_interfaces[i]);
03704           _dbus_assert_not_reached (<font class="stringliteral">"invalid error name"</font>);
03705         }
03706       
03707       ++i;
03708     }
03709 
03710   i = 0;
03711   <font class="keywordflow">while</font> (i &lt; (int) _DBUS_N_ELEMENTS (invalid_interfaces))
03712     {
03713       <font class="keywordflow">if</font> (invalid_interfaces[i][0] != <font class="charliteral">':'</font>)
03714         {
03715           _dbus_string_init_const (&amp;str, invalid_interfaces[i]);
03716           
03717           <font class="keywordflow">if</font> (_dbus_string_validate_error_name (&amp;str, 0,
03718                                                 _dbus_string_get_length (&amp;str)))
03719             {
03720               _dbus_warn (<font class="stringliteral">"Error name \"%s\" should have been invalid\n"</font>, invalid_interfaces[i]);
03721               _dbus_assert_not_reached (<font class="stringliteral">"valid error name"</font>);
03722             }
03723         }
03724       
03725       ++i;
03726     }
03727   
03728   <font class="comment">/* Member validation */</font>
03729   i = 0;
03730   <font class="keywordflow">while</font> (i &lt; (int) _DBUS_N_ELEMENTS (valid_members))
03731     {
03732       _dbus_string_init_const (&amp;str, valid_members[i]);
03733 
03734       <font class="keywordflow">if</font> (!_dbus_string_validate_member (&amp;str, 0,
03735                                          _dbus_string_get_length (&amp;str)))
03736         {
03737           _dbus_warn (<font class="stringliteral">"Member \"%s\" should have been valid\n"</font>, valid_members[i]);
03738           _dbus_assert_not_reached (<font class="stringliteral">"invalid member"</font>);
03739         }
03740       
03741       ++i;
03742     }
03743 
03744   i = 0;
03745   <font class="keywordflow">while</font> (i &lt; (int) _DBUS_N_ELEMENTS (invalid_members))
03746     {
03747       _dbus_string_init_const (&amp;str, invalid_members[i]);
03748       
03749       <font class="keywordflow">if</font> (_dbus_string_validate_member (&amp;str, 0,
03750                                         _dbus_string_get_length (&amp;str)))
03751         {
03752           _dbus_warn (<font class="stringliteral">"Member \"%s\" should have been invalid\n"</font>, invalid_members[i]);
03753           _dbus_assert_not_reached (<font class="stringliteral">"valid member"</font>);
03754         }
03755       
03756       ++i;
03757     }
03758 
03759   <font class="comment">/* Validate claimed length longer than real length */</font>
03760   _dbus_string_init_const (&amp;str, <font class="stringliteral">"abc.efg"</font>);
03761   <font class="keywordflow">if</font> (_dbus_string_validate_service (&amp;str, 0, 8))
03762     _dbus_assert_not_reached (<font class="stringliteral">"validated too-long string"</font>);
03763   <font class="keywordflow">if</font> (_dbus_string_validate_interface (&amp;str, 0, 8))
03764     _dbus_assert_not_reached (<font class="stringliteral">"validated too-long string"</font>);
03765   <font class="keywordflow">if</font> (_dbus_string_validate_error_name (&amp;str, 0, 8))
03766     _dbus_assert_not_reached (<font class="stringliteral">"validated too-long string"</font>);
03767 
03768   _dbus_string_init_const (&amp;str, <font class="stringliteral">"abc"</font>);
03769   <font class="keywordflow">if</font> (_dbus_string_validate_member (&amp;str, 0, 4))
03770     _dbus_assert_not_reached (<font class="stringliteral">"validated too-long string"</font>);
03771 
03772   <font class="comment">/* Validate string exceeding max name length */</font>
03773   <font class="keywordflow">if</font> (!_dbus_string_init (&amp;str))
03774     _dbus_assert_not_reached (<font class="stringliteral">"no memory"</font>);
03775 
03776   <font class="keywordflow">while</font> (_dbus_string_get_length (&amp;str) &lt;= DBUS_MAXIMUM_NAME_LENGTH)
03777     <font class="keywordflow">if</font> (!_dbus_string_append (&amp;str, <font class="stringliteral">"abc.def"</font>))
03778       _dbus_assert_not_reached (<font class="stringliteral">"no memory"</font>);
03779 
03780   <font class="keywordflow">if</font> (_dbus_string_validate_service (&amp;str, 0, _dbus_string_get_length (&amp;str)))
03781     _dbus_assert_not_reached (<font class="stringliteral">"validated overmax string"</font>);
03782   <font class="keywordflow">if</font> (_dbus_string_validate_interface (&amp;str, 0, _dbus_string_get_length (&amp;str)))
03783     _dbus_assert_not_reached (<font class="stringliteral">"validated overmax string"</font>);
03784   <font class="keywordflow">if</font> (_dbus_string_validate_error_name (&amp;str, 0, _dbus_string_get_length (&amp;str)))
03785     _dbus_assert_not_reached (<font class="stringliteral">"validated overmax string"</font>);
03786 
03787   <font class="comment">/* overlong member */</font>
03788   _dbus_string_set_length (&amp;str, 0);
03789   <font class="keywordflow">while</font> (_dbus_string_get_length (&amp;str) &lt;= DBUS_MAXIMUM_NAME_LENGTH)
03790     <font class="keywordflow">if</font> (!_dbus_string_append (&amp;str, <font class="stringliteral">"abc"</font>))
03791       _dbus_assert_not_reached (<font class="stringliteral">"no memory"</font>);  
03792 
03793   <font class="keywordflow">if</font> (_dbus_string_validate_member (&amp;str, 0, _dbus_string_get_length (&amp;str)))
03794     _dbus_assert_not_reached (<font class="stringliteral">"validated overmax string"</font>);
03795 
03796   <font class="comment">/* overlong base service */</font>
03797   _dbus_string_set_length (&amp;str, 0);
03798   _dbus_string_append (&amp;str, <font class="stringliteral">":"</font>);
03799   <font class="keywordflow">while</font> (_dbus_string_get_length (&amp;str) &lt;= DBUS_MAXIMUM_NAME_LENGTH)
03800     <font class="keywordflow">if</font> (!_dbus_string_append (&amp;str, <font class="stringliteral">"abc"</font>))
03801       _dbus_assert_not_reached (<font class="stringliteral">"no memory"</font>);  
03802 
03803   <font class="keywordflow">if</font> (_dbus_string_validate_service (&amp;str, 0, _dbus_string_get_length (&amp;str)))
03804     _dbus_assert_not_reached (<font class="stringliteral">"validated overmax string"</font>);
03805   
03806   _dbus_string_free (&amp;str);
03807   
03808   <font class="keywordflow">return</font> TRUE;
03809 }
03810 
03811 <font class="preprocessor">#endif </font><font class="comment">/* DBUS_BUILD_TESTS */</font>
</pre></div><hr><address align="right"><small>Generated on Wed Jun 9 05:01:27 2004 for D-BUS by
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border=0 
width=110 height=53></a>1.2.15 </small></address>
</body>
</html>