@@ -19,11 +19,19 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
19
19
#include <string.h>
20
20
#include <ctype.h>
21
21
#include "contty.h"
22
+ #include "serial.h"
23
+
24
+ enum {
25
+ OUT_DEF ,
26
+ OUT_BUF ,
27
+ OUT_SCR ,
28
+ OUT_SER
29
+ };
22
30
23
31
extern void pcboot_putchar (int c );
24
32
25
- static void bwrite (char * buf , size_t buf_sz , char * str , int sz );
26
- static int intern_printf (char * buf , size_t sz , const char * fmt , va_list ap );
33
+ static void bwrite (int out , char * buf , size_t buf_sz , char * str , int sz );
34
+ static int intern_printf (int out , char * buf , size_t sz , const char * fmt , va_list ap );
27
35
28
36
int putchar (int c )
29
37
{
@@ -52,14 +60,14 @@ int printf(const char *fmt, ...)
52
60
va_list ap ;
53
61
54
62
va_start (ap , fmt );
55
- res = intern_printf (0 , 0 , fmt , ap );
63
+ res = intern_printf (OUT_DEF , 0 , 0 , fmt , ap );
56
64
va_end (ap );
57
65
return res ;
58
66
}
59
67
60
68
int vprintf (const char * fmt , va_list ap )
61
69
{
62
- return intern_printf (0 , 0 , fmt , ap );
70
+ return intern_printf (OUT_DEF , 0 , 0 , fmt , ap );
63
71
}
64
72
65
73
int sprintf (char * buf , const char * fmt , ...)
@@ -68,14 +76,14 @@ int sprintf(char *buf, const char *fmt, ...)
68
76
va_list ap ;
69
77
70
78
va_start (ap , fmt );
71
- res = intern_printf (buf , 0 , fmt , ap );
79
+ res = intern_printf (OUT_BUF , buf , 0 , fmt , ap );
72
80
va_end (ap );
73
81
return res ;
74
82
}
75
83
76
84
int vsprintf (char * buf , const char * fmt , va_list ap )
77
85
{
78
- return intern_printf (buf , 0 , fmt , ap );
86
+ return intern_printf (OUT_BUF , buf , 0 , fmt , ap );
79
87
}
80
88
81
89
int snprintf (char * buf , size_t sz , const char * fmt , ...)
@@ -84,16 +92,31 @@ int snprintf(char *buf, size_t sz, const char *fmt, ...)
84
92
va_list ap ;
85
93
86
94
va_start (ap , fmt );
87
- res = intern_printf (buf , sz , fmt , ap );
95
+ res = intern_printf (OUT_BUF , buf , sz , fmt , ap );
88
96
va_end (ap );
89
97
return res ;
90
98
}
91
99
92
100
int vsnprintf (char * buf , size_t sz , const char * fmt , va_list ap )
93
101
{
94
- return intern_printf (buf , sz , fmt , ap );
102
+ return intern_printf (OUT_BUF , buf , sz , fmt , ap );
95
103
}
96
104
105
+ int ser_printf (const char * fmt , ...)
106
+ {
107
+ int res ;
108
+ va_list ap ;
109
+
110
+ va_start (ap , fmt );
111
+ res = intern_printf (OUT_SER , 0 , 0 , fmt , ap );
112
+ va_end (ap );
113
+ return res ;
114
+ }
115
+
116
+ int ser_vprintf (const char * fmt , va_list ap )
117
+ {
118
+ return intern_printf (OUT_SER , 0 , 0 , fmt , ap );
119
+ }
97
120
98
121
/* intern_printf provides all the functionality needed by all the printf
99
122
* variants.
@@ -108,7 +131,7 @@ int vsnprintf(char *buf, size_t sz, const char *fmt, va_list ap)
108
131
#define BUF (x ) ((x) ? (x) + cnum : (x))
109
132
#define SZ (x ) ((x) ? (x) - cnum : (x))
110
133
111
- static int intern_printf (char * buf , size_t sz , const char * fmt , va_list ap )
134
+ static int intern_printf (int out , char * buf , size_t sz , const char * fmt , va_list ap )
112
135
{
113
136
char conv_buf [32 ];
114
137
char * str ;
@@ -143,7 +166,7 @@ static int intern_printf(char *buf, size_t sz, const char *fmt, va_list ap)
143
166
base = 16 ;
144
167
145
168
if (alt ) {
146
- bwrite (BUF (buf ), SZ (sz ), "0x" , 2 );
169
+ bwrite (out , BUF (buf ), SZ (sz ), "0x" , 2 );
147
170
}
148
171
149
172
case 'u' :
@@ -154,7 +177,7 @@ static int intern_printf(char *buf, size_t sz, const char *fmt, va_list ap)
154
177
base = 8 ;
155
178
156
179
if (alt ) {
157
- bwrite (BUF (buf ), SZ (sz ), "0" , 1 );
180
+ bwrite (out , BUF (buf ), SZ (sz ), "0" , 1 );
158
181
}
159
182
}
160
183
@@ -173,18 +196,18 @@ static int intern_printf(char *buf, size_t sz, const char *fmt, va_list ap)
173
196
174
197
slen = strlen (conv_buf );
175
198
for (i = slen ; i < fwidth ; i ++ ) {
176
- bwrite (BUF (buf ), SZ (sz ), (char * )& padc , 1 );
199
+ bwrite (out , BUF (buf ), SZ (sz ), (char * )& padc , 1 );
177
200
cnum ++ ;
178
201
}
179
202
180
- bwrite (BUF (buf ), SZ (sz ), conv_buf , strlen (conv_buf ));
203
+ bwrite (out , BUF (buf ), SZ (sz ), conv_buf , strlen (conv_buf ));
181
204
cnum += slen ;
182
205
break ;
183
206
184
207
case 'c' :
185
208
{
186
209
char c = va_arg (ap , int );
187
- bwrite (BUF (buf ), SZ (sz ), & c , 1 );
210
+ bwrite (out , BUF (buf ), SZ (sz ), & c , 1 );
188
211
cnum ++ ;
189
212
}
190
213
break ;
@@ -194,10 +217,10 @@ static int intern_printf(char *buf, size_t sz, const char *fmt, va_list ap)
194
217
slen = strlen (str );
195
218
196
219
for (i = slen ; i < fwidth ; i ++ ) {
197
- bwrite (BUF (buf ), SZ (sz ), (char * )& padc , 1 );
220
+ bwrite (out , BUF (buf ), SZ (sz ), (char * )& padc , 1 );
198
221
cnum ++ ;
199
222
}
200
- bwrite (BUF (buf ), SZ (sz ), str , slen );
223
+ bwrite (out , BUF (buf ), SZ (sz ), str , slen );
201
224
cnum += slen ;
202
225
break ;
203
226
@@ -252,7 +275,7 @@ static int intern_printf(char *buf, size_t sz, const char *fmt, va_list ap)
252
275
fmt ++ ;
253
276
}
254
277
} else {
255
- bwrite (BUF (buf ), SZ (sz ), (char * )fmt ++ , 1 );
278
+ bwrite (out , BUF (buf ), SZ (sz ), (char * )fmt ++ , 1 );
256
279
cnum ++ ;
257
280
}
258
281
}
@@ -262,19 +285,34 @@ static int intern_printf(char *buf, size_t sz, const char *fmt, va_list ap)
262
285
263
286
264
287
/* bwrite is called by intern_printf to transparently handle writing into a
265
- * buffer (if buf is non-null) or to the terminal (if buf is null).
288
+ * buffer or to the terminal
266
289
*/
267
- static void bwrite (char * buf , size_t buf_sz , char * str , int sz )
290
+ static void bwrite (int out , char * buf , size_t buf_sz , char * str , int sz )
268
291
{
269
- if (buf ) {
292
+ int i ;
293
+
294
+ if (out == OUT_BUF ) {
270
295
if (buf_sz && buf_sz <= sz ) sz = buf_sz - 1 ;
271
296
memcpy (buf , str , sz );
272
297
273
298
buf [sz ] = 0 ;
274
299
} else {
275
- int i ;
276
- for (i = 0 ; i < sz ; i ++ ) {
277
- putchar (* str ++ );
300
+ switch (out ) {
301
+ case OUT_DEF :
302
+ for (i = 0 ; i < sz ; i ++ ) {
303
+ putchar (* str ++ );
304
+ }
305
+ break ;
306
+
307
+ case OUT_SER :
308
+ for (i = 0 ; i < sz ; i ++ ) {
309
+ ser_putchar (* str ++ );
310
+ }
311
+ break ;
312
+
313
+ default :
314
+ /* TODO: OUT_SCR */
315
+ break ;
278
316
}
279
317
}
280
318
}
0 commit comments