Arduino Core API Library besed on mbed platform.

Dependents:   WeeESP8266 ESP8266_moj

Committer:
itead
Date:
Tue Feb 10 10:39:42 2015 +0000
Revision:
4:1fec2e4c60e5
Parent:
0:5ebc917ebd09
Change buffer size

Who changed what in which revision?

UserRevisionLine numberNew contents of line
itead 0:5ebc917ebd09 1 /*
itead 0:5ebc917ebd09 2 WString.cpp - String library for Wiring & Arduino
itead 0:5ebc917ebd09 3 ...mostly rewritten by Paul Stoffregen...
itead 0:5ebc917ebd09 4 Copyright (c) 2009-10 Hernando Barragan. All rights reserved.
itead 0:5ebc917ebd09 5 Copyright 2011, Paul Stoffregen, paul@pjrc.com
itead 0:5ebc917ebd09 6
itead 0:5ebc917ebd09 7 This library is free software; you can redistribute it and/or
itead 0:5ebc917ebd09 8 modify it under the terms of the GNU Lesser General Public
itead 0:5ebc917ebd09 9 License as published by the Free Software Foundation; either
itead 0:5ebc917ebd09 10 version 2.1 of the License, or (at your option) any later version.
itead 0:5ebc917ebd09 11
itead 0:5ebc917ebd09 12 This library is distributed in the hope that it will be useful,
itead 0:5ebc917ebd09 13 but WITHOUT ANY WARRANTY; without even the implied warranty of
itead 0:5ebc917ebd09 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
itead 0:5ebc917ebd09 15 Lesser General Public License for more details.
itead 0:5ebc917ebd09 16
itead 0:5ebc917ebd09 17 You should have received a copy of the GNU Lesser General Public
itead 0:5ebc917ebd09 18 License along with this library; if not, write to the Free Software
itead 0:5ebc917ebd09 19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
itead 0:5ebc917ebd09 20 */
itead 0:5ebc917ebd09 21
itead 0:5ebc917ebd09 22 #include "WString.h"
itead 0:5ebc917ebd09 23
itead 0:5ebc917ebd09 24
itead 0:5ebc917ebd09 25 /*********************************************/
itead 0:5ebc917ebd09 26 /* Constructors */
itead 0:5ebc917ebd09 27 /*********************************************/
itead 0:5ebc917ebd09 28
itead 0:5ebc917ebd09 29 String::String(const char *cstr)
itead 0:5ebc917ebd09 30 {
itead 0:5ebc917ebd09 31 init();
itead 0:5ebc917ebd09 32 if (cstr) copy(cstr, strlen(cstr));
itead 0:5ebc917ebd09 33 }
itead 0:5ebc917ebd09 34
itead 0:5ebc917ebd09 35 String::String(const String &value)
itead 0:5ebc917ebd09 36 {
itead 0:5ebc917ebd09 37 init();
itead 0:5ebc917ebd09 38 *this = value;
itead 0:5ebc917ebd09 39 }
itead 0:5ebc917ebd09 40
itead 0:5ebc917ebd09 41 #ifdef __GXX_EXPERIMENTAL_CXX0X__
itead 0:5ebc917ebd09 42 String::String(String &&rval)
itead 0:5ebc917ebd09 43 {
itead 0:5ebc917ebd09 44 init();
itead 0:5ebc917ebd09 45 move(rval);
itead 0:5ebc917ebd09 46 }
itead 0:5ebc917ebd09 47 String::String(StringSumHelper &&rval)
itead 0:5ebc917ebd09 48 {
itead 0:5ebc917ebd09 49 init();
itead 0:5ebc917ebd09 50 move(rval);
itead 0:5ebc917ebd09 51 }
itead 0:5ebc917ebd09 52 #endif
itead 0:5ebc917ebd09 53
itead 0:5ebc917ebd09 54 String::String(char c)
itead 0:5ebc917ebd09 55 {
itead 0:5ebc917ebd09 56 init();
itead 0:5ebc917ebd09 57 char buf[2];
itead 0:5ebc917ebd09 58 buf[0] = c;
itead 0:5ebc917ebd09 59 buf[1] = 0;
itead 0:5ebc917ebd09 60 *this = buf;
itead 0:5ebc917ebd09 61 }
itead 0:5ebc917ebd09 62
itead 0:5ebc917ebd09 63 String::String(unsigned char value, unsigned char base)
itead 0:5ebc917ebd09 64 {
itead 0:5ebc917ebd09 65 init();
itead 0:5ebc917ebd09 66 char buf[9];
itead 0:5ebc917ebd09 67 utoa(value, buf, base);
itead 0:5ebc917ebd09 68 *this = buf;
itead 0:5ebc917ebd09 69 }
itead 0:5ebc917ebd09 70
itead 0:5ebc917ebd09 71 String::String(int value, unsigned char base)
itead 0:5ebc917ebd09 72 {
itead 0:5ebc917ebd09 73 init();
itead 0:5ebc917ebd09 74 char buf[18];
itead 0:5ebc917ebd09 75 itoa(value, buf, base);
itead 0:5ebc917ebd09 76 *this = buf;
itead 0:5ebc917ebd09 77 }
itead 0:5ebc917ebd09 78
itead 0:5ebc917ebd09 79 String::String(unsigned int value, unsigned char base)
itead 0:5ebc917ebd09 80 {
itead 0:5ebc917ebd09 81 init();
itead 0:5ebc917ebd09 82 char buf[17];
itead 0:5ebc917ebd09 83 utoa(value, buf, base);
itead 0:5ebc917ebd09 84 *this = buf;
itead 0:5ebc917ebd09 85 }
itead 0:5ebc917ebd09 86
itead 0:5ebc917ebd09 87 String::String(long value, unsigned char base)
itead 0:5ebc917ebd09 88 {
itead 0:5ebc917ebd09 89 init();
itead 0:5ebc917ebd09 90 char buf[34];
itead 0:5ebc917ebd09 91 ltoa(value, buf, base);
itead 0:5ebc917ebd09 92 *this = buf;
itead 0:5ebc917ebd09 93 }
itead 0:5ebc917ebd09 94
itead 0:5ebc917ebd09 95 String::String(unsigned long value, unsigned char base)
itead 0:5ebc917ebd09 96 {
itead 0:5ebc917ebd09 97 init();
itead 0:5ebc917ebd09 98 char buf[33];
itead 0:5ebc917ebd09 99 ultoa(value, buf, base);
itead 0:5ebc917ebd09 100 *this = buf;
itead 0:5ebc917ebd09 101 }
itead 0:5ebc917ebd09 102
itead 0:5ebc917ebd09 103 String::~String()
itead 0:5ebc917ebd09 104 {
itead 0:5ebc917ebd09 105 free(buffer);
itead 0:5ebc917ebd09 106 }
itead 0:5ebc917ebd09 107
itead 0:5ebc917ebd09 108 /*********************************************/
itead 0:5ebc917ebd09 109 /* Memory Management */
itead 0:5ebc917ebd09 110 /*********************************************/
itead 0:5ebc917ebd09 111
itead 0:5ebc917ebd09 112 inline void String::init(void)
itead 0:5ebc917ebd09 113 {
itead 0:5ebc917ebd09 114 buffer = NULL;
itead 0:5ebc917ebd09 115 capacity = 0;
itead 0:5ebc917ebd09 116 len = 0;
itead 0:5ebc917ebd09 117 flags = 0;
itead 0:5ebc917ebd09 118 }
itead 0:5ebc917ebd09 119
itead 0:5ebc917ebd09 120 void String::invalidate(void)
itead 0:5ebc917ebd09 121 {
itead 0:5ebc917ebd09 122 if (buffer) free(buffer);
itead 0:5ebc917ebd09 123 buffer = NULL;
itead 0:5ebc917ebd09 124 capacity = len = 0;
itead 0:5ebc917ebd09 125 }
itead 0:5ebc917ebd09 126
itead 0:5ebc917ebd09 127 unsigned char String::reserve(unsigned int size)
itead 0:5ebc917ebd09 128 {
itead 0:5ebc917ebd09 129 if (buffer && capacity >= size) return 1;
itead 0:5ebc917ebd09 130 if (changeBuffer(size)) {
itead 0:5ebc917ebd09 131 if (len == 0) buffer[0] = 0;
itead 0:5ebc917ebd09 132 return 1;
itead 0:5ebc917ebd09 133 }
itead 0:5ebc917ebd09 134 return 0;
itead 0:5ebc917ebd09 135 }
itead 0:5ebc917ebd09 136
itead 0:5ebc917ebd09 137 unsigned char String::changeBuffer(unsigned int maxStrLen)
itead 0:5ebc917ebd09 138 {
itead 0:5ebc917ebd09 139 char *newbuffer = (char *)realloc(buffer, maxStrLen + 1);
itead 0:5ebc917ebd09 140 if (newbuffer) {
itead 0:5ebc917ebd09 141 buffer = newbuffer;
itead 0:5ebc917ebd09 142 capacity = maxStrLen;
itead 0:5ebc917ebd09 143 return 1;
itead 0:5ebc917ebd09 144 }
itead 0:5ebc917ebd09 145 return 0;
itead 0:5ebc917ebd09 146 }
itead 0:5ebc917ebd09 147
itead 0:5ebc917ebd09 148 /*********************************************/
itead 0:5ebc917ebd09 149 /* Copy and Move */
itead 0:5ebc917ebd09 150 /*********************************************/
itead 0:5ebc917ebd09 151
itead 0:5ebc917ebd09 152 String & String::copy(const char *cstr, unsigned int length)
itead 0:5ebc917ebd09 153 {
itead 0:5ebc917ebd09 154 if (!reserve(length)) {
itead 0:5ebc917ebd09 155 invalidate();
itead 0:5ebc917ebd09 156 return *this;
itead 0:5ebc917ebd09 157 }
itead 0:5ebc917ebd09 158 len = length;
itead 0:5ebc917ebd09 159 strcpy(buffer, cstr);
itead 0:5ebc917ebd09 160 return *this;
itead 0:5ebc917ebd09 161 }
itead 0:5ebc917ebd09 162
itead 0:5ebc917ebd09 163 #ifdef __GXX_EXPERIMENTAL_CXX0X__
itead 0:5ebc917ebd09 164 void String::move(String &rhs)
itead 0:5ebc917ebd09 165 {
itead 0:5ebc917ebd09 166 if (buffer) {
itead 0:5ebc917ebd09 167 if (capacity >= rhs.len) {
itead 0:5ebc917ebd09 168 strcpy(buffer, rhs.buffer);
itead 0:5ebc917ebd09 169 len = rhs.len;
itead 0:5ebc917ebd09 170 rhs.len = 0;
itead 0:5ebc917ebd09 171 return;
itead 0:5ebc917ebd09 172 } else {
itead 0:5ebc917ebd09 173 free(buffer);
itead 0:5ebc917ebd09 174 }
itead 0:5ebc917ebd09 175 }
itead 0:5ebc917ebd09 176 buffer = rhs.buffer;
itead 0:5ebc917ebd09 177 capacity = rhs.capacity;
itead 0:5ebc917ebd09 178 len = rhs.len;
itead 0:5ebc917ebd09 179 rhs.buffer = NULL;
itead 0:5ebc917ebd09 180 rhs.capacity = 0;
itead 0:5ebc917ebd09 181 rhs.len = 0;
itead 0:5ebc917ebd09 182 }
itead 0:5ebc917ebd09 183 #endif
itead 0:5ebc917ebd09 184
itead 0:5ebc917ebd09 185 String & String::operator = (const String &rhs)
itead 0:5ebc917ebd09 186 {
itead 0:5ebc917ebd09 187 if (this == &rhs) return *this;
itead 0:5ebc917ebd09 188
itead 0:5ebc917ebd09 189 if (rhs.buffer) copy(rhs.buffer, rhs.len);
itead 0:5ebc917ebd09 190 else invalidate();
itead 0:5ebc917ebd09 191
itead 0:5ebc917ebd09 192 return *this;
itead 0:5ebc917ebd09 193 }
itead 0:5ebc917ebd09 194
itead 0:5ebc917ebd09 195 #ifdef __GXX_EXPERIMENTAL_CXX0X__
itead 0:5ebc917ebd09 196 String & String::operator = (String &&rval)
itead 0:5ebc917ebd09 197 {
itead 0:5ebc917ebd09 198 if (this != &rval) move(rval);
itead 0:5ebc917ebd09 199 return *this;
itead 0:5ebc917ebd09 200 }
itead 0:5ebc917ebd09 201
itead 0:5ebc917ebd09 202 String & String::operator = (StringSumHelper &&rval)
itead 0:5ebc917ebd09 203 {
itead 0:5ebc917ebd09 204 if (this != &rval) move(rval);
itead 0:5ebc917ebd09 205 return *this;
itead 0:5ebc917ebd09 206 }
itead 0:5ebc917ebd09 207 #endif
itead 0:5ebc917ebd09 208
itead 0:5ebc917ebd09 209 String & String::operator = (const char *cstr)
itead 0:5ebc917ebd09 210 {
itead 0:5ebc917ebd09 211 if (cstr) copy(cstr, strlen(cstr));
itead 0:5ebc917ebd09 212 else invalidate();
itead 0:5ebc917ebd09 213
itead 0:5ebc917ebd09 214 return *this;
itead 0:5ebc917ebd09 215 }
itead 0:5ebc917ebd09 216
itead 0:5ebc917ebd09 217 /*********************************************/
itead 0:5ebc917ebd09 218 /* concat */
itead 0:5ebc917ebd09 219 /*********************************************/
itead 0:5ebc917ebd09 220
itead 0:5ebc917ebd09 221 unsigned char String::concat(const String &s)
itead 0:5ebc917ebd09 222 {
itead 0:5ebc917ebd09 223 return concat(s.buffer, s.len);
itead 0:5ebc917ebd09 224 }
itead 0:5ebc917ebd09 225
itead 0:5ebc917ebd09 226 unsigned char String::concat(const char *cstr, unsigned int length)
itead 0:5ebc917ebd09 227 {
itead 0:5ebc917ebd09 228 unsigned int newlen = len + length;
itead 0:5ebc917ebd09 229 if (!cstr) return 0;
itead 0:5ebc917ebd09 230 if (length == 0) return 1;
itead 0:5ebc917ebd09 231 if (!reserve(newlen)) return 0;
itead 0:5ebc917ebd09 232 strcpy(buffer + len, cstr);
itead 0:5ebc917ebd09 233 len = newlen;
itead 0:5ebc917ebd09 234 return 1;
itead 0:5ebc917ebd09 235 }
itead 0:5ebc917ebd09 236
itead 0:5ebc917ebd09 237 unsigned char String::concat(const char *cstr)
itead 0:5ebc917ebd09 238 {
itead 0:5ebc917ebd09 239 if (!cstr) return 0;
itead 0:5ebc917ebd09 240 return concat(cstr, strlen(cstr));
itead 0:5ebc917ebd09 241 }
itead 0:5ebc917ebd09 242
itead 0:5ebc917ebd09 243 unsigned char String::concat(char c)
itead 0:5ebc917ebd09 244 {
itead 0:5ebc917ebd09 245 char buf[2];
itead 0:5ebc917ebd09 246 buf[0] = c;
itead 0:5ebc917ebd09 247 buf[1] = 0;
itead 0:5ebc917ebd09 248 return concat(buf, 1);
itead 0:5ebc917ebd09 249 }
itead 0:5ebc917ebd09 250
itead 0:5ebc917ebd09 251 unsigned char String::concat(unsigned char num)
itead 0:5ebc917ebd09 252 {
itead 0:5ebc917ebd09 253 char buf[4];
itead 0:5ebc917ebd09 254 itoa(num, buf, 10);
itead 0:5ebc917ebd09 255 return concat(buf, strlen(buf));
itead 0:5ebc917ebd09 256 }
itead 0:5ebc917ebd09 257
itead 0:5ebc917ebd09 258 unsigned char String::concat(int num)
itead 0:5ebc917ebd09 259 {
itead 0:5ebc917ebd09 260 char buf[7];
itead 0:5ebc917ebd09 261 itoa(num, buf, 10);
itead 0:5ebc917ebd09 262 return concat(buf, strlen(buf));
itead 0:5ebc917ebd09 263 }
itead 0:5ebc917ebd09 264
itead 0:5ebc917ebd09 265 unsigned char String::concat(unsigned int num)
itead 0:5ebc917ebd09 266 {
itead 0:5ebc917ebd09 267 char buf[6];
itead 0:5ebc917ebd09 268 utoa(num, buf, 10);
itead 0:5ebc917ebd09 269 return concat(buf, strlen(buf));
itead 0:5ebc917ebd09 270 }
itead 0:5ebc917ebd09 271
itead 0:5ebc917ebd09 272 unsigned char String::concat(long num)
itead 0:5ebc917ebd09 273 {
itead 0:5ebc917ebd09 274 char buf[12];
itead 0:5ebc917ebd09 275 ltoa(num, buf, 10);
itead 0:5ebc917ebd09 276 return concat(buf, strlen(buf));
itead 0:5ebc917ebd09 277 }
itead 0:5ebc917ebd09 278
itead 0:5ebc917ebd09 279 unsigned char String::concat(unsigned long num)
itead 0:5ebc917ebd09 280 {
itead 0:5ebc917ebd09 281 char buf[11];
itead 0:5ebc917ebd09 282 ultoa(num, buf, 10);
itead 0:5ebc917ebd09 283 return concat(buf, strlen(buf));
itead 0:5ebc917ebd09 284 }
itead 0:5ebc917ebd09 285
itead 0:5ebc917ebd09 286 /*********************************************/
itead 0:5ebc917ebd09 287 /* Concatenate */
itead 0:5ebc917ebd09 288 /*********************************************/
itead 0:5ebc917ebd09 289
itead 0:5ebc917ebd09 290 StringSumHelper & operator + (const StringSumHelper &lhs, const String &rhs)
itead 0:5ebc917ebd09 291 {
itead 0:5ebc917ebd09 292 StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
itead 0:5ebc917ebd09 293 if (!a.concat(rhs.buffer, rhs.len)) a.invalidate();
itead 0:5ebc917ebd09 294 return a;
itead 0:5ebc917ebd09 295 }
itead 0:5ebc917ebd09 296
itead 0:5ebc917ebd09 297 StringSumHelper & operator + (const StringSumHelper &lhs, const char *cstr)
itead 0:5ebc917ebd09 298 {
itead 0:5ebc917ebd09 299 StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
itead 0:5ebc917ebd09 300 if (!cstr || !a.concat(cstr, strlen(cstr))) a.invalidate();
itead 0:5ebc917ebd09 301 return a;
itead 0:5ebc917ebd09 302 }
itead 0:5ebc917ebd09 303
itead 0:5ebc917ebd09 304 StringSumHelper & operator + (const StringSumHelper &lhs, char c)
itead 0:5ebc917ebd09 305 {
itead 0:5ebc917ebd09 306 StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
itead 0:5ebc917ebd09 307 if (!a.concat(c)) a.invalidate();
itead 0:5ebc917ebd09 308 return a;
itead 0:5ebc917ebd09 309 }
itead 0:5ebc917ebd09 310
itead 0:5ebc917ebd09 311 StringSumHelper & operator + (const StringSumHelper &lhs, unsigned char num)
itead 0:5ebc917ebd09 312 {
itead 0:5ebc917ebd09 313 StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
itead 0:5ebc917ebd09 314 if (!a.concat(num)) a.invalidate();
itead 0:5ebc917ebd09 315 return a;
itead 0:5ebc917ebd09 316 }
itead 0:5ebc917ebd09 317
itead 0:5ebc917ebd09 318 StringSumHelper & operator + (const StringSumHelper &lhs, int num)
itead 0:5ebc917ebd09 319 {
itead 0:5ebc917ebd09 320 StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
itead 0:5ebc917ebd09 321 if (!a.concat(num)) a.invalidate();
itead 0:5ebc917ebd09 322 return a;
itead 0:5ebc917ebd09 323 }
itead 0:5ebc917ebd09 324
itead 0:5ebc917ebd09 325 StringSumHelper & operator + (const StringSumHelper &lhs, unsigned int num)
itead 0:5ebc917ebd09 326 {
itead 0:5ebc917ebd09 327 StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
itead 0:5ebc917ebd09 328 if (!a.concat(num)) a.invalidate();
itead 0:5ebc917ebd09 329 return a;
itead 0:5ebc917ebd09 330 }
itead 0:5ebc917ebd09 331
itead 0:5ebc917ebd09 332 StringSumHelper & operator + (const StringSumHelper &lhs, long num)
itead 0:5ebc917ebd09 333 {
itead 0:5ebc917ebd09 334 StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
itead 0:5ebc917ebd09 335 if (!a.concat(num)) a.invalidate();
itead 0:5ebc917ebd09 336 return a;
itead 0:5ebc917ebd09 337 }
itead 0:5ebc917ebd09 338
itead 0:5ebc917ebd09 339 StringSumHelper & operator + (const StringSumHelper &lhs, unsigned long num)
itead 0:5ebc917ebd09 340 {
itead 0:5ebc917ebd09 341 StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
itead 0:5ebc917ebd09 342 if (!a.concat(num)) a.invalidate();
itead 0:5ebc917ebd09 343 return a;
itead 0:5ebc917ebd09 344 }
itead 0:5ebc917ebd09 345
itead 0:5ebc917ebd09 346 /*********************************************/
itead 0:5ebc917ebd09 347 /* Comparison */
itead 0:5ebc917ebd09 348 /*********************************************/
itead 0:5ebc917ebd09 349
itead 0:5ebc917ebd09 350 int String::compareTo(const String &s) const
itead 0:5ebc917ebd09 351 {
itead 0:5ebc917ebd09 352 if (!buffer || !s.buffer) {
itead 0:5ebc917ebd09 353 if (s.buffer && s.len > 0) return 0 - *(unsigned char *)s.buffer;
itead 0:5ebc917ebd09 354 if (buffer && len > 0) return *(unsigned char *)buffer;
itead 0:5ebc917ebd09 355 return 0;
itead 0:5ebc917ebd09 356 }
itead 0:5ebc917ebd09 357 return strcmp(buffer, s.buffer);
itead 0:5ebc917ebd09 358 }
itead 0:5ebc917ebd09 359
itead 0:5ebc917ebd09 360 unsigned char String::equals(const String &s2) const
itead 0:5ebc917ebd09 361 {
itead 0:5ebc917ebd09 362 return (len == s2.len && compareTo(s2) == 0);
itead 0:5ebc917ebd09 363 }
itead 0:5ebc917ebd09 364
itead 0:5ebc917ebd09 365 unsigned char String::equals(const char *cstr) const
itead 0:5ebc917ebd09 366 {
itead 0:5ebc917ebd09 367 if (len == 0) return (cstr == NULL || *cstr == 0);
itead 0:5ebc917ebd09 368 if (cstr == NULL) return buffer[0] == 0;
itead 0:5ebc917ebd09 369 return strcmp(buffer, cstr) == 0;
itead 0:5ebc917ebd09 370 }
itead 0:5ebc917ebd09 371
itead 0:5ebc917ebd09 372 unsigned char String::operator<(const String &rhs) const
itead 0:5ebc917ebd09 373 {
itead 0:5ebc917ebd09 374 return compareTo(rhs) < 0;
itead 0:5ebc917ebd09 375 }
itead 0:5ebc917ebd09 376
itead 0:5ebc917ebd09 377 unsigned char String::operator>(const String &rhs) const
itead 0:5ebc917ebd09 378 {
itead 0:5ebc917ebd09 379 return compareTo(rhs) > 0;
itead 0:5ebc917ebd09 380 }
itead 0:5ebc917ebd09 381
itead 0:5ebc917ebd09 382 unsigned char String::operator<=(const String &rhs) const
itead 0:5ebc917ebd09 383 {
itead 0:5ebc917ebd09 384 return compareTo(rhs) <= 0;
itead 0:5ebc917ebd09 385 }
itead 0:5ebc917ebd09 386
itead 0:5ebc917ebd09 387 unsigned char String::operator>=(const String &rhs) const
itead 0:5ebc917ebd09 388 {
itead 0:5ebc917ebd09 389 return compareTo(rhs) >= 0;
itead 0:5ebc917ebd09 390 }
itead 0:5ebc917ebd09 391
itead 0:5ebc917ebd09 392 unsigned char String::equalsIgnoreCase( const String &s2 ) const
itead 0:5ebc917ebd09 393 {
itead 0:5ebc917ebd09 394 if (this == &s2) return 1;
itead 0:5ebc917ebd09 395 if (len != s2.len) return 0;
itead 0:5ebc917ebd09 396 if (len == 0) return 1;
itead 0:5ebc917ebd09 397 const char *p1 = buffer;
itead 0:5ebc917ebd09 398 const char *p2 = s2.buffer;
itead 0:5ebc917ebd09 399 while (*p1) {
itead 0:5ebc917ebd09 400 if (tolower(*p1++) != tolower(*p2++)) return 0;
itead 0:5ebc917ebd09 401 }
itead 0:5ebc917ebd09 402 return 1;
itead 0:5ebc917ebd09 403 }
itead 0:5ebc917ebd09 404
itead 0:5ebc917ebd09 405 unsigned char String::startsWith( const String &s2 ) const
itead 0:5ebc917ebd09 406 {
itead 0:5ebc917ebd09 407 if (len < s2.len) return 0;
itead 0:5ebc917ebd09 408 return startsWith(s2, 0);
itead 0:5ebc917ebd09 409 }
itead 0:5ebc917ebd09 410
itead 0:5ebc917ebd09 411 unsigned char String::startsWith( const String &s2, unsigned int offset ) const
itead 0:5ebc917ebd09 412 {
itead 0:5ebc917ebd09 413 if (offset > len - s2.len || !buffer || !s2.buffer) return 0;
itead 0:5ebc917ebd09 414 return strncmp( &buffer[offset], s2.buffer, s2.len ) == 0;
itead 0:5ebc917ebd09 415 }
itead 0:5ebc917ebd09 416
itead 0:5ebc917ebd09 417 unsigned char String::endsWith( const String &s2 ) const
itead 0:5ebc917ebd09 418 {
itead 0:5ebc917ebd09 419 if ( len < s2.len || !buffer || !s2.buffer) return 0;
itead 0:5ebc917ebd09 420 return strcmp(&buffer[len - s2.len], s2.buffer) == 0;
itead 0:5ebc917ebd09 421 }
itead 0:5ebc917ebd09 422
itead 0:5ebc917ebd09 423 /*********************************************/
itead 0:5ebc917ebd09 424 /* Character Access */
itead 0:5ebc917ebd09 425 /*********************************************/
itead 0:5ebc917ebd09 426
itead 0:5ebc917ebd09 427 char String::charAt(unsigned int loc) const
itead 0:5ebc917ebd09 428 {
itead 0:5ebc917ebd09 429 return operator[](loc);
itead 0:5ebc917ebd09 430 }
itead 0:5ebc917ebd09 431
itead 0:5ebc917ebd09 432 void String::setCharAt(unsigned int loc, char c)
itead 0:5ebc917ebd09 433 {
itead 0:5ebc917ebd09 434 if (loc < len) buffer[loc] = c;
itead 0:5ebc917ebd09 435 }
itead 0:5ebc917ebd09 436
itead 0:5ebc917ebd09 437 char & String::operator[](unsigned int index)
itead 0:5ebc917ebd09 438 {
itead 0:5ebc917ebd09 439 static char dummy_writable_char;
itead 0:5ebc917ebd09 440 if (index >= len || !buffer) {
itead 0:5ebc917ebd09 441 dummy_writable_char = 0;
itead 0:5ebc917ebd09 442 return dummy_writable_char;
itead 0:5ebc917ebd09 443 }
itead 0:5ebc917ebd09 444 return buffer[index];
itead 0:5ebc917ebd09 445 }
itead 0:5ebc917ebd09 446
itead 0:5ebc917ebd09 447 char String::operator[]( unsigned int index ) const
itead 0:5ebc917ebd09 448 {
itead 0:5ebc917ebd09 449 if (index >= len || !buffer) return 0;
itead 0:5ebc917ebd09 450 return buffer[index];
itead 0:5ebc917ebd09 451 }
itead 0:5ebc917ebd09 452
itead 0:5ebc917ebd09 453 void String::getBytes(unsigned char *buf, unsigned int bufsize, unsigned int index) const
itead 0:5ebc917ebd09 454 {
itead 0:5ebc917ebd09 455 if (!bufsize || !buf) return;
itead 0:5ebc917ebd09 456 if (index >= len) {
itead 0:5ebc917ebd09 457 buf[0] = 0;
itead 0:5ebc917ebd09 458 return;
itead 0:5ebc917ebd09 459 }
itead 0:5ebc917ebd09 460 unsigned int n = bufsize - 1;
itead 0:5ebc917ebd09 461 if (n > len - index) n = len - index;
itead 0:5ebc917ebd09 462 strncpy((char *)buf, buffer + index, n);
itead 0:5ebc917ebd09 463 buf[n] = 0;
itead 0:5ebc917ebd09 464 }
itead 0:5ebc917ebd09 465
itead 0:5ebc917ebd09 466 /*********************************************/
itead 0:5ebc917ebd09 467 /* Search */
itead 0:5ebc917ebd09 468 /*********************************************/
itead 0:5ebc917ebd09 469
itead 0:5ebc917ebd09 470 int String::indexOf(char c) const
itead 0:5ebc917ebd09 471 {
itead 0:5ebc917ebd09 472 return indexOf(c, 0);
itead 0:5ebc917ebd09 473 }
itead 0:5ebc917ebd09 474
itead 0:5ebc917ebd09 475 int String::indexOf( char ch, unsigned int fromIndex ) const
itead 0:5ebc917ebd09 476 {
itead 0:5ebc917ebd09 477 if (fromIndex >= len) return -1;
itead 0:5ebc917ebd09 478 const char* temp = strchr(buffer + fromIndex, ch);
itead 0:5ebc917ebd09 479 if (temp == NULL) return -1;
itead 0:5ebc917ebd09 480 return temp - buffer;
itead 0:5ebc917ebd09 481 }
itead 0:5ebc917ebd09 482
itead 0:5ebc917ebd09 483 int String::indexOf(const String &s2) const
itead 0:5ebc917ebd09 484 {
itead 0:5ebc917ebd09 485 return indexOf(s2, 0);
itead 0:5ebc917ebd09 486 }
itead 0:5ebc917ebd09 487
itead 0:5ebc917ebd09 488 int String::indexOf(const String &s2, unsigned int fromIndex) const
itead 0:5ebc917ebd09 489 {
itead 0:5ebc917ebd09 490 if (fromIndex >= len) return -1;
itead 0:5ebc917ebd09 491 const char *found = strstr(buffer + fromIndex, s2.buffer);
itead 0:5ebc917ebd09 492 if (found == NULL) return -1;
itead 0:5ebc917ebd09 493 return found - buffer;
itead 0:5ebc917ebd09 494 }
itead 0:5ebc917ebd09 495
itead 0:5ebc917ebd09 496 int String::lastIndexOf( char theChar ) const
itead 0:5ebc917ebd09 497 {
itead 0:5ebc917ebd09 498 return lastIndexOf(theChar, len - 1);
itead 0:5ebc917ebd09 499 }
itead 0:5ebc917ebd09 500
itead 0:5ebc917ebd09 501 int String::lastIndexOf(char ch, unsigned int fromIndex) const
itead 0:5ebc917ebd09 502 {
itead 0:5ebc917ebd09 503 if (fromIndex >= len) return -1;
itead 0:5ebc917ebd09 504 char tempchar = buffer[fromIndex + 1];
itead 0:5ebc917ebd09 505 buffer[fromIndex + 1] = '\0';
itead 0:5ebc917ebd09 506 char* temp = strrchr( buffer, ch );
itead 0:5ebc917ebd09 507 buffer[fromIndex + 1] = tempchar;
itead 0:5ebc917ebd09 508 if (temp == NULL) return -1;
itead 0:5ebc917ebd09 509 return temp - buffer;
itead 0:5ebc917ebd09 510 }
itead 0:5ebc917ebd09 511
itead 0:5ebc917ebd09 512 int String::lastIndexOf(const String &s2) const
itead 0:5ebc917ebd09 513 {
itead 0:5ebc917ebd09 514 return lastIndexOf(s2, len - s2.len);
itead 0:5ebc917ebd09 515 }
itead 0:5ebc917ebd09 516
itead 0:5ebc917ebd09 517 int String::lastIndexOf(const String &s2, unsigned int fromIndex) const
itead 0:5ebc917ebd09 518 {
itead 0:5ebc917ebd09 519 if (s2.len == 0 || len == 0 || s2.len > len) return -1;
itead 0:5ebc917ebd09 520 if (fromIndex >= len) fromIndex = len - 1;
itead 0:5ebc917ebd09 521 int found = -1;
itead 0:5ebc917ebd09 522 for (char *p = buffer; p <= buffer + fromIndex; p++) {
itead 0:5ebc917ebd09 523 p = strstr(p, s2.buffer);
itead 0:5ebc917ebd09 524 if (!p) break;
itead 0:5ebc917ebd09 525 if ((unsigned int)(p - buffer) <= fromIndex) found = p - buffer;
itead 0:5ebc917ebd09 526 }
itead 0:5ebc917ebd09 527 return found;
itead 0:5ebc917ebd09 528 }
itead 0:5ebc917ebd09 529
itead 0:5ebc917ebd09 530 String String::substring( unsigned int left ) const
itead 0:5ebc917ebd09 531 {
itead 0:5ebc917ebd09 532 return substring(left, len);
itead 0:5ebc917ebd09 533 }
itead 0:5ebc917ebd09 534
itead 0:5ebc917ebd09 535 String String::substring(unsigned int left, unsigned int right) const
itead 0:5ebc917ebd09 536 {
itead 0:5ebc917ebd09 537 if (left > right) {
itead 0:5ebc917ebd09 538 unsigned int temp = right;
itead 0:5ebc917ebd09 539 right = left;
itead 0:5ebc917ebd09 540 left = temp;
itead 0:5ebc917ebd09 541 }
itead 0:5ebc917ebd09 542 String out;
itead 0:5ebc917ebd09 543 if (left > len) return out;
itead 0:5ebc917ebd09 544 if (right > len) right = len;
itead 0:5ebc917ebd09 545 char temp = buffer[right]; // save the replaced character
itead 0:5ebc917ebd09 546 buffer[right] = '\0';
itead 0:5ebc917ebd09 547 out = buffer + left; // pointer arithmetic
itead 0:5ebc917ebd09 548 buffer[right] = temp; //restore character
itead 0:5ebc917ebd09 549 return out;
itead 0:5ebc917ebd09 550 }
itead 0:5ebc917ebd09 551
itead 0:5ebc917ebd09 552 /*********************************************/
itead 0:5ebc917ebd09 553 /* Modification */
itead 0:5ebc917ebd09 554 /*********************************************/
itead 0:5ebc917ebd09 555
itead 0:5ebc917ebd09 556 void String::replace(char find, char replace)
itead 0:5ebc917ebd09 557 {
itead 0:5ebc917ebd09 558 if (!buffer) return;
itead 0:5ebc917ebd09 559 for (char *p = buffer; *p; p++) {
itead 0:5ebc917ebd09 560 if (*p == find) *p = replace;
itead 0:5ebc917ebd09 561 }
itead 0:5ebc917ebd09 562 }
itead 0:5ebc917ebd09 563
itead 0:5ebc917ebd09 564 void String::replace(const String& find, const String& replace)
itead 0:5ebc917ebd09 565 {
itead 0:5ebc917ebd09 566 if (len == 0 || find.len == 0) return;
itead 0:5ebc917ebd09 567 int diff = replace.len - find.len;
itead 0:5ebc917ebd09 568 char *readFrom = buffer;
itead 0:5ebc917ebd09 569 char *foundAt;
itead 0:5ebc917ebd09 570 if (diff == 0) {
itead 0:5ebc917ebd09 571 while ((foundAt = strstr(readFrom, find.buffer)) != NULL) {
itead 0:5ebc917ebd09 572 memcpy(foundAt, replace.buffer, replace.len);
itead 0:5ebc917ebd09 573 readFrom = foundAt + replace.len;
itead 0:5ebc917ebd09 574 }
itead 0:5ebc917ebd09 575 } else if (diff < 0) {
itead 0:5ebc917ebd09 576 char *writeTo = buffer;
itead 0:5ebc917ebd09 577 while ((foundAt = strstr(readFrom, find.buffer)) != NULL) {
itead 0:5ebc917ebd09 578 unsigned int n = foundAt - readFrom;
itead 0:5ebc917ebd09 579 memcpy(writeTo, readFrom, n);
itead 0:5ebc917ebd09 580 writeTo += n;
itead 0:5ebc917ebd09 581 memcpy(writeTo, replace.buffer, replace.len);
itead 0:5ebc917ebd09 582 writeTo += replace.len;
itead 0:5ebc917ebd09 583 readFrom = foundAt + find.len;
itead 0:5ebc917ebd09 584 len += diff;
itead 0:5ebc917ebd09 585 }
itead 0:5ebc917ebd09 586 strcpy(writeTo, readFrom);
itead 0:5ebc917ebd09 587 } else {
itead 0:5ebc917ebd09 588 unsigned int size = len; // compute size needed for result
itead 0:5ebc917ebd09 589 while ((foundAt = strstr(readFrom, find.buffer)) != NULL) {
itead 0:5ebc917ebd09 590 readFrom = foundAt + find.len;
itead 0:5ebc917ebd09 591 size += diff;
itead 0:5ebc917ebd09 592 }
itead 0:5ebc917ebd09 593 if (size == len) return;
itead 0:5ebc917ebd09 594 if (size > capacity && !changeBuffer(size)) return; // XXX: tell user!
itead 0:5ebc917ebd09 595 int index = len - 1;
itead 0:5ebc917ebd09 596 while (index >= 0 && (index = lastIndexOf(find, index)) >= 0) {
itead 0:5ebc917ebd09 597 readFrom = buffer + index + find.len;
itead 0:5ebc917ebd09 598 memmove(readFrom + diff, readFrom, len - (readFrom - buffer));
itead 0:5ebc917ebd09 599 len += diff;
itead 0:5ebc917ebd09 600 buffer[len] = 0;
itead 0:5ebc917ebd09 601 memcpy(buffer + index, replace.buffer, replace.len);
itead 0:5ebc917ebd09 602 index--;
itead 0:5ebc917ebd09 603 }
itead 0:5ebc917ebd09 604 }
itead 0:5ebc917ebd09 605 }
itead 0:5ebc917ebd09 606
itead 0:5ebc917ebd09 607 void String::toLowerCase(void)
itead 0:5ebc917ebd09 608 {
itead 0:5ebc917ebd09 609 if (!buffer) return;
itead 0:5ebc917ebd09 610 for (char *p = buffer; *p; p++) {
itead 0:5ebc917ebd09 611 *p = tolower(*p);
itead 0:5ebc917ebd09 612 }
itead 0:5ebc917ebd09 613 }
itead 0:5ebc917ebd09 614
itead 0:5ebc917ebd09 615 void String::toUpperCase(void)
itead 0:5ebc917ebd09 616 {
itead 0:5ebc917ebd09 617 if (!buffer) return;
itead 0:5ebc917ebd09 618 for (char *p = buffer; *p; p++) {
itead 0:5ebc917ebd09 619 *p = toupper(*p);
itead 0:5ebc917ebd09 620 }
itead 0:5ebc917ebd09 621 }
itead 0:5ebc917ebd09 622
itead 0:5ebc917ebd09 623 void String::trim(void)
itead 0:5ebc917ebd09 624 {
itead 0:5ebc917ebd09 625 if (!buffer || len == 0) return;
itead 0:5ebc917ebd09 626 char *begin = buffer;
itead 0:5ebc917ebd09 627 while (isspace(*begin)) begin++;
itead 0:5ebc917ebd09 628 char *end = buffer + len - 1;
itead 0:5ebc917ebd09 629 while (isspace(*end) && end >= begin) end--;
itead 0:5ebc917ebd09 630 len = end + 1 - begin;
itead 0:5ebc917ebd09 631 if (begin > buffer) memcpy(buffer, begin, len);
itead 0:5ebc917ebd09 632 buffer[len] = 0;
itead 0:5ebc917ebd09 633 }
itead 0:5ebc917ebd09 634
itead 0:5ebc917ebd09 635 /*********************************************/
itead 0:5ebc917ebd09 636 /* Parsing / Conversion */
itead 0:5ebc917ebd09 637 /*********************************************/
itead 0:5ebc917ebd09 638
itead 0:5ebc917ebd09 639 long String::toInt(void) const
itead 0:5ebc917ebd09 640 {
itead 0:5ebc917ebd09 641 if (buffer) return atol(buffer);
itead 0:5ebc917ebd09 642 return 0;
itead 0:5ebc917ebd09 643 }
itead 0:5ebc917ebd09 644