- added Delay to Serial flush method

Dependents:   WeeESP8266

Fork of ArduinoAPI by ITEAD STUDIO

Committer:
JojoS
Date:
Mon Apr 24 16:23:14 2017 +0000
Revision:
7:c62910a9e405
Parent:
6:926a4df8c0fb
support routiines for ESP;

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