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