Skip to content

Commit e91a992

Browse files
committed
Extend Print class for 64bit integers.
modulo 32bit and 64bit tuned for code size.
1 parent 13e0206 commit e91a992

File tree

2 files changed

+65
-10
lines changed

2 files changed

+65
-10
lines changed

Diff for: cores/esp32/Print.cpp

+60-10
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);
@@ -261,12 +288,35 @@ size_t Print::printNumber(unsigned long n, uint8_t base)
261288
base = 10;
262289
}
263290

291+
do {
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(long long) + 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+
264313
do {
265314
unsigned long 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)