work fine

Dependencies:   mbed

Committer:
lixianyu
Date:
Tue May 31 15:32:03 2016 +0000
Revision:
0:5ca227682ee7
???????(Pass compile!)

Who changed what in which revision?

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