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 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ lzio.h | 49 +++++++++++++++++++++++++++++++++++++++ zio.c | 79 --------------------------------------------------------------- zio.h | 48 --------------------------------------- 4 files changed, 131 insertions(+), 127 deletions(-) create mode 100644 lzio.c create mode 100644 lzio.h delete mode 100644 zio.c delete mode 100644 zio.h 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; +} diff --git a/lzio.h b/lzio.h new file mode 100644 index 00000000..31ce948e --- /dev/null +++ b/lzio.h @@ -0,0 +1,49 @@ +/* +** $Id: $ +** Buffered streams +** See Copyright Notice in lua.h +*/ + + +#ifndef lzio_h +#define lzio_h + +#include + + + +/* For Lua only */ +#define zFopen luaZ_Fopen +#define zsopen luaZ_sopen +#define zmopen luaZ_mopen +#define zread luaZ_read + +#define EOZ (-1) /* end of stream */ + +typedef struct zio ZIO; + +ZIO* zFopen(ZIO* z, FILE* f); /* open FILEs */ +ZIO* zsopen(ZIO* z, char* s); /* string */ +ZIO* zmopen(ZIO* z, char* b, int size); /* memory */ + +int zread(ZIO* z, void* b, int n); /* read next n bytes */ + +#define zgetc(z) (--(z)->n>=0 ? ((int)*(z)->p++): (z)->filbuf(z)) +#define zungetc(z) (++(z)->n,--(z)->p) + + + +/* --------- Private Part ------------------ */ + +#define ZBSIZE 256 /* buffer size */ + +struct zio { + int n; /* bytes still unread */ + unsigned char* p; /* current position in buffer */ + int (*filbuf)(ZIO* z); + void* u; /* additional data */ + unsigned char buffer[ZBSIZE]; /* buffer */ +}; + + +#endif diff --git a/zio.c b/zio.c deleted file mode 100644 index c0b25daa..00000000 --- a/zio.c +++ /dev/null @@ -1,79 +0,0 @@ -/* -* zio.c -* a generic input stream interface -* $Id: zio.c,v 1.1 1997/06/16 16:50:22 roberto Exp roberto $ -*/ - -#include -#include -#include -#include "zio.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; -} diff --git a/zio.h b/zio.h deleted file mode 100644 index c688df55..00000000 --- a/zio.h +++ /dev/null @@ -1,48 +0,0 @@ -/* -* zio.h -* a generic input stream interface -* $Id: zio.h,v 1.4 1997/06/19 18:55:28 roberto Exp roberto $ -*/ - -#ifndef zio_h -#define zio_h - -#include - - - -/* For Lua only */ -#define zFopen luaZ_Fopen -#define zsopen luaZ_sopen -#define zmopen luaZ_mopen -#define zread luaZ_read - -#define EOZ (-1) /* end of stream */ - -typedef struct zio ZIO; - -ZIO* zFopen(ZIO* z, FILE* f); /* open FILEs */ -ZIO* zsopen(ZIO* z, char* s); /* string */ -ZIO* zmopen(ZIO* z, char* b, int size); /* memory */ - -int zread(ZIO* z, void* b, int n); /* read next n bytes */ - -#define zgetc(z) (--(z)->n>=0 ? ((int)*(z)->p++): (z)->filbuf(z)) -#define zungetc(z) (++(z)->n,--(z)->p) - - - -/* --------- Private Part ------------------ */ - -#define ZBSIZE 256 /* buffer size */ - -struct zio { - int n; /* bytes still unread */ - unsigned char* p; /* current position in buffer */ - int (*filbuf)(ZIO* z); - void* u; /* additional data */ - unsigned char buffer[ZBSIZE]; /* buffer */ -}; - - -#endif -- cgit v1.2.3-55-g6feb