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