#include #include #include #include #include FILE *stdin = 0; FILE *stdout = 0; FILE *stderr = 0; FILE libc_tty_stdio, libc_stdin, libc_stdout, libc_stderr; 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; } } int getchar() { return fgetc(stdin); } int putchar(int c) { return fputc(c, stdout); } int puts(const char* s) { return fputs(s, stdout); } int printf(const char* fmt, ...) { va_list ap; va_start(ap, fmt); int ret = vfprintf(stdout, fmt, ap); va_end(ap); return ret; } // ================== // BELOW IS TODO // ================== FILE *fopen(const char *path, const char *mode) { // TODO return 0; } 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; } int ungetc(int c, FILE *stream) { // TODO 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) { unsigned char x = c; return fwrite(&x, 1, 1, stream); } int fputs(const char *s, FILE *stream) { return fwrite(s, strlen(s), 1, stream); } int putc(int c, FILE *stream) { return fputc(c, stream); } 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; } int vfprintf(FILE *stream, const char *format, va_list ap) { char buf[1024]; vsnprintf(buf, 1024, format, ap); return fputs(buf, stream); } // buffering void setbuf(FILE *stream, char *buf) { setvbuf(stream, buf, buf ? _IOFBF : _IONBF, BUFSIZ); } void setbuffer(FILE *stream, char *buf, size_t size) { // TODO } void setlinebuf(FILE *stream) { setvbuf(stream, NULL, _IOLBF, 0); } int setvbuf(FILE *stream, char *buf, int mode, size_t size) { // TODO return 0; } int fflush(FILE* f) { // TODO return 0; } // --------------------- // COMPLICATED FUNCTIONS // --------------------- void clearerr(FILE *stream) { // TODO } int feof(FILE *stream) { // TODO return 0; } int ferror(FILE *stream) { // TODO return 0; } int fileno(FILE *stream) { // TODO return 0; } // ------------------ // POSITION FUNCTIONS // ------------------ int fseek(FILE *stream, long offset, int whence) { // TODO return 0; } long ftell(FILE *stream) { // TODO return 0; } void rewind(FILE *stream) { // TODO } int fgetpos(FILE *stream, fpos_t *pos) { // TODO return 0; } int fsetpos(FILE *stream, const fpos_t *pos) { // TODO return 0; } // --------------------- // PATH & FILE FUNCTIONS // --------------------- FILE *tmpfile(void) { // TODO return 0; } char *tmpnam(char *s) { // TODO return 0; } int rename(const char *old, const char *new) { // TODO return 0; } int remove(const char *pathname) { // TODO return 0; } /* vim: set ts=4 sw=4 tw=0 noet :*/