int sr_kemi_exec_func(lua_State* L, str *mname, int midx, str *fname) { int pdelta; sr_kemi_t *ket = NULL; sr_lua_env_t *env_L; env_L = sr_lua_env_get(); if(env_L==NULL || env_L->msg==NULL) { LM_ERR("invalid Lua environment attributes\n"); return app_lua_return_false(L); } ket = sr_kemi_lookup(mname, midx, fname); if(ket==NULL) { LM_ERR("cannot find function (%d): %.*s.%.*s\n", midx, (mname && mname->len>0)?mname->len:0, (mname && mname->len>0)?mname->s:"", fname->len, fname->s); return app_lua_return_false(L); } if(mname->len<=0) { pdelta = 1; } else { pdelta = 3; } return sr_kemi_lua_exec_func_ex(L, ket, pdelta); }
int sr_kemi_exec_func(lua_State* L, str *mname, int midx, str *fname) { int i; int pdelta; int argc; int ret; sr_kemi_t *ket = NULL; sr_kemi_val_t vps[SR_KEMI_PARAMS_MAX]; sr_lua_env_t *env_L; env_L = sr_lua_env_get(); if(env_L==NULL || env_L->msg==NULL) { LM_ERR("invalid Lua environment attributes\n"); return app_lua_return_false(L); } ket = sr_kemi_lookup(mname, midx, fname); if(ket==NULL) { return app_lua_return_false(L); } if(mname->len<=0) { pdelta = 1; } else { pdelta = 3; } argc = lua_gettop(L); if(argc==pdelta && ket->ptypes[0]==SR_KEMIP_NONE) { ret = ((sr_kemi_fm_f)(ket->func))(env_L->msg); return sr_kemi_return(L, ket, ret); } if(argc==pdelta && ket->ptypes[0]!=SR_KEMIP_NONE) { LM_ERR("invalid number of parameters for: %.*s\n", fname->len, fname->s); return app_lua_return_false(L); } if(argc>=SR_KEMI_PARAMS_MAX+pdelta) { LM_ERR("too many parameters for: %.*s\n", fname->len, fname->s); return app_lua_return_false(L); } memset(vps, 0, SR_KEMI_PARAMS_MAX*sizeof(sr_kemi_val_t)); for(i=0; i<SR_KEMI_PARAMS_MAX; i++) { if(ket->ptypes[i]==SR_KEMIP_NONE) { break; } else if(ket->ptypes[i]==SR_KEMIP_STR) { vps[i].s.s = (char*)lua_tostring(L, i+pdelta+1); vps[i].s.len = strlen(vps[i].s.s); LM_DBG("param[%d] for: %.*s is str: %.*s\n", i, fname->len, fname->s, vps[i].s.len, vps[i].s.s); } else if(ket->ptypes[i]==SR_KEMIP_INT) { vps[i].n = lua_tointeger(L, i+pdelta+1); LM_DBG("param[%d] for: %.*s is int: %d\n", i, fname->len, fname->s, vps[i].n); } else { LM_ERR("unknown parameter type %d (%d)\n", ket->ptypes[i], i); return app_lua_return_false(L); } } switch(i) { case 1: if(ket->ptypes[0]==SR_KEMIP_INT) { ret = ((sr_kemi_fmn_f)(ket->func))(env_L->msg, vps[0].n); return sr_kemi_return(L, ket, ret); } else if(ket->ptypes[0]==SR_KEMIP_STR) { ret = ((sr_kemi_fms_f)(ket->func))(env_L->msg, &vps[0].s); return sr_kemi_return(L, ket, ret); } else { LM_ERR("invalid parameters for: %.*s\n", fname->len, fname->s); return app_lua_return_false(L); } break; case 2: if(ket->ptypes[0]==SR_KEMIP_INT) { if(ket->ptypes[1]==SR_KEMIP_INT) { ret = ((sr_kemi_fmnn_f)(ket->func))(env_L->msg, vps[0].n, vps[1].n); return sr_kemi_return(L, ket, ret); } else if(ket->ptypes[1]==SR_KEMIP_STR) { ret = ((sr_kemi_fmns_f)(ket->func))(env_L->msg, vps[0].n, &vps[1].s); return sr_kemi_return(L, ket, ret); } else { LM_ERR("invalid parameters for: %.*s\n", fname->len, fname->s); return app_lua_return_false(L); } } else if(ket->ptypes[0]==SR_KEMIP_STR) { if(ket->ptypes[1]==SR_KEMIP_INT) { ret = ((sr_kemi_fmsn_f)(ket->func))(env_L->msg, &vps[0].s, vps[1].n); return sr_kemi_return(L, ket, ret); } else if(ket->ptypes[1]==SR_KEMIP_STR) { ret = ((sr_kemi_fmss_f)(ket->func))(env_L->msg, &vps[0].s, &vps[1].s); return sr_kemi_return(L, ket, ret); } else { LM_ERR("invalid parameters for: %.*s\n", fname->len, fname->s); return app_lua_return_false(L); } } else { LM_ERR("invalid parameters for: %.*s\n", fname->len, fname->s); return app_lua_return_false(L); } break; case 3: if(ket->ptypes[0]==SR_KEMIP_INT) { if(ket->ptypes[1]==SR_KEMIP_INT) { if(ket->ptypes[2]==SR_KEMIP_INT) { ret = ((sr_kemi_fmnnn_f)(ket->func))(env_L->msg, vps[0].n, vps[1].n, vps[2].n); return sr_kemi_return(L, ket, ret); } else if(ket->ptypes[2]==SR_KEMIP_STR) { ret = ((sr_kemi_fmnns_f)(ket->func))(env_L->msg, vps[0].n, vps[1].n, &vps[2].s); return sr_kemi_return(L, ket, ret); } else { LM_ERR("invalid parameters for: %.*s\n", fname->len, fname->s); return app_lua_return_false(L); } } else if(ket->ptypes[1]==SR_KEMIP_STR) { if(ket->ptypes[2]==SR_KEMIP_INT) { ret = ((sr_kemi_fmnsn_f)(ket->func))(env_L->msg, vps[0].n, &vps[1].s, vps[2].n); return sr_kemi_return(L, ket, ret); } else if(ket->ptypes[2]==SR_KEMIP_STR) { ret = ((sr_kemi_fmnss_f)(ket->func))(env_L->msg, vps[0].n, &vps[1].s, &vps[2].s); return sr_kemi_return(L, ket, ret); } else { LM_ERR("invalid parameters for: %.*s\n", fname->len, fname->s); return app_lua_return_false(L); } } else { LM_ERR("invalid parameters for: %.*s\n", fname->len, fname->s); return app_lua_return_false(L); } } else if(ket->ptypes[0]==SR_KEMIP_STR) { if(ket->ptypes[1]==SR_KEMIP_INT) { if(ket->ptypes[2]==SR_KEMIP_INT) { ret = ((sr_kemi_fmsnn_f)(ket->func))(env_L->msg, &vps[0].s, vps[1].n, vps[2].n); return sr_kemi_return(L, ket, ret); } else if(ket->ptypes[2]==SR_KEMIP_STR) { ret = ((sr_kemi_fmsns_f)(ket->func))(env_L->msg, &vps[0].s, vps[1].n, &vps[2].s); return sr_kemi_return(L, ket, ret); } else { LM_ERR("invalid parameters for: %.*s\n", fname->len, fname->s); return app_lua_return_false(L); } } else if(ket->ptypes[1]==SR_KEMIP_STR) { if(ket->ptypes[2]==SR_KEMIP_INT) { ret = ((sr_kemi_fmssn_f)(ket->func))(env_L->msg, &vps[0].s, &vps[1].s, vps[2].n); return sr_kemi_return(L, ket, ret); } else if(ket->ptypes[2]==SR_KEMIP_STR) { ret = ((sr_kemi_fmsss_f)(ket->func))(env_L->msg, &vps[0].s, &vps[1].s, &vps[2].s); return sr_kemi_return(L, ket, ret); } else { LM_ERR("invalid parameters for: %.*s\n", fname->len, fname->s); return app_lua_return_false(L); } } else { LM_ERR("invalid parameters for: %.*s\n", fname->len, fname->s); return app_lua_return_false(L); } } else { LM_ERR("invalid parameters for: %.*s\n", fname->len, fname->s); return app_lua_return_false(L); } break; case 4: if(ket->ptypes[0]==SR_KEMIP_STR || ket->ptypes[1]==SR_KEMIP_STR || ket->ptypes[2]==SR_KEMIP_STR || ket->ptypes[3]==SR_KEMIP_STR) { ret = ((sr_kemi_fmssss_f)(ket->func))(env_L->msg, &vps[0].s, &vps[1].s, &vps[2].s, &vps[3].s); return sr_kemi_return(L, ket, ret); } else if(ket->ptypes[0]==SR_KEMIP_STR || ket->ptypes[1]==SR_KEMIP_STR || ket->ptypes[2]==SR_KEMIP_INT || ket->ptypes[3]==SR_KEMIP_INT) { ret = ((sr_kemi_fmssnn_f)(ket->func))(env_L->msg, &vps[0].s, &vps[1].s, vps[2].n, vps[3].n); return sr_kemi_return(L, ket, ret); } else { LM_ERR("invalid parameters for: %.*s\n", fname->len, fname->s); return app_lua_return_false(L); } break; case 5: if(ket->ptypes[0]==SR_KEMIP_STR || ket->ptypes[1]==SR_KEMIP_STR || ket->ptypes[2]==SR_KEMIP_STR || ket->ptypes[3]==SR_KEMIP_STR || ket->ptypes[4]==SR_KEMIP_STR) { ret = ((sr_kemi_fmsssss_f)(ket->func))(env_L->msg, &vps[0].s, &vps[1].s, &vps[2].s, &vps[3].s, &vps[4].s); return sr_kemi_return(L, ket, ret); } else { LM_ERR("invalid parameters for: %.*s\n", fname->len, fname->s); return app_lua_return_false(L); } break; case 6: if(ket->ptypes[0]==SR_KEMIP_STR || ket->ptypes[1]==SR_KEMIP_STR || ket->ptypes[2]==SR_KEMIP_STR || ket->ptypes[3]==SR_KEMIP_STR || ket->ptypes[4]==SR_KEMIP_STR || ket->ptypes[5]==SR_KEMIP_STR) { ret = ((sr_kemi_fmssssss_f)(ket->func))(env_L->msg, &vps[0].s, &vps[1].s, &vps[2].s, &vps[3].s, &vps[4].s, &vps[5].s); return sr_kemi_return(L, ket, ret); } else { LM_ERR("invalid parameters for: %.*s\n", fname->len, fname->s); return app_lua_return_false(L); } break; default: LM_ERR("invalid parameters for: %.*s\n", fname->len, fname->s); return app_lua_return_false(L); } return app_lua_return_false(L); }