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