luat_repl.c 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. #include "luat_base.h"
  2. #include "luat_shell.h"
  3. #include "luat_mem.h"
  4. #include "luat_rtos.h"
  5. #include "luat_repl.h"
  6. #include "luat_msgbus.h"
  7. #define LUAT_LOG_TAG "repl"
  8. #include "luat_log.h"
  9. #ifdef LUAT_USE_REPL
  10. static char* mulitline_buff;
  11. static size_t mulitline_buff_size;
  12. static size_t mulitline_buff_offset;
  13. // static int mulitline_mode;
  14. #define luat_repl_write luat_shell_write
  15. // static const char* repl_tips = "";
  16. static int repl_enable = 1;
  17. int luat_repl_enable(int enable) {
  18. int tmp = repl_enable;
  19. if (enable >= 0) {
  20. repl_enable = enable;
  21. }
  22. return tmp;
  23. }
  24. void luat_repl_init(void) {
  25. luat_repl_write("LuatOS Ready\r\n>", strlen("LuatOS Ready\r\n>"));
  26. }
  27. static int report(lua_State* L) {
  28. size_t len = 0;
  29. const char *msg;
  30. msg = lua_tolstring(L, -1, &len);
  31. luat_repl_write(msg, len);
  32. luat_repl_write("\r\n", 2);
  33. lua_pop(L, 1); /* remove message */
  34. return 0;
  35. }
  36. static int repl_handle(lua_State* L, void* ptr) {
  37. char* buff = (char*)ptr;
  38. rtos_msg_t* msg = (rtos_msg_t*)lua_topointer(L, -1);
  39. size_t sz = msg->arg1;
  40. // LLOGD("REPL-- %.*s --", sz, buff);
  41. int ret = luaL_loadbuffer(L, buff, sz, "repl");
  42. luat_heap_free(ptr);
  43. if (ret != LUA_OK) {
  44. // LLOGD("加载出错,语法问题? %d", ret);
  45. report(L);
  46. return 0;
  47. }
  48. // lua_pushcfunction(L, l_err);
  49. // lua_pushvalue(L, -2);
  50. ret = lua_pcall(L, 0, 0, 0);
  51. if (ret < LUA_OK) {
  52. // LLOGD("执行出错 %d", ret);
  53. report(L);
  54. return 0;
  55. }
  56. return 0;
  57. }
  58. static int find2run(void) {
  59. // LLOGD("find2run %p %d %d", mulitline_buff, mulitline_buff_size, mulitline_buff_offset);
  60. if (mulitline_buff == NULL)
  61. return 1;
  62. size_t i = 0;
  63. for (; i < mulitline_buff_offset; i++)
  64. {
  65. if (mulitline_buff[i] == '\r' || mulitline_buff[i] == '\n') {
  66. continue;
  67. }
  68. break;
  69. }
  70. // LLOGD("=================================");
  71. if (i > 0) { // 有空白字符
  72. if (i == mulitline_buff_offset) {
  73. // 全是空白字符?
  74. // 那就是啥都不需要
  75. mulitline_buff_offset = 0;
  76. mulitline_buff_size = 0;
  77. luat_heap_free(mulitline_buff);
  78. mulitline_buff = NULL;
  79. return 1;
  80. }
  81. memmove(mulitline_buff, mulitline_buff + i, mulitline_buff_offset - i);
  82. }
  83. i = 0;
  84. // LLOGD("待搜索字符串 | %.*s |", mulitline_buff_offset, mulitline_buff);
  85. // LLOGD("是开头1吗? %d", memcmp("<<EOF\r", mulitline_buff, 6));
  86. // LLOGD("是开头2吗? %d", memcmp("<<EOF\n", mulitline_buff, 6));
  87. // 是不是多行呢
  88. if (!memcmp("<<EOF\r", mulitline_buff, 6) || !memcmp("<<EOF\n", mulitline_buff, 6)) {
  89. // LLOGD("找到了<<EOF");
  90. // 找到开始了, 继续找结束
  91. i += 6;
  92. for (; i < mulitline_buff_offset - 4; i++)
  93. {
  94. if (!memcmp("EOF\r", mulitline_buff + i, 4) || !memcmp("EOF\n", mulitline_buff + i, 4)) {
  95. // if (mulitline_buff[i-1] == '\r' || mulitline_buff[i-1] == '\n') {
  96. // LLOGD("找到EOF结束符了");
  97. // 是否再malloc一次呢? 貌似也没啥必要
  98. memmove(mulitline_buff, mulitline_buff + 6, i - 6);
  99. rtos_msg_t msg = {
  100. .handler = repl_handle
  101. };
  102. msg.ptr = mulitline_buff;
  103. msg.arg1 = i - 6;
  104. mulitline_buff = NULL;
  105. mulitline_buff_size = 0;
  106. mulitline_buff_offset = 0;
  107. luat_msgbus_put(&msg, 0);
  108. return 0;
  109. // }
  110. }
  111. }
  112. // LLOGD("没有找到EOF结束");
  113. return 1;
  114. }
  115. for (i = 1; i < mulitline_buff_offset; i++)
  116. {
  117. if (mulitline_buff[i] == '\r' || mulitline_buff[i] == '\n') {
  118. char* buff = luat_heap_malloc(i);
  119. if (buff == NULL) {
  120. mulitline_buff_size = 0;
  121. mulitline_buff_offset = 0;
  122. luat_heap_free(mulitline_buff);
  123. mulitline_buff = NULL;
  124. luat_repl_write("REPL: out of memory\r\n", strlen("REPL: out of memory\r\n"));
  125. return 1;
  126. }
  127. memcpy(buff, mulitline_buff, i);
  128. rtos_msg_t msg = {
  129. .handler = repl_handle
  130. };
  131. msg.ptr = buff;
  132. msg.arg1 = i;
  133. memmove(mulitline_buff, mulitline_buff + i, mulitline_buff_offset - i);
  134. mulitline_buff_offset -= i;
  135. luat_msgbus_put(&msg, 0);
  136. return 0;
  137. }
  138. }
  139. return 1;
  140. }
  141. void luat_shell_push(char* uart_buff, size_t rcount) {
  142. // LLOGD("收到数据长度 %d", rcount);
  143. if (rcount == 0 || !repl_enable)
  144. return;
  145. // rtos_msg_t msg = {
  146. // .handler = repl_handle
  147. // };
  148. if (mulitline_buff == NULL) { // 全新的?
  149. mulitline_buff_size = rcount > 1024 ? rcount : 1024;
  150. mulitline_buff = luat_heap_malloc(mulitline_buff_size);
  151. if (mulitline_buff == NULL) {
  152. // mulitline_mode = 0;
  153. mulitline_buff_offset = 0;
  154. mulitline_buff_size = 0;
  155. luat_repl_write("REPL: out of memory\r\n", strlen("REPL: out of memory\r\n"));
  156. return;
  157. }
  158. }
  159. if (mulitline_buff_offset + rcount > mulitline_buff_size) {
  160. void* tmpptr = luat_heap_realloc(mulitline_buff, mulitline_buff_offset + rcount + 256);
  161. if (tmpptr == NULL) {
  162. luat_heap_free(mulitline_buff);
  163. // mulitline_mode = 0;
  164. mulitline_buff_offset = 0;
  165. mulitline_buff_size = 0;
  166. luat_repl_write("REPL: out of memory\r\n", strlen("REPL: out of memory\r\n"));
  167. return;
  168. }
  169. }
  170. memcpy(mulitline_buff + mulitline_buff_offset, uart_buff, rcount);
  171. mulitline_buff_offset += rcount;
  172. // 查找指令
  173. while (find2run() == 0) {
  174. // LLOGD("继续下一个查询循环");
  175. }
  176. return;
  177. }
  178. #endif