فهرست منبع

app_lua: updates to use generic kemi function execution from core

Daniel-Constantin Mierla 2 سال پیش
والد
کامیت
6820b78c7e
1فایلهای تغییر یافته به همراه19 افزوده شده و 604 حذف شده
  1. 19 604
      src/modules/app_lua/app_lua_api.c

+ 19 - 604
src/modules/app_lua/app_lua_api.c

@@ -1002,8 +1002,7 @@ int sr_kemi_lua_exec_func_ex(lua_State* L, sr_kemi_t *ket, int pdelta)
 	int ret;
 	str *fname;
 	str *mname;
-	sr_kemi_val_t vps[SR_KEMI_PARAMS_MAX];
-	sr_kemi_xval_t xval;
+	sr_kemi_xval_t vps[SR_KEMI_PARAMS_MAX];
 	sr_lua_env_t *env_L;
 	sr_kemi_xval_t *xret;
 
@@ -1039,7 +1038,7 @@ int sr_kemi_lua_exec_func_ex(lua_State* L, sr_kemi_t *ket, int pdelta)
 		return app_lua_return_false(L);
 	}
 
-	memset(vps, 0, SR_KEMI_PARAMS_MAX*sizeof(sr_kemi_val_t));
+	memset(vps, 0, SR_KEMI_PARAMS_MAX*sizeof(sr_kemi_xval_t));
 	for(i=0; i<SR_KEMI_PARAMS_MAX; i++) {
 		if(ket->ptypes[i]==SR_KEMIP_NONE) {
 			break;
@@ -1050,631 +1049,47 @@ int sr_kemi_lua_exec_func_ex(lua_State* L, sr_kemi_t *ket, int pdelta)
 			return app_lua_return_false(L);
 		}
 		if(ket->ptypes[i]==SR_KEMIP_STR) {
-			vps[i].s.s = (char*)lua_tostring(L, i+pdelta+1);
-			if(vps[i].s.s!=NULL) {
+			vps[i].vtype = SR_KEMIP_STR;
+			vps[i].v.s.s = (char*)lua_tostring(L, i+pdelta+1);
+			if(vps[i].v.s.s!=NULL) {
 				if(lua_isstring(L, i+pdelta+1)) {
 #if LUA_VERSION_NUM > 501
-					vps[i].s.len = lua_rawlen(L, i+pdelta+1);
+					vps[i].v.s.len = lua_rawlen(L, i+pdelta+1);
 #else
-					vps[i].s.len = lua_strlen(L, i+pdelta+1);
+					vps[i].v.s.len = lua_strlen(L, i+pdelta+1);
 #endif
 				} else {
-					vps[i].s.len = strlen(vps[i].s.s);
+					vps[i].v.s.len = strlen(vps[i].v.s.s);
 				}
 			} else {
-				vps[i].s.len = 0;
+				vps[i].v.s.len = 0;
 			}
 			LM_DBG("param[%d] for: %.*s is str: %.*s\n", i,
-				fname->len, fname->s, vps[i].s.len, vps[i].s.s);
+				fname->len, fname->s, vps[i].v.s.len, vps[i].v.s.s);
 		} else if(ket->ptypes[i]==SR_KEMIP_INT) {
-			vps[i].n = lua_tointeger(L, i+pdelta+1);
+			vps[i].vtype = SR_KEMIP_INT;
+			vps[i].v.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);
+				fname->len, fname->s, vps[i].v.n);
 		} else if(ket->ptypes[i]==SR_KEMIP_LONG) {
-			vps[i].l = (long)lua_tonumber(L, i+pdelta+1);
+			vps[i].vtype = SR_KEMIP_LONG;
+			vps[i].v.l = (long)lua_tonumber(L, i+pdelta+1);
 			LM_DBG("param[%d] for: %.*s is long: %ld\n", i,
-				fname->len, fname->s, vps[i].l);
+				fname->len, fname->s, vps[i].v.l);
 		} 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) {
-				if(ket->rtype==SR_KEMIP_XVAL) {
-					xret = ((sr_kemi_xfmn_f)(ket->func))(env_L->msg, vps[0].n);
-					return sr_kemi_lua_return_xval(L, ket, xret);
-				} else {
-					ret = ((sr_kemi_fmn_f)(ket->func))(env_L->msg, vps[0].n);
-					return sr_kemi_lua_return_int(L, ket, ret);
-				}
-			} else if(ket->ptypes[0]==SR_KEMIP_STR) {
-				if(ket->rtype==SR_KEMIP_XVAL) {
-					xret = ((sr_kemi_xfms_f)(ket->func))(env_L->msg, &vps[0].s);
-					return sr_kemi_lua_return_xval(L, ket, xret);
-				} else {
-					ret = ((sr_kemi_fms_f)(ket->func))(env_L->msg, &vps[0].s);
-					return sr_kemi_lua_return_int(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) {
-					if(ket->rtype==SR_KEMIP_XVAL) {
-						xret = ((sr_kemi_xfmnn_f)(ket->func))(env_L->msg, vps[0].n, vps[1].n);
-						return sr_kemi_lua_return_xval(L, ket, xret);
-					} else {
-						ret = ((sr_kemi_fmnn_f)(ket->func))(env_L->msg, vps[0].n, vps[1].n);
-						return sr_kemi_lua_return_int(L, ket, ret);
-					}
-				} else if(ket->ptypes[1]==SR_KEMIP_STR) {
-					if(ket->rtype==SR_KEMIP_XVAL) {
-						xret = ((sr_kemi_xfmns_f)(ket->func))(env_L->msg, vps[0].n, &vps[1].s);
-						return sr_kemi_lua_return_xval(L, ket, xret);
-					} else {
-						ret = ((sr_kemi_fmns_f)(ket->func))(env_L->msg, vps[0].n, &vps[1].s);
-						return sr_kemi_lua_return_int(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) {
-					if(ket->rtype==SR_KEMIP_XVAL) {
-						xret = ((sr_kemi_xfmsn_f)(ket->func))(env_L->msg, &vps[0].s, vps[1].n);
-						return sr_kemi_lua_return_xval(L, ket, xret);
-					} else {
-						ret = ((sr_kemi_fmsn_f)(ket->func))(env_L->msg, &vps[0].s, vps[1].n);
-						return sr_kemi_lua_return_int(L, ket, ret);
-					}
-				} else if(ket->ptypes[1]==SR_KEMIP_STR) {
-					if(ket->rtype==SR_KEMIP_XVAL) {
-						xret = ((sr_kemi_xfmss_f)(ket->func))(env_L->msg, &vps[0].s, &vps[1].s);
-						return sr_kemi_lua_return_xval(L, ket, xret);
-					} else {
-						ret = ((sr_kemi_fmss_f)(ket->func))(env_L->msg, &vps[0].s, &vps[1].s);
-						return sr_kemi_lua_return_int(L, ket, ret);
-					}
-				} else if(ket->ptypes[1]==SR_KEMIP_LONG) {
-					xval.vtype = SR_KEMIP_LONG;
-					xval.v.l = vps[1].l;
-					if(ket->rtype==SR_KEMIP_XVAL) {
-						xret = ((sr_kemi_xfmsv_f)(ket->func))(env_L->msg, &vps[0].s, &xval);
-						return sr_kemi_lua_return_xval(L, ket, xret);
-					} else {
-						ret = ((sr_kemi_fmsv_f)(ket->func))(env_L->msg, &vps[0].s, &xval);
-						return sr_kemi_lua_return_int(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_STR
-					&& ket->ptypes[1]==SR_KEMIP_STR
-					&& ket->ptypes[2]==SR_KEMIP_STR) {
-				if(ket->rtype==SR_KEMIP_XVAL) {
-					xret = ((sr_kemi_xfmsss_f)(ket->func))(env_L->msg,
-						&vps[0].s, &vps[1].s, &vps[2].s);
-					return sr_kemi_lua_return_xval(L, ket, xret);
-				} else {
-					ret = ((sr_kemi_fmsss_f)(ket->func))(env_L->msg,
-						&vps[0].s, &vps[1].s, &vps[2].s);
-					return sr_kemi_lua_return_int(L, ket, ret);
-				}
-			} else if(ket->ptypes[0]==SR_KEMIP_STR
-					&& ket->ptypes[1]==SR_KEMIP_STR
-					&& ket->ptypes[2]==SR_KEMIP_INT) {
-				if(ket->rtype==SR_KEMIP_XVAL) {
-					xret = ((sr_kemi_xfmssn_f)(ket->func))(env_L->msg,
-						&vps[0].s, &vps[1].s, vps[2].n);
-					return sr_kemi_lua_return_xval(L, ket, xret);
-				} else {
-					ret = ((sr_kemi_fmssn_f)(ket->func))(env_L->msg,
-						&vps[0].s, &vps[1].s, vps[2].n);
-					return sr_kemi_lua_return_int(L, ket, ret);
-				}
-			} else if(ket->ptypes[0]==SR_KEMIP_STR
-					&& ket->ptypes[1]==SR_KEMIP_INT
-					&& ket->ptypes[2]==SR_KEMIP_STR) {
-				if(ket->rtype==SR_KEMIP_XVAL) {
-					xret = ((sr_kemi_xfmsns_f)(ket->func))(env_L->msg,
-						&vps[0].s, vps[1].n, &vps[2].s);
-					return sr_kemi_lua_return_xval(L, ket, xret);
-				} else {
-					ret = ((sr_kemi_fmsns_f)(ket->func))(env_L->msg,
-						&vps[0].s, vps[1].n, &vps[2].s);
-					return sr_kemi_lua_return_int(L, ket, ret);
-				}
-			} else if(ket->ptypes[0]==SR_KEMIP_STR
-					&& ket->ptypes[1]==SR_KEMIP_INT
-					&& ket->ptypes[2]==SR_KEMIP_INT) {
-				if(ket->rtype==SR_KEMIP_XVAL) {
-					xret = ((sr_kemi_xfmsnn_f)(ket->func))(env_L->msg,
-						&vps[0].s, vps[1].n, vps[2].n);
-					return sr_kemi_lua_return_xval(L, ket, xret);
-				} else {
-					ret = ((sr_kemi_fmsnn_f)(ket->func))(env_L->msg,
-						&vps[0].s, vps[1].n, vps[2].n);
-					return sr_kemi_lua_return_int(L, ket, ret);
-				}
-			} else if(ket->ptypes[0]==SR_KEMIP_INT
-					&& ket->ptypes[1]==SR_KEMIP_STR
-					&& ket->ptypes[2]==SR_KEMIP_STR) {
-				if(ket->rtype==SR_KEMIP_XVAL) {
-					xret = ((sr_kemi_xfmnss_f)(ket->func))(env_L->msg,
-						vps[0].n, &vps[1].s, &vps[2].s);
-					return sr_kemi_lua_return_xval(L, ket, xret);
-				} else {
-					ret = ((sr_kemi_fmnss_f)(ket->func))(env_L->msg,
-						vps[0].n, &vps[1].s, &vps[2].s);
-					return sr_kemi_lua_return_int(L, ket, ret);
-				}
-			} else if(ket->ptypes[0]==SR_KEMIP_INT
-					&& ket->ptypes[1]==SR_KEMIP_STR
-					&& ket->ptypes[2]==SR_KEMIP_INT) {
-				if(ket->rtype==SR_KEMIP_XVAL) {
-					xret = ((sr_kemi_xfmnsn_f)(ket->func))(env_L->msg,
-						vps[0].n, &vps[1].s, vps[2].n);
-					return sr_kemi_lua_return_xval(L, ket, xret);
-				} else {
-					ret = ((sr_kemi_fmnsn_f)(ket->func))(env_L->msg,
-						vps[0].n, &vps[1].s, vps[2].n);
-					return sr_kemi_lua_return_int(L, ket, ret);
-				}
-			} else if(ket->ptypes[0]==SR_KEMIP_INT
-					&& ket->ptypes[1]==SR_KEMIP_INT
-					&& ket->ptypes[2]==SR_KEMIP_STR) {
-				if(ket->rtype==SR_KEMIP_XVAL) {
-					xret = ((sr_kemi_xfmnns_f)(ket->func))(env_L->msg,
-						vps[0].n, vps[1].n, &vps[2].s);
-					return sr_kemi_lua_return_xval(L, ket, xret);
-				} else {
-					ret = ((sr_kemi_fmnns_f)(ket->func))(env_L->msg,
-						vps[0].n, vps[1].n, &vps[2].s);
-					return sr_kemi_lua_return_int(L, ket, ret);
-				}
-			} else if(ket->ptypes[0]==SR_KEMIP_INT
-					&& ket->ptypes[1]==SR_KEMIP_INT
-					&& ket->ptypes[2]==SR_KEMIP_INT) {
-				if(ket->rtype==SR_KEMIP_XVAL) {
-					xret = ((sr_kemi_xfmnnn_f)(ket->func))(env_L->msg,
-						vps[0].n, vps[1].n, vps[2].n);
-					return sr_kemi_lua_return_xval(L, ket, xret);
-				} else {
-					ret = ((sr_kemi_fmnnn_f)(ket->func))(env_L->msg,
-						vps[0].n, vps[1].n, vps[2].n);
-					return sr_kemi_lua_return_int(L, ket, ret);
-				}
-			} 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_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_STR
-					&& ket->ptypes[1]==SR_KEMIP_STR
-					&& ket->ptypes[2]==SR_KEMIP_STR
-					&& ket->ptypes[3]==SR_KEMIP_INT) {
-				ret = ((sr_kemi_fmsssn_f)(ket->func))(env_L->msg,
-						&vps[0].s, &vps[1].s, &vps[2].s, vps[3].n);
-				return sr_kemi_lua_return_int(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_STR) {
-				ret = ((sr_kemi_fmssns_f)(ket->func))(env_L->msg,
-						&vps[0].s, &vps[1].s, vps[2].n, &vps[3].s);
-				return sr_kemi_lua_return_int(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_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_STR
-					&& ket->ptypes[1]==SR_KEMIP_INT
-					&& ket->ptypes[2]==SR_KEMIP_STR
-					&& ket->ptypes[3]==SR_KEMIP_STR) {
-				ret = ((sr_kemi_fmsnss_f)(ket->func))(env_L->msg,
-						&vps[0].s, vps[1].n, &vps[2].s, &vps[3].s);
-				return sr_kemi_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_STR
-					&& ket->ptypes[1]==SR_KEMIP_INT
-					&& ket->ptypes[2]==SR_KEMIP_STR
-					&& ket->ptypes[3]==SR_KEMIP_INT) {
-				ret = ((sr_kemi_fmsnsn_f)(ket->func))(env_L->msg,
-						&vps[0].s, vps[1].n, &vps[2].s, vps[3].n);
-				return sr_kemi_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_STR
-					&& ket->ptypes[1]==SR_KEMIP_INT
-					&& ket->ptypes[2]==SR_KEMIP_INT
-					&& ket->ptypes[3]==SR_KEMIP_STR) {
-				ret = ((sr_kemi_fmsnns_f)(ket->func))(env_L->msg,
-						&vps[0].s, vps[1].n, vps[2].n, &vps[3].s);
-				return sr_kemi_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_STR
-					&& ket->ptypes[1]==SR_KEMIP_INT
-					&& ket->ptypes[2]==SR_KEMIP_INT
-					&& ket->ptypes[3]==SR_KEMIP_INT) {
-				ret = ((sr_kemi_fmsnnn_f)(ket->func))(env_L->msg,
-						&vps[0].s, vps[1].n, vps[2].n, vps[3].n);
-				return sr_kemi_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_INT
-					&& ket->ptypes[1]==SR_KEMIP_STR
-					&& ket->ptypes[2]==SR_KEMIP_STR
-					&& ket->ptypes[3]==SR_KEMIP_STR) {
-				ret = ((sr_kemi_fmnsss_f)(ket->func))(env_L->msg,
-						vps[0].n, &vps[1].s, &vps[2].s, &vps[3].s);
-				return sr_kemi_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_INT
-					&& ket->ptypes[1]==SR_KEMIP_STR
-					&& ket->ptypes[2]==SR_KEMIP_STR
-					&& ket->ptypes[3]==SR_KEMIP_INT) {
-				ret = ((sr_kemi_fmnssn_f)(ket->func))(env_L->msg,
-						vps[0].n, &vps[1].s, &vps[2].s, vps[3].n);
-				return sr_kemi_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_INT
-					&& ket->ptypes[1]==SR_KEMIP_STR
-					&& ket->ptypes[2]==SR_KEMIP_INT
-					&& ket->ptypes[3]==SR_KEMIP_STR) {
-				ret = ((sr_kemi_fmnsns_f)(ket->func))(env_L->msg,
-						vps[0].n, &vps[1].s, vps[2].n, &vps[3].s);
-				return sr_kemi_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_INT
-					&& ket->ptypes[1]==SR_KEMIP_STR
-					&& ket->ptypes[2]==SR_KEMIP_INT
-					&& ket->ptypes[3]==SR_KEMIP_INT) {
-				ret = ((sr_kemi_fmnsnn_f)(ket->func))(env_L->msg,
-						vps[0].n, &vps[1].s, vps[2].n, vps[3].n);
-				return sr_kemi_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_INT
-					&& ket->ptypes[1]==SR_KEMIP_INT
-					&& ket->ptypes[2]==SR_KEMIP_STR
-					&& ket->ptypes[3]==SR_KEMIP_STR) {
-				ret = ((sr_kemi_fmnnss_f)(ket->func))(env_L->msg,
-						vps[0].n, vps[1].n, &vps[2].s, &vps[3].s);
-				return sr_kemi_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_INT
-					&& ket->ptypes[1]==SR_KEMIP_INT
-					&& ket->ptypes[2]==SR_KEMIP_STR
-					&& ket->ptypes[3]==SR_KEMIP_INT) {
-				ret = ((sr_kemi_fmnnsn_f)(ket->func))(env_L->msg,
-						vps[0].n, vps[1].n, &vps[2].s, vps[3].n);
-				return sr_kemi_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_INT
-					&& ket->ptypes[1]==SR_KEMIP_INT
-					&& ket->ptypes[2]==SR_KEMIP_INT
-					&& ket->ptypes[3]==SR_KEMIP_STR) {
-				ret = ((sr_kemi_fmnnns_f)(ket->func))(env_L->msg,
-						vps[0].n, vps[1].n, vps[2].n, &vps[3].s);
-				return sr_kemi_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_INT
-					&& ket->ptypes[1]==SR_KEMIP_INT
-					&& ket->ptypes[2]==SR_KEMIP_INT
-					&& ket->ptypes[3]==SR_KEMIP_INT) {
-				ret = ((sr_kemi_fmnnnn_f)(ket->func))(env_L->msg,
-						vps[0].n, vps[1].n, vps[2].n, vps[3].n);
-				return sr_kemi_lua_return_int(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_lua_return_int(L, ket, ret);
-			} else 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_INT) {
-				ret = ((sr_kemi_fmssssn_f)(ket->func))(env_L->msg,
-						&vps[0].s, &vps[1].s, &vps[2].s, &vps[3].s, vps[4].n);
-				return sr_kemi_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_STR
-					&& ket->ptypes[1]==SR_KEMIP_STR
-					&& ket->ptypes[2]==SR_KEMIP_STR
-					&& ket->ptypes[3]==SR_KEMIP_INT
-					&& ket->ptypes[4]==SR_KEMIP_STR) {
-				ret = ((sr_kemi_fmsssns_f)(ket->func))(env_L->msg,
-						&vps[0].s, &vps[1].s, &vps[2].s, vps[3].n, &vps[4].s);
-				return sr_kemi_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_STR
-					&& ket->ptypes[1]==SR_KEMIP_STR
-					&& ket->ptypes[2]==SR_KEMIP_STR
-					&& ket->ptypes[3]==SR_KEMIP_INT
-					&& ket->ptypes[4]==SR_KEMIP_INT) {
-				ret = ((sr_kemi_fmsssnn_f)(ket->func))(env_L->msg,
-						&vps[0].s, &vps[1].s, &vps[2].s, vps[3].n, vps[4].n);
-				return sr_kemi_lua_return_int(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_STR
-					&& ket->ptypes[4]==SR_KEMIP_STR) {
-				ret = ((sr_kemi_fmssnss_f)(ket->func))(env_L->msg,
-						&vps[0].s, &vps[1].s, vps[2].n, &vps[3].s, &vps[4].s);
-				return sr_kemi_lua_return_int(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_STR
-					&& ket->ptypes[4]==SR_KEMIP_INT) {
-				ret = ((sr_kemi_fmssnsn_f)(ket->func))(env_L->msg,
-						&vps[0].s, &vps[1].s, vps[2].n, &vps[3].s, vps[4].n);
-				return sr_kemi_lua_return_int(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
-					&& ket->ptypes[4]==SR_KEMIP_STR) {
-				ret = ((sr_kemi_fmssnns_f)(ket->func))(env_L->msg,
-						&vps[0].s, &vps[1].s, vps[2].n, vps[3].n, &vps[4].s);
-				return sr_kemi_lua_return_int(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
-					&& ket->ptypes[4]==SR_KEMIP_INT) {
-				ret = ((sr_kemi_fmssnnn_f)(ket->func))(env_L->msg,
-						&vps[0].s, &vps[1].s, vps[2].n, vps[3].n, vps[4].n);
-				return sr_kemi_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_STR
-					&& ket->ptypes[1]==SR_KEMIP_INT
-					&& ket->ptypes[2]==SR_KEMIP_STR
-					&& ket->ptypes[3]==SR_KEMIP_STR
-					&& ket->ptypes[4]==SR_KEMIP_STR) {
-				ret = ((sr_kemi_fmsnsss_f)(ket->func))(env_L->msg,
-						&vps[0].s, vps[1].n, &vps[2].s, &vps[3].s, &vps[4].s);
-				return sr_kemi_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_STR
-					&& ket->ptypes[1]==SR_KEMIP_INT
-					&& ket->ptypes[2]==SR_KEMIP_STR
-					&& ket->ptypes[3]==SR_KEMIP_STR
-					&& ket->ptypes[4]==SR_KEMIP_INT) {
-				ret = ((sr_kemi_fmsnssn_f)(ket->func))(env_L->msg,
-						&vps[0].s, vps[1].n, &vps[2].s, &vps[3].s, vps[4].n);
-				return sr_kemi_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_STR
-					&& ket->ptypes[1]==SR_KEMIP_INT
-					&& ket->ptypes[2]==SR_KEMIP_STR
-					&& ket->ptypes[3]==SR_KEMIP_INT
-					&& ket->ptypes[4]==SR_KEMIP_STR) {
-				ret = ((sr_kemi_fmsnsns_f)(ket->func))(env_L->msg,
-						&vps[0].s, vps[1].n, &vps[2].s, vps[3].n, &vps[4].s);
-				return sr_kemi_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_STR
-					&& ket->ptypes[1]==SR_KEMIP_INT
-					&& ket->ptypes[2]==SR_KEMIP_STR
-					&& ket->ptypes[3]==SR_KEMIP_INT
-					&& ket->ptypes[4]==SR_KEMIP_INT) {
-				ret = ((sr_kemi_fmsnsnn_f)(ket->func))(env_L->msg,
-						&vps[0].s, vps[1].n, &vps[2].s, vps[3].n, vps[4].n);
-				return sr_kemi_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_STR
-					&& ket->ptypes[1]==SR_KEMIP_INT
-					&& ket->ptypes[2]==SR_KEMIP_INT
-					&& ket->ptypes[3]==SR_KEMIP_STR
-					&& ket->ptypes[4]==SR_KEMIP_STR) {
-				ret = ((sr_kemi_fmsnnss_f)(ket->func))(env_L->msg,
-						&vps[0].s, vps[1].n, vps[2].n, &vps[3].s, &vps[4].s);
-				return sr_kemi_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_STR
-					&& ket->ptypes[1]==SR_KEMIP_INT
-					&& ket->ptypes[2]==SR_KEMIP_INT
-					&& ket->ptypes[3]==SR_KEMIP_STR
-					&& ket->ptypes[4]==SR_KEMIP_INT) {
-				ret = ((sr_kemi_fmsnnsn_f)(ket->func))(env_L->msg,
-						&vps[0].s, vps[1].n, vps[2].n, &vps[3].s, vps[4].n);
-				return sr_kemi_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_STR
-					&& ket->ptypes[1]==SR_KEMIP_INT
-					&& ket->ptypes[2]==SR_KEMIP_INT
-					&& ket->ptypes[3]==SR_KEMIP_INT
-					&& ket->ptypes[4]==SR_KEMIP_STR) {
-				ret = ((sr_kemi_fmsnnns_f)(ket->func))(env_L->msg,
-						&vps[0].s, vps[1].n, vps[2].n, vps[3].n, &vps[4].s);
-				return sr_kemi_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_STR
-					&& ket->ptypes[1]==SR_KEMIP_INT
-					&& ket->ptypes[2]==SR_KEMIP_INT
-					&& ket->ptypes[3]==SR_KEMIP_INT
-					&& ket->ptypes[4]==SR_KEMIP_INT) {
-				ret = ((sr_kemi_fmsnnnn_f)(ket->func))(env_L->msg,
-						&vps[0].s, vps[1].n, vps[2].n, vps[3].n, vps[4].n);
-				return sr_kemi_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_INT
-					&& 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_fmnssss_f)(ket->func))(env_L->msg,
-						vps[0].n, &vps[1].s, &vps[2].s, &vps[3].s, &vps[4].s);
-				return sr_kemi_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_INT
-					&& ket->ptypes[1]==SR_KEMIP_STR
-					&& ket->ptypes[2]==SR_KEMIP_STR
-					&& ket->ptypes[3]==SR_KEMIP_STR
-					&& ket->ptypes[4]==SR_KEMIP_INT) {
-				ret = ((sr_kemi_fmnsssn_f)(ket->func))(env_L->msg,
-						vps[0].n, &vps[1].s, &vps[2].s, &vps[3].s, vps[4].n);
-				return sr_kemi_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_INT
-					&& ket->ptypes[1]==SR_KEMIP_STR
-					&& ket->ptypes[2]==SR_KEMIP_STR
-					&& ket->ptypes[3]==SR_KEMIP_INT
-					&& ket->ptypes[4]==SR_KEMIP_STR) {
-				ret = ((sr_kemi_fmnssns_f)(ket->func))(env_L->msg,
-						vps[0].n, &vps[1].s, &vps[2].s, vps[3].n, &vps[4].s);
-				return sr_kemi_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_INT
-					&& ket->ptypes[1]==SR_KEMIP_STR
-					&& ket->ptypes[2]==SR_KEMIP_STR
-					&& ket->ptypes[3]==SR_KEMIP_INT
-					&& ket->ptypes[4]==SR_KEMIP_INT) {
-				ret = ((sr_kemi_fmnssnn_f)(ket->func))(env_L->msg,
-						vps[0].n, &vps[1].s, &vps[2].s, vps[3].n, vps[4].n);
-				return sr_kemi_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_INT
-					&& ket->ptypes[1]==SR_KEMIP_STR
-					&& ket->ptypes[2]==SR_KEMIP_INT
-					&& ket->ptypes[3]==SR_KEMIP_STR
-					&& ket->ptypes[4]==SR_KEMIP_STR) {
-				ret = ((sr_kemi_fmnsnss_f)(ket->func))(env_L->msg,
-						vps[0].n, &vps[1].s, vps[2].n, &vps[3].s, &vps[4].s);
-				return sr_kemi_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_INT
-					&& ket->ptypes[1]==SR_KEMIP_STR
-					&& ket->ptypes[2]==SR_KEMIP_INT
-					&& ket->ptypes[3]==SR_KEMIP_STR
-					&& ket->ptypes[4]==SR_KEMIP_INT) {
-				ret = ((sr_kemi_fmnsnsn_f)(ket->func))(env_L->msg,
-						vps[0].n, &vps[1].s, vps[2].n, &vps[3].s, vps[4].n);
-				return sr_kemi_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_INT
-					&& ket->ptypes[1]==SR_KEMIP_STR
-					&& ket->ptypes[2]==SR_KEMIP_INT
-					&& ket->ptypes[3]==SR_KEMIP_INT
-					&& ket->ptypes[4]==SR_KEMIP_STR) {
-				ret = ((sr_kemi_fmnsnns_f)(ket->func))(env_L->msg,
-						vps[0].n, &vps[1].s, vps[2].n, vps[3].n, &vps[4].s);
-				return sr_kemi_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_INT
-					&& ket->ptypes[1]==SR_KEMIP_STR
-					&& ket->ptypes[2]==SR_KEMIP_INT
-					&& ket->ptypes[3]==SR_KEMIP_INT
-					&& ket->ptypes[4]==SR_KEMIP_INT) {
-				ret = ((sr_kemi_fmnsnnn_f)(ket->func))(env_L->msg,
-						vps[0].n, &vps[1].s, vps[2].n, vps[3].n, vps[4].n);
-				return sr_kemi_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_INT
-					&& ket->ptypes[1]==SR_KEMIP_INT
-					&& ket->ptypes[2]==SR_KEMIP_STR
-					&& ket->ptypes[3]==SR_KEMIP_STR
-					&& ket->ptypes[4]==SR_KEMIP_STR) {
-				ret = ((sr_kemi_fmnnsss_f)(ket->func))(env_L->msg,
-						vps[0].n, vps[1].n, &vps[2].s, &vps[3].s, &vps[4].s);
-				return sr_kemi_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_INT
-					&& ket->ptypes[1]==SR_KEMIP_INT
-					&& ket->ptypes[2]==SR_KEMIP_STR
-					&& ket->ptypes[3]==SR_KEMIP_STR
-					&& ket->ptypes[4]==SR_KEMIP_INT) {
-				ret = ((sr_kemi_fmnnssn_f)(ket->func))(env_L->msg,
-						vps[0].n, vps[1].n, &vps[2].s, &vps[3].s, vps[4].n);
-				return sr_kemi_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_INT
-					&& ket->ptypes[1]==SR_KEMIP_INT
-					&& ket->ptypes[2]==SR_KEMIP_STR
-					&& ket->ptypes[3]==SR_KEMIP_INT
-					&& ket->ptypes[4]==SR_KEMIP_STR) {
-				ret = ((sr_kemi_fmnnsns_f)(ket->func))(env_L->msg,
-						vps[0].n, vps[1].n, &vps[2].s, vps[3].n, &vps[4].s);
-				return sr_kemi_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_INT
-					&& ket->ptypes[1]==SR_KEMIP_INT
-					&& ket->ptypes[2]==SR_KEMIP_STR
-					&& ket->ptypes[3]==SR_KEMIP_INT
-					&& ket->ptypes[4]==SR_KEMIP_INT) {
-				ret = ((sr_kemi_fmnnsnn_f)(ket->func))(env_L->msg,
-						vps[0].n, vps[1].n, &vps[2].s, vps[3].n, vps[4].n);
-				return sr_kemi_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_INT
-					&& ket->ptypes[1]==SR_KEMIP_INT
-					&& ket->ptypes[2]==SR_KEMIP_INT
-					&& ket->ptypes[3]==SR_KEMIP_STR
-					&& ket->ptypes[4]==SR_KEMIP_STR) {
-				ret = ((sr_kemi_fmnnnss_f)(ket->func))(env_L->msg,
-						vps[0].n, vps[1].n, vps[2].n, &vps[3].s, &vps[4].s);
-				return sr_kemi_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_INT
-					&& ket->ptypes[1]==SR_KEMIP_INT
-					&& ket->ptypes[2]==SR_KEMIP_INT
-					&& ket->ptypes[3]==SR_KEMIP_STR
-					&& ket->ptypes[4]==SR_KEMIP_INT) {
-				ret = ((sr_kemi_fmnnnsn_f)(ket->func))(env_L->msg,
-						vps[0].n, vps[1].n, vps[2].n, &vps[3].s, vps[4].n);
-				return sr_kemi_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_INT
-					&& ket->ptypes[1]==SR_KEMIP_INT
-					&& ket->ptypes[2]==SR_KEMIP_INT
-					&& ket->ptypes[3]==SR_KEMIP_INT
-					&& ket->ptypes[4]==SR_KEMIP_STR) {
-				ret = ((sr_kemi_fmnnnns_f)(ket->func))(env_L->msg,
-						vps[0].n, vps[1].n, vps[2].n, vps[3].n, &vps[4].s);
-				return sr_kemi_lua_return_int(L, ket, ret);
-			} else if(ket->ptypes[0]==SR_KEMIP_INT
-					&& ket->ptypes[1]==SR_KEMIP_INT
-					&& ket->ptypes[2]==SR_KEMIP_INT
-					&& ket->ptypes[3]==SR_KEMIP_INT
-					&& ket->ptypes[4]==SR_KEMIP_INT) {
-				ret = ((sr_kemi_fmnnnnn_f)(ket->func))(env_L->msg,
-						vps[0].n, vps[1].n, vps[2].n, vps[3].n, vps[4].n);
-				return sr_kemi_lua_return_int(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_lua_return_int(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);
-	}
+	xret = sr_kemi_exec_func(ket, env_L->msg, i, vps);
+	return sr_kemi_lua_return_xval(L, ket, xret);
 }
 
 /**
  *
  */
-int sr_kemi_exec_func(lua_State* L, str *mname, int midx, str *fname)
+int sr_kemi_lua_exec_midx_func(lua_State* L, str *mname, int midx, str *fname)
 {
 	int pdelta;
 	sr_kemi_t *ket = NULL;