Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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

‎cores/esp32/Print.cpp‎

Lines changed: 62 additions & 12 deletions
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
}

‎cores/esp32/Print.h‎

Lines changed: 5 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /