gateway: simplify stopping the cleanup timer
[olsrd.git] / lib / tas / src / lua / lzio.c
1
2 /*
3 ** $Id: lzio.c,v 1.24 2003/03/20 16:00:56 roberto Exp $
4 ** a generic input stream interface
5 ** See Copyright Notice in lua.h
6 */
7
8
9 #include <string.h>
10
11 #define lzio_c
12
13 #include "lua.h"
14
15 #include "llimits.h"
16 #include "lmem.h"
17 #include "lzio.h"
18
19
20 int
21 luaZ_fill(ZIO * z)
22 {
23   size_t size;
24   const char *buff = z->reader(NULL, z->data, &size);
25   if (buff == NULL || size == 0)
26     return EOZ;
27   z->n = size - 1;
28   z->p = buff;
29   return char2int(*(z->p++));
30 }
31
32
33 int
34 luaZ_lookahead(ZIO * z)
35 {
36   if (z->n == 0) {
37     int c = luaZ_fill(z);
38     if (c == EOZ)
39       return c;
40     z->n++;
41     z->p--;
42   }
43   return char2int(*z->p);
44 }
45
46
47 void
48 luaZ_init(ZIO * z, lua_Chunkreader reader, void *data, const char *name)
49 {
50   z->reader = reader;
51   z->data = data;
52   z->name = name;
53   z->n = 0;
54   z->p = NULL;
55 }
56
57
58 /* --------------------------------------------------------------- read --- */
59 size_t
60 luaZ_read(ZIO * z, void *b, size_t n)
61 {
62   while (n) {
63     size_t m;
64     if (z->n == 0) {
65       if (luaZ_fill(z) == EOZ)
66         return n;               /* return number of missing bytes */
67       else {
68         ++z->n;                 /* filbuf removed first byte; put back it */
69         --z->p;
70       }
71     }
72     m = (n <= z->n) ? n : z->n; /* min. between n and z->n */
73     memcpy(b, z->p, m);
74     z->n -= m;
75     z->p += m;
76     b = (char *)b + m;
77     n -= m;
78   }
79   return 0;
80 }
81
82 /* ------------------------------------------------------------------------ */
83 char *
84 luaZ_openspace(lua_State * L, Mbuffer * buff, size_t n)
85 {
86   if (n > buff->buffsize) {
87     if (n < LUA_MINBUFFER)
88       n = LUA_MINBUFFER;
89     luaM_reallocvector(L, buff->buffer, buff->buffsize, n, char);
90     buff->buffsize = n;
91   }
92   return buff->buffer;
93 }