You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
92 lines
2.3 KiB
92 lines
2.3 KiB
/* zio.c (simulation of non-standard low-level i/o functions) */
|
|
|
|
/* Written by Andrew Makhorin <mao@gnu.org>, April 2011
|
|
* For conditions of distribution and use, see copyright notice in
|
|
* zlib.h */
|
|
|
|
/* (reserved for copyright notice) */
|
|
|
|
#include <assert.h>
|
|
#include <stdio.h>
|
|
#include "zio.h"
|
|
|
|
static FILE *file[FOPEN_MAX];
|
|
static int initialized = 0;
|
|
|
|
static void initialize(void)
|
|
{ int fd;
|
|
assert(!initialized);
|
|
file[0] = stdin;
|
|
file[1] = stdout;
|
|
file[2] = stderr;
|
|
for (fd = 3; fd < FOPEN_MAX; fd++)
|
|
file[fd] = NULL;
|
|
initialized = 1;
|
|
return;
|
|
}
|
|
|
|
int open(const char *path, int oflag, ...)
|
|
{ FILE *fp;
|
|
int fd;
|
|
if (!initialized) initialize();
|
|
/* see file gzlib.c, function gz_open */
|
|
if (oflag == O_RDONLY)
|
|
fp = fopen(path, "rb");
|
|
else if (oflag == (O_WRONLY | O_CREAT | O_TRUNC))
|
|
fp = fopen(path, "wb");
|
|
else if (oflag == (O_WRONLY | O_CREAT | O_APPEND))
|
|
fp = fopen(path, "ab");
|
|
else
|
|
assert(oflag != oflag);
|
|
if (fp == NULL)
|
|
return -1;
|
|
for (fd = 0; fd < FOPEN_MAX; fd++)
|
|
if (file[fd] == NULL) break;
|
|
assert(fd < FOPEN_MAX);
|
|
file[fd] = fp;
|
|
return fd;
|
|
}
|
|
|
|
long read(int fd, void *buf, unsigned long nbyte)
|
|
{ unsigned long count;
|
|
if (!initialized) initialize();
|
|
assert(0 <= fd && fd < FOPEN_MAX);
|
|
assert(file[fd] != NULL);
|
|
count = fread(buf, 1, nbyte, file[fd]);
|
|
if (ferror(file[fd]))
|
|
return -1;
|
|
return count;
|
|
}
|
|
|
|
long write(int fd, const void *buf, unsigned long nbyte)
|
|
{ unsigned long count;
|
|
if (!initialized) initialize();
|
|
assert(0 <= fd && fd < FOPEN_MAX);
|
|
assert(file[fd] != NULL);
|
|
count = fwrite(buf, 1, nbyte, file[fd]);
|
|
if (count != nbyte)
|
|
return -1;
|
|
if (fflush(file[fd]) != 0)
|
|
return -1;
|
|
return count;
|
|
}
|
|
|
|
long lseek(int fd, long offset, int whence)
|
|
{ if (!initialized) initialize();
|
|
assert(0 <= fd && fd < FOPEN_MAX);
|
|
assert(file[fd] != NULL);
|
|
if (fseek(file[fd], offset, whence) != 0)
|
|
return -1;
|
|
return ftell(file[fd]);
|
|
}
|
|
|
|
int close(int fd)
|
|
{ if (!initialized) initialize();
|
|
assert(0 <= fd && fd < FOPEN_MAX);
|
|
assert(file[fd] != NULL);
|
|
fclose(file[fd]);
|
|
file[fd] = NULL;
|
|
return 0;
|
|
}
|
|
|
|
/* eof */
|