Skip to content

Commit 4204869

Browse files
authored
Extend Print class for 64bit integers. (#3688)
* Extend Print class for 64bit integers. modulo 32bit and 64bit tuned for code size. * Fix 32bit long used in long long printNumber.
1 parent ab23e8a commit 4204869

File tree

2 files changed

+67
-12
lines changed

2 files changed

+67
-12
lines changed

Diff for: cores/esp32/Print.cpp

+62-12
Original file line numberDiff line numberDiff line change
@@ -110,24 +110,37 @@ size_t Print::print(unsigned int n, int base)
110110
}
111111

112112
size_t Print::print(long n, int base)
113+
{
114+
int t = 0;
115+
if (base == 10 && n < 0) {
116+
t = print('-');
117+
n = -n;
118+
}
119+
return printNumber(static_cast<unsigned long>(n), base) + t;
120+
}
121+
122+
size_t Print::print(unsigned long n, int base)
113123
{
114124
if(base == 0) {
115125
return write(n);
116-
} else if(base == 10) {
117-
if(n < 0) {
118-
int t = print('-');
119-
n = -n;
120-
return printNumber(n, 10) + t;
121-
}
122-
return printNumber(n, 10);
123126
} else {
124127
return printNumber(n, base);
125128
}
126129
}
127130

128-
size_t Print::print(unsigned long n, int base)
131+
size_t Print::print(long long n, int base)
129132
{
130-
if(base == 0) {
133+
int t = 0;
134+
if (base == 10 && n < 0) {
135+
t = print('-');
136+
n = -n;
137+
}
138+
return printNumber(static_cast<unsigned long long>(n), base) + t;
139+
}
140+
141+
size_t Print::print(unsigned long long n, int base)
142+
{
143+
if (base == 0) {
131144
return write(n);
132145
} else {
133146
return printNumber(n, base);
@@ -226,6 +239,20 @@ size_t Print::println(unsigned long num, int base)
226239
return n;
227240
}
228241

242+
size_t Print::println(long long num, int base)
243+
{
244+
size_t n = print(num, base);
245+
n += println();
246+
return n;
247+
}
248+
249+
size_t Print::println(unsigned long long num, int base)
250+
{
251+
size_t n = print(num, base);
252+
n += println();
253+
return n;
254+
}
255+
229256
size_t Print::println(double num, int digits)
230257
{
231258
size_t n = print(num, digits);
@@ -251,7 +278,7 @@ size_t Print::println(struct tm * timeinfo, const char * format)
251278

252279
size_t Print::printNumber(unsigned long n, uint8_t base)
253280
{
254-
char buf[8 * sizeof(long) + 1]; // Assumes 8-bit chars plus zero byte.
281+
char buf[8 * sizeof(n) + 1]; // Assumes 8-bit chars plus zero byte.
255282
char *str = &buf[sizeof(buf) - 1];
256283

257284
*str = '\0';
@@ -262,11 +289,34 @@ size_t Print::printNumber(unsigned long n, uint8_t base)
262289
}
263290

264291
do {
265-
unsigned long m = n;
292+
char c = n % base;
293+
n /= base;
294+
295+
*--str = c < 10 ? c + '0' : c + 'A' - 10;
296+
} while (n);
297+
298+
return write(str);
299+
}
300+
301+
size_t Print::printNumber(unsigned long long n, uint8_t base)
302+
{
303+
char buf[8 * sizeof(n) + 1]; // Assumes 8-bit chars plus zero byte.
304+
char* str = &buf[sizeof(buf) - 1];
305+
306+
*str = '\0';
307+
308+
// prevent crash if called with base == 1
309+
if (base < 2) {
310+
base = 10;
311+
}
312+
313+
do {
314+
auto m = n;
266315
n /= base;
267316
char c = m - base * n;
317+
268318
*--str = c < 10 ? c + '0' : c + 'A' - 10;
269-
} while(n);
319+
} while (n);
270320

271321
return write(str);
272322
}

Diff for: cores/esp32/Print.h

+5
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class Print
3636
private:
3737
int write_error;
3838
size_t printNumber(unsigned long, uint8_t);
39+
size_t printNumber(unsigned long long, uint8_t);
3940
size_t printFloat(double, uint8_t);
4041
protected:
4142
void setWriteError(int err = 1)
@@ -81,6 +82,8 @@ class Print
8182
size_t print(unsigned int, int = DEC);
8283
size_t print(long, int = DEC);
8384
size_t print(unsigned long, int = DEC);
85+
size_t print(long long, int = DEC);
86+
size_t print(unsigned long long, int = DEC);
8487
size_t print(double, int = 2);
8588
size_t print(const Printable&);
8689
size_t print(struct tm * timeinfo, const char * format = NULL);
@@ -94,6 +97,8 @@ class Print
9497
size_t println(unsigned int, int = DEC);
9598
size_t println(long, int = DEC);
9699
size_t println(unsigned long, int = DEC);
100+
size_t println(long long, int = DEC);
101+
size_t println(unsigned long long, int = DEC);
97102
size_t println(double, int = 2);
98103
size_t println(const Printable&);
99104
size_t println(struct tm * timeinfo, const char * format = NULL);

0 commit comments

Comments
 (0)