23
23
#include < stdio.h>
24
24
#include < string.h>
25
25
#include < math.h>
26
- #include " wiring .h"
26
+ #include " Arduino .h"
27
27
28
28
#include " Print.h"
29
29
30
30
// Public Methods //////////////////////////////////////////////////////////////
31
31
32
32
/* default implementation: may be overridden */
33
- void Print::write (const char *str )
33
+ size_t Print::write (const uint8_t *buffer, size_t size )
34
34
{
35
- while (*str)
36
- write (*str++);
35
+ size_t n = 0 ;
36
+ while (size--) {
37
+ n += write (*buffer++);
38
+ }
39
+ return n;
37
40
}
38
41
39
- /* default implementation: may be overridden */
40
- void Print::write (const uint8_t *buffer, size_t size)
42
+ size_t Print::print (const __FlashStringHelper *ifsh)
41
43
{
42
- while (size--)
43
- write (*buffer++);
44
+ const prog_char *p = (const prog_char *)ifsh;
45
+ size_t n = 0 ;
46
+ while (1 ) {
47
+ unsigned char c = pgm_read_byte (p++);
48
+ if (c == 0 ) break ;
49
+ n += write (c);
50
+ }
51
+ return n;
44
52
}
45
53
46
- void Print::print (const String &s)
54
+ size_t Print::print (const String &s)
47
55
{
48
- for (unsigned int i = 0 ; i < s.length (); i++) {
49
- write (s[i]);
56
+ size_t n = 0 ;
57
+ for (uint16_t i = 0 ; i < s.length (); i++) {
58
+ n += write (s[i]);
50
59
}
60
+ return n;
51
61
}
52
62
53
- void Print::print (const char str[])
63
+ size_t Print::print (const char str[])
54
64
{
55
- write (str);
65
+ return write (str);
56
66
}
57
67
58
- void Print::print (char c, int base )
68
+ size_t Print::print (char c)
59
69
{
60
- print (( long ) c, base );
70
+ return write (c );
61
71
}
62
72
63
- void Print::print (unsigned char b, int base)
73
+ size_t Print::print (unsigned char b, int base)
64
74
{
65
- print ((unsigned long ) b, base);
75
+ return print ((unsigned long ) b, base);
66
76
}
67
77
68
- void Print::print (int n, int base)
78
+ size_t Print::print (int n, int base)
69
79
{
70
- print ((long ) n, base);
80
+ return print ((long ) n, base);
71
81
}
72
82
73
- void Print::print (unsigned int n, int base)
83
+ size_t Print::print (unsigned int n, int base)
74
84
{
75
- print ((unsigned long ) n, base);
85
+ return print ((unsigned long ) n, base);
76
86
}
77
87
78
- void Print::print (long n, int base)
88
+ size_t Print::print (long n, int base)
79
89
{
80
90
if (base == 0 ) {
81
- write (n);
91
+ return write (n);
82
92
} else if (base == 10 ) {
83
93
if (n < 0 ) {
84
- print (' -' );
94
+ int t = print (' -' );
85
95
n = -n;
96
+ return printNumber (n, 10 ) + t;
86
97
}
87
- printNumber (n, 10 );
98
+ return printNumber (n, 10 );
88
99
} else {
89
- printNumber (n, base);
100
+ return printNumber (n, base);
90
101
}
91
102
}
92
103
93
- void Print::print (unsigned long n, int base)
104
+ size_t Print::print (unsigned long n, int base)
94
105
{
95
- if (base == 0 ) write (n);
96
- else printNumber (n, base);
106
+ if (base == 0 ) return write (n);
107
+ else return printNumber (n, base);
97
108
}
98
109
99
- void Print::print (double n, int digits)
110
+ size_t Print::print (double n, int digits)
100
111
{
101
- printFloat (n, digits);
112
+ return printFloat (n, digits);
102
113
}
103
114
104
- void Print::println (void )
115
+ size_t Print::println (const __FlashStringHelper *ifsh )
105
116
{
106
- print (' \r ' );
107
- print (' \n ' );
117
+ size_t n = print (ifsh);
118
+ n += println ();
119
+ return n;
108
120
}
109
121
110
- void Print::println (const String &s )
122
+ size_t Print::print (const Printable& x )
111
123
{
112
- print (s);
113
- println ();
124
+ return x.printTo (*this );
114
125
}
115
126
116
- void Print::println (const char c[] )
127
+ size_t Print::println (void )
117
128
{
118
- print (c);
119
- println ();
129
+ size_t n = print (' \r ' );
130
+ n += print (' \n ' );
131
+ return n;
120
132
}
121
133
122
- void Print::println (char c, int base )
134
+ size_t Print::println (const String &s )
123
135
{
124
- print (c, base);
125
- println ();
136
+ size_t n = print (s);
137
+ n += println ();
138
+ return n;
126
139
}
127
140
128
- void Print::println (unsigned char b, int base )
141
+ size_t Print::println (const char c[] )
129
142
{
130
- print (b, base);
131
- println ();
143
+ size_t n = print (c);
144
+ n += println ();
145
+ return n;
132
146
}
133
147
134
- void Print::println (int n, int base )
148
+ size_t Print::println (char c )
135
149
{
136
- print (n, base);
137
- println ();
150
+ size_t n = print (c);
151
+ n += println ();
152
+ return n;
138
153
}
139
154
140
- void Print::println (unsigned int n , int base)
155
+ size_t Print::println (unsigned char b , int base)
141
156
{
142
- print (n, base);
143
- println ();
157
+ size_t n = print (b, base);
158
+ n += println ();
159
+ return n;
144
160
}
145
161
146
- void Print::println (long n , int base)
162
+ size_t Print::println (int num , int base)
147
163
{
148
- print (n, base);
149
- println ();
164
+ size_t n = print (num, base);
165
+ n += println ();
166
+ return n;
150
167
}
151
168
152
- void Print::println (unsigned long n , int base)
169
+ size_t Print::println (unsigned int num , int base)
153
170
{
154
- print (n, base);
155
- println ();
171
+ size_t n = print (num, base);
172
+ n += println ();
173
+ return n;
156
174
}
157
175
158
- void Print::println (double n , int digits )
176
+ size_t Print::println (long num , int base )
159
177
{
160
- print (n, digits);
161
- println ();
178
+ size_t n = print (num, base);
179
+ n += println ();
180
+ return n;
162
181
}
163
182
164
- // Private Methods /////////////////////////////////////////////////////////////
183
+ size_t Print::println (unsigned long num, int base)
184
+ {
185
+ size_t n = print (num, base);
186
+ n += println ();
187
+ return n;
188
+ }
165
189
166
- void Print::printNumber ( unsigned long n, uint8_t base )
190
+ size_t Print::println ( double num, int digits )
167
191
{
168
- unsigned char buf[8 * sizeof (long )]; // Assumes 8-bit chars.
169
- unsigned long i = 0 ;
192
+ size_t n = print (num, digits);
193
+ n += println ();
194
+ return n;
195
+ }
170
196
171
- if (n == 0 ) {
172
- print (' 0' );
173
- return ;
174
- }
197
+ size_t Print::println (const Printable& x)
198
+ {
199
+ size_t n = print (x);
200
+ n += println ();
201
+ return n;
202
+ }
175
203
176
- while (n > 0 ) {
177
- buf[i++] = n % base;
204
+ // Private Methods /////////////////////////////////////////////////////////////
205
+
206
+ size_t Print::printNumber (unsigned long n, uint8_t base) {
207
+ char buf[8 * sizeof (long ) + 1 ]; // Assumes 8-bit chars plus zero byte.
208
+ char *str = &buf[sizeof (buf) - 1 ];
209
+
210
+ *str = ' \0 ' ;
211
+
212
+ // prevent crash if called with base == 1
213
+ if (base < 2 ) base = 10 ;
214
+
215
+ do {
216
+ unsigned long m = n;
178
217
n /= base;
179
- }
218
+ char c = m - base * n;
219
+ *--str = c < 10 ? c + ' 0' : c + ' A' - 10 ;
220
+ } while (n);
180
221
181
- for (; i > 0 ; i--)
182
- print ((char ) (buf[i - 1 ] < 10 ?
183
- ' 0' + buf[i - 1 ] :
184
- ' A' + buf[i - 1 ] - 10 ));
222
+ return write (str);
185
223
}
186
224
187
- void Print::printFloat (double number, uint8_t digits)
225
+ size_t Print::printFloat (double number, uint8_t digits)
188
226
{
227
+ size_t n = 0 ;
228
+
189
229
// Handle negative numbers
190
230
if (number < 0.0 )
191
231
{
192
- print (' -' );
232
+ n += print (' -' );
193
233
number = -number;
194
234
}
195
235
@@ -203,18 +243,21 @@ void Print::printFloat(double number, uint8_t digits)
203
243
// Extract the integer part of the number and print it
204
244
unsigned long int_part = (unsigned long )number;
205
245
double remainder = number - (double )int_part;
206
- print (int_part);
246
+ n += print (int_part);
207
247
208
248
// Print the decimal point, but only if there are digits beyond
209
- if (digits > 0 )
210
- print (" ." );
249
+ if (digits > 0 ) {
250
+ n += print (" ." );
251
+ }
211
252
212
253
// Extract digits from the remainder one at a time
213
254
while (digits-- > 0 )
214
255
{
215
256
remainder *= 10.0 ;
216
257
int toPrint = int (remainder);
217
- print (toPrint);
258
+ n += print (toPrint);
218
259
remainder -= toPrint;
219
260
}
261
+
262
+ return n;
220
263
}
0 commit comments