|
|
@ -3,7 +3,7 @@ |
|
|
|
** TecCGraf - PUC-Rio |
|
|
|
*/ |
|
|
|
|
|
|
|
char *rcs_fallback="$Id: fallback.c,v 2.2 1997/04/04 22:24:51 roberto Exp roberto $"; |
|
|
|
char *rcs_fallback="$Id: fallback.c,v 2.3 1997/04/06 14:08:08 roberto Exp roberto $"; |
|
|
|
|
|
|
|
#include <stdio.h> |
|
|
|
#include <string.h> |
|
|
@ -102,18 +102,9 @@ char *luaI_eventname[] = { /* ORDER IM */ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int findstring (char *name, char *list[]) |
|
|
|
{ |
|
|
|
int i; |
|
|
|
for (i=0; list[i]; i++) |
|
|
|
if (strcmp(list[i], name) == 0) |
|
|
|
return i; |
|
|
|
return -1; /* name not found */ |
|
|
|
} |
|
|
|
|
|
|
|
static int luaI_checkevent (char *name, char *list[]) |
|
|
|
{ |
|
|
|
int e = findstring(name, list); |
|
|
|
int e = luaI_findstring(name, list); |
|
|
|
if (e < 0) |
|
|
|
luaL_verror("`%s' is not a valid event name", name); |
|
|
|
return e; |
|
|
@ -197,11 +188,8 @@ void luaI_settag (int tag, TObject *o) |
|
|
|
case LUA_T_ARRAY: |
|
|
|
o->value.a->htag = tag; |
|
|
|
break; |
|
|
|
case LUA_T_USERDATA: |
|
|
|
o->value.ts->tag = tag; |
|
|
|
break; |
|
|
|
default: |
|
|
|
luaL_verror("cannot change tag of a %s", luaI_typenames[-ttype(o)]); |
|
|
|
luaL_verror("cannot change the tag of a %s", luaI_typenames[-ttype(o)]); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@ -318,45 +306,52 @@ static void fillvalids (IMS e, TObject *func) |
|
|
|
|
|
|
|
void luaI_setfallback (void) |
|
|
|
{ |
|
|
|
int e; |
|
|
|
static char *oldnames [] = {"error", "getglobal", "arith", "order", NULL}; |
|
|
|
TObject oldfunc; |
|
|
|
lua_CFunction replace; |
|
|
|
char *name = luaL_check_string(1); |
|
|
|
lua_Object func = lua_getparam(2); |
|
|
|
luaI_initfallbacks(); |
|
|
|
luaL_arg_check(lua_isfunction(func), 2, "function expected"); |
|
|
|
if (strcmp(name, "error") == 0) { /* old error fallback */ |
|
|
|
oldfunc = errorim; |
|
|
|
errorim = *luaI_Address(func); |
|
|
|
replace = errorFB; |
|
|
|
} |
|
|
|
else if (strcmp(name, "getglobal") == 0) { /* old getglobal fallback */ |
|
|
|
oldfunc = luaI_IMtable[-LUA_T_NIL].int_method[IM_GETGLOBAL]; |
|
|
|
luaI_IMtable[-LUA_T_NIL].int_method[IM_GETGLOBAL] = *luaI_Address(func); |
|
|
|
replace = nilFB; |
|
|
|
} |
|
|
|
else if ((e = findstring(name, luaI_eventname)) >= 0) { |
|
|
|
oldfunc = luaI_IMtable[-LUA_T_USERDATA].int_method[e]; |
|
|
|
fillvalids(e, luaI_Address(func)); |
|
|
|
replace = (e == IM_GC || e == IM_INDEX) ? nilFB : typeFB; |
|
|
|
} |
|
|
|
else if (strcmp(name, "arith") == 0) { /* old arith fallback */ |
|
|
|
int i; |
|
|
|
oldfunc = luaI_IMtable[-LUA_T_USERDATA].int_method[IM_POW]; |
|
|
|
for (i=IM_ADD; i<=IM_UNM; i++) /* ORDER IM */ |
|
|
|
fillvalids(i, luaI_Address(func)); |
|
|
|
replace = typeFB; |
|
|
|
} |
|
|
|
else if (strcmp(name, "order") == 0) { /* old order fallback */ |
|
|
|
int i; |
|
|
|
oldfunc = luaI_IMtable[-LUA_T_USERDATA].int_method[IM_LT]; |
|
|
|
for (i=IM_LT; i<=IM_GE; i++) /* ORDER IM */ |
|
|
|
fillvalids(i, luaI_Address(func)); |
|
|
|
replace = typeFB; |
|
|
|
} |
|
|
|
else { |
|
|
|
luaL_verror("`%s' is not a valid fallback name", name); |
|
|
|
replace = NULL; /* to avoid warnings */ |
|
|
|
switch (luaI_findstring(name, oldnames)) { |
|
|
|
case 0: /* old error fallback */ |
|
|
|
oldfunc = errorim; |
|
|
|
errorim = *luaI_Address(func); |
|
|
|
replace = errorFB; |
|
|
|
break; |
|
|
|
case 1: /* old getglobal fallback */ |
|
|
|
oldfunc = luaI_IMtable[-LUA_T_NIL].int_method[IM_GETGLOBAL]; |
|
|
|
luaI_IMtable[-LUA_T_NIL].int_method[IM_GETGLOBAL] = *luaI_Address(func); |
|
|
|
replace = nilFB; |
|
|
|
break; |
|
|
|
case 2: { /* old arith fallback */ |
|
|
|
int i; |
|
|
|
oldfunc = luaI_IMtable[-LUA_T_USERDATA].int_method[IM_POW]; |
|
|
|
for (i=IM_ADD; i<=IM_UNM; i++) /* ORDER IM */ |
|
|
|
fillvalids(i, luaI_Address(func)); |
|
|
|
replace = typeFB; |
|
|
|
break; |
|
|
|
} |
|
|
|
case 3: { /* old order fallback */ |
|
|
|
int i; |
|
|
|
oldfunc = luaI_IMtable[-LUA_T_USERDATA].int_method[IM_LT]; |
|
|
|
for (i=IM_LT; i<=IM_GE; i++) /* ORDER IM */ |
|
|
|
fillvalids(i, luaI_Address(func)); |
|
|
|
replace = typeFB; |
|
|
|
break; |
|
|
|
} |
|
|
|
default: { |
|
|
|
int e; |
|
|
|
if ((e = luaI_findstring(name, luaI_eventname)) >= 0) { |
|
|
|
oldfunc = luaI_IMtable[-LUA_T_USERDATA].int_method[e]; |
|
|
|
fillvalids(e, luaI_Address(func)); |
|
|
|
replace = (e == IM_GC || e == IM_INDEX) ? nilFB : typeFB; |
|
|
|
} |
|
|
|
else { |
|
|
|
luaL_verror("`%s' is not a valid fallback name", name); |
|
|
|
replace = NULL; /* to avoid warnings */ |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
if (oldfunc.ttype != LUA_T_NIL) |
|
|
|
luaI_pushobject(&oldfunc); |
|
|
|