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