Skip to content

Commit fa23c18

Browse files
WIP
1 parent c64a4e0 commit fa23c18

File tree

2 files changed

+392
-165
lines changed

2 files changed

+392
-165
lines changed

cores/arduino/Print.cpp

Lines changed: 33 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -41,66 +41,55 @@ size_t Print::write(const uint8_t *buffer, size_t size)
4141
return n;
4242
}
4343

44-
size_t Print::doPrint(const __FlashStringHelper *ifsh)
44+
size_t Print::println(void)
4545
{
46-
PGM_P p = reinterpret_cast<PGM_P>(ifsh);
46+
return write("\r\n");
47+
}
48+
49+
50+
size_t Formatters::DefaultFormatter::printTo(Print *p, const __FlashStringHelper *ifsh) const
51+
{
52+
PGM_P ptr = reinterpret_cast<PGM_P>(ifsh);
4753
size_t n = 0;
4854
while (1) {
49-
unsigned char c = pgm_read_byte(p++);
55+
unsigned char c = pgm_read_byte(ptr++);
5056
if (c == 0) break;
51-
if (write(c)) n++;
57+
if (p->write(c)) n++;
5258
else break;
5359
}
5460
return n;
5561
}
5662

57-
size_t Print::doPrint(const String &s)
63+
size_t Formatters::DefaultFormatter::printTo(Print *p, const String &s) const
5864
{
59-
return write(s.c_str(), s.length());
65+
return p->write(s.c_str(), s.length());
6066
}
6167

62-
size_t Print::doPrint(signed long n, int base)
68+
size_t Formatters::DefaultFormatter::printSignedNumber(Print *p, signed long n) const
6369
{
64-
if (base == 0) {
65-
return write(n);
66-
} else if (base == 10) {
70+
if (this->base == 10) {
6771
if (n < 0) {
68-
int t = print('-');
72+
size_t t = p->write('-');
6973
n = -n;
70-
return printNumber(n, 10) + t;
74+
return printNumber(p, n) + t;
7175
}
72-
return printNumber(n, 10);
76+
return printNumber(p, n);
7377
} else {
74-
return printNumber(n, base);
78+
return printNumber(p, n);
7579
}
7680
}
7781

78-
size_t Print::doPrint(unsigned long n, int base)
79-
{
80-
if (base == 0) return write(n);
81-
else return printNumber(n, base);
82-
}
83-
84-
size_t Print::doPrint(double n, int digits)
85-
{
86-
return printFloat(n, digits);
87-
}
88-
89-
size_t Print::println(void)
90-
{
91-
return write("\r\n");
92-
}
93-
9482
// Private Methods /////////////////////////////////////////////////////////////
9583

96-
size_t Print::printNumber(unsigned long n, uint8_t base)
84+
size_t Formatters::DefaultFormatter::printNumber(Print *p , unsigned long n) const
9785
{
9886
char buf[8 * sizeof(long) + 1]; // Assumes 8-bit chars plus zero byte.
9987
char *str = &buf[sizeof(buf) - 1];
88+
uint8_t base = this->base;
10089

10190
*str = '\0';
10291

103-
// prevent crash if called with base == 1
92+
// prevent crash if called with base 0 or 1
10493
if (base < 2) base = 10;
10594

10695
do {
@@ -110,22 +99,24 @@ size_t Print::printNumber(unsigned long n, uint8_t base)
11099
*--str = c < 10 ? c + '0' : c + 'A' - 10;
111100
} while(n);
112101

113-
return write(str);
102+
return p->write(str);
114103
}
115104

116-
size_t Print::printFloat(double number, uint8_t digits)
105+
size_t Formatters::DefaultFormatter::printFloat(Print *p, double number) const
117106
{
118107
size_t n = 0;
108+
uint8_t digits = this->precision;
109+
auto int_formatter = DefaultFormatter();
119110

120-
if (isnan(number)) return print("nan");
121-
if (isinf(number)) return print("inf");
122-
if (number > 4294967040.0) return print ("ovf"); // constant determined empirically
123-
if (number <-4294967040.0) return print ("ovf"); // constant determined empirically
111+
if (isnan(number)) return p->write("nan");
112+
if (isinf(number)) return p->write("inf");
113+
if (number > 4294967040.0) return p->write ("ovf"); // constant determined empirically
114+
if (number <-4294967040.0) return p->write ("ovf"); // constant determined empirically
124115

125116
// Handle negative numbers
126117
if (number < 0.0)
127118
{
128-
n += print('-');
119+
n += p->write('-');
129120
number = -number;
130121
}
131122

@@ -139,19 +130,19 @@ size_t Print::printFloat(double number, uint8_t digits)
139130
// Extract the integer part of the number and print it
140131
unsigned long int_part = (unsigned long)number;
141132
double remainder = number - (double)int_part;
142-
n += print(int_part);
133+
n += int_formatter.printTo(p, int_part);
143134

144135
// Print the decimal point, but only if there are digits beyond
145136
if (digits > 0) {
146-
n += print('.');
137+
n += p->write('.');
147138
}
148139

149140
// Extract digits from the remainder one at a time
150141
while (digits-- > 0)
151142
{
152143
remainder *= 10.0;
153144
unsigned int toPrint = (unsigned int)(remainder);
154-
n += print(toPrint);
145+
n += int_formatter.printTo(p, toPrint);
155146
remainder -= toPrint;
156147
}
157148

0 commit comments

Comments
 (0)