/******************************************************************************
 * $Id: luay.h,v 1.8 2007/01/15 21:41:40 gareuselesinge Exp $
 * This file is part of FreePOPs (http://www.freepops.org)                    *
 * This file is distributed under the terms of GNU GPL license.               *
 ******************************************************************************/


/******************************************************************************/
 /*!
  * \file   luay.h
  * \brief  more handy lua_call wrapper
  * 
  * \author Name <gareuselesinge@users.sourceforge.net>
  */
/******************************************************************************/
#ifndef _LUALP_H_
#define _LUALP_H_

/*! \brief calls a lua function and returns values
 *  Calls a lua function in protected mode and returns multiple arguments.
 *  \param args is a formt string. It tells both passed arguments and 
 *  	expected arguments. The '|' is used as a separator for in/out 
 *  	parameters. Type specifyers are d for int, s for char*, p for
 *  	void*(lightuserdata), f for double, b for bool, v for lua value
 *  	(as stack position, as output the value is left as is).
 *  	An example of format string is
 *  	"spf|dp" says that the function takes a string, a userdata and a 
 *  	double(lua_Number) and return an integer(trucated lua_Number) and 
 *  	a lightuserdata. With 's' string received are strdup()ed, since
 *  	the pointer to the LUA data may become a dandling reference due to a 
 *  	garbage collector call. If you are sure the LUA string will not be 
 *  	collected you can use 'S' instead. 
 *  \param funcname the function name
 *  \param ... arguments are passed as described int the args parameter,
 *  	remember that returns values must be of type pointer-to. For 
 *  	example a function "|dfsp" must be called<BR>
 *  	<TT>
 *  	int	r1;
 *  	double	r2;
 *  	char*	r3;
 *  	void*	r4;
 *  	lualp_call(S,"|dfsp","functionname",&r1,&r2,&r3,&r4);
 *  	</TT>
 *
 */ 
int luay_call(lua_State* s,const char *args,const char *funcname,...);

/*!
 * \brief as before but the input is a char* array.
 *
 * The output is arbitrary as described in args that should omit every input.
 *
 */ 
int luay_callv(lua_State* s,const char *args,const char *funcname,
		char**argv, int len, ...);

/*! \brief pops all the stak's elements
 *
 */ 
#define luay_emptystack(s) {\
	while(lua_gettop(s) != 0)\
	lua_pop(s,1);\
	}

/*! \brief prints the stack of the luaVM
 */ 
void luay_printstack(lua_State* s);

/*! \brief prints the calling trace of the luaVM
 * Internally used as the error function for lua_pcall
 */ 
int luay_printtrace(lua_State* s);

#endif
