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