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