Donald Meyers / Mbed OS evan
Committer:
djmeyers
Date:
Sat Mar 18 22:37:16 2017 +0000
Revision:
0:06ee5f8a484a
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
djmeyers 0:06ee5f8a484a 1 /*
djmeyers 0:06ee5f8a484a 2 * Copyright (c) 2015 ARM Limited. All rights reserved.
djmeyers 0:06ee5f8a484a 3 * SPDX-License-Identifier: Apache-2.0
djmeyers 0:06ee5f8a484a 4 * Licensed under the Apache License, Version 2.0 (the License); you may
djmeyers 0:06ee5f8a484a 5 * not use this file except in compliance with the License.
djmeyers 0:06ee5f8a484a 6 * You may obtain a copy of the License at
djmeyers 0:06ee5f8a484a 7 *
djmeyers 0:06ee5f8a484a 8 * http://www.apache.org/licenses/LICENSE-2.0
djmeyers 0:06ee5f8a484a 9 *
djmeyers 0:06ee5f8a484a 10 * Unless required by applicable law or agreed to in writing, software
djmeyers 0:06ee5f8a484a 11 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
djmeyers 0:06ee5f8a484a 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
djmeyers 0:06ee5f8a484a 13 * See the License for the specific language governing permissions and
djmeyers 0:06ee5f8a484a 14 * limitations under the License.
djmeyers 0:06ee5f8a484a 15 */
djmeyers 0:06ee5f8a484a 16 #include "mbed-client/m2mstring.h"
djmeyers 0:06ee5f8a484a 17 #include <string.h> // strlen
djmeyers 0:06ee5f8a484a 18 #include <stdlib.h> // malloc, realloc
djmeyers 0:06ee5f8a484a 19 #include <assert.h>
djmeyers 0:06ee5f8a484a 20 #include <algorithm> // min
djmeyers 0:06ee5f8a484a 21
djmeyers 0:06ee5f8a484a 22 namespace m2m {
djmeyers 0:06ee5f8a484a 23
djmeyers 0:06ee5f8a484a 24 const String::size_type String::npos = static_cast<size_t>(-1);
djmeyers 0:06ee5f8a484a 25
djmeyers 0:06ee5f8a484a 26 char* String::strdup(const char* s)
djmeyers 0:06ee5f8a484a 27 {
djmeyers 0:06ee5f8a484a 28 const size_t len = strlen(s)+1;
djmeyers 0:06ee5f8a484a 29 char *p2 = static_cast<char*>(malloc(len));
djmeyers 0:06ee5f8a484a 30 memcpy(p2, s, len);
djmeyers 0:06ee5f8a484a 31 allocated_ = len;
djmeyers 0:06ee5f8a484a 32 size_ = len-1;
djmeyers 0:06ee5f8a484a 33 return p2;
djmeyers 0:06ee5f8a484a 34 }
djmeyers 0:06ee5f8a484a 35
djmeyers 0:06ee5f8a484a 36 String::String()
djmeyers 0:06ee5f8a484a 37 : p( strdup("") )
djmeyers 0:06ee5f8a484a 38 {
djmeyers 0:06ee5f8a484a 39 }
djmeyers 0:06ee5f8a484a 40
djmeyers 0:06ee5f8a484a 41 String::~String()
djmeyers 0:06ee5f8a484a 42 {
djmeyers 0:06ee5f8a484a 43 free(p);
djmeyers 0:06ee5f8a484a 44 p = 0;
djmeyers 0:06ee5f8a484a 45 }
djmeyers 0:06ee5f8a484a 46
djmeyers 0:06ee5f8a484a 47 String::String(const String& s)
djmeyers 0:06ee5f8a484a 48 : p(0)
djmeyers 0:06ee5f8a484a 49 {
djmeyers 0:06ee5f8a484a 50 if( &s != NULL ) {
djmeyers 0:06ee5f8a484a 51 p = static_cast<char*>(malloc(s.size_ + 1));
djmeyers 0:06ee5f8a484a 52
djmeyers 0:06ee5f8a484a 53 allocated_ = s.size_ + 1;
djmeyers 0:06ee5f8a484a 54 size_ = s.size_;
djmeyers 0:06ee5f8a484a 55 memcpy(p, s.p, size_ + 1);
djmeyers 0:06ee5f8a484a 56 }
djmeyers 0:06ee5f8a484a 57 }
djmeyers 0:06ee5f8a484a 58
djmeyers 0:06ee5f8a484a 59 String::String(const char* s)
djmeyers 0:06ee5f8a484a 60 : p(strdup(s))
djmeyers 0:06ee5f8a484a 61 {
djmeyers 0:06ee5f8a484a 62 }
djmeyers 0:06ee5f8a484a 63
djmeyers 0:06ee5f8a484a 64 String::String(const char* str, size_t n)
djmeyers 0:06ee5f8a484a 65 {
djmeyers 0:06ee5f8a484a 66 p = static_cast<char*>(malloc(n + 1));
djmeyers 0:06ee5f8a484a 67
djmeyers 0:06ee5f8a484a 68 allocated_ = n + 1;
djmeyers 0:06ee5f8a484a 69 size_ = n;
djmeyers 0:06ee5f8a484a 70 memcpy(p, str, n);
djmeyers 0:06ee5f8a484a 71 p[n] = 0;
djmeyers 0:06ee5f8a484a 72 }
djmeyers 0:06ee5f8a484a 73
djmeyers 0:06ee5f8a484a 74 String& String::operator=(const char* s)
djmeyers 0:06ee5f8a484a 75 {
djmeyers 0:06ee5f8a484a 76 if ( p != s ) {
djmeyers 0:06ee5f8a484a 77 // s could point into our own string, so we have to allocate a new string
djmeyers 0:06ee5f8a484a 78 const size_t len = strlen(s);
djmeyers 0:06ee5f8a484a 79 char* copy = (char*) malloc( len + 1);
djmeyers 0:06ee5f8a484a 80 memmove(copy, s, len+1); // trailing 0
djmeyers 0:06ee5f8a484a 81 free( p );
djmeyers 0:06ee5f8a484a 82 p = copy;
djmeyers 0:06ee5f8a484a 83 size_ = len;
djmeyers 0:06ee5f8a484a 84 allocated_ = len+1;
djmeyers 0:06ee5f8a484a 85 }
djmeyers 0:06ee5f8a484a 86 return *this;
djmeyers 0:06ee5f8a484a 87 }
djmeyers 0:06ee5f8a484a 88
djmeyers 0:06ee5f8a484a 89 String& String::operator=(const String& s)
djmeyers 0:06ee5f8a484a 90 {
djmeyers 0:06ee5f8a484a 91 return operator=(s.p);
djmeyers 0:06ee5f8a484a 92 }
djmeyers 0:06ee5f8a484a 93
djmeyers 0:06ee5f8a484a 94 String& String::operator+=(const String& s)
djmeyers 0:06ee5f8a484a 95 {
djmeyers 0:06ee5f8a484a 96 if (s.size_ > 0) {
djmeyers 0:06ee5f8a484a 97 this->reserve(size_ + s.size_);
djmeyers 0:06ee5f8a484a 98 memmove(p+size_, s.p, s.size_+1); // trailing 0
djmeyers 0:06ee5f8a484a 99 size_ += s.size_;
djmeyers 0:06ee5f8a484a 100 }
djmeyers 0:06ee5f8a484a 101 return *this;
djmeyers 0:06ee5f8a484a 102 }
djmeyers 0:06ee5f8a484a 103
djmeyers 0:06ee5f8a484a 104 // since p and s may overlap, we have to copy our own string first
djmeyers 0:06ee5f8a484a 105 String& String::operator+=(const char* s)
djmeyers 0:06ee5f8a484a 106 {
djmeyers 0:06ee5f8a484a 107 const size_type lens = strlen(s);
djmeyers 0:06ee5f8a484a 108 if (lens > 0) {
djmeyers 0:06ee5f8a484a 109 if (size_ + lens + 1 <= allocated_) {
djmeyers 0:06ee5f8a484a 110 memmove(p+size_, s, lens+1); // trailing 0
djmeyers 0:06ee5f8a484a 111 size_ += lens;
djmeyers 0:06ee5f8a484a 112 } else {
djmeyers 0:06ee5f8a484a 113 String s2( *this ); // copy own data
djmeyers 0:06ee5f8a484a 114 s2.reserve(size_ + lens);
djmeyers 0:06ee5f8a484a 115 memmove(s2.p+size_, s, lens+1); // trailing 0
djmeyers 0:06ee5f8a484a 116 s2.size_ = size_ + lens;
djmeyers 0:06ee5f8a484a 117 this->swap( s2 );
djmeyers 0:06ee5f8a484a 118 }
djmeyers 0:06ee5f8a484a 119 }
djmeyers 0:06ee5f8a484a 120 return *this;
djmeyers 0:06ee5f8a484a 121 }
djmeyers 0:06ee5f8a484a 122
djmeyers 0:06ee5f8a484a 123 String& String::operator+=(const char c)
djmeyers 0:06ee5f8a484a 124 {
djmeyers 0:06ee5f8a484a 125 push_back(c);
djmeyers 0:06ee5f8a484a 126 return *this;
djmeyers 0:06ee5f8a484a 127 }
djmeyers 0:06ee5f8a484a 128
djmeyers 0:06ee5f8a484a 129 void String::push_back(const char c) {
djmeyers 0:06ee5f8a484a 130
djmeyers 0:06ee5f8a484a 131 if (size_ == allocated_ - 1) {
djmeyers 0:06ee5f8a484a 132 size_t more = (allocated_* 3) / 2; // factor 1.5
djmeyers 0:06ee5f8a484a 133 if ( more < 4 ) more = 4;
djmeyers 0:06ee5f8a484a 134 reserve( size_ + more );
djmeyers 0:06ee5f8a484a 135 }
djmeyers 0:06ee5f8a484a 136
djmeyers 0:06ee5f8a484a 137 p[size_] = c;
djmeyers 0:06ee5f8a484a 138 size_++;
djmeyers 0:06ee5f8a484a 139 p[size_] = 0;
djmeyers 0:06ee5f8a484a 140 }
djmeyers 0:06ee5f8a484a 141
djmeyers 0:06ee5f8a484a 142 bool String::operator==(const char* s) const
djmeyers 0:06ee5f8a484a 143 {
djmeyers 0:06ee5f8a484a 144 if( s == NULL ) {
djmeyers 0:06ee5f8a484a 145 if( p == NULL ) {
djmeyers 0:06ee5f8a484a 146 return true;
djmeyers 0:06ee5f8a484a 147 }
djmeyers 0:06ee5f8a484a 148 return false;
djmeyers 0:06ee5f8a484a 149 }
djmeyers 0:06ee5f8a484a 150 bool ret = strcmp(p, s);
djmeyers 0:06ee5f8a484a 151 return !ret;
djmeyers 0:06ee5f8a484a 152 }
djmeyers 0:06ee5f8a484a 153
djmeyers 0:06ee5f8a484a 154 bool String::operator==(const String& s) const
djmeyers 0:06ee5f8a484a 155 {
djmeyers 0:06ee5f8a484a 156 bool ret = strcmp(p, s.p);
djmeyers 0:06ee5f8a484a 157 return !ret;
djmeyers 0:06ee5f8a484a 158 }
djmeyers 0:06ee5f8a484a 159
djmeyers 0:06ee5f8a484a 160 void String::clear()
djmeyers 0:06ee5f8a484a 161 {
djmeyers 0:06ee5f8a484a 162 size_ = 0;
djmeyers 0:06ee5f8a484a 163 p[0] = 0;
djmeyers 0:06ee5f8a484a 164 }
djmeyers 0:06ee5f8a484a 165
djmeyers 0:06ee5f8a484a 166 String String::substr(const size_type pos, size_type length) const
djmeyers 0:06ee5f8a484a 167 {
djmeyers 0:06ee5f8a484a 168 String s;
djmeyers 0:06ee5f8a484a 169 const size_type len = size_;
djmeyers 0:06ee5f8a484a 170
djmeyers 0:06ee5f8a484a 171 if ( pos <= len ) {
djmeyers 0:06ee5f8a484a 172
djmeyers 0:06ee5f8a484a 173 size_type remain = len - pos;
djmeyers 0:06ee5f8a484a 174
djmeyers 0:06ee5f8a484a 175 if ( length > remain )
djmeyers 0:06ee5f8a484a 176 length = remain;
djmeyers 0:06ee5f8a484a 177
djmeyers 0:06ee5f8a484a 178 s.reserve( length );
djmeyers 0:06ee5f8a484a 179
djmeyers 0:06ee5f8a484a 180 memcpy(s.p, p + pos, length);
djmeyers 0:06ee5f8a484a 181 s.p[length] = '\0';
djmeyers 0:06ee5f8a484a 182 s.size_ = length;
djmeyers 0:06ee5f8a484a 183 }
djmeyers 0:06ee5f8a484a 184 return s;
djmeyers 0:06ee5f8a484a 185 }
djmeyers 0:06ee5f8a484a 186
djmeyers 0:06ee5f8a484a 187
djmeyers 0:06ee5f8a484a 188 // checked access, accessing the NUL at end is allowed
djmeyers 0:06ee5f8a484a 189 char String::at(const size_type i) const
djmeyers 0:06ee5f8a484a 190 {
djmeyers 0:06ee5f8a484a 191 if ( i <= strlen(p) ) {
djmeyers 0:06ee5f8a484a 192 return p[i];
djmeyers 0:06ee5f8a484a 193 } else {
djmeyers 0:06ee5f8a484a 194 return '\0';
djmeyers 0:06ee5f8a484a 195 }
djmeyers 0:06ee5f8a484a 196 }
djmeyers 0:06ee5f8a484a 197
djmeyers 0:06ee5f8a484a 198 String& String::erase(size_type pos, size_type len)
djmeyers 0:06ee5f8a484a 199 {
djmeyers 0:06ee5f8a484a 200 if (len > 0) {
djmeyers 0:06ee5f8a484a 201
djmeyers 0:06ee5f8a484a 202 if ( pos < size_ ) { // user must not remove trailing 0
djmeyers 0:06ee5f8a484a 203
djmeyers 0:06ee5f8a484a 204 size_type s2 = size_;
djmeyers 0:06ee5f8a484a 205 size_type remain = s2 - pos - len;
djmeyers 0:06ee5f8a484a 206
djmeyers 0:06ee5f8a484a 207 if (remain > 0) {
djmeyers 0:06ee5f8a484a 208 // erase by overwriting
djmeyers 0:06ee5f8a484a 209 memmove(p + pos, p + pos + len, remain);
djmeyers 0:06ee5f8a484a 210 }
djmeyers 0:06ee5f8a484a 211
djmeyers 0:06ee5f8a484a 212 //if ( remain < 0 ) remain = 0;
djmeyers 0:06ee5f8a484a 213
djmeyers 0:06ee5f8a484a 214 // remove unused space
djmeyers 0:06ee5f8a484a 215 this->resize( pos+remain );
djmeyers 0:06ee5f8a484a 216
djmeyers 0:06ee5f8a484a 217 }
djmeyers 0:06ee5f8a484a 218 }
djmeyers 0:06ee5f8a484a 219 return *this;
djmeyers 0:06ee5f8a484a 220 }
djmeyers 0:06ee5f8a484a 221
djmeyers 0:06ee5f8a484a 222 String& String::append( const char* str, size_type n) {
djmeyers 0:06ee5f8a484a 223 if (str && n > 0) {
djmeyers 0:06ee5f8a484a 224 size_t lens = strlen(str);
djmeyers 0:06ee5f8a484a 225 if (n > lens)
djmeyers 0:06ee5f8a484a 226 n = lens;
djmeyers 0:06ee5f8a484a 227 size_t newlen = size_ + n;
djmeyers 0:06ee5f8a484a 228 this->reserve( newlen );
djmeyers 0:06ee5f8a484a 229 memmove(p+size_, str, n); // p and s.p MAY overlap
djmeyers 0:06ee5f8a484a 230 p[newlen] = 0; // add NUL termination
djmeyers 0:06ee5f8a484a 231 size_ = newlen;
djmeyers 0:06ee5f8a484a 232 }
djmeyers 0:06ee5f8a484a 233 return *this;
djmeyers 0:06ee5f8a484a 234 }
djmeyers 0:06ee5f8a484a 235
djmeyers 0:06ee5f8a484a 236 String& String::append_raw( const char* str, size_type n) {
djmeyers 0:06ee5f8a484a 237 if (str && n > 0) {
djmeyers 0:06ee5f8a484a 238 size_t newlen = size_ + n;
djmeyers 0:06ee5f8a484a 239 this->reserve( newlen );
djmeyers 0:06ee5f8a484a 240 memmove(p+size_, str, n); // p and s.p MAY overlap
djmeyers 0:06ee5f8a484a 241 p[newlen] = 0; // add NUL termination
djmeyers 0:06ee5f8a484a 242 size_ = newlen;
djmeyers 0:06ee5f8a484a 243 }
djmeyers 0:06ee5f8a484a 244 return *this;
djmeyers 0:06ee5f8a484a 245 }
djmeyers 0:06ee5f8a484a 246
djmeyers 0:06ee5f8a484a 247 void String::append_int(int param) {
djmeyers 0:06ee5f8a484a 248
djmeyers 0:06ee5f8a484a 249 // max len of "-9223372036854775808" plus zero termination
djmeyers 0:06ee5f8a484a 250 char conv_buff[20+1];
djmeyers 0:06ee5f8a484a 251
djmeyers 0:06ee5f8a484a 252 int len = itoa_c(param, conv_buff);
djmeyers 0:06ee5f8a484a 253 append_raw(conv_buff, len);
djmeyers 0:06ee5f8a484a 254 }
djmeyers 0:06ee5f8a484a 255
djmeyers 0:06ee5f8a484a 256 int String::compare( size_type pos, size_type len, const String& str ) const {
djmeyers 0:06ee5f8a484a 257 int r = -1;
djmeyers 0:06ee5f8a484a 258 if (pos <= size_) {
djmeyers 0:06ee5f8a484a 259 if ( len > size_ - pos)
djmeyers 0:06ee5f8a484a 260 len = size_ - pos; // limit len to available length
djmeyers 0:06ee5f8a484a 261
djmeyers 0:06ee5f8a484a 262 const size_type osize = str.size();
djmeyers 0:06ee5f8a484a 263 const size_type len2 = std::min(len, osize);
djmeyers 0:06ee5f8a484a 264 r = strncmp( p + pos, str.p, len2);
djmeyers 0:06ee5f8a484a 265 if (r==0) // equal so far, now compare sizes
djmeyers 0:06ee5f8a484a 266 r = len < osize ? -1 : ( len == osize ? 0 : +1 );
djmeyers 0:06ee5f8a484a 267 }
djmeyers 0:06ee5f8a484a 268 return r;
djmeyers 0:06ee5f8a484a 269 }
djmeyers 0:06ee5f8a484a 270
djmeyers 0:06ee5f8a484a 271 int String::compare( size_type pos, size_type len, const char* str ) const {
djmeyers 0:06ee5f8a484a 272 int r = -1;
djmeyers 0:06ee5f8a484a 273 if (pos <= size_) {
djmeyers 0:06ee5f8a484a 274
djmeyers 0:06ee5f8a484a 275 if ( len > size_ - pos)
djmeyers 0:06ee5f8a484a 276 len = size_ - pos; // limit len to available length
djmeyers 0:06ee5f8a484a 277
djmeyers 0:06ee5f8a484a 278 const size_type osize = strlen(str);
djmeyers 0:06ee5f8a484a 279 const size_type len2 = std::min(len, osize);
djmeyers 0:06ee5f8a484a 280 r = strncmp( p + pos, str, len2);
djmeyers 0:06ee5f8a484a 281 if (r==0) // equal so far, now compare sizes
djmeyers 0:06ee5f8a484a 282 r = len < osize ? -1 : ( len == osize ? 0 : +1 );
djmeyers 0:06ee5f8a484a 283 }
djmeyers 0:06ee5f8a484a 284 return r;
djmeyers 0:06ee5f8a484a 285 }
djmeyers 0:06ee5f8a484a 286
djmeyers 0:06ee5f8a484a 287 int String::find_last_of(char c) const {
djmeyers 0:06ee5f8a484a 288 int r = -1;
djmeyers 0:06ee5f8a484a 289 char *v;
djmeyers 0:06ee5f8a484a 290 v = strrchr(p,c);
djmeyers 0:06ee5f8a484a 291 if (v != NULL) {
djmeyers 0:06ee5f8a484a 292 r = 0;
djmeyers 0:06ee5f8a484a 293 char* i = p;
djmeyers 0:06ee5f8a484a 294 while (v != i) {
djmeyers 0:06ee5f8a484a 295 i++;
djmeyers 0:06ee5f8a484a 296 r++;
djmeyers 0:06ee5f8a484a 297 }
djmeyers 0:06ee5f8a484a 298 }
djmeyers 0:06ee5f8a484a 299 return r;
djmeyers 0:06ee5f8a484a 300 }
djmeyers 0:06ee5f8a484a 301
djmeyers 0:06ee5f8a484a 302 void String::new_realloc( size_type n) {
djmeyers 0:06ee5f8a484a 303 if (n > 0 ) {
djmeyers 0:06ee5f8a484a 304 char* pnew = static_cast<char*>(realloc(p, n)); // could return NULL
djmeyers 0:06ee5f8a484a 305 if (pnew)
djmeyers 0:06ee5f8a484a 306 p = pnew;
djmeyers 0:06ee5f8a484a 307 }
djmeyers 0:06ee5f8a484a 308 }
djmeyers 0:06ee5f8a484a 309
djmeyers 0:06ee5f8a484a 310 void String::reserve( const size_type n) {
djmeyers 0:06ee5f8a484a 311 if (n >= allocated_ ) {
djmeyers 0:06ee5f8a484a 312 this->new_realloc(n + 1);
djmeyers 0:06ee5f8a484a 313 allocated_ = n + 1;
djmeyers 0:06ee5f8a484a 314 }
djmeyers 0:06ee5f8a484a 315 }
djmeyers 0:06ee5f8a484a 316
djmeyers 0:06ee5f8a484a 317 void String::resize( const size_type n) {
djmeyers 0:06ee5f8a484a 318 this->resize( n, 0 );
djmeyers 0:06ee5f8a484a 319 }
djmeyers 0:06ee5f8a484a 320
djmeyers 0:06ee5f8a484a 321 void String::resize( const size_type n, const char c) {
djmeyers 0:06ee5f8a484a 322 if (n < size_ ) {
djmeyers 0:06ee5f8a484a 323 p[n] = 0;
djmeyers 0:06ee5f8a484a 324 size_ = n;
djmeyers 0:06ee5f8a484a 325 }
djmeyers 0:06ee5f8a484a 326 else if (n > size_ ) {
djmeyers 0:06ee5f8a484a 327 this->reserve( n );
djmeyers 0:06ee5f8a484a 328 for (size_type i=size_; i < n; ++i )
djmeyers 0:06ee5f8a484a 329 p[i] = c;
djmeyers 0:06ee5f8a484a 330 p[n] = 0;
djmeyers 0:06ee5f8a484a 331 size_ = n;
djmeyers 0:06ee5f8a484a 332 }
djmeyers 0:06ee5f8a484a 333 }
djmeyers 0:06ee5f8a484a 334
djmeyers 0:06ee5f8a484a 335 void String::swap( String& s ) {
djmeyers 0:06ee5f8a484a 336 std::swap( allocated_, s.allocated_ );
djmeyers 0:06ee5f8a484a 337 std::swap( size_, s.size_ );
djmeyers 0:06ee5f8a484a 338 std::swap( p, s.p );
djmeyers 0:06ee5f8a484a 339 }
djmeyers 0:06ee5f8a484a 340
djmeyers 0:06ee5f8a484a 341
djmeyers 0:06ee5f8a484a 342 // Comparison
djmeyers 0:06ee5f8a484a 343 bool operator<( const String& s1, const String& s2 ) {
djmeyers 0:06ee5f8a484a 344 return strcmp( s1.c_str(), s2.c_str() ) < 0;
djmeyers 0:06ee5f8a484a 345 }
djmeyers 0:06ee5f8a484a 346
djmeyers 0:06ee5f8a484a 347 void reverse(char s[], uint32_t length)
djmeyers 0:06ee5f8a484a 348 {
djmeyers 0:06ee5f8a484a 349 uint32_t i, j;
djmeyers 0:06ee5f8a484a 350 char c;
djmeyers 0:06ee5f8a484a 351
djmeyers 0:06ee5f8a484a 352 for (i = 0, j = length-1; i<j; i++, j--) {
djmeyers 0:06ee5f8a484a 353 c = s[i];
djmeyers 0:06ee5f8a484a 354 s[i] = s[j];
djmeyers 0:06ee5f8a484a 355 s[j] = c;
djmeyers 0:06ee5f8a484a 356 }
djmeyers 0:06ee5f8a484a 357 }
djmeyers 0:06ee5f8a484a 358
djmeyers 0:06ee5f8a484a 359 uint32_t itoa_c (int64_t n, char s[])
djmeyers 0:06ee5f8a484a 360 {
djmeyers 0:06ee5f8a484a 361 int64_t sign;
djmeyers 0:06ee5f8a484a 362 uint32_t i;
djmeyers 0:06ee5f8a484a 363
djmeyers 0:06ee5f8a484a 364 if ((sign = n) < 0)
djmeyers 0:06ee5f8a484a 365 n = -n;
djmeyers 0:06ee5f8a484a 366
djmeyers 0:06ee5f8a484a 367 i = 0;
djmeyers 0:06ee5f8a484a 368
djmeyers 0:06ee5f8a484a 369 do {
djmeyers 0:06ee5f8a484a 370 s[i++] = n % 10 + '0';
djmeyers 0:06ee5f8a484a 371 }
djmeyers 0:06ee5f8a484a 372 while ((n /= 10) > 0);
djmeyers 0:06ee5f8a484a 373
djmeyers 0:06ee5f8a484a 374 if (sign < 0)
djmeyers 0:06ee5f8a484a 375 s[i++] = '-';
djmeyers 0:06ee5f8a484a 376
djmeyers 0:06ee5f8a484a 377 s[i] = '\0';
djmeyers 0:06ee5f8a484a 378
djmeyers 0:06ee5f8a484a 379 m2m::reverse(s, i);
djmeyers 0:06ee5f8a484a 380 return i;
djmeyers 0:06ee5f8a484a 381 }
djmeyers 0:06ee5f8a484a 382
djmeyers 0:06ee5f8a484a 383 uint8_t* String::convert_integer_to_array(int64_t value, uint8_t &size, uint8_t *array, uint32_t array_size)
djmeyers 0:06ee5f8a484a 384 {
djmeyers 0:06ee5f8a484a 385 uint8_t* buffer = NULL;
djmeyers 0:06ee5f8a484a 386 size = 0;
djmeyers 0:06ee5f8a484a 387 if (array) {
djmeyers 0:06ee5f8a484a 388 value = String::convert_array_to_integer(array, array_size);
djmeyers 0:06ee5f8a484a 389 }
djmeyers 0:06ee5f8a484a 390
djmeyers 0:06ee5f8a484a 391 if(value < 0xFF) {
djmeyers 0:06ee5f8a484a 392 size = 1;
djmeyers 0:06ee5f8a484a 393 } else if(value < 0xFFFF) {
djmeyers 0:06ee5f8a484a 394 size = 2;
djmeyers 0:06ee5f8a484a 395 } else if(value < 0xFFFFFF) {
djmeyers 0:06ee5f8a484a 396 size = 3;
djmeyers 0:06ee5f8a484a 397 } else if(value < 0xFFFFFFFF) {
djmeyers 0:06ee5f8a484a 398 size = 4;
djmeyers 0:06ee5f8a484a 399 } else if(value < 0xFFFFFFFFFF) {
djmeyers 0:06ee5f8a484a 400 size = 5;
djmeyers 0:06ee5f8a484a 401 } else if(value < 0xFFFFFFFFFFFF) {
djmeyers 0:06ee5f8a484a 402 size = 6;
djmeyers 0:06ee5f8a484a 403 } else if(value < 0xFFFFFFFFFFFFFF) {
djmeyers 0:06ee5f8a484a 404 size = 7;
djmeyers 0:06ee5f8a484a 405 } else {
djmeyers 0:06ee5f8a484a 406 size = 8;
djmeyers 0:06ee5f8a484a 407 }
djmeyers 0:06ee5f8a484a 408
djmeyers 0:06ee5f8a484a 409 buffer = (uint8_t*)malloc(size);
djmeyers 0:06ee5f8a484a 410 if (buffer) {
djmeyers 0:06ee5f8a484a 411 for (int i = 0; i < size; i++) {
djmeyers 0:06ee5f8a484a 412 buffer[i] = (value >> ((size - i - 1) * 8));
djmeyers 0:06ee5f8a484a 413 }
djmeyers 0:06ee5f8a484a 414 } else {
djmeyers 0:06ee5f8a484a 415 size = 0;
djmeyers 0:06ee5f8a484a 416 }
djmeyers 0:06ee5f8a484a 417 return buffer;
djmeyers 0:06ee5f8a484a 418 }
djmeyers 0:06ee5f8a484a 419
djmeyers 0:06ee5f8a484a 420 int64_t String::convert_array_to_integer(uint8_t *value, uint32_t size)
djmeyers 0:06ee5f8a484a 421 {
djmeyers 0:06ee5f8a484a 422 int64_t temp_64 = 0;
djmeyers 0:06ee5f8a484a 423 for (int i = size - 1; i >= 0; i--) {
djmeyers 0:06ee5f8a484a 424 temp_64 += (uint64_t)(*value++) << i * 8;
djmeyers 0:06ee5f8a484a 425 }
djmeyers 0:06ee5f8a484a 426 return temp_64;
djmeyers 0:06ee5f8a484a 427 }
djmeyers 0:06ee5f8a484a 428
djmeyers 0:06ee5f8a484a 429 } // namespace