rev |
line source |
alpar@9
|
1 /* zio.c (simulation of non-standard low-level i/o functions) */
|
alpar@9
|
2
|
alpar@9
|
3 /* Written by Andrew Makhorin <mao@gnu.org>, April 2011
|
alpar@9
|
4 * For conditions of distribution and use, see copyright notice in
|
alpar@9
|
5 * zlib.h */
|
alpar@9
|
6
|
alpar@9
|
7 /* (reserved for copyright notice) */
|
alpar@9
|
8
|
alpar@9
|
9 #include <assert.h>
|
alpar@9
|
10 #include <stdio.h>
|
alpar@9
|
11 #include "zio.h"
|
alpar@9
|
12
|
alpar@9
|
13 static FILE *file[FOPEN_MAX];
|
alpar@9
|
14 static int initialized = 0;
|
alpar@9
|
15
|
alpar@9
|
16 static void initialize(void)
|
alpar@9
|
17 { int fd;
|
alpar@9
|
18 assert(!initialized);
|
alpar@9
|
19 file[0] = stdin;
|
alpar@9
|
20 file[1] = stdout;
|
alpar@9
|
21 file[2] = stderr;
|
alpar@9
|
22 for (fd = 3; fd < FOPEN_MAX; fd++)
|
alpar@9
|
23 file[fd] = NULL;
|
alpar@9
|
24 initialized = 1;
|
alpar@9
|
25 return;
|
alpar@9
|
26 }
|
alpar@9
|
27
|
alpar@9
|
28 int open(const char *path, int oflag, ...)
|
alpar@9
|
29 { FILE *fp;
|
alpar@9
|
30 int fd;
|
alpar@9
|
31 if (!initialized) initialize();
|
alpar@9
|
32 /* see file gzlib.c, function gz_open */
|
alpar@9
|
33 if (oflag == O_RDONLY)
|
alpar@9
|
34 fp = fopen(path, "rb");
|
alpar@9
|
35 else if (oflag == (O_WRONLY | O_CREAT | O_TRUNC))
|
alpar@9
|
36 fp = fopen(path, "wb");
|
alpar@9
|
37 else if (oflag == (O_WRONLY | O_CREAT | O_APPEND))
|
alpar@9
|
38 fp = fopen(path, "ab");
|
alpar@9
|
39 else
|
alpar@9
|
40 assert(oflag != oflag);
|
alpar@9
|
41 if (fp == NULL)
|
alpar@9
|
42 return -1;
|
alpar@9
|
43 for (fd = 0; fd < FOPEN_MAX; fd++)
|
alpar@9
|
44 if (file[fd] == NULL) break;
|
alpar@9
|
45 assert(fd < FOPEN_MAX);
|
alpar@9
|
46 file[fd] = fp;
|
alpar@9
|
47 return fd;
|
alpar@9
|
48 }
|
alpar@9
|
49
|
alpar@9
|
50 long read(int fd, void *buf, unsigned long nbyte)
|
alpar@9
|
51 { unsigned long count;
|
alpar@9
|
52 if (!initialized) initialize();
|
alpar@9
|
53 assert(0 <= fd && fd < FOPEN_MAX);
|
alpar@9
|
54 assert(file[fd] != NULL);
|
alpar@9
|
55 count = fread(buf, 1, nbyte, file[fd]);
|
alpar@9
|
56 if (ferror(file[fd]))
|
alpar@9
|
57 return -1;
|
alpar@9
|
58 return count;
|
alpar@9
|
59 }
|
alpar@9
|
60
|
alpar@9
|
61 long write(int fd, const void *buf, unsigned long nbyte)
|
alpar@9
|
62 { unsigned long count;
|
alpar@9
|
63 if (!initialized) initialize();
|
alpar@9
|
64 assert(0 <= fd && fd < FOPEN_MAX);
|
alpar@9
|
65 assert(file[fd] != NULL);
|
alpar@9
|
66 count = fwrite(buf, 1, nbyte, file[fd]);
|
alpar@9
|
67 if (count != nbyte)
|
alpar@9
|
68 return -1;
|
alpar@9
|
69 if (fflush(file[fd]) != 0)
|
alpar@9
|
70 return -1;
|
alpar@9
|
71 return count;
|
alpar@9
|
72 }
|
alpar@9
|
73
|
alpar@9
|
74 long lseek(int fd, long offset, int whence)
|
alpar@9
|
75 { if (!initialized) initialize();
|
alpar@9
|
76 assert(0 <= fd && fd < FOPEN_MAX);
|
alpar@9
|
77 assert(file[fd] != NULL);
|
alpar@9
|
78 if (fseek(file[fd], offset, whence) != 0)
|
alpar@9
|
79 return -1;
|
alpar@9
|
80 return ftell(file[fd]);
|
alpar@9
|
81 }
|
alpar@9
|
82
|
alpar@9
|
83 int close(int fd)
|
alpar@9
|
84 { if (!initialized) initialize();
|
alpar@9
|
85 assert(0 <= fd && fd < FOPEN_MAX);
|
alpar@9
|
86 assert(file[fd] != NULL);
|
alpar@9
|
87 fclose(file[fd]);
|
alpar@9
|
88 file[fd] = NULL;
|
alpar@9
|
89 return 0;
|
alpar@9
|
90 }
|
alpar@9
|
91
|
alpar@9
|
92 /* eof */
|