diff options
author | zlg <zlg@zlg.space> | 2022-01-09 16:41:26 -0800 |
---|---|---|
committer | zlg <zlg@zlg.space> | 2022-01-09 16:41:26 -0800 |
commit | 2b68c3d06fb2961ae3797d1ef461cff655f328b2 (patch) | |
tree | 8731595b523ec3dcad0e9a70992de5f0a4a95a01 /ch8/8-02_fopen-and-fillbuf.c | |
parent | Solve Exercise 8-2: fopen and fillbuf (diff) | |
download | knr-2b68c3d06fb2961ae3797d1ef461cff655f328b2.tar.gz knr-2b68c3d06fb2961ae3797d1ef461cff655f328b2.tar.bz2 knr-2b68c3d06fb2961ae3797d1ef461cff655f328b2.tar.xz knr-2b68c3d06fb2961ae3797d1ef461cff655f328b2.zip |
Refactor syscalls.h for ch8 exercises
The refactor includes implementations for fflush and fclose as well,
needed in 8-03.
Diffstat (limited to '')
-rw-r--r-- | ch8/8-02_fopen-and-fillbuf.c | 82 |
1 files changed, 12 insertions, 70 deletions
diff --git a/ch8/8-02_fopen-and-fillbuf.c b/ch8/8-02_fopen-and-fillbuf.c index e533da8..66d7336 100644 --- a/ch8/8-02_fopen-and-fillbuf.c +++ b/ch8/8-02_fopen-and-fillbuf.c @@ -1,8 +1,9 @@ +#include <errno.h> +#include <string.h> #include <fcntl.h> -#include <stdio.h> #include <stdlib.h> #include <unistd.h> -#include "8-02_syscalls.h" +#include "syscalls.h" /* The C Programming Language: 2nd Edition * @@ -14,76 +15,14 @@ * * The resulting binary of this file (plus the custom header) runs through this * source file in about 0.001s. However, the binary is 1KB larger. + * + * Some subsequent exercises use the same syscalls.h file created for this + * exercise. For this reason, the file only refers to its chapter and not + * specific exercises. */ -#define PERMS 0666 - -int getc(FILE *); - -int my__fillbuf(my_FILE *fp) { - int bufsize; - if (fp->flags._READ == 0) { - return EOF; - } - bufsize = (fp->flags._UNBUF != 0) ? 1 : BUFSIZ; - if (fp->base == NULL) { - if ((fp->base = (char *) calloc(bufsize, sizeof (char))) == NULL) { - return EOF; - } - } - fp->ptr = fp->base; - fp->cnt = read(fp->fd, fp->ptr, bufsize); - if (--fp->cnt < 0) { - if (fp->cnt == -1) { - fp->flags._EOF = 1; - } else { - fp->flags._ERR = 1; - } - fp->cnt = 0; - return EOF; - } - return (unsigned char) *fp->ptr++; -} - -my_FILE * my_fopen(char *name, char *mode) { - int fd; - my_FILE *fp; - if (*mode != 'r' && *mode != 'w' && *mode != 'a') { - return NULL; - } - for (fp = _iob; fp < _iob + FOPEN_MAX; fp++) { - if (fp->flags._READ == 0 && fp->flags._WRITE == 0) { - break; - } - } - if (fp >= _iob + FOPEN_MAX) { - return NULL; - } - if (*mode == 'w') { - fd = creat(name, PERMS); - } else if (*mode == 'a') { - if ((fd = open(name, O_WRONLY, 0)) == -1) { - fd = creat(name, PERMS); - } - lseek(fd, 0L, 2); - } else { - fd = open(name, O_RDONLY, 0); - } - if (fd == -1) { - return NULL; - } - fp->fd = fd; - fp->cnt = 0; - if (*mode == 'r') { - fp->flags._READ = 1; - } else { - fp->flags._WRITE = 1; - } - return fp; -} - int main() { - my_FILE *fp = my_fopen("8-02_fopen-and-fillbuf.c", "r"); + FILE *fp = fopen("8-02_fopen-and-fillbuf.c", "r"); if (fp != NULL) { puts("We could read the file.\n"); /* pro tip: don't declare this as 'unsigned' or you'll create an @@ -91,9 +30,12 @@ int main() { * half an hour on a newbie mistake like I did. :) */ char c; - while ((c = my_getc(fp)) != EOF) { + while ((c = getc(fp)) != EOF) { putchar(c); } + /* fclose calls fflush */ + fclose(fp); + fclose(stdout); } else { puts("Could not open file for reading."); } |