Imported from ../lua-5.0.3.tar.gz.
[lua.git] / src / lzio.c
blob3aeca1c5889f6e9901d9fded0e3e6e3587256c0c
1 /*
2 ** $Id: lzio.c,v 1.24 2003/03/20 16:00:56 roberto Exp $
3 ** a generic input stream interface
4 ** See Copyright Notice in lua.h
5 */
8 #include <string.h>
10 #define lzio_c
12 #include "lua.h"
14 #include "llimits.h"
15 #include "lmem.h"
16 #include "lzio.h"
19 int luaZ_fill (ZIO *z) {
20 size_t size;
21 const char *buff = z->reader(NULL, z->data, &size);
22 if (buff == NULL || size == 0) return EOZ;
23 z->n = size - 1;
24 z->p = buff;
25 return char2int(*(z->p++));
29 int luaZ_lookahead (ZIO *z) {
30 if (z->n == 0) {
31 int c = luaZ_fill(z);
32 if (c == EOZ) return c;
33 z->n++;
34 z->p--;
36 return char2int(*z->p);
40 void luaZ_init (ZIO *z, lua_Chunkreader reader, void *data, const char *name) {
41 z->reader = reader;
42 z->data = data;
43 z->name = name;
44 z->n = 0;
45 z->p = NULL;
49 /* --------------------------------------------------------------- read --- */
50 size_t luaZ_read (ZIO *z, void *b, size_t n) {
51 while (n) {
52 size_t m;
53 if (z->n == 0) {
54 if (luaZ_fill(z) == EOZ)
55 return n; /* return number of missing bytes */
56 else {
57 ++z->n; /* filbuf removed first byte; put back it */
58 --z->p;
61 m = (n <= z->n) ? n : z->n; /* min. between n and z->n */
62 memcpy(b, z->p, m);
63 z->n -= m;
64 z->p += m;
65 b = (char *)b + m;
66 n -= m;
68 return 0;
71 /* ------------------------------------------------------------------------ */
72 char *luaZ_openspace (lua_State *L, Mbuffer *buff, size_t n) {
73 if (n > buff->buffsize) {
74 if (n < LUA_MINBUFFER) n = LUA_MINBUFFER;
75 luaM_reallocvector(L, buff->buffer, buff->buffsize, n, char);
76 buff->buffsize = n;
78 return buff->buffer;