1 /*
2 ** $Id: lzio.c,v 1.1 2001/10/29 17:49:53 rr9 Exp $
3 ** a generic input stream interface
4 ** See Copyright Notice in lua.h
5 */
6 
7 
8 
9 #include <stdio.h>
10 #include <string.h>
11 
12 #include "lua.h"
13 
14 #include "lzio.h"
15 
16 
17 
18 /* ----------------------------------------------------- memory buffers --- */
19 
zmfilbuf(ZIO * z)20 static int zmfilbuf (ZIO* z) {
21   (void)z;  /* to avoid warnings */
22   return EOZ;
23 }
24 
25 
zmopen(ZIO * z,const char * b,size_t size,const char * name)26 ZIO* zmopen (ZIO* z, const char* b, size_t size, const char *name) {
27   if (b==NULL) return NULL;
28   z->n = size;
29   z->p = (const unsigned char *)b;
30   z->filbuf = zmfilbuf;
31   z->u = NULL;
32   z->name = name;
33   return z;
34 }
35 
36 /* ------------------------------------------------------------ strings --- */
37 
zsopen(ZIO * z,const char * s,const char * name)38 ZIO* zsopen (ZIO* z, const char* s, const char *name) {
39   if (s==NULL) return NULL;
40   return zmopen(z, s, strlen(s), name);
41 }
42 
43 /* -------------------------------------------------------------- FILEs --- */
44 
zffilbuf(ZIO * z)45 static int zffilbuf (ZIO* z) {
46   size_t n;
47   if (feof((FILE *)z->u)) return EOZ;
48   n = fread(z->buffer, 1, ZBSIZE, (FILE *)z->u);
49   if (n==0) return EOZ;
50   z->n = n-1;
51   z->p = z->buffer;
52   return *(z->p++);
53 }
54 
55 
zFopen(ZIO * z,FILE * f,const char * name)56 ZIO* zFopen (ZIO* z, FILE* f, const char *name) {
57   if (f==NULL) return NULL;
58   z->n = 0;
59   z->p = z->buffer;
60   z->filbuf = zffilbuf;
61   z->u = f;
62   z->name = name;
63   return z;
64 }
65 
66 
67 /* --------------------------------------------------------------- read --- */
zread(ZIO * z,void * b,size_t n)68 size_t zread (ZIO *z, void *b, size_t n) {
69   while (n) {
70     size_t m;
71     if (z->n == 0) {
72       if (z->filbuf(z) == EOZ)
73         return n;  /* return number of missing bytes */
74       zungetc(z);  /* put result from `filbuf' in the buffer */
75     }
76     m = (n <= z->n) ? n : z->n;  /* min. between n and z->n */
77     memcpy(b, z->p, m);
78     z->n -= m;
79     z->p += m;
80     b = (char *)b + m;
81     n -= m;
82   }
83   return 0;
84 }
85