1 /*
2 * Copyright (c) 2013 Travis Geiselbrecht
3 *
4 * Use of this source code is governed by a MIT-style
5 * license that can be found in the LICENSE file or at
6 * https://opensource.org/licenses/MIT
7 */
8 #include <lk/debug.h>
9 #include <stdio.h>
10 #include <stdarg.h>
11 #include <string.h>
12 #include <sys/types.h>
13 #include <platform/debug.h>
14
15 #define DEFINE_STDIO_DESC(id) \
16 [(id)] = { \
17 .io = &console_io, \
18 }
19
20 FILE __stdio_FILEs[3] = {
21 DEFINE_STDIO_DESC(0), /* stdin */
22 DEFINE_STDIO_DESC(1), /* stdout */
23 DEFINE_STDIO_DESC(2), /* stderr */
24 };
25 #undef DEFINE_STDIO_DESC
26
fputc(int _c,FILE * fp)27 int fputc(int _c, FILE *fp) {
28 unsigned char c = _c;
29 return io_write(fp->io, (char *)&c, 1);
30 }
31
putchar(int c)32 int putchar(int c) {
33 return fputc(c, stdout);
34 }
35
puts(const char * str)36 int puts(const char *str) {
37 int err = fputs(str, stdout);
38 if (err >= 0)
39 err = fputc('\n', stdout);
40 return err;
41 }
42
fputs(const char * s,FILE * fp)43 int fputs(const char *s, FILE *fp) {
44 size_t len = strlen(s);
45
46 return io_write(fp->io, s, len);
47 }
48
fwrite(const void * ptr,size_t size,size_t count,FILE * fp)49 size_t fwrite(const void *ptr, size_t size, size_t count, FILE *fp) {
50 size_t bytes_written;
51
52 if (size == 0 || count == 0)
53 return 0;
54
55 // fast path for size == 1
56 if (likely(size == 1)) {
57 return io_write(fp->io, ptr, count);
58 }
59
60 bytes_written = io_write(fp->io, ptr, size * count);
61 return bytes_written / size;
62 }
63
getc(FILE * fp)64 int getc(FILE *fp) {
65 char c;
66 ssize_t ret = io_read(fp->io, &c, sizeof(c));
67
68 return (ret > 0) ? c : ret;
69 }
70
getchar(void)71 int getchar(void) {
72 return getc(stdin);
73 }
74
_fprintf_output_func(const char * str,size_t len,void * state)75 int _fprintf_output_func(const char *str, size_t len, void *state) {
76 FILE *fp = (FILE *)state;
77
78 return io_write(fp->io, str, len);
79 }
80
vfprintf(FILE * fp,const char * fmt,va_list ap)81 int vfprintf(FILE *fp, const char *fmt, va_list ap) {
82 return _printf_engine(&_fprintf_output_func, (void *)fp, fmt, ap);
83 }
84
fprintf(FILE * fp,const char * fmt,...)85 int fprintf(FILE *fp, const char *fmt, ...) {
86 va_list ap;
87 int err;
88
89 va_start(ap, fmt);
90 err = vfprintf(fp, fmt, ap);
91 va_end(ap);
92 return err;
93 }
94
95 #if !DISABLE_DEBUG_OUTPUT
printf(const char * fmt,...)96 int printf(const char *fmt, ...) {
97 va_list ap;
98 int err;
99
100 va_start(ap, fmt);
101 err = vfprintf(stdout, fmt, ap);
102 va_end(ap);
103
104 return err;
105 }
106
vprintf(const char * fmt,va_list ap)107 int vprintf(const char *fmt, va_list ap) {
108 return vfprintf(stdout, fmt, ap);
109 }
110 #endif // !DISABLE_DEBUG_OUTPUT
111