_pika_lua.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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. // PikaObj* dict = objDict_new0();
  46. while (lua_next(L, -2) != 0) {
  47. // 'key' is at index -2 and 'value' at index -1
  48. if (!get_list && !get_dict) {
  49. if (lua_isinteger(L, -2)) {
  50. ret = objList_new(NULL);
  51. get_list = PIKA_TRUE;
  52. } else {
  53. ret = objDict_new(NULL);
  54. get_dict = PIKA_TRUE;
  55. }
  56. }
  57. Arg* val = _lua_val_to_arg(L);
  58. if (get_list) {
  59. PikaStdData_List_append(ret, val);
  60. } else if (get_dict) {
  61. char* key = (char*)lua_tostring(L, -2);
  62. PikaStdData_Dict_set(ret, key, val);
  63. }
  64. arg_deinit(val);
  65. lua_pop(L, 1); // Remove value, keep key for next iteration
  66. }
  67. return arg_newObj(ret); // You might want to return something else here
  68. }
  69. return NULL;
  70. }
  71. Arg* _pika_lua_evals(PikaObj* self, char* cmd) {
  72. Args buffs = {0};
  73. int res = luaL_dostring(g_pika_L, cmd);
  74. if (LUA_OK != res) {
  75. obj_setErrorCode(self, PIKA_RES_ERR_OPERATION_FAILED);
  76. pika_platform_printf("Error: Lua dostring failed: \r\n> %s\r\n",
  77. lua_tostring(g_pika_L, -1));
  78. lua_pop(g_pika_L, 1);
  79. strsDeinit(&buffs);
  80. return NULL;
  81. }
  82. Arg* ret = _lua_val_to_arg(g_pika_L);
  83. if (ret != NULL) {
  84. lua_pop(g_pika_L, 1);
  85. }
  86. strsDeinit(&buffs);
  87. return ret;
  88. }
  89. void _pika_lua___exit__(PikaObj* self) {
  90. /* close the lua_State created */
  91. if (PIKA_TRUE == obj_getInt(self, "needfree")) {
  92. lua_close(g_pika_L);
  93. }
  94. }
  95. Arg* _pika_lua_evalLine(PikaObj* self, char* line) {
  96. Args buffs = {0};
  97. char* line_with_end = strsAppend(&buffs, line, "\n");
  98. Arg* ret = _pika_lua_evals(self, line_with_end);
  99. goto __exit;
  100. __exit:
  101. strsDeinit(&buffs);
  102. return ret;
  103. }
  104. void _pika_lua___del__(PikaObj* self) {
  105. pika_debug("lua close!\r\n");
  106. lua_close(g_pika_L); // 关闭 Lua 状态机,释放所有关联的资源
  107. g_pika_L = NULL;
  108. }