Skip to content

Commit b73cf39

Browse files
committed
Moving write errors out of return value into separate API methods.
write(), print(), println() now return size_t (and don't use negative values to signal errors). Print adds writeError() for checking for write errors, clearWriteError() to reset the flag to false, and a protected setWriteError() for signalling errors. http://code.google.com/p/arduino/issues/detail?id=598
1 parent 9295973 commit b73cf39

23 files changed

+181
-170
lines changed

hardware/arduino/cores/arduino/HardwareSerial.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ void HardwareSerial::flush()
352352
;
353353
}
354354

355-
ssize_t HardwareSerial::write(uint8_t c)
355+
size_t HardwareSerial::write(uint8_t c)
356356
{
357357
int i = (_tx_buffer->head + 1) % SERIAL_BUFFER_SIZE;
358358

hardware/arduino/cores/arduino/HardwareSerial.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class HardwareSerial : public Stream
5555
virtual int peek(void);
5656
virtual int read(void);
5757
virtual void flush(void);
58-
virtual ssize_t write(uint8_t);
58+
virtual size_t write(uint8_t);
5959
using Print::write; // pull in write(str) and write(buf, size) from Print
6060
};
6161

hardware/arduino/cores/arduino/Print.cpp

+66-78
Original file line numberDiff line numberDiff line change
@@ -30,196 +30,190 @@
3030
// Public Methods //////////////////////////////////////////////////////////////
3131

3232
/* default implementation: may be overridden */
33-
ssize_t Print::write(const char *str)
33+
size_t Print::write(const char *str)
3434
{
35-
ssize_t n = 0;
35+
size_t n = 0;
3636
while (*str) {
37-
if (write(*str++) <= 0) break;
38-
n++;
37+
n += write(*str++);
3938
}
4039
return n;
4140
}
4241

4342
/* default implementation: may be overridden */
44-
ssize_t Print::write(const uint8_t *buffer, size_t size)
43+
size_t Print::write(const uint8_t *buffer, size_t size)
4544
{
46-
ssize_t n = 0;
45+
size_t n = 0;
4746
while (size--) {
48-
if (write(*buffer++) <= 0) break;
49-
n++;
47+
n += write(*buffer++);
5048
}
5149
return n;
5250
}
5351

54-
ssize_t Print::print(const __FlashStringHelper *ifsh)
52+
size_t Print::print(const __FlashStringHelper *ifsh)
5553
{
5654
const prog_char *p = (const prog_char *)ifsh;
57-
ssize_t n = 0;
55+
size_t n = 0;
5856
while (1) {
5957
unsigned char c = pgm_read_byte(p++);
6058
if (c == 0) break;
61-
if (write(c) <= 0) break;
62-
n++;
59+
n += write(c);
6360
}
6461
return n;
6562
}
6663

67-
ssize_t Print::print(const String &s)
64+
size_t Print::print(const String &s)
6865
{
69-
ssize_t n = 0;
66+
size_t n = 0;
7067
for (int i = 0; i < s.length(); i++) {
71-
if (write(s[i]) < 0) break;
72-
n++;
68+
n += write(s[i]);
7369
}
7470
return n;
7571
}
7672

77-
ssize_t Print::print(const char str[])
73+
size_t Print::print(const char str[])
7874
{
7975
return write(str);
8076
}
8177

82-
ssize_t Print::print(char c)
78+
size_t Print::print(char c)
8379
{
8480
return write(c);
8581
}
8682

87-
ssize_t Print::print(unsigned char b, int base)
83+
size_t Print::print(unsigned char b, int base)
8884
{
8985
return print((unsigned long) b, base);
9086
}
9187

92-
ssize_t Print::print(int n, int base)
88+
size_t Print::print(int n, int base)
9389
{
9490
return print((long) n, base);
9591
}
9692

97-
ssize_t Print::print(unsigned int n, int base)
93+
size_t Print::print(unsigned int n, int base)
9894
{
9995
return print((unsigned long) n, base);
10096
}
10197

102-
ssize_t Print::print(long n, int base)
98+
size_t Print::print(long n, int base)
10399
{
104100
if (base == 0) {
105101
return write(n);
106102
} else if (base == 10) {
107103
if (n < 0) {
108104
int t = print('-');
109-
if (t <= 0) return t;
110105
n = -n;
111-
return printNumber(n, 10) + 1;
106+
return printNumber(n, 10) + t;
112107
}
113108
return printNumber(n, 10);
114109
} else {
115110
return printNumber(n, base);
116111
}
117112
}
118113

119-
ssize_t Print::print(unsigned long n, int base)
114+
size_t Print::print(unsigned long n, int base)
120115
{
121116
if (base == 0) return write(n);
122117
else return printNumber(n, base);
123118
}
124119

125-
ssize_t Print::print(double n, int digits)
120+
size_t Print::print(double n, int digits)
126121
{
127122
return printFloat(n, digits);
128123
}
129124

130-
ssize_t Print::println(const __FlashStringHelper *ifsh)
125+
size_t Print::println(const __FlashStringHelper *ifsh)
131126
{
132-
ssize_t n = print(ifsh);
133-
if (n >= 0) n += println();
127+
size_t n = print(ifsh);
128+
n += println();
134129
return n;
135130
}
136131

137-
ssize_t Print::print(const Printable& x)
132+
size_t Print::print(const Printable& x)
138133
{
139134
return x.printTo(*this);
140135
}
141136

142-
ssize_t Print::println(void)
137+
size_t Print::println(void)
143138
{
144-
ssize_t t = print('\r');
145-
if (t <= 0) return t;
146-
if (print('\n') <= 0) return 1;
147-
return 2;
139+
size_t n = print('\r');
140+
n += print('\n');
141+
return n;
148142
}
149143

150-
ssize_t Print::println(const String &s)
144+
size_t Print::println(const String &s)
151145
{
152-
ssize_t n = print(s);
153-
if (n >= 0) n += println();
146+
size_t n = print(s);
147+
n += println();
154148
return n;
155149
}
156150

157-
ssize_t Print::println(const char c[])
151+
size_t Print::println(const char c[])
158152
{
159-
ssize_t n = print(c);
160-
if (n >= 0) n += println();
153+
size_t n = print(c);
154+
n += println();
161155
return n;
162156
}
163157

164-
ssize_t Print::println(char c)
158+
size_t Print::println(char c)
165159
{
166-
ssize_t n = print(c);
167-
if (n > 0) n += println();
160+
size_t n = print(c);
161+
n += println();
168162
return n;
169163
}
170164

171-
ssize_t Print::println(unsigned char b, int base)
165+
size_t Print::println(unsigned char b, int base)
172166
{
173-
ssize_t n = print(b, base);
174-
if (n >= 0) n += println();
167+
size_t n = print(b, base);
168+
n += println();
175169
return n;
176170
}
177171

178-
ssize_t Print::println(int num, int base)
172+
size_t Print::println(int num, int base)
179173
{
180-
ssize_t n = print(num, base);
181-
if (n >= 0) n += println();
174+
size_t n = print(num, base);
175+
n += println();
182176
return n;
183177
}
184178

185-
ssize_t Print::println(unsigned int num, int base)
179+
size_t Print::println(unsigned int num, int base)
186180
{
187-
ssize_t n = print(num, base);
188-
if (n >= 0) n += println();
181+
size_t n = print(num, base);
182+
n += println();
189183
return n;
190184
}
191185

192-
ssize_t Print::println(long num, int base)
186+
size_t Print::println(long num, int base)
193187
{
194-
ssize_t n = print(num, base);
195-
if (n >= 0) n += println();
188+
size_t n = print(num, base);
189+
n += println();
196190
return n;
197191
}
198192

199-
ssize_t Print::println(unsigned long num, int base)
193+
size_t Print::println(unsigned long num, int base)
200194
{
201-
ssize_t n = print(num, base);
202-
if (n >= 0) n += println();
195+
size_t n = print(num, base);
196+
n += println();
203197
return n;
204198
}
205199

206-
ssize_t Print::println(double num, int digits)
200+
size_t Print::println(double num, int digits)
207201
{
208-
ssize_t n = print(num, digits);
209-
if (n >= 0) n += println();
202+
size_t n = print(num, digits);
203+
n += println();
210204
return n;
211205
}
212206

213-
ssize_t Print::println(const Printable& x)
207+
size_t Print::println(const Printable& x)
214208
{
215-
ssize_t n = print(x);
216-
if (n >= 0) n += println();
209+
size_t n = print(x);
210+
n += println();
217211
return n;
218212
}
219213

220214
// Private Methods /////////////////////////////////////////////////////////////
221215

222-
ssize_t Print::printNumber(unsigned long n, uint8_t base) {
216+
size_t Print::printNumber(unsigned long n, uint8_t base) {
223217
char buf[8 * sizeof(long) + 1]; // Assumes 8-bit chars plus zero byte.
224218
char *str = &buf[sizeof(buf) - 1];
225219

@@ -238,14 +232,14 @@ ssize_t Print::printNumber(unsigned long n, uint8_t base) {
238232
return write(str);
239233
}
240234

241-
ssize_t Print::printFloat(double number, uint8_t digits)
235+
size_t Print::printFloat(double number, uint8_t digits)
242236
{
243-
ssize_t n = 0, t;
237+
size_t n = 0;
244238

245239
// Handle negative numbers
246240
if (number < 0.0)
247241
{
248-
if ((n = print('-')) <= 0) return n;
242+
n += print('-');
249243
number = -number;
250244
}
251245

@@ -259,25 +253,19 @@ ssize_t Print::printFloat(double number, uint8_t digits)
259253
// Extract the integer part of the number and print it
260254
unsigned long int_part = (unsigned long)number;
261255
double remainder = number - (double)int_part;
262-
if ((t = print(int_part)) < 0) return n;
263-
264-
n += t;
256+
n += print(int_part);
265257

266258
// Print the decimal point, but only if there are digits beyond
267259
if (digits > 0) {
268-
t = print(".");
269-
if (t <= 0) return n;
270-
n += t;
260+
n += print(".");
271261
}
272262

273263
// Extract digits from the remainder one at a time
274264
while (digits-- > 0)
275265
{
276266
remainder *= 10.0;
277267
int toPrint = int(remainder);
278-
t = print(toPrint);
279-
if (t <= 0) return n;
280-
n += t;
268+
n += print(toPrint);
281269
remainder -= toPrint;
282270
}
283271

0 commit comments

Comments
 (0)