misc/tools/kemi/kemi-code-gen.py
10414705
 # Python 3 helper program for KEMI
 # - print IF conditions with param types for KEMI interpreters
 # - print typedefs for functions
 
 PRINTPARAMS=4
 # - print mode: typedefs, js, lua, python, pythonparams, ruby, sqlang
 PRINTMODE="sqlang"
 # - two tabs for python params, three for the other cases
 # PRINTTABS="\t\t"
 PRINTTABS="\t\t\t"
 PRINTELSE=""
 
 def printCodeFuncTypedefs(prefix):
 	sfunc = "typedef int (*sr_kemi_fm" + prefix + "_f)(sip_msg_t*"
 	", str*, str*, str*, str*, str*);"
 	for i, c in enumerate(prefix):
 		if c == 's':
 			sfunc += ", str*"
 		else:
 			sfunc += ", int"
 	sfunc += ");"
 	print(sfunc)
 
 
 def printCodeIfEnd(sretfunc):
 	print(PRINTTABS + "} else {")
 	print(PRINTTABS + "\tLM_ERR(\"invalid parameters for: %.*s\\n\", fname->len, fname->s);")
 	print(PRINTTABS + "\treturn " + sretfunc + ";")
 	print(PRINTTABS + "}")
 
 
 def printCodeIfJS(prefix):
 	global PRINTELSE
 	sfunc = PRINTTABS + "\tret = ((sr_kemi_fm" + prefix + "_f)(ket->func))(env_J->msg,\n" + PRINTTABS + "\t\t\t"
 	for i, c in enumerate(prefix):
 		if i==0:
 			if c == 's':
 				print(PRINTTABS + PRINTELSE + "if(ket->ptypes[0]==SR_KEMIP_STR")
 				sfunc += "&vps[" + str(i) +"].s, "
 			else:
 				print(PRINTTABS + PRINTELSE + "if(ket->ptypes[0]==SR_KEMIP_INT")
 				sfunc += "vps[" + str(i) +"].n, "
 			PRINTELSE = "} else "
 		elif i==PRINTPARAMS-1:
 			if c == 's':
 				print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_STR) {")
 				sfunc += "&vps[" + str(i) +"].s);"
 			else:
 				print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_INT) {")
 				sfunc += "vps[" + str(i) +"].n);"
 		else:
 			if c == 's':
 				print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_STR")
 				sfunc += "&vps[" + str(i) +"].s, "
 			else:
 				print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_INT")
 				sfunc += "vps[" + str(i) +"].n, "
 
 	print(sfunc)
 	print(PRINTTABS + "\treturn sr_kemi_jsdt_return_int(J, ket, ret);")
 
 
 def printCodeIfLua(prefix):
 	global PRINTELSE
 	sfunc = PRINTTABS + "\tret = ((sr_kemi_fm" + prefix + "_f)(ket->func))(env_L->msg,\n" + PRINTTABS + "\t\t\t"
 	for i, c in enumerate(prefix):
 		if i==0:
 			if c == 's':
 				print(PRINTTABS + PRINTELSE + "if(ket->ptypes[0]==SR_KEMIP_STR")
 				sfunc += "&vps[" + str(i) +"].s, "
 			else:
 				print(PRINTTABS + PRINTELSE + "if(ket->ptypes[0]==SR_KEMIP_INT")
 				sfunc += "vps[" + str(i) +"].n, "
 			PRINTELSE = "} else "
 		elif i==PRINTPARAMS-1:
 			if c == 's':
 				print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_STR) {")
 				sfunc += "&vps[" + str(i) +"].s);"
 			else:
 				print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_INT) {")
 				sfunc += "vps[" + str(i) +"].n);"
 		else:
 			if c == 's':
 				print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_STR")
 				sfunc += "&vps[" + str(i) +"].s, "
 			else:
 				print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_INT")
 				sfunc += "vps[" + str(i) +"].n, "
 
 	print(sfunc)
 	print(PRINTTABS + "\treturn sr_kemi_lua_return_int(L, ket, ret);")
 
 
 def printCodeIfPython(prefix):
 	global PRINTELSE
 	sfunc = PRINTTABS + "\tret = ((sr_kemi_fm" + prefix + "_f)(ket->func))(lmsg,\n" + PRINTTABS + "\t\t\t"
 	for i, c in enumerate(prefix):
 		if i==0:
 			if c == 's':
 				print(PRINTTABS + PRINTELSE + "if(ket->ptypes[0]==SR_KEMIP_STR")
 				sfunc += "&vps[" + str(i) +"].s, "
 			else:
 				print(PRINTTABS + PRINTELSE + "if(ket->ptypes[0]==SR_KEMIP_INT")
 				sfunc += "vps[" + str(i) +"].n, "
 			PRINTELSE = "} else "
 		elif i==PRINTPARAMS-1:
 			if c == 's':
 				print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_STR) {")
 				sfunc += "&vps[" + str(i) +"].s);"
 			else:
 				print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_INT) {")
 				sfunc += "vps[" + str(i) +"].n);"
 		else:
 			if c == 's':
 				print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_STR")
 				sfunc += "&vps[" + str(i) +"].s, "
 			else:
 				print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_INT")
 				sfunc += "vps[" + str(i) +"].n, "
 
 	print(sfunc)
 	print(PRINTTABS + "\treturn sr_kemi_apy_return_int(ket, ret);")
 
 
 def printCodeIfPythonParams(prefix):
 	global PRINTELSE
 	sfunc = PRINTTABS + "\tif(!PyArg_ParseTuple(args, \"" + prefix + ":kemi-param-" + prefix + "\",\n" + PRINTTABS + "\t\t\t"
 	slen = ""
 	sdbg = PRINTTABS + "\tLM_DBG(\"params[%d] for: %.*s are:"
 	sval = ""
 	for i, c in enumerate(prefix):
 		if i==0:
 			if c == 's':
 				print(PRINTTABS + PRINTELSE + "if(ket->ptypes[0]==SR_KEMIP_STR")
 				sfunc += "&vps[" + str(i) +"].s.s, "
 				slen += PRINTTABS + "\tvps[" + str(i) + "].s.len = strlen(vps[" + str(i) + "].s.s);\n"
 				sdbg += " [%s]"
 				sval += "vps[" + str(i) + "].s.s, "
 			else:
 				print(PRINTTABS + PRINTELSE + "if(ket->ptypes[0]==SR_KEMIP_INT")
 				sfunc += "&vps[" + str(i) +"].n, "
 				sdbg += " [%d]"
 				sval += "vps[" + str(i) + "].n, "
 			PRINTELSE = "} else "
 		elif i==PRINTPARAMS-1:
 			if c == 's':
 				print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_STR) {")
 				sfunc += "&vps[" + str(i) +"].s.s)) {"
 				slen += PRINTTABS + "\tvps[" + str(i) + "].s.len = strlen(vps[" + str(i) + "].s.s);\n"
 				sdbg += " [%s]"
 				sval += "vps[" + str(i) + "].s.s"
 			else:
 				print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_INT) {")
 				sfunc += "&vps[" + str(i) +"].n)) {"
 				sdbg += " [%d]"
 				sval += "vps[" + str(i) + "].n"
 		else:
 			if c == 's':
 				print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_STR")
 				sfunc += "&vps[" + str(i) +"].s.s, "
 				slen += PRINTTABS + "\tvps[" + str(i) + "].s.len = strlen(vps[" + str(i) + "].s.s);\n"
 				sdbg += " [%s]"
 				sval += "vps[" + str(i) + "].s.s, "
 			else:
 				print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_INT")
 				sfunc += "&vps[" + str(i) +"].n, "
 				sdbg += " [%d]"
 				sval += "vps[" + str(i) + "].n, "
 	print(sfunc)
 	print(PRINTTABS + "\t\tLM_ERR(\"unable to retrieve " + prefix + " params %d\\n\", i);")
 	print(PRINTTABS + "\t\treturn sr_kemi_apy_return_false();")
 	print(PRINTTABS + "\t}")
 	print(slen)
 	print(sdbg + "\\n\",\n" + PRINTTABS + "\t\t\t" + "i, fname.len, fname.s,")
 	print(PRINTTABS + "\t\t\t" + sval + ");")
 
 
 def printCodeIfRuby(prefix):
 	global PRINTELSE
 	sfunc = PRINTTABS + "\tret = ((sr_kemi_fm" + prefix + "_f)(ket->func))(env_R->msg,\n" + PRINTTABS + "\t\t\t"
 	for i, c in enumerate(prefix):
 		if i==0:
 			if c == 's':
 				print(PRINTTABS + PRINTELSE + "if(ket->ptypes[0]==SR_KEMIP_STR")
 				sfunc += "&vps[" + str(i) +"].s, "
 			else:
 				print(PRINTTABS + PRINTELSE + "if(ket->ptypes[0]==SR_KEMIP_INT")
 				sfunc += "vps[" + str(i) +"].n, "
 			PRINTELSE = "} else "
 		elif i==PRINTPARAMS-1:
 			if c == 's':
 				print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_STR) {")
 				sfunc += "&vps[" + str(i) +"].s);"
 			else:
 				print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_INT) {")
 				sfunc += "vps[" + str(i) +"].n);"
 		else:
 			if c == 's':
 				print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_STR")
 				sfunc += "&vps[" + str(i) +"].s, "
 			else:
 				print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_INT")
 				sfunc += "vps[" + str(i) +"].n, "
 
 	print(sfunc)
 	print(PRINTTABS + "\treturn sr_kemi_ruby_return_int(ket, ret);")
 
 
 def printCodeIfSQLang(prefix):
 	global PRINTELSE
 	sfunc = PRINTTABS + "\tret = ((sr_kemi_fm" + prefix + "_f)(ket->func))(env_J->msg,\n" + PRINTTABS + "\t\t\t"
 	for i, c in enumerate(prefix):
 		if i==0:
 			if c == 's':
 				print(PRINTTABS + PRINTELSE + "if(ket->ptypes[0]==SR_KEMIP_STR")
 				sfunc += "&vps[" + str(i) +"].s, "
 			else:
 				print(PRINTTABS + PRINTELSE + "if(ket->ptypes[0]==SR_KEMIP_INT")
 				sfunc += "vps[" + str(i) +"].n, "
 			PRINTELSE = "} else "
 		elif i==PRINTPARAMS-1:
 			if c == 's':
 				print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_STR) {")
 				sfunc += "&vps[" + str(i) +"].s);"
 			else:
 				print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_INT) {")
 				sfunc += "vps[" + str(i) +"].n);"
 		else:
 			if c == 's':
 				print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_STR")
 				sfunc += "&vps[" + str(i) +"].s, "
 			else:
 				print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_INT")
 				sfunc += "vps[" + str(i) +"].n, "
 
 	print(sfunc)
 	print(PRINTTABS + "\treturn sr_kemi_sqlang_return_int(J, ket, ret);")
 
 
 # generated possible strings of length k with chars from set.
 def printAllKLength(cset, k):
 
 	n = len(cset)
 	printAllKLengthRec(cset, "", n, k)
 
 
 def printAllKLengthRec(cset, prefix, n, k):
 
 	if (k == 0) :
 		# print(prefix)
 		if PRINTMODE == "js":
 			printCodeIfJS(prefix)
 		elif PRINTMODE == "lua":
 			printCodeIfLua(prefix)
 		elif PRINTMODE == "python":
 			printCodeIfPython(prefix)
 		elif PRINTMODE == "pythonparams":
 			printCodeIfPythonParams(prefix)
 		elif PRINTMODE == "ruby":
 			printCodeIfRuby(prefix)
 		elif PRINTMODE == "sqlang":
 			printCodeIfSQLang(prefix)
 		else:
 			printCodeFuncTypedefs(prefix)
 		return
 
 	for i in range(n):
 		newPrefix = prefix + cset[i]
 		printAllKLengthRec(cset, newPrefix, n, k - 1)
 
 
 # main statements
 if __name__ == "__main__":
 
 	charset = ['s', 'n']
 	k = PRINTPARAMS
 	printAllKLength(charset, k)
 	if PRINTMODE == "js":
 		printCodeIfEnd("app_jsdt_return_false(J)")
 	elif PRINTMODE == "lua":
 		printCodeIfEnd("app_lua_return_false(L)")
 	elif PRINTMODE == "python":
 		printCodeIfEnd("sr_kemi_apy_return_false()")
 	elif PRINTMODE == "pythonparams":
 		printCodeIfEnd("sr_kemi_apy_return_false()")
 	elif PRINTMODE == "ruby":
 		printCodeIfEnd("Qfalse")
 	elif PRINTMODE == "sqlang":
 		printCodeIfEnd("app_sqlang_return_false(J)")