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