UIPEthernet library for Arduino IDE, Eclipse with arduino plugin and MBED/SMeshStudio (AVR,STM32F,ESP8266,Intel ARC32,Nordic nRF51,Teensy boards,Realtek Ameba(RTL8195A,RTL8710)), ENC28j60 network chip. Compatible with Wiznet W5100 Ethernet library API. Compiled and tested on Nucleo-F302R8. Master repository is: https://github.com/UIPEthernet/UIPEthernet/

Committer:
cassyarduino
Date:
Tue Jan 23 15:08:43 2018 +0100
Revision:
39:deeb00b81cc9
Parent:
35:f9f3a91fe4d4
Release: 2.0.4

Who changed what in which revision?

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