Set of Files to enable some Arduino examples.

Dependents:   TFT_Touch_botao_v1 TFT_Touch_exemplo5_git_touch TESTE_1 TFT_Touch_exemplo6_git_touch_button_3_

Committer:
davidprentice
Date:
Mon Apr 26 14:52:27 2021 +0000
Revision:
0:5952bbaff1c6
initial set of files to enable Arduino examples

Who changed what in which revision?

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