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/
mbed/WString.cpp@39:deeb00b81cc9, 2018-01-23 (annotated)
- 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?
User | Revision | Line number | New 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 |