aboutsummaryrefslogtreecommitdiff
path: root/ch8/8-02_syscalls.h
blob: 728c5af02403f12a011651394ce868a9483fe2af (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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*);