From 4ad4e6c7f6d2fb414d22dd3e55801c85b02c1af7 Mon Sep 17 00:00:00 2001 From: zlg Date: Sat, 22 Dec 2018 01:23:35 -0800 Subject: Solve Exercise 8-2: fopen and fillbuf --- ch8/8-02_syscalls.h | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 ch8/8-02_syscalls.h (limited to 'ch8/8-02_syscalls.h') diff --git a/ch8/8-02_syscalls.h b/ch8/8-02_syscalls.h new file mode 100644 index 0000000..728c5af --- /dev/null +++ b/ch8/8-02_syscalls.h @@ -0,0 +1,47 @@ +/* 8-02_syscalls.h + * + * A simpler stdio.h to aid in exercises 8-2 + */ + +long lseek(int fd, long offset, int origin); + +struct _flags { + unsigned int _READ : 1; + unsigned int _WRITE : 1; + unsigned int _UNBUF : 1; + unsigned int _EOF : 1; + unsigned int _ERR : 1; +} flags; + +typedef struct _iobuf { + int cnt; + char *ptr; + char *base; + struct _flags flags; + int fd; +} my_FILE; + +my_FILE _iob[FOPEN_MAX] = { + /* stdin is read-only */ + { 0, (char *) 0, (char *) 0, {1, 0, 0, 0, 0}, 0 }, + /* stdout is write only */ + { 0, (char *) 0, (char *) 0, {0, 1, 0, 0, 0}, 1 }, + /* stderr is written AND not buffered */ + { 0, (char *) 0, (char *) 0, {0, 1, 1, 0, 0}, 2 } +}; + +#define feof(p) (((p)->flags._EOF) != 0) +#define ferror(p) (((p)->flags._ERR) != 0) +#define fileno(p) ((p)->fd) +#define my_getc(p) (--(p)->cnt >= 0 ? (unsigned char) *(p)->ptr++ : my__fillbuf(p)) +#define getchar() getc(stdin) + +int my_fempty(struct _flags flags) { + if (!flags._READ && !flags._WRITE && !flags._UNBUF && !flags._EOF && !flags._ERR) { + return 1; + } else { + return 0; + } +} + +int my_fclose(my_FILE*); -- cgit v1.2.3-54-g00ecf