1 /* $NetBSD: lzio.c,v 1.2 2014/07/19 18:38:34 lneto Exp $ */ 2 3 /* 4 ** $Id: lzio.c,v 1.2 2014/07/19 18:38:34 lneto Exp $ 5 ** Buffered streams 6 ** See Copyright Notice in lua.h 7 */ 8 9 10 #ifndef _KERNEL 11 #include <string.h> 12 #endif 13 14 #define lzio_c 15 #define LUA_CORE 16 17 #include "lua.h" 18 19 #include "llimits.h" 20 #include "lmem.h" 21 #include "lstate.h" 22 #include "lzio.h" 23 24 25 int luaZ_fill (ZIO *z) { 26 size_t size; 27 lua_State *L = z->L; 28 const char *buff; 29 lua_unlock(L); 30 buff = z->reader(L, z->data, &size); 31 lua_lock(L); 32 if (buff == NULL || size == 0) 33 return EOZ; 34 z->n = size - 1; /* discount char being returned */ 35 z->p = buff; 36 return cast_uchar(*(z->p++)); 37 } 38 39 40 void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader, void *data) { 41 z->L = L; 42 z->reader = reader; 43 z->data = data; 44 z->n = 0; 45 z->p = NULL; 46 } 47 48 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) { /* no bytes in buffer? */ 54 if (luaZ_fill(z) == EOZ) /* try to read more */ 55 return n; /* no more input; return number of missing bytes */ 56 else { 57 z->n++; /* luaZ_fill consumed first byte; put it back */ 58 z->p--; 59 } 60 } 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; 67 } 68 return 0; 69 } 70 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 luaZ_resizebuffer(L, buff, n); 76 } 77 return buff->buffer; 78 } 79 80 81