summaryrefslogtreecommitdiff
path: root/src/libc/stdio.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libc/stdio.c')
-rw-r--r--src/libc/stdio.c93
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