Skip to content

Commit 3fd2040

Browse files
committed
Extend Print class for 64bit integers.
1 parent 0e7fae8 commit 3fd2040

File tree

2 files changed

+100
-50
lines changed

2 files changed

+100
-50
lines changed

cores/arduino/Print.cpp

Lines changed: 56 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -86,18 +86,12 @@ size_t Print::print(unsigned int n, int base)
8686

8787
size_t Print::print(long n, int base)
8888
{
89-
if (base == 0) {
90-
return write(n);
91-
} else if (base == 10) {
92-
if (n < 0) {
93-
int t = print('-');
94-
n = -n;
95-
return printNumber(n, 10) + t;
96-
}
97-
return printNumber(n, 10);
98-
} else {
99-
return printNumber(n, base);
89+
int t = 0;
90+
if (base == 10 && n < 0) {
91+
t = print('-');
92+
n = -n;
10093
}
94+
return printNumber(static_cast<unsigned long>(n), base) + t;
10195
}
10296

10397
size_t Print::print(unsigned long n, int base)
@@ -106,6 +100,22 @@ size_t Print::print(unsigned long n, int base)
106100
else return printNumber(n, base);
107101
}
108102

103+
size_t Print::print(long long n, int base)
104+
{
105+
int t = 0;
106+
if (base == 10 && n < 0) {
107+
t = print('-');
108+
n = -n;
109+
}
110+
return printNumber(static_cast<unsigned long long>(n), base) + t;
111+
}
112+
113+
size_t Print::print(unsigned long long n, int base)
114+
{
115+
if (base == 0) return write(n);
116+
return printNumber(n, base);
117+
}
118+
109119
size_t Print::print(double n, int digits)
110120
{
111121
return printFloat(n, digits);
@@ -184,6 +194,20 @@ size_t Print::println(unsigned long num, int base)
184194
return n;
185195
}
186196

197+
size_t Print::println(long long num, int base)
198+
{
199+
size_t n = print(num, base);
200+
n += println();
201+
return n;
202+
}
203+
204+
size_t Print::println(unsigned long long num, int base)
205+
{
206+
size_t n = print(num, base);
207+
n += println();
208+
return n;
209+
}
210+
187211
size_t Print::println(double num, int digits)
188212
{
189213
size_t n = print(num, digits);
@@ -220,6 +244,27 @@ size_t Print::printNumber(unsigned long n, uint8_t base)
220244
return write(str);
221245
}
222246

247+
size_t Print::printNumber(unsigned long long n, uint8_t base)
248+
{
249+
char buf[8 * sizeof(long long) + 1]; // Assumes 8-bit chars plus zero byte.
250+
char* str = &buf[sizeof(buf) - 1];
251+
252+
*str = '\0';
253+
254+
// prevent crash if called with base == 1
255+
if (base < 2) base = 10;
256+
257+
do {
258+
unsigned long m = n;
259+
n /= base;
260+
char c = m - base * n;
261+
262+
*--str = c < 10 ? c + '0' : c + 'A' - 10;
263+
} while(n);
264+
265+
return write(str);
266+
}
267+
223268
size_t Print::printFloat(double number, uint8_t digits)
224269
{
225270
size_t n = 0;

cores/arduino/Print.h

Lines changed: 44 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -36,58 +36,63 @@
3636

3737
class Print
3838
{
39-
private:
40-
int write_error;
41-
size_t printNumber(unsigned long, uint8_t);
42-
size_t printFloat(double, uint8_t);
43-
protected:
39+
private:
40+
int write_error;
41+
size_t printNumber(unsigned long, uint8_t);
42+
size_t printNumber(unsigned long long, uint8_t);
43+
size_t printFloat(double, uint8_t);
44+
protected:
4445
void setWriteError(int err = 1) { write_error = err; }
45-
public:
46+
public:
4647
Print() : write_error(0) {}
47-
48+
4849
int getWriteError() { return write_error; }
4950
void clearWriteError() { setWriteError(0); }
50-
51-
virtual size_t write(uint8_t) = 0;
52-
size_t write(const char *str) {
51+
52+
virtual size_t write(uint8_t) = 0;
53+
size_t write(const char *str) {
5354
if (str == NULL) return 0;
5455
return write((const uint8_t *)str, strlen(str));
55-
}
56-
virtual size_t write(const uint8_t *buffer, size_t size);
57-
size_t write(const char *buffer, size_t size) {
58-
return write((const uint8_t *)buffer, size);
59-
}
56+
}
57+
virtual size_t write(const uint8_t *buffer, size_t size);
58+
size_t write(const char *buffer, size_t size) {
59+
return write((const uint8_t *) buffer, size);
60+
}
6061

6162
// default to zero, meaning "a single write may block"
6263
// should be overriden by subclasses with buffering
6364
virtual int availableForWrite() { return 0; }
6465

65-
size_t print(const __FlashStringHelper *);
66-
size_t print(const String &);
67-
size_t print(const char[]);
68-
size_t print(char);
69-
size_t print(unsigned char, int = DEC);
70-
size_t print(int, int = DEC);
71-
size_t print(unsigned int, int = DEC);
72-
size_t print(long, int = DEC);
73-
size_t print(unsigned long, int = DEC);
74-
size_t print(double, int = 2);
75-
size_t print(const Printable&);
66+
size_t print(const __FlashStringHelper *);
67+
size_t print(const String &);
68+
size_t print(const char[]);
69+
size_t print(char);
70+
size_t print(unsigned char, int = DEC);
71+
size_t print(int, int = DEC);
72+
size_t print(unsigned int, int = DEC);
73+
size_t print(long, int = DEC);
74+
size_t print(unsigned long, int = DEC);
75+
size_t print(long long, int = DEC);
76+
size_t print(unsigned long long, int = DEC);
77+
size_t print(double, int = 2);
78+
size_t print(const Printable&);
7679

77-
size_t println(const __FlashStringHelper *);
78-
size_t println(const String &s);
79-
size_t println(const char[]);
80-
size_t println(char);
81-
size_t println(unsigned char, int = DEC);
82-
size_t println(int, int = DEC);
83-
size_t println(unsigned int, int = DEC);
84-
size_t println(long, int = DEC);
85-
size_t println(unsigned long, int = DEC);
86-
size_t println(double, int = 2);
87-
size_t println(const Printable&);
88-
size_t println(void);
80+
size_t println(const __FlashStringHelper *);
81+
size_t println(const String &s);
82+
size_t println(const char[]);
83+
size_t println(char);
84+
size_t println(unsigned char, int = DEC);
85+
size_t println(int, int = DEC);
86+
size_t println(unsigned int, int = DEC);
87+
size_t println(long, int = DEC);
88+
size_t println(unsigned long, int = DEC);
89+
size_t println(long long, int = DEC);
90+
size_t println(unsigned long long, int = DEC);
91+
size_t println(double, int = 2);
92+
size_t println(const Printable&);
93+
size_t println(void);
8994

90-
virtual void flush() { /* Empty implementation for backward compatibility */ }
95+
virtual void flush() { /* Empty implementation for backward compatibility */ }
9196
};
9297

9398
#endif

0 commit comments

Comments
 (0)