1323530Savg/*
2323530Savg** $Id: lzio.c,v 1.35.1.1 2013/04/12 18:48:47 roberto Exp $
3323530Savg** Buffered streams
4323530Savg** See Copyright Notice in lua.h
5323530Savg*/
6323530Savg
7323530Savg
8323530Savg#include <sys/zfs_context.h>
9323530Savg
10323530Savg#define lzio_c
11323530Savg#define LUA_CORE
12323530Savg
13323530Savg#include "lua.h"
14323530Savg
15323530Savg#include "llimits.h"
16323530Savg#include "lmem.h"
17323530Savg#include "lstate.h"
18323530Savg#include "lzio.h"
19323530Savg
20323530Savg
21323530Savgint luaZ_fill (ZIO *z) {
22323530Savg  size_t size;
23323530Savg  lua_State *L = z->L;
24323530Savg  const char *buff;
25323530Savg  lua_unlock(L);
26323530Savg  buff = z->reader(L, z->data, &size);
27323530Savg  lua_lock(L);
28323530Savg  if (buff == NULL || size == 0)
29323530Savg    return EOZ;
30323530Savg  z->n = size - 1;  /* discount char being returned */
31323530Savg  z->p = buff;
32323530Savg  return cast_uchar(*(z->p++));
33323530Savg}
34323530Savg
35323530Savg
36323530Savgvoid luaZ_init (lua_State *L, ZIO *z, lua_Reader reader, void *data) {
37323530Savg  z->L = L;
38323530Savg  z->reader = reader;
39323530Savg  z->data = data;
40323530Savg  z->n = 0;
41323530Savg  z->p = NULL;
42323530Savg}
43323530Savg
44323530Savg
45323530Savg/* --------------------------------------------------------------- read --- */
46323530Savgsize_t luaZ_read (ZIO *z, void *b, size_t n) {
47323530Savg  while (n) {
48323530Savg    size_t m;
49323530Savg    if (z->n == 0) {  /* no bytes in buffer? */
50323530Savg      if (luaZ_fill(z) == EOZ)  /* try to read more */
51323530Savg        return n;  /* no more input; return number of missing bytes */
52323530Savg      else {
53323530Savg        z->n++;  /* luaZ_fill consumed first byte; put it back */
54323530Savg        z->p--;
55323530Savg      }
56323530Savg    }
57323530Savg    m = (n <= z->n) ? n : z->n;  /* min. between n and z->n */
58323530Savg    memcpy(b, z->p, m);
59323530Savg    z->n -= m;
60323530Savg    z->p += m;
61323530Savg    b = (char *)b + m;
62323530Savg    n -= m;
63323530Savg  }
64323530Savg  return 0;
65323530Savg}
66323530Savg
67323530Savg/* ------------------------------------------------------------------------ */
68323530Savgchar *luaZ_openspace (lua_State *L, Mbuffer *buff, size_t n) {
69323530Savg  if (n > buff->buffsize) {
70323530Savg    if (n < LUA_MINBUFFER) n = LUA_MINBUFFER;
71323530Savg    luaZ_resizebuffer(L, buff, n);
72323530Savg  }
73323530Savg  return buff->buffer;
74323530Savg}
75323530Savg
76323530Savg
77