ref: 44cc5010e56094acc7cf2a042135c0cd4ca27323
parent: ee1f5f77cd79122402b7c823744c933c64e18097
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Tue Dec 5 18:32:32 EST 2017
[lib/c] Add stdio declarations for file operations
--- a/lib/c/include/stdio.h
+++ b/lib/c/include/stdio.h
@@ -3,35 +3,48 @@
#include <arch/stdio.h>
+#ifndef FOPEN_MAX
+#define FOPEN_MAX 12
+#endif
+
#ifndef NULL
#define NULL ((void *) 0)
#endif
#define EOF -1
-#define _IOFBF 0
-#define _IOLBF 1
-#define _IONBF 2
#define SEEK_CUR 0
#define SEEK_END 1
#define SEEK_SET 2
+#define _IOFBF 0
+#define _IOLBF 1
+#define _IONBF 2
+
+#define _IOWRITE (1 << 0)
+#define _IOREAD (1 << 1)
+#define _IORW (1 << 2)
+#define _IOEOF (1 << 3)
+#define _IOERR (1 << 4)
+#define _IOSTRG (1 << 5)
+#define _IOTXT (1 << 6)
+
typedef struct {
- int fd; /* file descriptor */
- char flags; /* bits for must free buffer on close, line-buffered */
- char state; /* last operation was read, write, position, error, eof */
- char *buf; /* pointer to i/o buffer */
- char *rp; /* read pointer (or write end-of-buffer) */
- char *wp; /* write pointer (or read end-of-buffer) */
- char *lp; /* actual write pointer used when line-buffering */
- size_t len; /* actual length of buffer */
- char unbuf[1]; /* tiny buffer for unbuffered io */
+ int fd; /* file descriptor */
+ unsigned char *buf; /* pointer to i/o buffer */
+ unsigned char *rp; /* read pointer */
+ unsigned char *wp; /* write pointer */
+ unsigned char *lp; /* write pointer used when line-buffering */
+ size_t len; /* actual length of buffer */
+ unsigned char mode;
+ unsigned char flags;
+ unsigned char unbuf[1]; /* tiny buffer for unbuffered io */
} FILE;
-extern FILE _IO_stream[FOPEN_MAX];
+extern FILE __iob[FOPEN_MAX];
-#define stderr (&_IO_stream[2])
-#define stdin (&_IO_stream[0])
-#define stdout (&_IO_stream[1])
+#define stdin (&__iob[0])
+#define stdout (&__iob[1])
+#define stderr (&__iob[2])
extern int remove(const char *filename);
extern int rename(const char *old, const char *new);
@@ -94,8 +107,20 @@
extern int ferror(FILE *fp);
extern void perror(const char *s);
+extern int __getc(FILE *fp);
+extern int __putc(int, FILE *fp);
+
#ifdef __USE_MACROS
-#define printf(...) fprintf(stdout, __VA_ARGS__)
+#ifdef __UNIX_FILES
+#define getc(fp) ((fp)->rp >= (fp)->wp ? __getc(fp) : *(fp)->rp++)
+#define putc(c, fp) ((fp)->wp >= (fp)->rp ? __putc(c,fp) : (*(fp)->wp++ = c))
+#endif
+
+#define ferror(fp) ((fp)->flags & _IOERR)
+#define feof(fp) ((fp)->flags & _IOEOF)
+#define clearerr(fp) (void) ((fp)->flags &= ~(_IOERR|_IOEOF))
+#define getchar() getc(stdin)
+#define putchar(c) putc((c), stdout)
#endif
#endif