kemi-code-gen.py 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. # Python 3 helper program for KEMI
  2. # - print IF conditions with param types for KEMI interpreters
  3. # - print typedefs for functions
  4. PRINTPARAMS=4
  5. # - print mode: typedefs, js, lua, python, pythonparams, ruby, sqlang
  6. PRINTMODE="sqlang"
  7. # - two tabs for python params, three for the other cases
  8. # PRINTTABS="\t\t"
  9. PRINTTABS="\t\t\t"
  10. PRINTELSE=""
  11. def printCodeFuncTypedefs(prefix):
  12. sfunc = "typedef int (*sr_kemi_fm" + prefix + "_f)(sip_msg_t*"
  13. ", str*, str*, str*, str*, str*);"
  14. for i, c in enumerate(prefix):
  15. if c == 's':
  16. sfunc += ", str*"
  17. else:
  18. sfunc += ", int"
  19. sfunc += ");"
  20. print(sfunc)
  21. def printCodeIfEnd(sretfunc):
  22. print(PRINTTABS + "} else {")
  23. print(PRINTTABS + "\tLM_ERR(\"invalid parameters for: %.*s\\n\", fname->len, fname->s);")
  24. print(PRINTTABS + "\treturn " + sretfunc + ";")
  25. print(PRINTTABS + "}")
  26. def printCodeIfJS(prefix):
  27. global PRINTELSE
  28. sfunc = PRINTTABS + "\tret = ((sr_kemi_fm" + prefix + "_f)(ket->func))(env_J->msg,\n" + PRINTTABS + "\t\t\t"
  29. for i, c in enumerate(prefix):
  30. if i==0:
  31. if c == 's':
  32. print(PRINTTABS + PRINTELSE + "if(ket->ptypes[0]==SR_KEMIP_STR")
  33. sfunc += "&vps[" + str(i) +"].s, "
  34. else:
  35. print(PRINTTABS + PRINTELSE + "if(ket->ptypes[0]==SR_KEMIP_INT")
  36. sfunc += "vps[" + str(i) +"].n, "
  37. PRINTELSE = "} else "
  38. elif i==PRINTPARAMS-1:
  39. if c == 's':
  40. print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_STR) {")
  41. sfunc += "&vps[" + str(i) +"].s);"
  42. else:
  43. print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_INT) {")
  44. sfunc += "vps[" + str(i) +"].n);"
  45. else:
  46. if c == 's':
  47. print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_STR")
  48. sfunc += "&vps[" + str(i) +"].s, "
  49. else:
  50. print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_INT")
  51. sfunc += "vps[" + str(i) +"].n, "
  52. print(sfunc)
  53. print(PRINTTABS + "\treturn sr_kemi_jsdt_return_int(J, ket, ret);")
  54. def printCodeIfLua(prefix):
  55. global PRINTELSE
  56. sfunc = PRINTTABS + "\tret = ((sr_kemi_fm" + prefix + "_f)(ket->func))(env_L->msg,\n" + PRINTTABS + "\t\t\t"
  57. for i, c in enumerate(prefix):
  58. if i==0:
  59. if c == 's':
  60. print(PRINTTABS + PRINTELSE + "if(ket->ptypes[0]==SR_KEMIP_STR")
  61. sfunc += "&vps[" + str(i) +"].s, "
  62. else:
  63. print(PRINTTABS + PRINTELSE + "if(ket->ptypes[0]==SR_KEMIP_INT")
  64. sfunc += "vps[" + str(i) +"].n, "
  65. PRINTELSE = "} else "
  66. elif i==PRINTPARAMS-1:
  67. if c == 's':
  68. print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_STR) {")
  69. sfunc += "&vps[" + str(i) +"].s);"
  70. else:
  71. print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_INT) {")
  72. sfunc += "vps[" + str(i) +"].n);"
  73. else:
  74. if c == 's':
  75. print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_STR")
  76. sfunc += "&vps[" + str(i) +"].s, "
  77. else:
  78. print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_INT")
  79. sfunc += "vps[" + str(i) +"].n, "
  80. print(sfunc)
  81. print(PRINTTABS + "\treturn sr_kemi_lua_return_int(L, ket, ret);")
  82. def printCodeIfPython(prefix):
  83. global PRINTELSE
  84. sfunc = PRINTTABS + "\tret = ((sr_kemi_fm" + prefix + "_f)(ket->func))(lmsg,\n" + PRINTTABS + "\t\t\t"
  85. for i, c in enumerate(prefix):
  86. if i==0:
  87. if c == 's':
  88. print(PRINTTABS + PRINTELSE + "if(ket->ptypes[0]==SR_KEMIP_STR")
  89. sfunc += "&vps[" + str(i) +"].s, "
  90. else:
  91. print(PRINTTABS + PRINTELSE + "if(ket->ptypes[0]==SR_KEMIP_INT")
  92. sfunc += "vps[" + str(i) +"].n, "
  93. PRINTELSE = "} else "
  94. elif i==PRINTPARAMS-1:
  95. if c == 's':
  96. print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_STR) {")
  97. sfunc += "&vps[" + str(i) +"].s);"
  98. else:
  99. print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_INT) {")
  100. sfunc += "vps[" + str(i) +"].n);"
  101. else:
  102. if c == 's':
  103. print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_STR")
  104. sfunc += "&vps[" + str(i) +"].s, "
  105. else:
  106. print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_INT")
  107. sfunc += "vps[" + str(i) +"].n, "
  108. print(sfunc)
  109. print(PRINTTABS + "\treturn sr_kemi_apy_return_int(ket, ret);")
  110. def printCodeIfPythonParams(prefix):
  111. global PRINTELSE
  112. sfunc = PRINTTABS + "\tif(!PyArg_ParseTuple(args, \"" + prefix + ":kemi-param-" + prefix + "\",\n" + PRINTTABS + "\t\t\t"
  113. slen = ""
  114. sdbg = PRINTTABS + "\tLM_DBG(\"params[%d] for: %.*s are:"
  115. sval = ""
  116. for i, c in enumerate(prefix):
  117. if i==0:
  118. if c == 's':
  119. print(PRINTTABS + PRINTELSE + "if(ket->ptypes[0]==SR_KEMIP_STR")
  120. sfunc += "&vps[" + str(i) +"].s.s, "
  121. slen += PRINTTABS + "\tvps[" + str(i) + "].s.len = strlen(vps[" + str(i) + "].s.s);\n"
  122. sdbg += " [%s]"
  123. sval += "vps[" + str(i) + "].s.s, "
  124. else:
  125. print(PRINTTABS + PRINTELSE + "if(ket->ptypes[0]==SR_KEMIP_INT")
  126. sfunc += "&vps[" + str(i) +"].n, "
  127. sdbg += " [%d]"
  128. sval += "vps[" + str(i) + "].n, "
  129. PRINTELSE = "} else "
  130. elif i==PRINTPARAMS-1:
  131. if c == 's':
  132. print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_STR) {")
  133. sfunc += "&vps[" + str(i) +"].s.s)) {"
  134. slen += PRINTTABS + "\tvps[" + str(i) + "].s.len = strlen(vps[" + str(i) + "].s.s);\n"
  135. sdbg += " [%s]"
  136. sval += "vps[" + str(i) + "].s.s"
  137. else:
  138. print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_INT) {")
  139. sfunc += "&vps[" + str(i) +"].n)) {"
  140. sdbg += " [%d]"
  141. sval += "vps[" + str(i) + "].n"
  142. else:
  143. if c == 's':
  144. print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_STR")
  145. sfunc += "&vps[" + str(i) +"].s.s, "
  146. slen += PRINTTABS + "\tvps[" + str(i) + "].s.len = strlen(vps[" + str(i) + "].s.s);\n"
  147. sdbg += " [%s]"
  148. sval += "vps[" + str(i) + "].s.s, "
  149. else:
  150. print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_INT")
  151. sfunc += "&vps[" + str(i) +"].n, "
  152. sdbg += " [%d]"
  153. sval += "vps[" + str(i) + "].n, "
  154. print(sfunc)
  155. print(PRINTTABS + "\t\tLM_ERR(\"unable to retrieve " + prefix + " params %d\\n\", i);")
  156. print(PRINTTABS + "\t\treturn sr_kemi_apy_return_false();")
  157. print(PRINTTABS + "\t}")
  158. print(slen)
  159. print(sdbg + "\\n\",\n" + PRINTTABS + "\t\t\t" + "i, fname.len, fname.s,")
  160. print(PRINTTABS + "\t\t\t" + sval + ");")
  161. def printCodeIfRuby(prefix):
  162. global PRINTELSE
  163. sfunc = PRINTTABS + "\tret = ((sr_kemi_fm" + prefix + "_f)(ket->func))(env_R->msg,\n" + PRINTTABS + "\t\t\t"
  164. for i, c in enumerate(prefix):
  165. if i==0:
  166. if c == 's':
  167. print(PRINTTABS + PRINTELSE + "if(ket->ptypes[0]==SR_KEMIP_STR")
  168. sfunc += "&vps[" + str(i) +"].s, "
  169. else:
  170. print(PRINTTABS + PRINTELSE + "if(ket->ptypes[0]==SR_KEMIP_INT")
  171. sfunc += "vps[" + str(i) +"].n, "
  172. PRINTELSE = "} else "
  173. elif i==PRINTPARAMS-1:
  174. if c == 's':
  175. print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_STR) {")
  176. sfunc += "&vps[" + str(i) +"].s);"
  177. else:
  178. print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_INT) {")
  179. sfunc += "vps[" + str(i) +"].n);"
  180. else:
  181. if c == 's':
  182. print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_STR")
  183. sfunc += "&vps[" + str(i) +"].s, "
  184. else:
  185. print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_INT")
  186. sfunc += "vps[" + str(i) +"].n, "
  187. print(sfunc)
  188. print(PRINTTABS + "\treturn sr_kemi_ruby_return_int(ket, ret);")
  189. def printCodeIfSQLang(prefix):
  190. global PRINTELSE
  191. sfunc = PRINTTABS + "\tret = ((sr_kemi_fm" + prefix + "_f)(ket->func))(env_J->msg,\n" + PRINTTABS + "\t\t\t"
  192. for i, c in enumerate(prefix):
  193. if i==0:
  194. if c == 's':
  195. print(PRINTTABS + PRINTELSE + "if(ket->ptypes[0]==SR_KEMIP_STR")
  196. sfunc += "&vps[" + str(i) +"].s, "
  197. else:
  198. print(PRINTTABS + PRINTELSE + "if(ket->ptypes[0]==SR_KEMIP_INT")
  199. sfunc += "vps[" + str(i) +"].n, "
  200. PRINTELSE = "} else "
  201. elif i==PRINTPARAMS-1:
  202. if c == 's':
  203. print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_STR) {")
  204. sfunc += "&vps[" + str(i) +"].s);"
  205. else:
  206. print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_INT) {")
  207. sfunc += "vps[" + str(i) +"].n);"
  208. else:
  209. if c == 's':
  210. print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_STR")
  211. sfunc += "&vps[" + str(i) +"].s, "
  212. else:
  213. print(PRINTTABS + "\t\t&& ket->ptypes[" + str(i) + "]==SR_KEMIP_INT")
  214. sfunc += "vps[" + str(i) +"].n, "
  215. print(sfunc)
  216. print(PRINTTABS + "\treturn sr_kemi_sqlang_return_int(J, ket, ret);")
  217. # generated possible strings of length k with chars from set.
  218. def printAllKLength(cset, k):
  219. n = len(cset)
  220. printAllKLengthRec(cset, "", n, k)
  221. def printAllKLengthRec(cset, prefix, n, k):
  222. if (k == 0) :
  223. # print(prefix)
  224. if PRINTMODE == "js":
  225. printCodeIfJS(prefix)
  226. elif PRINTMODE == "lua":
  227. printCodeIfLua(prefix)
  228. elif PRINTMODE == "python":
  229. printCodeIfPython(prefix)
  230. elif PRINTMODE == "pythonparams":
  231. printCodeIfPythonParams(prefix)
  232. elif PRINTMODE == "ruby":
  233. printCodeIfRuby(prefix)
  234. elif PRINTMODE == "sqlang":
  235. printCodeIfSQLang(prefix)
  236. else:
  237. printCodeFuncTypedefs(prefix)
  238. return
  239. for i in range(n):
  240. newPrefix = prefix + cset[i]
  241. printAllKLengthRec(cset, newPrefix, n, k - 1)
  242. # main statements
  243. if __name__ == "__main__":
  244. charset = ['s', 'n']
  245. k = PRINTPARAMS
  246. printAllKLength(charset, k)
  247. if PRINTMODE == "js":
  248. printCodeIfEnd("app_jsdt_return_false(J)")
  249. elif PRINTMODE == "lua":
  250. printCodeIfEnd("app_lua_return_false(L)")
  251. elif PRINTMODE == "python":
  252. printCodeIfEnd("sr_kemi_apy_return_false()")
  253. elif PRINTMODE == "pythonparams":
  254. printCodeIfEnd("sr_kemi_apy_return_false()")
  255. elif PRINTMODE == "ruby":
  256. printCodeIfEnd("Qfalse")
  257. elif PRINTMODE == "sqlang":
  258. printCodeIfEnd("app_sqlang_return_false(J)")