Anuncios

Bienvenidos sean a este post, continuando con el post anterior hoy veremos como la API tiene una funcion para empujar por cada tipo de C que puede ser representado en Lua:

  • lua_pushnil para la constante nil
  • lua_pushnumber para numeros dobles
  • lua_pushinteger para numeros enteros
  • lua_pushboolean para booleanos (enteros en C)
  • lua_psuhlstring para cadenas arbitrarias (char * mas la longitud)
  • lua_pushstring para cadenas terminados en cero
Anuncios
void lua_pushnil	(lua_State *L);
void lua_pushboolean	(lua_State *L, int bool);
void lua_pushnumber	(lua_State *L, lua_Number n);
void lua_pushinteger	(lua_State *L, lua_Integer n);
void lua_pushlstring	(lua_State *L, const char *a, size_t len);
void lua_pushstring	(lua_State *L, const char *a);
Anuncios

Tambien hay funciones para empujar funciones de C y valores del usuario en la pila pero de esta hablaremos mas adelante.

Anuncios

El tipo lua_Number es el tipo numerico en Lua, es de tipo doble (double) de forma predeterminado pero algunas instalaciones podrian cambiarlo a un flotante (float) o incluso un entero largo (long integer), el tipo lua_Integer es un tipo entero con signo lo suficientemente grande para almacenar el tamaño de cadenas grandes, usualmente es definido como el tipo ptrdiff_type.

Anuncios

Las cadenas en Lua no son terminadas en cero ademas ellas pueden contener datos binarios arbitrarios y en consecuencia deben confiar en un longitud explicita, la funcion basica para empujar una cadena en la pila es lua_pushlstring, la cual requiere una longitud explicita como argumento, para cadenas terminadas en cero puedes usar tambien lua_pushstring, el cual usa a strlen para proveer la longitud de la cadena, Lua nunca mantiene apuntadores para cadenas externas (o cualquier otro objeto externo con la excepcion de funciones de C las cuales son estaticas), para cualquier cadena que deba mantener Lua hace una copia interna o la reutiliza, por lo tanto puedes liberar o modificar tu buffer tan pronto como estas funciones retornan.

Anuncios

Cada vez que empujas un elemento en la pila es tu responsabilidad asegurarte que haya espacio en la misma, recuerden que ahora somos un programador de C y Lua no te malcriara, cuando Lua comienza cada vez que llama a C, la pila tiene al menos 20 slots libres (esta constante es definida en LUA_MINSTACK en lua.h), este espacio deberia ser mas que suficiente para usos comunes, asi que habitualmente no lo pensamos, sin embargo algunas tareas podria necesitar mas espacio de pila, por ejemplo la llamada a una funcion con muchos argumentos, en tales casos es preferible llamar primero a lua_checkstack (el cual chequea si la pila tiene suficiente espacio para tus necesidades):

int lua_checkstack(lua_State *L, int sz);
Anuncios
Nota: En C y C++, las cadenas para que sean identificadas como tales deben finalizar con un cero de lo contrario el lenguaje no sabe como interpretarlo.
Anuncios

En resumen, hoy hemos visto como empujar elementos de la pila, las funciones que transfieren datos a la pila, hemos visto como trabajar con la pila en C y en LUA, como se podria configurar y como obtener este dato, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00