@@ -45,6 +45,12 @@ String::String(const char *cstr)
45
45
if (cstr) copy (cstr, strlen (cstr));
46
46
}
47
47
48
+ String::String (const char *cstr, unsigned int length)
49
+ {
50
+ init ();
51
+ if (cstr) copy (cstr, length);
52
+ }
53
+
48
54
String::String (const String &value)
49
55
{
50
56
init ();
@@ -192,7 +198,8 @@ String & String::copy(const char *cstr, unsigned int length)
192
198
return *this ;
193
199
}
194
200
len = length;
195
- strcpy (buffer, cstr);
201
+ memcpy (buffer, cstr, length);
202
+ buffer[len] = ' \0 ' ;
196
203
return *this ;
197
204
}
198
205
@@ -212,8 +219,9 @@ void String::move(String &rhs)
212
219
{
213
220
if (buffer) {
214
221
if (rhs && capacity >= rhs.len ) {
215
- strcpy (buffer, rhs.buffer );
222
+ memcpy (buffer, rhs.buffer , rhs. len );
216
223
len = rhs.len ;
224
+ buffer[len] = ' \0 ' ;
217
225
rhs.len = 0 ;
218
226
return ;
219
227
} else {
@@ -284,8 +292,9 @@ unsigned char String::concat(const char *cstr, unsigned int length)
284
292
if (!cstr) return 0 ;
285
293
if (length == 0 ) return 1 ;
286
294
if (!reserve (newlen)) return 0 ;
287
- strcpy (buffer + len, cstr);
295
+ memcpy (buffer + len, cstr, length );
288
296
len = newlen;
297
+ buffer[len] = ' \0 ' ;
289
298
return 1 ;
290
299
}
291
300
@@ -297,59 +306,56 @@ unsigned char String::concat(const char *cstr)
297
306
298
307
unsigned char String::concat (char c)
299
308
{
300
- char buf[2 ];
301
- buf[0 ] = c;
302
- buf[1 ] = 0 ;
303
- return concat (buf, 1 );
309
+ return concat (&c, 1 );
304
310
}
305
311
306
312
unsigned char String::concat (unsigned char num)
307
313
{
308
314
char buf[1 + 3 * sizeof (unsigned char )];
309
315
itoa (num, buf, 10 );
310
- return concat (buf, strlen (buf) );
316
+ return concat (buf);
311
317
}
312
318
313
319
unsigned char String::concat (int num)
314
320
{
315
321
char buf[2 + 3 * sizeof (int )];
316
322
itoa (num, buf, 10 );
317
- return concat (buf, strlen (buf) );
323
+ return concat (buf);
318
324
}
319
325
320
326
unsigned char String::concat (unsigned int num)
321
327
{
322
328
char buf[1 + 3 * sizeof (unsigned int )];
323
329
utoa (num, buf, 10 );
324
- return concat (buf, strlen (buf) );
330
+ return concat (buf);
325
331
}
326
332
327
333
unsigned char String::concat (long num)
328
334
{
329
335
char buf[2 + 3 * sizeof (long )];
330
336
ltoa (num, buf, 10 );
331
- return concat (buf, strlen (buf) );
337
+ return concat (buf);
332
338
}
333
339
334
340
unsigned char String::concat (unsigned long num)
335
341
{
336
342
char buf[1 + 3 * sizeof (unsigned long )];
337
343
ultoa (num, buf, 10 );
338
- return concat (buf, strlen (buf) );
344
+ return concat (buf);
339
345
}
340
346
341
347
unsigned char String::concat (float num)
342
348
{
343
349
char buf[20 ];
344
350
char * string = dtostrf (num, 4 , 2 , buf);
345
- return concat (string, strlen (string) );
351
+ return concat (string);
346
352
}
347
353
348
354
unsigned char String::concat (double num)
349
355
{
350
356
char buf[20 ];
351
357
char * string = dtostrf (num, 4 , 2 , buf);
352
- return concat (string, strlen (string) );
358
+ return concat (string);
353
359
}
354
360
355
361
unsigned char String::concat (const __FlashStringHelper * str)
@@ -378,7 +384,7 @@ StringSumHelper & operator + (const StringSumHelper &lhs, const String &rhs)
378
384
StringSumHelper & operator + (const StringSumHelper &lhs, const char *cstr)
379
385
{
380
386
StringSumHelper &a = const_cast <StringSumHelper&>(lhs);
381
- if (!cstr || !a.concat (cstr, strlen (cstr) )) a.invalidate ();
387
+ if (!cstr || !a.concat (cstr)) a.invalidate ();
382
388
return a;
383
389
}
384
390
@@ -629,10 +635,7 @@ String String::substring(unsigned int left, unsigned int right) const
629
635
String out;
630
636
if (left >= len) return out;
631
637
if (right > len) right = len;
632
- char temp = buffer[right]; // save the replaced character
633
- buffer[right] = ' \0 ' ;
634
- out = buffer + left; // pointer arithmetic
635
- buffer[right] = temp; // restore character
638
+ out.copy (buffer + left, right - left);
636
639
return out;
637
640
}
638
641
0 commit comments