alpar@9: /* zio.c (simulation of non-standard low-level i/o functions) */ alpar@9: alpar@9: /* Written by Andrew Makhorin , April 2011 alpar@9: * For conditions of distribution and use, see copyright notice in alpar@9: * zlib.h */ alpar@9: alpar@9: /* (reserved for copyright notice) */ alpar@9: alpar@9: #include alpar@9: #include alpar@9: #include "zio.h" alpar@9: alpar@9: static FILE *file[FOPEN_MAX]; alpar@9: static int initialized = 0; alpar@9: alpar@9: static void initialize(void) alpar@9: { int fd; alpar@9: assert(!initialized); alpar@9: file[0] = stdin; alpar@9: file[1] = stdout; alpar@9: file[2] = stderr; alpar@9: for (fd = 3; fd < FOPEN_MAX; fd++) alpar@9: file[fd] = NULL; alpar@9: initialized = 1; alpar@9: return; alpar@9: } alpar@9: alpar@9: int open(const char *path, int oflag, ...) alpar@9: { FILE *fp; alpar@9: int fd; alpar@9: if (!initialized) initialize(); alpar@9: /* see file gzlib.c, function gz_open */ alpar@9: if (oflag == O_RDONLY) alpar@9: fp = fopen(path, "rb"); alpar@9: else if (oflag == (O_WRONLY | O_CREAT | O_TRUNC)) alpar@9: fp = fopen(path, "wb"); alpar@9: else if (oflag == (O_WRONLY | O_CREAT | O_APPEND)) alpar@9: fp = fopen(path, "ab"); alpar@9: else alpar@9: assert(oflag != oflag); alpar@9: if (fp == NULL) alpar@9: return -1; alpar@9: for (fd = 0; fd < FOPEN_MAX; fd++) alpar@9: if (file[fd] == NULL) break; alpar@9: assert(fd < FOPEN_MAX); alpar@9: file[fd] = fp; alpar@9: return fd; alpar@9: } alpar@9: alpar@9: long read(int fd, void *buf, unsigned long nbyte) alpar@9: { unsigned long count; alpar@9: if (!initialized) initialize(); alpar@9: assert(0 <= fd && fd < FOPEN_MAX); alpar@9: assert(file[fd] != NULL); alpar@9: count = fread(buf, 1, nbyte, file[fd]); alpar@9: if (ferror(file[fd])) alpar@9: return -1; alpar@9: return count; alpar@9: } alpar@9: alpar@9: long write(int fd, const void *buf, unsigned long nbyte) alpar@9: { unsigned long count; alpar@9: if (!initialized) initialize(); alpar@9: assert(0 <= fd && fd < FOPEN_MAX); alpar@9: assert(file[fd] != NULL); alpar@9: count = fwrite(buf, 1, nbyte, file[fd]); alpar@9: if (count != nbyte) alpar@9: return -1; alpar@9: if (fflush(file[fd]) != 0) alpar@9: return -1; alpar@9: return count; alpar@9: } alpar@9: alpar@9: long lseek(int fd, long offset, int whence) alpar@9: { if (!initialized) initialize(); alpar@9: assert(0 <= fd && fd < FOPEN_MAX); alpar@9: assert(file[fd] != NULL); alpar@9: if (fseek(file[fd], offset, whence) != 0) alpar@9: return -1; alpar@9: return ftell(file[fd]); alpar@9: } alpar@9: alpar@9: int close(int fd) alpar@9: { if (!initialized) initialize(); alpar@9: assert(0 <= fd && fd < FOPEN_MAX); alpar@9: assert(file[fd] != NULL); alpar@9: fclose(file[fd]); alpar@9: file[fd] = NULL; alpar@9: return 0; alpar@9: } alpar@9: alpar@9: /* eof */