Mon 14 Oct 23:14:00 CEST 2024
This commit is contained in:
parent
ce19b7e20d
commit
71a603acb0
48
library/stdio.c
Normal file
48
library/stdio.c
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2016-2019 The University of Notre Dame
|
||||||
|
This software is distributed under the GNU General Public License.
|
||||||
|
See the file LICENSE for details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "kernel/types.h"
|
||||||
|
#include "library/stdio.h"
|
||||||
|
#include "library/syscalls.h"
|
||||||
|
#include "library/string.h"
|
||||||
|
#include "stdarg.h"
|
||||||
|
|
||||||
|
static char stdio_buffer[PAGE_SIZE] = { 0 };
|
||||||
|
|
||||||
|
static uint32_t stdio_buffer_index = 0;
|
||||||
|
|
||||||
|
void flush()
|
||||||
|
{
|
||||||
|
syscall_object_write(KNO_STDOUT, stdio_buffer, stdio_buffer_index, 0);
|
||||||
|
stdio_buffer_index = 0;
|
||||||
|
stdio_buffer[0] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void printf_buffer(char *s, unsigned len)
|
||||||
|
{
|
||||||
|
while(len) {
|
||||||
|
unsigned l = len % (PAGE_SIZE - 1);
|
||||||
|
if(l > PAGE_SIZE - stdio_buffer_index - 1) {
|
||||||
|
flush();
|
||||||
|
}
|
||||||
|
memcpy(stdio_buffer + stdio_buffer_index, s, l);
|
||||||
|
stdio_buffer_index += l;
|
||||||
|
len -= l;
|
||||||
|
}
|
||||||
|
stdio_buffer[stdio_buffer_index] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void printf_putchar(char c)
|
||||||
|
{
|
||||||
|
printf_buffer(&c, 1);
|
||||||
|
if(c == '\n')
|
||||||
|
flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
void printf_putstring(char *s)
|
||||||
|
{
|
||||||
|
printf_buffer(s, strlen(s));
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user