1/*
2** $Id: lzio.c $
3** Buffered streams
4** See Copyright Notice in lua.h
5*/
6
7#define lzio_c
8#define LUA_CORE
9
10#include "lprefix.h"
11
12
13#include <string.h>
14
15#include "lua.h"
16
17#include "llimits.h"
18#include "lmem.h"
19#include "lstate.h"
20#include "lzio.h"
21
22
23int luaZ_fill (ZIO *z) {
24  size_t size;
25  lua_State *L = z->L;
26  const char *buff;
27  lua_unlock(L);
28  buff = z->reader(L, z->data, &size);
29  lua_lock(L);
30  if (buff == NULL || size == 0)
31    return EOZ;
32  z->n = size - 1;  /* discount char being returned */
33  z->p = buff;
34  return cast_uchar(*(z->p++));
35}
36
37
38void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader, void *data) {
39  z->L = L;
40  z->reader = reader;
41  z->data = data;
42  z->n = 0;
43  z->p = NULL;
44}
45
46
47/* --------------------------------------------------------------- read --- */
48size_t luaZ_read (ZIO *z, void *b, size_t n) {
49  while (n) {
50    size_t m;
51    if (z->n == 0) {  /* no bytes in buffer? */
52      if (luaZ_fill(z) == EOZ)  /* try to read more */
53        return n;  /* no more input; return number of missing bytes */
54      else {
55        z->n++;  /* luaZ_fill consumed first byte; put it back */
56        z->p--;
57      }
58    }
59    m = (n <= z->n) ? n : z->n;  /* min. between n and z->n */
60    memcpy(b, z->p, m);
61    z->n -= m;
62    z->p += m;
63    b = (char *)b + m;
64    n -= m;
65  }
66  return 0;
67}
68
69