Great game by Aurelién Rodot for Gamebuin. Ported by Jonne

Dependencies:   PokittoLib

Fork of Asterocks by Pokitto Community Team

Committer:
Pokitto
Date:
Wed May 02 06:31:17 2018 +0000
Revision:
13:9bf683c077df
Parent:
4:46e28b959b54
New pokittolib with improved volume controls & better button handling

Who changed what in which revision?

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