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_
WString.cpp@0:5952bbaff1c6, 2021-04-26 (annotated)
- 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?
User | Revision | Line number | New 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 |