60b41f971eb16f4fb7410eeb591cd8246fa2f801
[olsrd.git] / lib / tas / src / lua / lmem.c
1
2 /*
3 ** $Id: lmem.c,v 1.61 2002/12/04 17:38:31 roberto Exp $
4 ** Interface to Memory Manager
5 ** See Copyright Notice in lua.h
6 */
7
8
9 #include <stdlib.h>
10
11 #define lmem_c
12
13 #include "lua.h"
14
15 #include "ldebug.h"
16 #include "ldo.h"
17 #include "lmem.h"
18 #include "lobject.h"
19 #include "lstate.h"
20
21
22
23 /*
24 ** definition for realloc function. It must assure that l_realloc(NULL,
25 ** 0, x) allocates a new block (ANSI C assures that). (`os' is the old
26 ** block size; some allocators may use that.)
27 */
28 #ifndef l_realloc
29 #define l_realloc(b,os,s)       realloc(b,s)
30 #endif
31
32 /*
33 ** definition for free function. (`os' is the old block size; some
34 ** allocators may use that.)
35 */
36 #ifndef l_free
37 #define l_free(b,os)    free(b)
38 #endif
39
40
41 #define MINSIZEARRAY    4
42
43
44 void *
45 luaM_growaux(lua_State * L, void *block, int *size, int size_elems, int limit, const char *errormsg)
46 {
47   void *newblock;
48   int newsize = (*size) * 2;
49   if (newsize < MINSIZEARRAY)
50     newsize = MINSIZEARRAY;     /* minimum size */
51   else if (*size >= limit / 2) {        /* cannot double it? */
52     if (*size < limit - MINSIZEARRAY)   /* try something smaller... */
53       newsize = limit;          /* still have at least MINSIZEARRAY free places */
54     else
55       luaG_runerror(L, errormsg);
56   }
57   newblock = luaM_realloc(L, block,
58                           cast(lu_mem, *size) * cast(lu_mem, size_elems), cast(lu_mem, newsize) * cast(lu_mem, size_elems));
59   *size = newsize;              /* update only when everything else is OK */
60   return newblock;
61 }
62
63
64 /*
65 ** generic allocation routine.
66 */
67 void *
68 luaM_realloc(lua_State * L, void *block, lu_mem oldsize, lu_mem size)
69 {
70   lua_assert((oldsize == 0) == (block == NULL));
71   if (size == 0) {
72     if (block != NULL) {
73       l_free(block, oldsize);
74       block = NULL;
75     } else
76       return NULL;              /* avoid `nblocks' computations when oldsize==size==0 */
77   } else if (size >= MAX_SIZET)
78     luaG_runerror(L, "memory allocation error: block too big");
79   else {
80     block = l_realloc(block, oldsize, size);
81     if (block == NULL) {
82       if (L)
83         luaD_throw(L, LUA_ERRMEM);
84       else
85         return NULL;            /* error before creating state! */
86     }
87   }
88   if (L) {
89     lua_assert(G(L) != NULL && G(L)->nblocks > 0);
90     G(L)->nblocks -= oldsize;
91     G(L)->nblocks += size;
92   }
93   return block;
94 }