From bb2dd23f315bafa7b0b64845c2fe25d7a0893b10 Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Sat, 16 Jul 2016 18:07:24 +0200 Subject: Got Lua running \o/ --- src/lib/libc/stdio.c | 191 ++++++++++++++++++++++++++++++++++----------------- 1 file changed, 127 insertions(+), 64 deletions(-) (limited to 'src/lib/libc/stdio.c') diff --git a/src/lib/libc/stdio.c b/src/lib/libc/stdio.c index 8d4577e..c849683 100644 --- a/src/lib/libc/stdio.c +++ b/src/lib/libc/stdio.c @@ -10,15 +10,31 @@ FILE *stdin = 0; FILE *stdout = 0; FILE *stderr = 0; -void setup_libc_stdio() { - fd_t tty_io = STD_FD_TTY_STDIO; - // fd_t tty_in = STD_FD_STDIN; - // fd_t tty_out = STD_FD_STDOUT; - // fd_t tty_err = STD_FD_STDERR; +FILE libc_tty_stdio, libc_stdin, libc_stdout, libc_stderr; - // TODO - if (true) { - sc_fctl(tty_io, FC_SET_BLOCKING, 0); +void setup_libc_stdio() { + if (sc_stat_open(STD_FD_TTY_STDIO, &libc_tty_stdio.st)) { + libc_tty_stdio.fd = STD_FD_TTY_STDIO; + sc_fctl(libc_tty_stdio.fd, FC_SET_BLOCKING, 0); + // TODO: initialize libc_tty_stdio as a TTY + stdin = &libc_tty_stdio; + stdout = &libc_tty_stdio; + stderr = &libc_tty_stdio; + } + if (sc_stat_open(STD_FD_STDIN, &libc_stdin.st)) { + libc_stdin.fd = STD_FD_STDIN; + // TODO: initialize + stdin = &libc_stdin; + } + if (sc_stat_open(STD_FD_STDOUT, &libc_stdout.st)) { + libc_stdout.fd = STD_FD_STDOUT; + // TODO: initialize + stdout = &libc_stdout; + } + if (sc_stat_open(STD_FD_STDERR, &libc_stderr.st)) { + libc_stderr.fd = STD_FD_STDERR; + // TODO: initialize + stderr = &libc_stderr; } } @@ -37,13 +53,12 @@ int puts(const char* s) { int printf(const char* fmt, ...) { va_list ap; - char buffer[256]; va_start(ap, fmt); - vsnprintf(buffer, 256, fmt, ap); + int ret = vfprintf(stdout, fmt, ap); va_end(ap); - return puts(buffer); + return ret; } // ================== @@ -51,14 +66,59 @@ int printf(const char* fmt, ...) { // ================== -int fgetc(FILE *stream) { +FILE *fopen(const char *path, const char *mode) { // TODO return 0; } -char *fgets(char *s, int size, FILE *stream) { +FILE *freopen(const char *path, const char *mode, FILE *stream) { // TODO return 0; } +int fclose(FILE* f) { + // TODO + return 0; +} + + +// --------------- +// INPUT FUNCTIONS +// --------------- + +size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) { + if (stream == NULL || stream->fd == 0) return 0; + + // TODO buffering + // TODO position + return sc_read(stream->fd, 0, size * nmemb, ptr); +} + +int fgetc(FILE *stream) { + // TODO buffering && ungetc + char x; + if (fread(&x, 1, 1, stream)) { + return x; + } else { + return EOF; + } +} +char *fgets(char *s, int size, FILE *stream) { + int l = 0; + while (l < size - 1) { + int c = fgetc(stream); + if (c == EOF) { + break; + } else if (c == '\b') { + if (l > 0) l--; + // TODO if terminal write back space or something + } else { + s[l] = c; + l++; + if (c == '\n') break; + } + } + s[l] = 0; + return s; +} int getc(FILE *stream) { // TODO return 0; @@ -68,77 +128,90 @@ int ungetc(int c, FILE *stream) { return 0; } +// ---------------- +// OUTPUT FUNCTIONS +// ---------------- + +size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) { + if (stream == NULL || stream->fd == 0) return 0; + + // TODO buffering + // TODO position + return sc_write(stream->fd, 0, size * nmemb, ptr); +} + int fputc(int c, FILE *stream) { - // TODO - return 0; + unsigned char x = c; + return fwrite(&x, 1, 1, stream); } int fputs(const char *s, FILE *stream) { - // TODO - return 0; + return fwrite(s, strlen(s), 1, stream); } int putc(int c, FILE *stream) { - // TODO - return 0; + return fputc(c, stream); } -FILE *fopen(const char *path, const char *mode) { - // TODO - return 0; +int fprintf(FILE *stream, const char *fmt, ...) { + va_list ap; + + va_start(ap, fmt); + int ret = vfprintf(stream, fmt, ap); + va_end(ap); + + return ret; } -FILE *freopen(const char *path, const char *mode, FILE *stream) { - // TODO - return 0; +int vfprintf(FILE *stream, const char *format, va_list ap) { + char buf[1024]; + vsnprintf(buf, 1024, format, ap); + + return fputs(buf, stream); } -void clearerr(FILE *stream) { - // TODO +// buffering + +void setbuf(FILE *stream, char *buf) { + setvbuf(stream, buf, buf ? _IOFBF : _IONBF, BUFSIZ); } -int feof(FILE *stream) { +void setbuffer(FILE *stream, char *buf, size_t size) { // TODO - return 0; } -int ferror(FILE *stream) { +void setlinebuf(FILE *stream) { + setvbuf(stream, NULL, _IOLBF, 0); +} +int setvbuf(FILE *stream, char *buf, int mode, size_t size) { // TODO return 0; } -int fileno(FILE *stream) { + +int fflush(FILE* f) { // TODO return 0; } +// --------------------- +// COMPLICATED FUNCTIONS +// --------------------- -size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) { +void clearerr(FILE *stream) { // TODO - return 0; } -size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) { +int feof(FILE *stream) { // TODO return 0; } - -int fflush(FILE* f) { +int ferror(FILE *stream) { // TODO return 0; } -int fclose(FILE* f) { +int fileno(FILE *stream) { // TODO return 0; } -void setbuf(FILE *stream, char *buf) { - // TODO -} -void setbuffer(FILE *stream, char *buf, size_t size) { - // TODO -} -void setlinebuf(FILE *stream) { - // TODO -} -int setvbuf(FILE *stream, char *buf, int mode, size_t size) { - // TODO - return 0; -} +// ------------------ +// POSITION FUNCTIONS +// ------------------ int fseek(FILE *stream, long offset, int whence) { @@ -161,6 +234,10 @@ int fsetpos(FILE *stream, const fpos_t *pos) { return 0; } +// --------------------- +// PATH & FILE FUNCTIONS +// --------------------- + FILE *tmpfile(void) { // TODO return 0; @@ -181,18 +258,4 @@ int remove(const char *pathname) { -int fprintf(FILE *stream, const char *format, ...) { - // TODO - return 0; -} -int dprintf(int fd, const char *format, ...) { - // TODO - return 0; -} -int sprintf(char *str, const char *format, ...) { - // TODO - return 0; -} - - /* vim: set ts=4 sw=4 tw=0 noet :*/ -- cgit v1.2.3