diff options
Diffstat (limited to 'lua/src/lzio.c')
-rw-r--r-- | lua/src/lzio.c | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/lua/src/lzio.c b/lua/src/lzio.c new file mode 100644 index 0000000..6f0e24d --- /dev/null +++ b/lua/src/lzio.c @@ -0,0 +1,84 @@ +/* +** $Id: lzio.c,v 1.1 2002/02/14 10:46:59 jcatki Exp $ +** a generic input stream interface +** See Copyright Notice in lua.h +*/ + + + +#include <stdio.h> +#include <string.h> + +#include "lua.h" + +#include "lzio.h" + + + +/* ----------------------------------------------------- memory buffers --- */ + +static int zmfilbuf (ZIO* z) { + (void)z; /* to avoid warnings */ + return EOZ; +} + + +ZIO* zmopen (ZIO* z, const char* b, size_t size, const char *name) { + if (b==NULL) return NULL; + z->n = size; + z->p = (const unsigned char *)b; + z->filbuf = zmfilbuf; + z->u = NULL; + z->name = name; + return z; +} + +/* ------------------------------------------------------------ strings --- */ + +ZIO* zsopen (ZIO* z, const char* s, const char *name) { + if (s==NULL) return NULL; + return zmopen(z, s, strlen(s), name); +} + +/* -------------------------------------------------------------- FILEs --- */ + +static int zffilbuf (ZIO* z) { + size_t n; + if (feof((FILE *)z->u)) return EOZ; + n = fread(z->buffer, 1, ZBSIZE, (FILE *)z->u); + if (n==0) return EOZ; + z->n = n-1; + z->p = z->buffer; + return *(z->p++); +} + + +ZIO* zFopen (ZIO* z, FILE* f, const char *name) { + if (f==NULL) return NULL; + z->n = 0; + z->p = z->buffer; + z->filbuf = zffilbuf; + z->u = f; + z->name = name; + return z; +} + + +/* --------------------------------------------------------------- read --- */ +size_t zread (ZIO *z, void *b, size_t n) { + while (n) { + size_t m; + if (z->n == 0) { + if (z->filbuf(z) == EOZ) + return n; /* return number of missing bytes */ + zungetc(z); /* put result from `filbuf' in the buffer */ + } + m = (n <= z->n) ? n : z->n; /* min. between n and z->n */ + memcpy(b, z->p, m); + z->n -= m; + z->p += m; + b = (char *)b + m; + n -= m; + } + return 0; +} |