From d600a6b5b358c28d482b01f10bfa3292b17f5d12 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Tue, 16 Sep 1997 16:25:59 -0300 Subject: a generic input stream interface --- lzio.c | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 lzio.c (limited to 'lzio.c') diff --git a/lzio.c b/lzio.c new file mode 100644 index 00000000..bd714ea1 --- /dev/null +++ b/lzio.c @@ -0,0 +1,82 @@ +/* +** $Id: zio.c,v 1.2 1997/06/20 19:25:54 roberto Exp $ +** a generic input stream interface +** See Copyright Notice in lua.h +*/ + + + +#include +#include + +#include "lzio.h" + + + +/* ----------------------------------------------------- memory buffers --- */ + +static int zmfilbuf(ZIO* z) +{ + return EOZ; +} + +ZIO* zmopen(ZIO* z, char* b, int size) +{ + if (b==NULL) return NULL; + z->n=size; + z->p= (unsigned char *)b; + z->filbuf=zmfilbuf; + z->u=NULL; + return z; +} + +/* ------------------------------------------------------------ strings --- */ + +ZIO* zsopen(ZIO* z, char* s) +{ + if (s==NULL) return NULL; + return zmopen(z,s,strlen(s)); +} + +/* -------------------------------------------------------------- FILEs --- */ + +static int zffilbuf(ZIO* z) +{ + int n=fread(z->buffer,1,ZBSIZE,z->u); + if (n==0) return EOZ; + z->n=n-1; + z->p=z->buffer; + return *(z->p++); +} + + +ZIO* zFopen(ZIO* z, FILE* f) +{ + if (f==NULL) return NULL; + z->n=0; + z->p=z->buffer; + z->filbuf=zffilbuf; + z->u=f; + return z; +} + + +/* --------------------------------------------------------------- read --- */ +int zread(ZIO *z, void *b, int n) +{ + while (n) { + int m; + if (z->n == 0) { + if (z->filbuf(z) == EOZ) + return n; /* retorna quantos faltaram ler */ + zungetc(z); /* poe o resultado de filbuf no buffer */ + } + m = (n <= z->n) ? n : z->n; /* minimo de n e z->n */ + memcpy(b, z->p, m); + z->n -= m; + z->p += m; + b = (char *)b + m; + n -= m; + } + return 0; +} -- cgit v1.2.3-55-g6feb