diff options
Diffstat (limited to 'src/libc/stdio.c')
-rw-r--r-- | src/libc/stdio.c | 93 |
1 files changed, 72 insertions, 21 deletions
diff --git a/src/libc/stdio.c b/src/libc/stdio.c index 07a047e..631cfbb 100644 --- a/src/libc/stdio.c +++ b/src/libc/stdio.c @@ -3,17 +3,70 @@ #include "stdlib.h" #include "string.h" +#ifdef OS_ABAOS +#include "kernel.h" +#endif + +#ifdef OS_ABAOS console_t *stdio_console = NULL; +#endif -int puts( const char *s ) +static void print_string( const char *s ); +static void print_char( const char c ); +static void print_newline( void ); + +#ifdef OS_ABAOS +static void print_string( const char *s ) { if( stdio_console == NULL ) { - return EOF; + kernel_panic( "stdio_console not set!" ); } - + console_put_string( stdio_console, s ); +} + +static void print_char( const char c ) +{ + if( stdio_console == NULL ) { + kernel_panic( "stdio_console not set!" ); + } + + console_put_char( stdio_console, c ); +} + +static void print_newline( void ) +{ + if( stdio_console == NULL ) { + kernel_panic( "stdio_console not set!" ); + } + console_put_newline( stdio_console ); - +} +#endif + +#ifdef OS_LINUX +static void print_string( const char *s ) +{ + syscall3( __NR_write, STDOUT_FILENO, (long)s, strlen( s ) ); +} + +static void print_char( const char c ) +{ + char s[2]; s[0] = c; + syscall3( __NR_write, STDOUT_FILENO, (long)s, 1 ); +} + +static void print_newline( void ) +{ + syscall3( __NR_write, STDOUT_FILENO, (long)"\n", 1 ); +} +#endif + +int puts( const char *s ) +{ + print_string( s ); + print_newline( ); + return 1; } @@ -32,35 +85,31 @@ int vprintf( const char *format, va_list args ) { const char *s = format; int n = 0; - - if( stdio_console == NULL ) { - return -1; - } while( *s != '\0' ) { switch( *s ) { case '\n': - console_put_newline( stdio_console ); + print_newline( ); n++; break; case '%': s++; if( *s == '\0' ) { - console_put_string( stdio_console, "<truncated % found at end of format string>" ); - console_put_newline( stdio_console ); + print_string( "<truncated % found at end of format string>" ); + print_newline( ); return -1; } switch( *s ) { case '%': - console_put_char( stdio_console, '%' ); + print_char( '%' ); break; case 'X': { char buf[19]; itoa( va_arg( args, int ), (char *)buf, 16 ); - console_put_string( stdio_console, buf ); + print_string( buf ); n += strlen( buf ); } break; @@ -68,30 +117,30 @@ int vprintf( const char *format, va_list args ) case 'd': { char buf[19]; itoa( va_arg( args, int ), (char *)buf, 10 ); - console_put_string( stdio_console, buf ); + print_string( buf ); n += strlen( buf ); } break; case 'c': - console_put_char( stdio_console, va_arg( args, int ) ); + print_char( va_arg( args, int ) ); break; case 's': - console_put_string( stdio_console, va_arg( args, const char * ) ); + print_string( va_arg( args, const char * ) ); break; default: - console_put_string( stdio_console, "<illegal format string %" ); - console_put_char( stdio_console, *s ); - console_put_string( stdio_console, ">" ); - console_put_newline( stdio_console ); + print_string( "<illegal format string %" ); + print_char( *s ); + print_string( ">" ); + print_newline( ); } break; default: - console_put_char( stdio_console, *s ); + print_char( *s ); n++; } s++; @@ -100,7 +149,9 @@ int vprintf( const char *format, va_list args ) return n; } +#ifdef OS_ABAOS void __stdio_set_console( console_t *console ) { stdio_console = console; } +#endif |