diff options
author | Eugene Sandulenko | 2010-10-18 17:12:00 +0000 |
---|---|---|
committer | Eugene Sandulenko | 2010-10-18 17:12:00 +0000 |
commit | 3feac393b0c951c53d96181b320dd42f5c725f35 (patch) | |
tree | 9fdf2fa312777288a76356c21e2d2098fd752d0f /engines/sword25/util/lua/lmem.cpp | |
parent | 3b21db16188899eac9914fe1c3b32b311a3aa344 (diff) | |
download | scummvm-rg350-3feac393b0c951c53d96181b320dd42f5c725f35.tar.gz scummvm-rg350-3feac393b0c951c53d96181b320dd42f5c725f35.tar.bz2 scummvm-rg350-3feac393b0c951c53d96181b320dd42f5c725f35.zip |
SWORD25: Renamed Lua .c files to .cpp and make it compilable
svn-id: r53568
Diffstat (limited to 'engines/sword25/util/lua/lmem.cpp')
-rw-r--r-- | engines/sword25/util/lua/lmem.cpp | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/engines/sword25/util/lua/lmem.cpp b/engines/sword25/util/lua/lmem.cpp new file mode 100644 index 0000000000..ccd69357e0 --- /dev/null +++ b/engines/sword25/util/lua/lmem.cpp @@ -0,0 +1,86 @@ +/* +** $Id$ +** Interface to Memory Manager +** See Copyright Notice in lua.h +*/ + + +#include <stddef.h> + +#define lmem_c +#define LUA_CORE + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" + + + +/* +** About the realloc function: +** void * frealloc (void *ud, void *ptr, size_t osize, size_t nsize); +** (`osize' is the old size, `nsize' is the new size) +** +** Lua ensures that (ptr == NULL) iff (osize == 0). +** +** * frealloc(ud, NULL, 0, x) creates a new block of size `x' +** +** * frealloc(ud, p, x, 0) frees the block `p' +** (in this specific case, frealloc must return NULL). +** particularly, frealloc(ud, NULL, 0, 0) does nothing +** (which is equivalent to free(NULL) in ANSI C) +** +** frealloc returns NULL if it cannot create or reallocate the area +** (any reallocation to an equal or smaller size cannot fail!) +*/ + + + +#define MINSIZEARRAY 4 + + +void *luaM_growaux_ (lua_State *L, void *block, int *size, size_t size_elems, + int limit, const char *errormsg) { + void *newblock; + int newsize; + if (*size >= limit/2) { /* cannot double it? */ + if (*size >= limit) /* cannot grow even a little? */ + luaG_runerror(L, errormsg); + newsize = limit; /* still have at least one free place */ + } + else { + newsize = (*size)*2; + if (newsize < MINSIZEARRAY) + newsize = MINSIZEARRAY; /* minimum size */ + } + newblock = luaM_reallocv(L, block, *size, newsize, size_elems); + *size = newsize; /* update only when everything else is OK */ + return newblock; +} + + +void *luaM_toobig (lua_State *L) { + luaG_runerror(L, "memory allocation error: block too big"); + return NULL; /* to avoid warnings */ +} + + + +/* +** generic allocation routine. +*/ +void *luaM_realloc_ (lua_State *L, void *block, size_t osize, size_t nsize) { + global_State *g = G(L); + lua_assert((osize == 0) == (block == NULL)); + block = (*g->frealloc)(g->ud, block, osize, nsize); + if (block == NULL && nsize > 0) + luaD_throw(L, LUA_ERRMEM); + lua_assert((nsize == 0) == (block == NULL)); + g->totalbytes = (g->totalbytes - osize) + nsize; + return block; +} + |