Changeset 5817 in orxonox.OLD for branches/world_entities/src/lib/tinyxml/tinystr.cc
- Timestamp:
- Nov 29, 2005, 10:52:08 AM (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/world_entities/src/lib/tinyxml/tinystr.cc
r4491 r5817 3 3 Original file by Yves Berquin. 4 4 5 This software is provided 'as-is', without any express or implied 6 warranty. In no event will the authors be held liable for any 5 This software is provided 'as-is', without any express or implied 6 warranty. In no event will the authors be held liable for any 7 7 damages arising from the use of this software. 8 8 9 Permission is granted to anyone to use this software for any 10 purpose, including commercial applications, and to alter it and 9 Permission is granted to anyone to use this software for any 10 purpose, including commercial applications, and to alter it and 11 11 redistribute it freely, subject to the following restrictions: 12 12 13 1. The origin of this software must not be misrepresented; you must 14 not claim that you wrote the original software. If you use this 15 software in a product, an acknowledgment in the product documentation 13 1. The origin of this software must not be misrepresented; you must 14 not claim that you wrote the original software. If you use this 15 software in a product, an acknowledgment in the product documentation 16 16 would be appreciated but is not required. 17 17 … … 19 19 must not be misrepresented as being the original software. 20 20 21 3. This notice may not be removed or altered from any source 21 3. This notice may not be removed or altered from any source 22 22 distribution. 23 23 */ 24 24 25 #include "tinyxml.h" 25 /* 26 * THIS FILE WAS ALTERED BY Tyge Løvset, 7. April 2005. 27 */ 28 26 29 27 30 #ifndef TIXML_USE_STL 28 31 29 30 #include <stdlib.h>31 #include <string.h>32 #include <ctype.h>33 34 32 #include "tinystr.h" 35 33 36 // TiXmlString constructor, based on a C string 37 TiXmlString::TiXmlString (const char* instring) 34 // Error value for find primitive 35 const TiXmlString::size_type TiXmlString::npos = static_cast< size_type >(-1); 36 37 // Null rep. 38 TiXmlString::Rep TiXmlString::nullrep_ = { 0, 0, '\0' }; 39 40 41 void TiXmlString::reserve (size_type cap) 38 42 { 39 size_t newlen; 40 char * newstring; 41 42 if (!instring) 43 { 44 allocated = 0; 45 cstring = NULL; 46 current_length = 0; 47 return; 48 } 49 newlen = strlen (instring) + 1; 50 newstring = new char [newlen]; 51 memcpy (newstring, instring, newlen); 52 // strcpy (newstring, instring); 53 allocated = newlen; 54 cstring = newstring; 55 current_length = newlen - 1; 56 } 57 58 // TiXmlString copy constructor 59 TiXmlString::TiXmlString (const TiXmlString& copy) 60 { 61 size_t newlen; 62 char * newstring; 63 64 // Prevent copy to self! 65 if ( © == this ) 66 return; 67 68 if (! copy . allocated) 69 { 70 allocated = 0; 71 cstring = NULL; 72 current_length = 0; 73 return; 74 } 75 newlen = copy . length () + 1; 76 newstring = new char [newlen]; 77 // strcpy (newstring, copy . cstring); 78 memcpy (newstring, copy . cstring, newlen); 79 allocated = newlen; 80 cstring = newstring; 81 current_length = newlen - 1; 82 } 83 84 // TiXmlString = operator. Safe when assign own content 85 void TiXmlString ::operator = (const char * content) 86 { 87 size_t newlen; 88 char * newstring; 89 90 if (! content) 91 { 92 empty_it (); 93 return; 94 } 95 newlen = strlen (content) + 1; 96 newstring = new char [newlen]; 97 // strcpy (newstring, content); 98 memcpy (newstring, content, newlen); 99 empty_it (); 100 allocated = newlen; 101 cstring = newstring; 102 current_length = newlen - 1; 103 } 104 105 // = operator. Safe when assign own content 106 void TiXmlString ::operator = (const TiXmlString & copy) 107 { 108 size_t newlen; 109 char * newstring; 110 111 if (! copy . length ()) 112 { 113 empty_it (); 114 return; 115 } 116 newlen = copy . length () + 1; 117 newstring = new char [newlen]; 118 // strcpy (newstring, copy . c_str ()); 119 memcpy (newstring, copy . c_str (), newlen); 120 empty_it (); 121 allocated = newlen; 122 cstring = newstring; 123 current_length = newlen - 1; 43 if (cap > capacity()) 44 { 45 TiXmlString tmp; 46 tmp.init(length(), cap); 47 memcpy(tmp.start(), data(), length()); 48 swap(tmp); 49 } 124 50 } 125 51 126 52 127 // append a const char * to an existing TiXmlString 128 void TiXmlString::append( const char* str, size_t len ) 53 TiXmlString& TiXmlString::assign(const char* str, size_type len) 129 54 { 130 char * new_string; 131 size_t new_alloc, new_size, size_suffix; 132 133 // don't use strlen - it can overrun the len passed in! 134 const char* p = str; 135 size_suffix = 0; 136 137 while ( *p && size_suffix < (unsigned)len ) 55 size_type cap = capacity(); 56 if (len > cap || cap > 3*(len + 8)) 138 57 { 139 ++p; 140 ++size_suffix; 58 TiXmlString tmp; 59 tmp.init(len); 60 memcpy(tmp.start(), str, len); 61 swap(tmp); 141 62 } 142 if ( !size_suffix) 143 return; 144 145 new_size = length () + size_suffix + 1; 146 // check if we need to expand 147 if (new_size > allocated) 148 { 149 // compute new size 150 new_alloc = assign_new_size (new_size); 151 152 // allocate new buffer 153 new_string = new char [new_alloc]; 154 new_string [0] = 0; 155 156 // copy the previous allocated buffer into this one 157 if (allocated && cstring) 158 // strcpy (new_string, cstring); 159 memcpy (new_string, cstring, length ()); 160 161 // append the suffix. It does exist, otherwize we wouldn't be expanding 162 // strncat (new_string, str, len); 163 memcpy (new_string + length (), 164 str, 165 size_suffix); 166 167 // return previsously allocated buffer if any 168 if (allocated && cstring) 169 delete [] cstring; 170 171 // update member variables 172 cstring = new_string; 173 allocated = new_alloc; 174 } 175 else 176 { 177 // we know we can safely append the new string 178 // strncat (cstring, str, len); 179 memcpy (cstring + length (), 180 str, 181 size_suffix); 182 } 183 current_length = new_size - 1; 184 cstring [current_length] = 0; 63 else 64 { 65 memmove(start(), str, len); 66 set_size(len); 67 } 68 return *this; 185 69 } 186 70 187 71 188 // append a const char * to an existing TiXmlString 189 void TiXmlString::append( const char * suffix ) 72 TiXmlString& TiXmlString::append(const char* str, size_type len) 190 73 { 191 char * new_string; 192 size_t new_alloc, new_size; 193 194 new_size = length () + strlen (suffix) + 1; 195 // check if we need to expand 196 if (new_size > allocated) 197 { 198 // compute new size 199 new_alloc = assign_new_size (new_size); 200 201 // allocate new buffer 202 new_string = new char [new_alloc]; 203 new_string [0] = 0; 204 205 // copy the previous allocated buffer into this one 206 if (allocated && cstring) 207 memcpy (new_string, cstring, 1 + length ()); 208 // strcpy (new_string, cstring); 209 210 // append the suffix. It does exist, otherwize we wouldn't be expanding 211 // strcat (new_string, suffix); 212 memcpy (new_string + length (), 213 suffix, 214 strlen (suffix) + 1); 215 216 // return previsously allocated buffer if any 217 if (allocated && cstring) 218 delete [] cstring; 219 220 // update member variables 221 cstring = new_string; 222 allocated = new_alloc; 223 } 224 else 225 { 226 // we know we can safely append the new string 227 // strcat (cstring, suffix); 228 memcpy (cstring + length (), 229 suffix, 230 strlen (suffix) + 1); 231 } 232 current_length = new_size - 1; 233 } 234 235 // Check for TiXmlString equuivalence 236 //bool TiXmlString::operator == (const TiXmlString & compare) const 237 //{ 238 // return (! strcmp (c_str (), compare . c_str ())); 239 //} 240 241 //unsigned TiXmlString::length () const 242 //{ 243 // if (allocated) 244 // // return strlen (cstring); 245 // return current_length; 246 // return 0; 247 //} 248 249 250 unsigned TiXmlString::find (char tofind, unsigned offset) const 251 { 252 char * lookup; 253 254 if (offset >= length ()) 255 return (unsigned) notfound; 256 for (lookup = cstring + offset; * lookup; lookup++) 257 if (* lookup == tofind) 258 return (unsigned)(lookup - cstring); 259 return (unsigned) notfound; 74 size_type newsize = length() + len; 75 if (newsize > capacity()) 76 { 77 reserve (newsize + capacity()); 78 } 79 memmove(finish(), str, len); 80 set_size(newsize); 81 return *this; 260 82 } 261 83 262 84 263 bool TiXmlString::operator == (const TiXmlString & compare) const 85 TiXmlString operator + (const TiXmlString & a, const TiXmlString & b) 264 86 { 265 if ( allocated && compare.allocated ) 266 { 267 assert( cstring ); 268 assert( compare.cstring ); 269 return ( strcmp( cstring, compare.cstring ) == 0 ); 270 } 271 else if ( length() == 0 && compare.length() == 0 ) 272 { 273 return true; 274 } 275 return false; 87 TiXmlString tmp; 88 tmp.reserve(a.length() + b.length()); 89 tmp += a; 90 tmp += b; 91 return tmp; 276 92 } 277 93 278 279 bool TiXmlString::operator == (const char* compare) const 94 TiXmlString operator + (const TiXmlString & a, const char* b) 280 95 { 281 if ( allocated && compare && *compare ) 282 { 283 assert( cstring ); 284 return ( strcmp( cstring, compare ) == 0 ); 285 } 286 else if ( length() == 0 && (!compare || !*compare ) ) // this is a little dubious, but try to duplicate behavior in other operator== 287 { 288 return true; 289 } 290 return false; 96 TiXmlString tmp; 97 TiXmlString::size_type b_len = static_cast<TiXmlString::size_type>( strlen(b) ); 98 tmp.reserve(a.length() + b_len); 99 tmp += a; 100 tmp.append(b, b_len); 101 return tmp; 291 102 } 292 103 293 294 bool TiXmlString::operator < (const TiXmlString & compare) const 104 TiXmlString operator + (const char* a, const TiXmlString & b) 295 105 { 296 if ( allocated && compare.allocated ) 297 { 298 assert( cstring ); 299 assert( compare.cstring ); 300 return ( strcmp( cstring, compare.cstring ) > 0 ); 301 } 302 return false; 303 } 304 305 306 bool TiXmlString::operator > (const TiXmlString & compare) const 307 { 308 if ( allocated && compare.allocated ) 309 { 310 assert( cstring ); 311 assert( compare.cstring ); 312 return ( strcmp( cstring, compare.cstring ) < 0 ); 313 } 314 return false; 106 TiXmlString tmp; 107 TiXmlString::size_type a_len = static_cast<TiXmlString::size_type>( strlen(a) ); 108 tmp.reserve(a_len + b.length()); 109 tmp.append(a, a_len); 110 tmp += b; 111 return tmp; 315 112 } 316 113
Note: See TracChangeset
for help on using the changeset viewer.