_pika_lua.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #include "_pika_lua.h"
  2. #include "dataStrs.h"
  3. #include "lauxlib.h"
  4. #include "lualib.h"
  5. #if !PIKASCRIPT_VERSION_REQUIRE_MINIMUN(1, 12, 3)
  6. #error "PikaScript version require minimum 1.12.3"
  7. #endif
  8. /* if there is already a lua_State, extern pika_L to it */
  9. lua_State* g_pika_L = NULL;
  10. void _pika_lua___init__(PikaObj* self) {
  11. /* not found exist lua_State, create One */
  12. if (NULL == g_pika_L) {
  13. g_pika_L = luaL_newstate(); /* create state */
  14. luaL_openlibs(g_pika_L);
  15. obj_setInt(self, "needfree", PIKA_TRUE);
  16. pika_debug("lua luached!\r\n");
  17. }
  18. }
  19. void PikaStdData_List_append(PikaObj* self, Arg* arg);
  20. void PikaStdData_Dict_set(PikaObj* self, char* key, Arg* arg);
  21. Arg* _lua_val_to_arg(lua_State* L) {
  22. if (!lua_gettop(L)) {
  23. return NULL;
  24. }
  25. if (lua_isinteger(L, -1)) {
  26. return arg_newInt(lua_tointeger(L, -1));
  27. }
  28. if (lua_isnumber(L, -1)) {
  29. return arg_newFloat(lua_tonumber(L, -1));
  30. }
  31. if (lua_isstring(L, -1)) {
  32. return arg_newStr((char*)lua_tostring(L, -1));
  33. }
  34. if (lua_isboolean(L, -1)) {
  35. return arg_newBool(lua_toboolean(L, -1));
  36. }
  37. if (lua_isnil(L, -1) || lua_isnoneornil(L, -1)) {
  38. return arg_newNone();
  39. }
  40. if (lua_istable(L, -1)) {
  41. PikaObj* ret = NULL;
  42. PIKA_BOOL get_list = PIKA_FALSE;
  43. PIKA_BOOL get_dict = PIKA_FALSE;
  44. lua_pushnil(L); // push the first key
  45. while (lua_next(L, -2) != 0) {
  46. // 'key' is at index -2 and 'value' at index -1
  47. if (!get_list && !get_dict) {
  48. if (lua_isinteger(L, -2)) {
  49. ret = New_PikaList();
  50. get_list = PIKA_TRUE;
  51. } else {
  52. ret = New_PikaDict();
  53. get_dict = PIKA_TRUE;
  54. }
  55. }
  56. Arg* val = _lua_val_to_arg(L);
  57. if (get_list) {
  58. PikaStdData_List_append(ret, val);
  59. } else if (get_dict) {
  60. char* key = (char*)lua_tostring(L, -2);
  61. PikaStdData_Dict_set(ret, key, val);
  62. }
  63. arg_deinit(val);
  64. lua_pop(L, 1); // Remove value, keep key for next iteration
  65. }
  66. return arg_newObj(ret); // You might want to return something else here
  67. }
  68. return NULL;
  69. }
  70. Arg* _pika_lua_evals(PikaObj* self, char* cmd) {
  71. Args buffs = {0};
  72. int res = luaL_dostring(g_pika_L, cmd);
  73. if (LUA_OK != res) {
  74. obj_setErrorCode(self, PIKA_RES_ERR_OPERATION_FAILED);
  75. pika_platform_printf("Error: Lua dostring failed: \r\n> %s\r\n",
  76. lua_tostring(g_pika_L, -1));
  77. lua_pop(g_pika_L, 1);
  78. strsDeinit(&buffs);
  79. return NULL;
  80. }
  81. Arg* ret = _lua_val_to_arg(g_pika_L);
  82. if (ret != NULL) {
  83. lua_pop(g_pika_L, 1);
  84. }
  85. strsDeinit(&buffs);
  86. return ret;
  87. }
  88. void _pika_lua___exit__(PikaObj* self) {
  89. /* close the lua_State created */
  90. if (PIKA_TRUE == obj_getInt(self, "needfree")) {
  91. lua_close(g_pika_L);
  92. }
  93. }
  94. Arg* _pika_lua_evalLine(PikaObj* self, char* line) {
  95. Args buffs = {0};
  96. char* line_with_end = strsAppend(&buffs, line, "\n");
  97. Arg* ret = _pika_lua_evals(self, line_with_end);
  98. goto __exit;
  99. __exit:
  100. strsDeinit(&buffs);
  101. return ret;
  102. }
  103. void _pika_lua___del__(PikaObj* self) {
  104. pika_debug("lua close!\r\n");
  105. lua_close(g_pika_L);
  106. g_pika_L = NULL;
  107. }