<!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> <a class="qindex" href="modules.html">Modules</a> <a class="qindex" href="annotated.html">Data Structures</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="functions.html">Data Fields</a> <a class="qindex" href="pages.html">Related Pages</a> </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 <string.h></font> 00028 <font class="comment">/* for vsnprintf */</font> 00029 <font class="preprocessor">#include <stdio.h></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)->invalid); _dbus_assert ((real)->len >= 0); _dbus_assert ((real)->allocated >= 0); _dbus_assert ((real)->max_length >= 0); _dbus_assert ((real)->len <= ((real)->allocated - ALLOCATION_PADDING)); _dbus_assert ((real)->len <= (real)->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)->constant); \</font> 00103 <font class="preprocessor"> _dbus_assert (!(real)->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)->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->allocated for the align offset and nul byte */</font> 00139 _dbus_assert (real-><a class="code" href="structDBusRealString.html#m1">len</a> <= real-><a class="code" href="structDBusRealString.html#m2">allocated</a> - ALLOCATION_PADDING); 00140 00141 old_align_offset = real-><a class="code" href="structDBusRealString.html#m7">align_offset</a>; 00142 real_block = real-><a class="code" href="structDBusRealString.html#m0">str</a> - old_align_offset; 00143 00144 aligned = _DBUS_ALIGN_ADDRESS (real_block, 8); 00145 00146 real-><a class="code" href="structDBusRealString.html#m7">align_offset</a> = aligned - real_block; 00147 real-><a class="code" href="structDBusRealString.html#m0">str</a> = aligned; 00148 00149 <font class="keywordflow">if</font> (old_align_offset != real-><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-><a class="code" href="structDBusRealString.html#m7">align_offset</a>, 00153 real_block + old_align_offset, 00154 real-><a class="code" href="structDBusRealString.html#m1">len</a> + 1); 00155 } 00156 00157 _dbus_assert (real-><a class="code" href="structDBusRealString.html#m7">align_offset</a> < 8); 00158 _dbus_assert (_DBUS_ALIGN_ADDRESS (real-><a class="code" href="structDBusRealString.html#m0">str</a>, 8) == real-><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-><a class="code" href="structDBusRealString.html#m7">align_offset</a> != 0) 00165 { 00166 memmove (real-><a class="code" href="structDBusRealString.html#m0">str</a> - real-><a class="code" href="structDBusRealString.html#m7">align_offset</a>, 00167 real-><a class="code" href="structDBusRealString.html#m0">str</a>, 00168 real-><a class="code" href="structDBusRealString.html#m1">len</a> + 1); 00169 00170 real-><a class="code" href="structDBusRealString.html#m0">str</a> = real-><a class="code" href="structDBusRealString.html#m0">str</a> - real-><a class="code" href="structDBusRealString.html#m7">align_offset</a>; 00171 real-><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->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-><a class="code" href="structDBusRealString.html#m0">str</a> = dbus_malloc (ALLOCATION_PADDING + allocate_size); 00203 <font class="keywordflow">if</font> (real-><a class="code" href="structDBusRealString.html#m0">str</a> == NULL) 00204 <font class="keywordflow">return</font> FALSE; 00205 00206 real-><a class="code" href="structDBusRealString.html#m2">allocated</a> = ALLOCATION_PADDING + allocate_size; 00207 real-><a class="code" href="structDBusRealString.html#m1">len</a> = 0; 00208 real-><a class="code" href="structDBusRealString.html#m0">str</a>[real-><a class="code" href="structDBusRealString.html#m1">len</a>] = <font class="charliteral">'\0'</font>; 00209 00210 real-><a class="code" href="structDBusRealString.html#m3">max_length</a> = MAX_MAX_LENGTH; 00211 real-><a class="code" href="structDBusRealString.html#m4">constant</a> = FALSE; 00212 real-><a class="code" href="structDBusRealString.html#m5">locked</a> = FALSE; 00213 real-><a class="code" href="structDBusRealString.html#m6">invalid</a> = FALSE; 00214 real-><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-><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 <= MAX_MAX_LENGTH); 00290 _dbus_assert (len >= 0); 00291 00292 real = (<a class="code" href="structDBusRealString.html">DBusRealString</a>*) str; 00293 00294 real-><a class="code" href="structDBusRealString.html#m0">str</a> = (<font class="keywordtype">char</font>*) value; 00295 real-><a class="code" href="structDBusRealString.html#m1">len</a> = len; 00296 real-><a class="code" href="structDBusRealString.html#m2">allocated</a> = real-><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-><a class="code" href="structDBusRealString.html#m3">max_length</a> = real-><a class="code" href="structDBusRealString.html#m1">len</a> + 1; 00298 real-><a class="code" href="structDBusRealString.html#m4">constant</a> = TRUE; 00299 real-><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-><a class="code" href="structDBusRealString.html#m4">constant</a>) 00318 <font class="keywordflow">return</font>; 00319 dbus_free (real-><a class="code" href="structDBusRealString.html#m0">str</a> - real-><a class="code" href="structDBusRealString.html#m7">align_offset</a>); 00320 00321 real-><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->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->allocated - MAX_WASTE > real->len) 00349 { 00350 <font class="keywordtype">char</font> *new_str; 00351 <font class="keywordtype">int</font> new_allocated; 00352 00353 new_allocated = real->len + ALLOCATION_PADDING; 00354 00355 new_str = dbus_realloc (real->str - real->align_offset, 00356 new_allocated); 00357 <font class="keywordflow">if</font> (new_str != NULL) 00358 { 00359 real->str = new_str + real->align_offset; 00360 real->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-><a class="code" href="structDBusRealString.html#m2">allocated</a> > (MAX_MAX_LENGTH + ALLOCATION_PADDING) / 2) 00378 new_allocated = MAX_MAX_LENGTH + ALLOCATION_PADDING; 00379 <font class="keywordflow">else</font> 00380 new_allocated = real-><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 >= real-><a class="code" href="structDBusRealString.html#m2">allocated</a>); <font class="comment">/* code relies on this */</font> 00395 new_str = dbus_realloc (real-><a class="code" href="structDBusRealString.html#m0">str</a> - real-><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-><a class="code" href="structDBusRealString.html#m0">str</a> = new_str + real-><a class="code" href="structDBusRealString.html#m7">align_offset</a>; 00400 real-><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 > real-><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 > (real-><a class="code" href="structDBusRealString.html#m2">allocated</a> - ALLOCATION_PADDING) && 00416 !reallocate_for_length (real, new_length)) 00417 <font class="keywordflow">return</font> FALSE; 00418 <font class="keywordflow">else</font> 00419 { 00420 real-><a class="code" href="structDBusRealString.html#m1">len</a> = new_length; 00421 real-><a class="code" href="structDBusRealString.html#m0">str</a>[real-><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 > dest-><a class="code" href="structDBusRealString.html#m3">max_length</a> - dest-><a class="code" href="structDBusRealString.html#m1">len</a>) 00435 <font class="keywordflow">return</font> FALSE; <font class="comment">/* detected overflow of dest->len + len below */</font> 00436 00437 <font class="keywordflow">if</font> (!set_length (dest, dest-><a class="code" href="structDBusRealString.html#m1">len</a> + len)) 00438 <font class="keywordflow">return</font> FALSE; 00439 00440 memmove (dest-><a class="code" href="structDBusRealString.html#m0">str</a> + insert_at + len, 00441 dest-><a class="code" href="structDBusRealString.html#m0">str</a> + insert_at, 00442 dest-><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->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->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 >= 0); 00500 _dbus_assert (len >= 0); 00501 _dbus_assert (start <= real->len); 00502 _dbus_assert (len <= real->len - start); 00503 00504 <font class="keywordflow">return</font> real->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 >= 0); 00522 _dbus_assert (len >= 0); 00523 _dbus_assert (start <= real->len); 00524 _dbus_assert (len <= real->len - start); 00525 00526 <font class="keywordflow">return</font> real->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 < real->len); 00543 _dbus_assert (i >= 0); 00544 00545 real->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 <= real->len); 00563 _dbus_assert (start >= 0); 00564 00565 <font class="keywordflow">return</font> real->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 <= real->len); 00586 _dbus_assert (i >= 0); 00587 _dbus_assert (n_bytes >= 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->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->str; 00621 00622 old_max_length = real->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->str = *data_return; 00629 *data_return = NULL; 00630 fixup_alignment (real); 00631 <font class="keywordflow">return</font> FALSE; 00632 } 00633 00634 real->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 >= 0); 00664 _dbus_assert (len >= 0); 00665 _dbus_assert (start <= real->len); 00666 _dbus_assert (len <= real->len - start); 00667 00668 <font class="keywordflow">if</font> (!_dbus_string_init (&dest)) 00669 <font class="keywordflow">return</font> FALSE; 00670 00671 set_max_length (&dest, real->max_length); 00672 00673 <font class="keywordflow">if</font> (!_dbus_string_move_len (str, start, len, &dest, 0)) 00674 { 00675 _dbus_string_free (&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 (&dest, data_return)) 00681 { 00682 _dbus_string_free (&dest); 00683 <font class="keywordflow">return</font> FALSE; 00684 } 00685 00686 _dbus_string_free (&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->len + 1); 00706 <font class="keywordflow">if</font> (*data_return == NULL) 00707 <font class="keywordflow">return</font> FALSE; 00708 00709 memcpy (*data_return, real->str, real->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 >= 0); 00734 _dbus_assert (len >= 0); 00735 _dbus_assert (start <= real->len); 00736 _dbus_assert (len <= real->len - start); 00737 00738 <font class="keywordflow">if</font> (!_dbus_string_init (&dest)) 00739 <font class="keywordflow">return</font> FALSE; 00740 00741 set_max_length (&dest, real->max_length); 00742 00743 <font class="keywordflow">if</font> (!_dbus_string_copy_len (str, start, len, &dest, 0)) 00744 { 00745 _dbus_string_free (&dest); 00746 <font class="keywordflow">return</font> FALSE; 00747 } 00748 00749 <font class="keywordflow">if</font> (!_dbus_string_steal_data (&dest, data_return)) 00750 { 00751 _dbus_string_free (&dest); 00752 <font class="keywordflow">return</font> FALSE; 00753 } 00754 00755 _dbus_string_free (&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->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 >= 0); 00790 00791 <font class="keywordflow">if</font> (additional_length > real->max_length - real->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->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 >= 0); 00810 _dbus_assert (length_to_remove <= real->len); 00811 00812 set_length (real, 00813 real->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 >= 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 >= 1); 00845 _dbus_assert (alignment <= 8); /* it has to be a bug if > 8 */ 00846 00847 new_len = _DBUS_ALIGN_VALUE (real->len, alignment); 00848 <font class="keywordflow">if</font> (new_len > (<font class="keywordtype">unsigned</font> <font class="keywordtype">long</font>) real->max_length - then_lengthen_by) 00849 <font class="keywordflow">return</font> FALSE; 00850 new_len += then_lengthen_by; 00851 00852 delta = new_len - real->len; 00853 _dbus_assert (delta >= 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 < 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 < (new_len - then_lengthen_by)) 00869 { 00870 real->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-><a class="code" href="structDBusRealString.html#m0">str</a> + (real-><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 > (<font class="keywordtype">unsigned</font> <font class="keywordtype">long</font>) real-><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-><a class="code" href="structDBusRealString.html#m0">str</a> + (real-><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-><a class="code" href="structDBusRealString.html#m0">str</a> + (real-><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-><a class="code" href="structDBusRealString.html#m0">str</a> + (real-><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-><a class="code" href="structDBusRealString.html#m0">str</a> + real-><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 (&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-><a class="code" href="structDBusRealString.html#m0">str</a> + (real-><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 >= 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-><a class="code" href="structDBusRealString.html#m1">len</a> + 1)) 01100 <font class="keywordflow">return</font> FALSE; 01101 01102 real-><a class="code" href="structDBusRealString.html#m0">str</a>[real-><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 < 0x80) 01130 { 01131 first = 0; 01132 len = 1; 01133 } 01134 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (ch < 0x800) 01135 { 01136 first = 0xc0; 01137 len = 2; 01138 } 01139 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (ch < 0x10000) 01140 { 01141 first = 0xe0; 01142 len = 3; 01143 } 01144 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (ch < 0x200000) 01145 { 01146 first = 0xf0; 01147 len = 4; 01148 } 01149 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (ch < 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 > (real-><a class="code" href="structDBusRealString.html#m3">max_length</a> - real-><a class="code" href="structDBusRealString.html#m1">len</a>)) 01161 <font class="keywordflow">return</font> FALSE; <font class="comment">/* real->len + len would overflow */</font> 01162 01163 <font class="keywordflow">if</font> (!set_length (real, real-><a class="code" href="structDBusRealString.html#m1">len</a> + len)) 01164 <font class="keywordflow">return</font> FALSE; 01165 01166 out = real-><a class="code" href="structDBusRealString.html#m0">str</a> + (real-><a class="code" href="structDBusRealString.html#m1">len</a> - len); 01167 01168 <font class="keywordflow">for</font> (i = len - 1; i > 0; --i) 01169 { 01170 out[i] = (ch & 0x3f) | 0x80; 01171 ch >>= 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-><a class="code" href="structDBusRealString.html#m0">str</a> + start, real-><a class="code" href="structDBusRealString.html#m0">str</a> + start + len, real-><a class="code" href="structDBusRealString.html#m1">len</a> - (start + len)); 01187 real-><a class="code" href="structDBusRealString.html#m1">len</a> -= len; 01188 real-><a class="code" href="structDBusRealString.html#m0">str</a>[real-><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 >= 0); 01207 _dbus_assert (len >= 0); 01208 _dbus_assert (start <= real->len); 01209 _dbus_assert (len <= real->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-><a class="code" href="structDBusRealString.html#m0">str</a> + insert_at, 01228 source-><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->constant); \</font> 01250 <font class="preprocessor"> _dbus_assert (!real_dest->locked); \</font> 01251 <font class="preprocessor"> _dbus_assert ((start) >= 0); \</font> 01252 <font class="preprocessor"> _dbus_assert ((start) <= real_source->len); \</font> 01253 <font class="preprocessor"> _dbus_assert ((insert_at) >= 0); \</font> 01254 <font class="preprocessor"> _dbus_assert ((insert_at) <= real_dest->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 <= real_source->len); 01274 01275 <font class="keywordflow">return</font> _dbus_string_move_len (source, start, 01276 real_source-><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->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 >= 0); 01328 _dbus_assert ((start + len) <= real_source->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 && 01336 len == real_source->len && 01337 real_dest->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 ->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)->str = (b)->str; \</font> 01347 <font class="preprocessor"> (a)->len = (b)->len; \</font> 01348 <font class="preprocessor"> (a)->allocated = (b)->allocated; \</font> 01349 <font class="preprocessor"> (a)->align_offset = (b)->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 (&tmp, real_source); 01355 ASSIGN_DATA (real_source, real_dest); 01356 ASSIGN_DATA (real_dest, &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 >= 0); 01394 _dbus_assert (start <= real_source->len); 01395 _dbus_assert (len <= real_source->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 >= 0); 01433 _dbus_assert (start <= real_source->len); 01434 _dbus_assert (len <= real_source->len - start); 01435 _dbus_assert (replace_at >= 0); 01436 _dbus_assert (replace_at <= real_dest->len); 01437 _dbus_assert (replace_len <= real_dest->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 < 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 & 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 & 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 & 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 & 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 & 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) < 0x80 ? 1 : \</font> 01497 <font class="preprocessor"> ((Char) < 0x800 ? 2 : \</font> 01498 <font class="preprocessor"> ((Char) < 0x10000 ? 3 : \</font> 01499 <font class="preprocessor"> ((Char) < 0x200000 ? 4 : \</font> 01500 <font class="preprocessor"> ((Char) < 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] & (Mask); \</font> 01513 <font class="preprocessor"> for ((Count) = 1; (Count) < (Len); ++(Count)) \</font> 01514 <font class="preprocessor"> { \</font> 01515 <font class="preprocessor"> if (((Chars)[(Count)] & 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) <<= 6; \</font> 01521 <font class="preprocessor"> (Result) |= ((Chars)[(Count)] & 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) < 0x110000 && \</font> 01531 <font class="preprocessor"> (((Char) & 0xFFFFF800) != 0xD800) && \</font> 01532 <font class="preprocessor"> ((Char) < 0xFDD0 || (Char) > 0xFDEF) && \</font> 01533 <font class="preprocessor"> ((Char) & 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 >= 0); 01557 _dbus_assert (start <= real->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-><a class="code" href="structDBusRealString.html#m1">len</a>; 01563 01564 mask = 0; 01565 p = real-><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)->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 <= real->len); 01634 _dbus_assert (start >= 0); 01635 _dbus_assert (substr != NULL); 01636 _dbus_assert (end <= real->len); 01637 _dbus_assert (start <= 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 < end) 01649 { 01650 <font class="keywordflow">if</font> (real-><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 < 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-><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 <= real->len); 01700 _dbus_assert (start >= 0); 01701 _dbus_assert (found != NULL); 01702 01703 i = start - 1; 01704 <font class="keywordflow">while</font> (i >= 0) 01705 { 01706 <font class="keywordflow">if</font> (real-><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 >= 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 <= real->len); 01736 _dbus_assert (start >= 0); 01737 01738 i = start; 01739 <font class="keywordflow">while</font> (i < real-><a class="code" href="structDBusRealString.html#m1">len</a>) 01740 { 01741 <font class="keywordflow">if</font> (real-><a class="code" href="structDBusRealString.html#m0">str</a>[i] == <font class="charliteral">' '</font> || 01742 real-><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-><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 <= real->len); 01774 _dbus_assert (start >= 0); 01775 01776 i = start; 01777 <font class="keywordflow">while</font> (i < real-><a class="code" href="structDBusRealString.html#m1">len</a>) 01778 { 01779 <font class="keywordflow">if</font> (!(real-><a class="code" href="structDBusRealString.html#m0">str</a>[i] == <font class="charliteral">' '</font> || 01780 real-><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-><a class="code" href="structDBusRealString.html#m1">len</a> || !(real-><a class="code" href="structDBusRealString.html#m0">str</a>[i] == <font class="charliteral">' '</font> || 01787 real-><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 <= real->len); 01809 _dbus_assert (start >= 0); 01810 01811 i = start; 01812 <font class="keywordflow">while</font> (i < real-><a class="code" href="structDBusRealString.html#m1">len</a>) 01813 { 01814 <font class="keywordflow">if</font> (!(real-><a class="code" href="structDBusRealString.html#m0">str</a>[i] == <font class="charliteral">' '</font> || 01815 real-><a class="code" href="structDBusRealString.html#m0">str</a>[i] == <font class="charliteral">'\n'</font> || 01816 real-><a class="code" href="structDBusRealString.html#m0">str</a>[i] == <font class="charliteral">'\r'</font> || 01817 real-><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-><a class="code" href="structDBusRealString.html#m1">len</a> || !(real-><a class="code" href="structDBusRealString.html#m0">str</a>[i] == <font class="charliteral">' '</font> || 01824 real-><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>, &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) > 0); 01881 01882 <font class="keywordflow">if</font> (_dbus_string_get_length (dest) > 1 && 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, &i)) 01909 _dbus_string_skip_blank (str, i, &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, &i); 01925 01926 <font class="keywordflow">if</font> (i > 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-><a class="code" href="structDBusRealString.html#m1">len</a> != real_b-><a class="code" href="structDBusRealString.html#m1">len</a>) 01952 <font class="keywordflow">return</font> FALSE; 01953 01954 ap = real_a-><a class="code" href="structDBusRealString.html#m0">str</a>; 01955 bp = real_b-><a class="code" href="structDBusRealString.html#m0">str</a>; 01956 a_end = real_a-><a class="code" href="structDBusRealString.html#m0">str</a> + real_a-><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-><a class="code" href="structDBusRealString.html#m1">len</a> != real_b-><a class="code" href="structDBusRealString.html#m1">len</a> && 01995 (real_a-><a class="code" href="structDBusRealString.html#m1">len</a> < len || real_b-><a class="code" href="structDBusRealString.html#m1">len</a> < len)) 01996 <font class="keywordflow">return</font> FALSE; 01997 01998 ap = real_a-><a class="code" href="structDBusRealString.html#m0">str</a>; 01999 bp = real_b-><a class="code" href="structDBusRealString.html#m0">str</a>; 02000 a_end = real_a-><a class="code" href="structDBusRealString.html#m0">str</a> + MIN (real_a-><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-><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-><a class="code" href="structDBusRealString.html#m0">str</a> + real_a-><a class="code" href="structDBusRealString.html#m1">len</a>; 02034 <font class="keywordflow">while</font> (ap != a_end && *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-><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-><a class="code" href="structDBusRealString.html#m0">str</a> + real_a-><a class="code" href="structDBusRealString.html#m1">len</a>; 02070 <font class="keywordflow">while</font> (ap != a_end && *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-><a class="code" href="structDBusRealString.html#m1">len</a>) < c_str_len) 02108 <font class="keywordflow">return</font> FALSE; 02109 02110 ap = real_a-><a class="code" href="structDBusRealString.html#m0">str</a> + (real_a-><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-><a class="code" href="structDBusRealString.html#m0">str</a> + real_a-><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 <= _dbus_string_get_length (source)); 02154 02155 <font class="keywordflow">if</font> (!_dbus_string_init (&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 (&result, 02167 hexdigits[(*p >> 4)])) 02168 <font class="keywordflow">goto</font> out; 02169 02170 <font class="keywordflow">if</font> (!_dbus_string_append_byte (&result, 02171 hexdigits[(*p & 0x0f)])) 02172 <font class="keywordflow">goto</font> out; 02173 02174 ++p; 02175 } 02176 02177 <font class="keywordflow">if</font> (!_dbus_string_move (&result, 0, dest, insert_at)) 02178 <font class="keywordflow">goto</font> out; 02179 02180 retval = TRUE; 02181 02182 out: 02183 _dbus_string_free (&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 <= _dbus_string_get_length (source)); 02211 02212 <font class="keywordflow">if</font> (!_dbus_string_init (&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 (&result, 02289 val << 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 (&result); 02298 02299 b = _dbus_string_get_byte (&result, len - 1); 02300 02301 b |= val; 02302 02303 _dbus_string_set_byte (&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 (&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 (&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 >= 0); 02347 _dbus_assert (start <= real->len); 02348 _dbus_assert (len >= 0); 02349 02350 <font class="keywordflow">if</font> (len > real-><a class="code" href="structDBusRealString.html#m1">len</a> - start) 02351 <font class="keywordflow">return</font> FALSE; 02352 02353 s = real-><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 & ~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 >= 0); 02391 _dbus_assert (start <= real->len); 02392 _dbus_assert (len >= 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 > real-><a class="code" href="structDBusRealString.html#m1">len</a> - start)) 02403 <font class="keywordflow">return</font> FALSE; 02404 02405 p = real-><a class="code" href="structDBusRealString.html#m0">str</a> + start; 02406 end = p + len; 02407 02408 <font class="keywordflow">while</font> (p < 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) < 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 >= 0); 02468 _dbus_assert (len >= 0); 02469 _dbus_assert (start <= real->len); 02470 02471 <font class="keywordflow">if</font> (len > real-><a class="code" href="structDBusRealString.html#m1">len</a> - start) 02472 <font class="keywordflow">return</font> FALSE; 02473 02474 s = real-><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 >= 0); 02514 _dbus_assert (len >= 0); 02515 _dbus_assert (start <= real->len); 02516 02517 <font class="keywordflow">if</font> (len > real-><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 > 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-><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) < 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) < 2 && 02548 len > 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) >= 'A' && (c) <= 'Z') || \</font> 02560 <font class="preprocessor"> ((c) >= 'a' && (c) <= '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) >= '0' && (c) <= '9') || \</font> 02569 <font class="preprocessor"> ((c) >= 'A' && (c) <= 'Z') || \</font> 02570 <font class="preprocessor"> ((c) >= 'a' && (c) <= '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 >= 0); 02598 _dbus_assert (len >= 0); 02599 _dbus_assert (start <= real->len); 02600 02601 <font class="keywordflow">if</font> (len > real-><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 > 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-><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 > 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 >= 0); 02674 _dbus_assert (len >= 0); 02675 _dbus_assert (start <= real->len); 02676 02677 <font class="keywordflow">if</font> (len > real-><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 > 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-><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 > 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 >= 0); 02746 _dbus_assert (len >= 0); 02747 _dbus_assert (start <= real->len); 02748 02749 <font class="keywordflow">if</font> (len > real-><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 > DBUS_MAXIMUM_NAME_LENGTH) 02753 <font class="keywordflow">return</font> FALSE; 02754 02755 _dbus_assert (len > 0); 02756 02757 service = real-><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-><a class="code" href="structDBusRealString.html#m0">str</a> - real-><a class="code" href="structDBusRealString.html#m7">align_offset</a>, <font class="charliteral">'\0'</font>, real-><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 <stdio.h></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 >= 5 && _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 >= 4 && _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> && 02873 _dbus_string_get_length (str) >= start + 4 && 02874 _dbus_string_get_byte (str, start + 1) == <font class="charliteral">'\\'</font> && 02875 _dbus_string_get_byte (str, start + 2) == <font class="charliteral">'\''</font> && 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> && 02882 _dbus_string_get_length (str) >= start + 3 && 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, &val, &end)) 02891 _dbus_warn (<font class="stringliteral">"Failed to parse integer for BYTE\n"</font>); 02892 } 02893 02894 <font class="keywordflow">if</font> (val > 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, &val, &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, &val, &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 -> [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, &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 > 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 < 0) 02964 len = strlen (data); 02965 02966 <font class="keywordflow">if</font> (!_dbus_string_init (&orig)) 02967 _dbus_assert_not_reached (<font class="stringliteral">"could not init string"</font>); 02968 02969 <font class="keywordflow">if</font> (!_dbus_string_init (&encoded)) 02970 _dbus_assert_not_reached (<font class="stringliteral">"could not init string"</font>); 02971 02972 <font class="keywordflow">if</font> (!_dbus_string_init (&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 (&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 (&orig, 0, &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 (&encoded, 0, &end, &decoded, 0)) 02982 _dbus_assert_not_reached (<font class="stringliteral">"could not decode"</font>); 02983 02984 _dbus_assert (_dbus_string_get_length (&encoded) == end); 02985 02986 <font class="keywordflow">if</font> (!_dbus_string_equal (&orig, &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 (&orig), 02992 _dbus_string_get_length (&encoded), 02993 _dbus_string_get_length (&decoded)); 02994 printf (<font class="stringliteral">"Original: %s\n"</font>, data); 02995 s = _dbus_string_get_const_data (&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 (&orig); 03001 _dbus_string_free (&encoded); 03002 _dbus_string_free (&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 < _DBUS_N_ELEMENTS (buf)) 03034 { 03035 buf[i] = i; 03036 ++i; 03037 } 03038 i = 0; 03039 <font class="keywordflow">while</font> (i < _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 < _DBUS_N_ELEMENTS (lens)) 03178 { 03179 <font class="keywordflow">if</font> (!_dbus_string_init (&str)) 03180 _dbus_assert_not_reached (<font class="stringliteral">"failed to init string"</font>); 03181 03182 set_max_length (&str, lens[i]); 03183 03184 test_max_len (&str, lens[i]); 03185 _dbus_string_free (&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 < _DBUS_N_ELEMENTS (lens)) 03193 { 03194 <font class="keywordtype">int</font> j; 03195 03196 <font class="keywordflow">if</font> (!_dbus_string_init (&str)) 03197 _dbus_assert_not_reached (<font class="stringliteral">"failed to init string"</font>); 03198 03199 set_max_length (&str, lens[i]); 03200 03201 <font class="keywordflow">if</font> (!_dbus_string_set_length (&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 > 0) 03206 { 03207 _dbus_assert (_dbus_string_get_length (&str) == j); 03208 <font class="keywordflow">if</font> (j > 0) 03209 { 03210 _dbus_string_shorten (&str, 1); 03211 _dbus_assert (_dbus_string_get_length (&str) == (j - 1)); 03212 } 03213 --j; 03214 } 03215 03216 _dbus_string_free (&str); 03217 03218 ++i; 03219 } 03220 03221 <font class="comment">/* Test appending data */</font> 03222 <font class="keywordflow">if</font> (!_dbus_string_init (&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 < 10) 03227 { 03228 <font class="keywordflow">if</font> (!_dbus_string_append (&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 (&str) == i * 2 + 1); 03232 03233 <font class="keywordflow">if</font> (!_dbus_string_append_byte (&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 (&str) == i * 2 + 2); 03237 03238 ++i; 03239 } 03240 03241 _dbus_string_free (&str); 03242 03243 <font class="comment">/* Check steal_data */</font> 03244 03245 <font class="keywordflow">if</font> (!_dbus_string_init (&str)) 03246 _dbus_assert_not_reached (<font class="stringliteral">"failed to init string"</font>); 03247 03248 <font class="keywordflow">if</font> (!_dbus_string_append (&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 (&str); 03252 03253 <font class="keywordflow">if</font> (!_dbus_string_steal_data (&str, &s)) 03254 _dbus_assert_not_reached (<font class="stringliteral">"failed to steal data"</font>); 03255 03256 _dbus_assert (_dbus_string_get_length (&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 (&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 (&str); 03267 03268 <font class="keywordflow">if</font> (!_dbus_string_init (&other)) 03269 _dbus_assert_not_reached (<font class="stringliteral">"could not init string"</font>); 03270 03271 <font class="keywordflow">if</font> (!_dbus_string_move (&str, 0, &other, 0)) 03272 _dbus_assert_not_reached (<font class="stringliteral">"could not move"</font>); 03273 03274 _dbus_assert (_dbus_string_get_length (&str) == 0); 03275 _dbus_assert (_dbus_string_get_length (&other) == i); 03276 03277 <font class="keywordflow">if</font> (!_dbus_string_append (&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 (&str, 0, &other, _dbus_string_get_length (&other))) 03281 _dbus_assert_not_reached (<font class="stringliteral">"could not move"</font>); 03282 03283 _dbus_assert (_dbus_string_get_length (&str) == 0); 03284 _dbus_assert (_dbus_string_get_length (&other) == i * 2); 03285 03286 <font class="keywordflow">if</font> (!_dbus_string_append (&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 (&str, 0, &other, _dbus_string_get_length (&other) / 2)) 03290 _dbus_assert_not_reached (<font class="stringliteral">"could not move"</font>); 03291 03292 _dbus_assert (_dbus_string_get_length (&str) == 0); 03293 _dbus_assert (_dbus_string_get_length (&other) == i * 3); 03294 03295 _dbus_string_free (&other); 03296 03297 <font class="comment">/* Check copy */</font> 03298 03299 <font class="keywordflow">if</font> (!_dbus_string_append (&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 (&str); 03303 03304 <font class="keywordflow">if</font> (!_dbus_string_init (&other)) 03305 _dbus_assert_not_reached (<font class="stringliteral">"could not init string"</font>); 03306 03307 <font class="keywordflow">if</font> (!_dbus_string_copy (&str, 0, &other, 0)) 03308 _dbus_assert_not_reached (<font class="stringliteral">"could not copy"</font>); 03309 03310 _dbus_assert (_dbus_string_get_length (&str) == i); 03311 _dbus_assert (_dbus_string_get_length (&other) == i); 03312 03313 <font class="keywordflow">if</font> (!_dbus_string_copy (&str, 0, &other, _dbus_string_get_length (&other))) 03314 _dbus_assert_not_reached (<font class="stringliteral">"could not copy"</font>); 03315 03316 _dbus_assert (_dbus_string_get_length (&str) == i); 03317 _dbus_assert (_dbus_string_get_length (&other) == i * 2); 03318 _dbus_assert (_dbus_string_equal_c_str (&other, 03319 <font class="stringliteral">"Hello WorldHello World"</font>)); 03320 03321 <font class="keywordflow">if</font> (!_dbus_string_copy (&str, 0, &other, _dbus_string_get_length (&other) / 2)) 03322 _dbus_assert_not_reached (<font class="stringliteral">"could not copy"</font>); 03323 03324 _dbus_assert (_dbus_string_get_length (&str) == i); 03325 _dbus_assert (_dbus_string_get_length (&other) == i * 3); 03326 _dbus_assert (_dbus_string_equal_c_str (&other, 03327 <font class="stringliteral">"Hello WorldHello WorldHello World"</font>)); 03328 03329 _dbus_string_free (&str); 03330 _dbus_string_free (&other); 03331 03332 <font class="comment">/* Check replace */</font> 03333 03334 <font class="keywordflow">if</font> (!_dbus_string_init (&str)) 03335 _dbus_assert_not_reached (<font class="stringliteral">"failed to init string"</font>); 03336 03337 <font class="keywordflow">if</font> (!_dbus_string_append (&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 (&str); 03341 03342 <font class="keywordflow">if</font> (!_dbus_string_init (&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 (&str, 0, _dbus_string_get_length (&str), 03346 &other, 0, _dbus_string_get_length (&other))) 03347 _dbus_assert_not_reached (<font class="stringliteral">"could not replace"</font>); 03348 03349 _dbus_assert (_dbus_string_get_length (&str) == i); 03350 _dbus_assert (_dbus_string_get_length (&other) == i); 03351 _dbus_assert (_dbus_string_equal_c_str (&other, <font class="stringliteral">"Hello World"</font>)); 03352 03353 <font class="keywordflow">if</font> (!_dbus_string_replace_len (&str, 0, _dbus_string_get_length (&str), 03354 &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 (&str) == i); 03358 _dbus_assert (_dbus_string_get_length (&other) == i * 2 - 1); 03359 _dbus_assert (_dbus_string_equal_c_str (&other, 03360 <font class="stringliteral">"HelloHello WorldWorld"</font>)); 03361 03362 03363 <font class="keywordflow">if</font> (!_dbus_string_replace_len (&str, 1, 1, 03364 &other, 03365 _dbus_string_get_length (&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 (&str) == i); 03370 _dbus_assert (_dbus_string_get_length (&other) == i * 2 - 1); 03371 _dbus_assert (_dbus_string_equal_c_str (&other, 03372 <font class="stringliteral">"HelloHello WorldWorle"</font>)); 03373 03374 _dbus_string_free (&str); 03375 _dbus_string_free (&other); 03376 03377 <font class="comment">/* Check append/get unichar */</font> 03378 03379 <font class="keywordflow">if</font> (!_dbus_string_init (&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 (&str, 0xfffc)) 03384 _dbus_assert_not_reached (<font class="stringliteral">"failed to append unichar"</font>); 03385 03386 _dbus_string_get_unichar (&str, 0, &ch, &i); 03387 03388 _dbus_assert (ch == 0xfffc); 03389 _dbus_assert (i == _dbus_string_get_length (&str)); 03390 03391 _dbus_string_free (&str); 03392 03393 <font class="comment">/* Check insert/set/get byte */</font> 03394 03395 <font class="keywordflow">if</font> (!_dbus_string_init (&str)) 03396 _dbus_assert_not_reached (<font class="stringliteral">"failed to init string"</font>); 03397 03398 <font class="keywordflow">if</font> (!_dbus_string_append (&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 (&str, 0) == <font class="charliteral">'H'</font>); 03402 _dbus_assert (_dbus_string_get_byte (&str, 1) == <font class="charliteral">'e'</font>); 03403 _dbus_assert (_dbus_string_get_byte (&str, 2) == <font class="charliteral">'l'</font>); 03404 _dbus_assert (_dbus_string_get_byte (&str, 3) == <font class="charliteral">'l'</font>); 03405 _dbus_assert (_dbus_string_get_byte (&str, 4) == <font class="charliteral">'o'</font>); 03406 03407 _dbus_string_set_byte (&str, 1, <font class="charliteral">'q'</font>); 03408 _dbus_assert (_dbus_string_get_byte (&str, 1) == <font class="charliteral">'q'</font>); 03409 03410 <font class="keywordflow">if</font> (!_dbus_string_insert_bytes (&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 (&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 (&str, _dbus_string_get_length (&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 (&str, 0) == 255); 03420 _dbus_assert (_dbus_string_get_byte (&str, 1) == <font class="charliteral">'H'</font>); 03421 _dbus_assert (_dbus_string_get_byte (&str, 2) == <font class="charliteral">'Z'</font>); 03422 _dbus_assert (_dbus_string_get_byte (&str, 3) == <font class="charliteral">'Z'</font>); 03423 _dbus_assert (_dbus_string_get_byte (&str, 4) == <font class="charliteral">'Z'</font>); 03424 _dbus_assert (_dbus_string_get_byte (&str, 5) == <font class="charliteral">'Z'</font>); 03425 _dbus_assert (_dbus_string_get_byte (&str, 6) == <font class="charliteral">'q'</font>); 03426 _dbus_assert (_dbus_string_get_byte (&str, 7) == <font class="charliteral">'l'</font>); 03427 _dbus_assert (_dbus_string_get_byte (&str, 8) == <font class="charliteral">'l'</font>); 03428 _dbus_assert (_dbus_string_get_byte (&str, 9) == <font class="charliteral">'o'</font>); 03429 _dbus_assert (_dbus_string_get_byte (&str, 10) == <font class="charliteral">'W'</font>); 03430 03431 _dbus_string_free (&str); 03432 03433 <font class="comment">/* Check append/parse int/double */</font> 03434 03435 <font class="keywordflow">if</font> (!_dbus_string_init (&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 (&str, 27)) 03439 _dbus_assert_not_reached (<font class="stringliteral">"failed to append int"</font>); 03440 03441 i = _dbus_string_get_length (&str); 03442 03443 <font class="keywordflow">if</font> (!_dbus_string_parse_int (&str, 0, &v, &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 (&str); 03450 03451 <font class="keywordflow">if</font> (!_dbus_string_init (&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 (&str, 50.3)) 03455 _dbus_assert_not_reached (<font class="stringliteral">"failed to append float"</font>); 03456 03457 i = _dbus_string_get_length (&str); 03458 03459 <font class="keywordflow">if</font> (!_dbus_string_parse_double (&str, 0, &d, &end)) 03460 _dbus_assert_not_reached (<font class="stringliteral">"failed to parse float"</font>); 03461 03462 _dbus_assert (d > (50.3 - 1e-6) && d < (50.3 + 1e-6)); 03463 _dbus_assert (end == i); 03464 03465 _dbus_string_free (&str); 03466 03467 <font class="comment">/* Test find */</font> 03468 <font class="keywordflow">if</font> (!_dbus_string_init (&str)) 03469 _dbus_assert_not_reached (<font class="stringliteral">"failed to init string"</font>); 03470 03471 <font class="keywordflow">if</font> (!_dbus_string_append (&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 (&str, 0, <font class="stringliteral">"He"</font>, &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 (&str, 0, <font class="stringliteral">"Hello"</font>, &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 (&str, 0, <font class="stringliteral">"ello"</font>, &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 (&str, 0, <font class="stringliteral">"lo"</font>, &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 (&str, 2, <font class="stringliteral">"lo"</font>, &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 (&str, 4, <font class="stringliteral">"lo"</font>, &i)) 03495 _dbus_assert_not_reached (<font class="stringliteral">"did find 'lo'"</font>); 03496 03497 <font class="keywordflow">if</font> (!_dbus_string_find (&str, 0, <font class="stringliteral">"l"</font>, &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 (&str, 0, <font class="stringliteral">"H"</font>, &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 (&str, 0, <font class="stringliteral">""</font>, &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 (&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 (&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 (&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 (&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 (&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 (&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 (&str, _dbus_string_get_length (&str), <font class="charliteral">'H'</font>, &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 (&str, _dbus_string_get_length (&str), <font class="charliteral">'o'</font>, &i)) 03532 _dbus_assert_not_reached (<font class="stringliteral">"Did not find 'o'"</font>); 03533 _dbus_assert (i == _dbus_string_get_length (&str) - 1); 03534 03535 <font class="keywordflow">if</font> (_dbus_string_find_byte_backward (&str, _dbus_string_get_length (&str) - 1, <font class="charliteral">'o'</font>, &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 (&str, 1, <font class="charliteral">'e'</font>, &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 (&str, 2, <font class="charliteral">'e'</font>, &i)) 03544 _dbus_assert_not_reached (<font class="stringliteral">"Didn't find 'e'"</font>); 03545 _dbus_assert (i == 1); 03546 03547 _dbus_string_free (&str); 03548 03549 <font class="comment">/* Hex encoding */</font> 03550 _dbus_string_init_const (&str, <font class="stringliteral">"cafebabe, this is a bogus hex string"</font>); 03551 <font class="keywordflow">if</font> (!_dbus_string_init (&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 (&str, 0, &end, &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 (&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 < (int) _DBUS_N_ELEMENTS (valid_paths)) 03566 { 03567 _dbus_string_init_const (&str, valid_paths[i]); 03568 03569 <font class="keywordflow">if</font> (!_dbus_string_validate_path (&str, 0, 03570 _dbus_string_get_length (&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 < (int) _DBUS_N_ELEMENTS (invalid_paths)) 03581 { 03582 _dbus_string_init_const (&str, invalid_paths[i]); 03583 03584 <font class="keywordflow">if</font> (_dbus_string_validate_path (&str, 0, 03585 _dbus_string_get_length (&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 < (int) _DBUS_N_ELEMENTS (valid_interfaces)) 03597 { 03598 _dbus_string_init_const (&str, valid_interfaces[i]); 03599 03600 <font class="keywordflow">if</font> (!_dbus_string_validate_interface (&str, 0, 03601 _dbus_string_get_length (&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 < (int) _DBUS_N_ELEMENTS (invalid_interfaces)) 03612 { 03613 _dbus_string_init_const (&str, invalid_interfaces[i]); 03614 03615 <font class="keywordflow">if</font> (_dbus_string_validate_interface (&str, 0, 03616 _dbus_string_get_length (&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 < (int) _DBUS_N_ELEMENTS (valid_interfaces)) 03630 { 03631 _dbus_string_init_const (&str, valid_interfaces[i]); 03632 03633 <font class="keywordflow">if</font> (!_dbus_string_validate_service (&str, 0, 03634 _dbus_string_get_length (&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 < (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 (&str, invalid_interfaces[i]); 03649 03650 <font class="keywordflow">if</font> (_dbus_string_validate_service (&str, 0, 03651 _dbus_string_get_length (&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 < (int) _DBUS_N_ELEMENTS (valid_base_services)) 03664 { 03665 _dbus_string_init_const (&str, valid_base_services[i]); 03666 03667 <font class="keywordflow">if</font> (!_dbus_string_validate_service (&str, 0, 03668 _dbus_string_get_length (&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 < (int) _DBUS_N_ELEMENTS (invalid_base_services)) 03679 { 03680 _dbus_string_init_const (&str, invalid_base_services[i]); 03681 03682 <font class="keywordflow">if</font> (_dbus_string_validate_service (&str, 0, 03683 _dbus_string_get_length (&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 < (int) _DBUS_N_ELEMENTS (valid_interfaces)) 03697 { 03698 _dbus_string_init_const (&str, valid_interfaces[i]); 03699 03700 <font class="keywordflow">if</font> (!_dbus_string_validate_error_name (&str, 0, 03701 _dbus_string_get_length (&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 < (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 (&str, invalid_interfaces[i]); 03716 03717 <font class="keywordflow">if</font> (_dbus_string_validate_error_name (&str, 0, 03718 _dbus_string_get_length (&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 < (int) _DBUS_N_ELEMENTS (valid_members)) 03731 { 03732 _dbus_string_init_const (&str, valid_members[i]); 03733 03734 <font class="keywordflow">if</font> (!_dbus_string_validate_member (&str, 0, 03735 _dbus_string_get_length (&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 < (int) _DBUS_N_ELEMENTS (invalid_members)) 03746 { 03747 _dbus_string_init_const (&str, invalid_members[i]); 03748 03749 <font class="keywordflow">if</font> (_dbus_string_validate_member (&str, 0, 03750 _dbus_string_get_length (&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 (&str, <font class="stringliteral">"abc.efg"</font>); 03761 <font class="keywordflow">if</font> (_dbus_string_validate_service (&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 (&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 (&str, 0, 8)) 03766 _dbus_assert_not_reached (<font class="stringliteral">"validated too-long string"</font>); 03767 03768 _dbus_string_init_const (&str, <font class="stringliteral">"abc"</font>); 03769 <font class="keywordflow">if</font> (_dbus_string_validate_member (&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 (&str)) 03774 _dbus_assert_not_reached (<font class="stringliteral">"no memory"</font>); 03775 03776 <font class="keywordflow">while</font> (_dbus_string_get_length (&str) <= DBUS_MAXIMUM_NAME_LENGTH) 03777 <font class="keywordflow">if</font> (!_dbus_string_append (&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 (&str, 0, _dbus_string_get_length (&str))) 03781 _dbus_assert_not_reached (<font class="stringliteral">"validated overmax string"</font>); 03782 <font class="keywordflow">if</font> (_dbus_string_validate_interface (&str, 0, _dbus_string_get_length (&str))) 03783 _dbus_assert_not_reached (<font class="stringliteral">"validated overmax string"</font>); 03784 <font class="keywordflow">if</font> (_dbus_string_validate_error_name (&str, 0, _dbus_string_get_length (&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 (&str, 0); 03789 <font class="keywordflow">while</font> (_dbus_string_get_length (&str) <= DBUS_MAXIMUM_NAME_LENGTH) 03790 <font class="keywordflow">if</font> (!_dbus_string_append (&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 (&str, 0, _dbus_string_get_length (&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 (&str, 0); 03798 _dbus_string_append (&str, <font class="stringliteral">":"</font>); 03799 <font class="keywordflow">while</font> (_dbus_string_get_length (&str) <= DBUS_MAXIMUM_NAME_LENGTH) 03800 <font class="keywordflow">if</font> (!_dbus_string_append (&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 (&str, 0, _dbus_string_get_length (&str))) 03804 _dbus_assert_not_reached (<font class="stringliteral">"validated overmax string"</font>); 03805 03806 _dbus_string_free (&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>