11/*
22 * Print.cpp - Base class that provides print() and println()
33 * Copyright (c) 2008 David A. Mellis. All right reserved.
4+ * Copyright (c) 2011 LeafLabs, LLC.
45 *
56 * This library is free software; you can redistribute it and/or
67 * modify it under the terms of the GNU Lesser General Public License
2324
2425#include " Print.h"
2526
26- #include < limits.h>
27+ #include " wirish_math.h"
28+ #include " limits.h"
2729
2830#ifndef LLONG_MAX
2931/*
4042#define LLONG_MAX 9223372036854775807LL
4143#endif
4244
43- #include " wirish_math.h"
44-
4545/*
4646 * Public methods
4747 */
4848
49- void Print::write (const char *str) {
49+ size_t Print::write (const char *str) {
50+ size_t n = 0 ;
5051 while (*str) {
5152 write (*str++);
53+ n++;
5254 }
55+ return n;
5356}
5457
55- void Print::write (const void *buffer, uint32 size) {
58+ size_t Print::write (const void *buffer, uint32 size) {
59+ size_t n = 0 ;
5660 uint8 *ch = (uint8*)buffer;
5761 while (size--) {
5862 write (*ch++);
63+ n++;
5964 }
65+ return n;
6066}
6167
62- void Print::print (uint8 b, int base) {
68+ size_t Print::print (uint8 b, int base) {
6369 print ((uint64)b, base);
6470}
6571
66- void Print::print (char c) {
67- write (c);
72+ size_t Print::print (const String &s)
73+ {
74+ return write (s.c_str (), s.length ());
6875}
6976
70- void Print::print (const char str[] ) {
71- write (str );
77+ size_t Print::print (char c ) {
78+ return write (c );
7279}
7380
74- void Print::print (int n, int base ) {
75- print (( long long )n, base );
81+ size_t Print::print (const char str[] ) {
82+ return write (str );
7683}
7784
78- void Print::print (unsigned int n, int base) {
79- print ((unsigned long long )n, base);
85+ size_t Print::print (int n, int base) {
86+ return print ((long long )n, base);
8087}
8188
82- void Print::print (long n, int base) {
83- print ((long long )n, base);
89+ size_t Print::print (unsigned int n, int base) {
90+ return print ((unsigned long long )n, base);
8491}
8592
86- void Print::print (unsigned long n, int base) {
87- print ((unsigned long long )n, base);
93+ size_t Print::print (long n, int base) {
94+ return print ((long long )n, base);
8895}
8996
90- void Print::print (long long n, int base) {
91- if (base == BYTE) {
92- write ((uint8)n);
93- return ;
97+ size_t Print::print (unsigned long n, int base) {
98+ return print ((unsigned long long )n, base);
99+ }
100+
101+ size_t Print::print (long long n, int base) {
102+ if (base == BYTE)
103+ {
104+ return write ((uint8)n);
94105 }
95106 if (n < 0 ) {
96107 print (' -' );
97108 n = -n;
98109 }
99- printNumber (n, base);
110+ return printNumber (n, base);
100111}
101112
102- void Print::print (unsigned long long n, int base) {
113+ size_t Print::print (unsigned long long n, int base) {
114+ size_t c=0 ;
103115 if (base == BYTE) {
104- write ((uint8)n);
116+ c= write ((uint8)n);
105117 } else {
106- printNumber (n, base);
118+ c= printNumber (n, base);
107119 }
120+ return c;
108121}
109122
110- void Print::print (double n, int digits) {
111- printFloat (n, digits);
123+ size_t Print::print (double n, int digits) {
124+ return printFloat (n, digits);
112125}
113126
114- void Print::println (void ) {
115- print (' \r ' );
116- print (' \n ' );
127+ size_t Print::println (void )
128+ {
129+ size_t n = print (' \r ' );
130+ n += print (' \n ' );
131+ return n;
117132}
118133
119- void Print::println (char c) {
120- print (c);
121- println ();
134+ size_t Print::println (const String &s)
135+ {
136+ size_t n = print (s);
137+ n += println ();
138+ return n;
122139}
123140
124- void Print::println (const char c[]) {
125- print (c);
126- println ();
141+ size_t Print::println (char c) {
142+ size_t n = print (c);
143+ n += println ();
144+ return n;
127145}
128146
129- void Print::println (uint8 b, int base) {
130- print (b, base);
131- println ();
147+ size_t Print::println (const char c[]) {
148+ size_t n = print (c);
149+ n += println ();
150+ return n;
132151}
133152
134- void Print::println (int n, int base) {
135- print (n, base);
136- println ();
153+ size_t Print::println (uint8 b, int base) {
154+ size_t n = print (b, base);
155+ n += println ();
156+ return n;
137157}
138158
139- void Print::println (unsigned int n, int base) {
140- print (n, base);
141- println ();
159+ size_t Print::println (int n, int base) {
160+ size_t s = print (n, base);
161+ s += println ();
162+ return s;
142163}
143164
144- void Print::println (long n, int base) {
145- print ((long long )n, base);
146- println ();
165+ size_t Print::println (unsigned int n, int base) {
166+ size_t s = print (n, base);
167+ s += println ();
168+ return s;
147169}
148170
149- void Print::println (unsigned long n, int base) {
150- print ((unsigned long long )n, base);
151- println ();
171+ size_t Print::println (long n, int base) {
172+ size_t s = print ((long long )n, base);
173+ s += println ();
174+ return s;
152175}
153176
154- void Print::println (long long n, int base) {
155- print (n, base);
156- println ();
177+ size_t Print::println (unsigned long n, int base) {
178+ size_t s = print ((unsigned long long )n, base);
179+ s += println ();
180+ return s;
157181}
158182
159- void Print::println (unsigned long long n, int base) {
160- print (n, base);
161- println ();
183+ size_t Print::println (long long n, int base) {
184+ size_t s = print (n, base);
185+ s += println ();
186+ return s;
162187}
163188
164- void Print::println (double n, int digits) {
165- print (n, digits);
166- println ();
189+ size_t Print::println (unsigned long long n, int base) {
190+ size_t s = print (n, base);
191+ s += println ();
192+ return s;
167193}
168194
195+ size_t Print::println (double n, int digits) {
196+ size_t s = print (n, digits);
197+ s += println ();
198+ return s;
199+ }
200+
201+ #ifdef SUPPORTS_PRINTF
202+ #include < stdio.h>
203+ #include < stdarg.h>
204+ // Work in progress to support printf.
205+ // Need to implement stream FILE to write individual chars to chosen serial port
206+ int Print::printf (__const char *__restrict __format, ...)
207+ {
208+ FILE *__restrict __stream;
209+ int ret_status = 0 ;
210+
211+
212+ va_list args;
213+ va_start (args,__format);
214+ ret_status = vfprintf (__stream, __format, args);
215+ va_end (args);
216+ return ret_status;
217+ }
218+ #endif
219+
169220/*
170221 * Private methods
171222 */
172223
173- void Print::printNumber (unsigned long long n, uint8 base) {
224+ size_t Print::printNumber (unsigned long long n, uint8 base) {
174225 unsigned char buf[CHAR_BIT * sizeof (long long )];
175226 unsigned long i = 0 ;
176-
227+ size_t s= 0 ;
177228 if (n == 0 ) {
178229 print (' 0' );
179- return ;
230+ return 1 ;
180231 }
181232
182233 while (n > 0 ) {
@@ -185,12 +236,14 @@ void Print::printNumber(unsigned long long n, uint8 base) {
185236 }
186237
187238 for (; i > 0 ; i--) {
188- print ((char )(buf[i - 1 ] < 10 ?
239+ s += print ((char )(buf[i - 1 ] < 10 ?
189240 ' 0' + buf[i - 1 ] :
190241 ' A' + buf[i - 1 ] - 10 ));
191242 }
243+ return s;
192244}
193245
246+
194247/* According to snprintf(),
195248 *
196249 * nextafter((double)numeric_limits<long long>::max(), 0.0) ~= 9.22337e+18
@@ -208,19 +261,20 @@ void Print::printNumber(unsigned long long n, uint8 base) {
208261 *
209262 * http://kurtstephens.com/files/p372-steele.pdf
210263 */
211- void Print::printFloat (double number, uint8 digits) {
264+ size_t Print::printFloat (double number, uint8 digits) {
265+ size_t s=0 ;
212266 // Hackish fail-fast behavior for large-magnitude doubles
213267 if (abs (number) >= LARGE_DOUBLE_TRESHOLD) {
214268 if (number < 0.0 ) {
215- print (' -' );
269+ s= print (' -' );
216270 }
217- print (" <large double>" );
218- return ;
271+ s+= print (" <large double>" );
272+ return s ;
219273 }
220274
221275 // Handle negative numbers
222276 if (number < 0.0 ) {
223- print (' -' );
277+ s+= print (' -' );
224278 number = -number;
225279 }
226280
@@ -235,18 +289,20 @@ void Print::printFloat(double number, uint8 digits) {
235289 // Extract the integer part of the number and print it
236290 long long int_part = (long long )number;
237291 double remainder = number - int_part;
238- print (int_part);
292+ s+= print (int_part);
239293
240294 // Print the decimal point, but only if there are digits beyond
241295 if (digits > 0 ) {
242- print (" ." );
296+ s+= print (" ." );
243297 }
244298
245299 // Extract digits from the remainder one at a time
246300 while (digits-- > 0 ) {
247301 remainder *= 10.0 ;
248302 int to_print = (int )remainder;
249- print (to_print);
303+ s+= print (to_print);
250304 remainder -= to_print;
251305 }
306+ return s;
252307}
308+
0 commit comments