Skip to content

Commit a03d93d

Browse files
committed
add support for String operation with uint64_t
fixes examples StringConstructors, StringAdditionOperator, StringAppendOperator only needed because millis() returns a uint64_t
1 parent 2dbdd01 commit a03d93d

File tree

2 files changed

+65
-9
lines changed

2 files changed

+65
-9
lines changed

cores/arduino/WString.cpp

Lines changed: 57 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ char * String::getCSpec(int base, bool issigned, bool islong){
125125
String::String(unsigned char value, unsigned char base)
126126
{
127127
init();
128-
char buf[9];
128+
char buf[1 + 8 * sizeof(unsigned char)];
129129
//utoa(value, buf, base);
130130
snprintf(buf, sizeof(buf), getCSpec(base, false, false), value);
131131
*this = buf;
@@ -134,7 +134,7 @@ String::String(unsigned char value, unsigned char base)
134134
String::String(int value, unsigned char base)
135135
{
136136
init();
137-
char buf[18];
137+
char buf[2 + 8 * sizeof(int)];
138138
//itoa(value, buf, base);
139139
snprintf(buf, sizeof(buf), getCSpec(base, true, false), value);
140140
*this = buf;
@@ -143,7 +143,7 @@ String::String(int value, unsigned char base)
143143
String::String(unsigned int value, unsigned char base)
144144
{
145145
init();
146-
char buf[17];
146+
char buf[1 + 8 * sizeof(unsigned int)];
147147
//utoa(value, buf, base);
148148
snprintf(buf, sizeof(buf), getCSpec(base, false, false), value);
149149
*this = buf;
@@ -152,7 +152,7 @@ String::String(unsigned int value, unsigned char base)
152152
String::String(long value, unsigned char base)
153153
{
154154
init();
155-
char buf[34];
155+
char buf[2 + 8 * sizeof(long)];
156156
//ltoa(value, buf, base);
157157
snprintf(buf, sizeof(buf), getCSpec(base, true, true), value);
158158
*this = buf;
@@ -161,7 +161,25 @@ String::String(long value, unsigned char base)
161161
String::String(unsigned long value, unsigned char base)
162162
{
163163
init();
164-
char buf[33];
164+
char buf[1 + 8 * sizeof(unsigned long)];
165+
//ultoa(value, buf, base);
166+
snprintf(buf, sizeof(buf), getCSpec(base, false, true), value);
167+
*this = buf;
168+
}
169+
170+
String::String(long long value, unsigned char base)
171+
{
172+
init();
173+
char buf[2 + 8 * sizeof(long long)];
174+
//ltoa(value, buf, base);
175+
snprintf(buf, sizeof(buf), getCSpec(base, true, true), value);
176+
*this = buf;
177+
}
178+
179+
String::String(unsigned long long value, unsigned char base)
180+
{
181+
init();
182+
char buf[1 + 8 * sizeof(unsigned long long)];
165183
//ultoa(value, buf, base);
166184
snprintf(buf, sizeof(buf), getCSpec(base, false, true), value);
167185
*this = buf;
@@ -337,37 +355,53 @@ unsigned char String::concat(char c)
337355

338356
unsigned char String::concat(unsigned char num)
339357
{
340-
char buf[4];
358+
char buf[1 + 3 * sizeof(unsigned char)];
341359
//itoa(num, buf, 10);
342360
snprintf(buf, sizeof(buf), getCSpec(10, true, false), num);
343361
return concat(buf, strlen(buf));
344362
}
345363

346364
unsigned char String::concat(int num)
347365
{
348-
char buf[7];
366+
char buf[2 + 3 * sizeof(int)];
349367
//itoa(num, buf, 10);
350368
snprintf(buf, sizeof(buf), getCSpec(10, true, false), num);
351369
return concat(buf, strlen(buf));
352370
}
353371

354372
unsigned char String::concat(unsigned int num)
355373
{
356-
char buf[6];
374+
char buf[1 + 3 * sizeof(unsigned int)];
357375
//utoa(num, buf, 10);
358376
snprintf(buf, sizeof(buf), getCSpec(10, false, false), num);
359377
return concat(buf, strlen(buf));
360378
}
361379

362380
unsigned char String::concat(long num)
363381
{
364-
char buf[12];
382+
char buf[2 + 3 * sizeof(long)];
365383
//ltoa(num, buf, 10);
366384
snprintf(buf, sizeof(buf), getCSpec(10, true, true), num);
367385
return concat(buf, strlen(buf));
368386
}
369387

370388
unsigned char String::concat(unsigned long num)
389+
{
390+
char buf[1 + 3 * sizeof(unsigned long)];
391+
//ultoa(num, buf, 10);
392+
snprintf(buf, sizeof(buf), getCSpec(10, false, true), num);
393+
return concat(buf, strlen(buf));
394+
}
395+
396+
unsigned char String::concat(long long num)
397+
{
398+
char buf[12];
399+
//ltoa(num, buf, 10);
400+
snprintf(buf, sizeof(buf), getCSpec(10, true, true), num);
401+
return concat(buf, strlen(buf));
402+
}
403+
404+
unsigned char String::concat(unsigned long long num)
371405
{
372406
char buf[11];
373407
//ultoa(num, buf, 10);
@@ -449,6 +483,20 @@ StringSumHelper & operator + (const StringSumHelper &lhs, unsigned long num)
449483
return a;
450484
}
451485

486+
StringSumHelper & operator + (const StringSumHelper &lhs, long long num)
487+
{
488+
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
489+
if (!a.concat(num)) a.invalidate();
490+
return a;
491+
}
492+
493+
StringSumHelper & operator + (const StringSumHelper &lhs, unsigned long long num)
494+
{
495+
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
496+
if (!a.concat(num)) a.invalidate();
497+
return a;
498+
}
499+
452500
StringSumHelper & operator + (const StringSumHelper &lhs, float num)
453501
{
454502
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);

cores/arduino/WString.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ class String
7272
explicit String(unsigned int, unsigned char base=10);
7373
explicit String(long, unsigned char base=10);
7474
explicit String(unsigned long, unsigned char base=10);
75+
explicit String(long long, unsigned char base=10);
76+
explicit String(unsigned long long, unsigned char base=10);
7577
explicit String(float, unsigned char decimalPlaces=2);
7678
explicit String(double, unsigned char decimalPlaces=2);
7779
~String(void);
@@ -106,6 +108,8 @@ class String
106108
unsigned char concat(unsigned int num);
107109
unsigned char concat(long num);
108110
unsigned char concat(unsigned long num);
111+
unsigned char concat(long long num);
112+
unsigned char concat(unsigned long long num);
109113
unsigned char concat(float num);
110114
unsigned char concat(double num);
111115

@@ -119,6 +123,8 @@ class String
119123
String & operator += (unsigned int num) {concat(num); return (*this);}
120124
String & operator += (long num) {concat(num); return (*this);}
121125
String & operator += (unsigned long num) {concat(num); return (*this);}
126+
String & operator += (long long num) {concat(num); return (*this);}
127+
String & operator += (unsigned long long num) {concat(num); return (*this);}
122128
String & operator += (float num) {concat(num); return (*this);}
123129
String & operator += (double num) {concat(num); return (*this);}
124130

@@ -130,6 +136,8 @@ class String
130136
friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned int num);
131137
friend StringSumHelper & operator + (const StringSumHelper &lhs, long num);
132138
friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned long num);
139+
friend StringSumHelper & operator + (const StringSumHelper &lhs, long long num);
140+
friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned long long num);
133141
friend StringSumHelper & operator + (const StringSumHelper &lhs, float num);
134142
friend StringSumHelper & operator + (const StringSumHelper &lhs, double num);
135143

0 commit comments

Comments
 (0)