1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
/* tolua: error handling
** Support code for Lua bindings.
** Written by Waldemar Celes
** TeCGraf/PUC-Rio
** Jul 1998
** $Id: tolua_eh.c,v 1.2 2001/11/26 23:00:27 darkgod Exp $
*/
/* This code is free software; you can redistribute it and/or modify it.
** The software provided hereunder is on an "as is" basis, and
** the author has no obligation to provide maintenance, support, updates,
** enhancements, or modifications.
*/
#include "tolua.h"
#include "tolua_eh.h"
#include "tolua_rg.h"
#include <stdio.h>
/* registry fiels used to hold current error info
- tolua_err_narg: number of wrong argument
- tolua_err_provided: provided type
- tolua_err_expected: expected type
*/
void toluaI_eh_set
(lua_State* L, int narg, const char* provided, const char* expected)
{
lua_pushnumber(L,narg);
toluaI_setregistry(L,"tolua_err_narg");
lua_pushstring(L,provided);
toluaI_setregistry(L,"tolua_err_provided");
lua_pushstring(L,expected);
toluaI_setregistry(L,"tolua_err_expected");
}
void tolua_error (lua_State* L, char* msg)
{
if (msg[0]=='#')
{
static char buffer[BUFSIZ];
const char* err_provided;
const char* err_expected;
toluaI_getregistry(L,"tolua_err_provided");
err_provided = lua_tostring(L,-1);
toluaI_getregistry(L,"tolua_err_expected");
err_expected = lua_tostring(L,-1);
lua_pop(L,2);
if (msg[1]=='f')
{
int err_narg;
toluaI_getregistry(L,"tolua_err_narg");
err_narg = (int)lua_tonumber(L,-1);
lua_pop(L,1);
sprintf(buffer,"%s\n argument #%d is '%s'; '%s' expected.\n",
msg+2,err_narg,err_provided,err_expected);
}
else if (msg[1]=='v')
sprintf(buffer,"%s\n value is '%s'; '%s' expected.\n",
msg+2,err_provided,err_expected);
lua_error(L,buffer);
}
else
lua_error(L,msg);
}
|