Line data Source code
1 : /*
2 : ** $Id: lzio.c,v 1.31.1.1 2007/12/27 13:02:25 roberto Exp $
3 : ** a generic input stream interface
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 1008 : int luaZ_fill (ZIO *z) {
22 : size_t size;
23 1008 : lua_State *L = z->L;
24 : const char *buff;
25 : lua_unlock(L);
26 1008 : buff = z->reader(L, z->data, &size);
27 : lua_lock(L);
28 1007 : if (buff == NULL || size == 0) return EOZ;
29 547 : z->n = size - 1;
30 547 : z->p = buff;
31 547 : return char2int(*(z->p++));
32 : }
33 :
34 :
35 876 : int luaZ_lookahead (ZIO *z) {
36 876 : if (z->n == 0) {
37 488 : if (luaZ_fill(z) == EOZ)
38 2 : return EOZ;
39 : else {
40 485 : z->n++; /* luaZ_fill removed first byte; put back it */
41 485 : z->p--;
42 : }
43 : }
44 873 : return char2int(*z->p);
45 : }
46 :
47 :
48 488 : void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader, void *data) {
49 488 : z->L = L;
50 488 : z->reader = reader;
51 488 : z->data = data;
52 488 : z->n = 0;
53 488 : z->p = NULL;
54 488 : }
55 :
56 :
57 : /* --------------------------------------------------------------- read --- */
58 392 : size_t luaZ_read (ZIO *z, void *b, size_t n) {
59 780 : while (n) {
60 : size_t m;
61 388 : if (luaZ_lookahead(z) == EOZ)
62 0 : return n; /* return number of missing bytes */
63 388 : m = (n <= z->n) ? n : z->n; /* min. between n and z->n */
64 388 : memcpy(b, z->p, m);
65 388 : z->n -= m;
66 388 : z->p += m;
67 388 : b = (char *)b + m;
68 388 : n -= m;
69 : }
70 392 : return 0;
71 : }
72 :
73 : /* ------------------------------------------------------------------------ */
74 10951 : char *luaZ_openspace (lua_State *L, Mbuffer *buff, size_t n) {
75 10951 : if (n > buff->buffsize) {
76 546 : if (n < LUA_MINBUFFER) n = LUA_MINBUFFER;
77 546 : luaZ_resizebuffer(L, buff, n);
78 : }
79 10951 : return buff->buffer;
80 : }
81 :
82 :
|