PikaWhile.c 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. /*
  2. Author: lyon
  3. Tencent QQ: 645275593
  4. */
  5. #include <stdarg.h>
  6. #include "PikaBlock.h"
  7. #include "PikaObj.h"
  8. #include "dataArgs.h"
  9. #include "dataMemory.h"
  10. #include "dataString.h"
  11. #include "dataStrs.h"
  12. void while_setAssert(PikaObj* self, char* line) {
  13. Args* buffs = New_strBuff();
  14. char* assert = strsRemovePrefix(buffs, line, "while ");
  15. assert = strsGetFirstToken(buffs, assert, ':');
  16. block_setAssert(self, assert);
  17. block_setMode(self, "while");
  18. args_deinit(buffs);
  19. }
  20. void while_pushLine(PikaObj* self, char* line) {
  21. Args* buffs = New_strBuff();
  22. char* bodyLine = strsRemovePrefix(buffs, line, " ");
  23. block_pushLine(self, bodyLine);
  24. goto exit;
  25. exit:
  26. args_deinit(buffs);
  27. return;
  28. }
  29. void while_run(PikaObj* self) {
  30. Args* buffs = New_strBuff();
  31. char* body = strsCopy(buffs, block_getBody(self));
  32. uint16_t lineSize = block_getLineSize(self);
  33. while (block_checkAssert(self)) {
  34. PikaObj* host = obj_getContext(self);
  35. for (int i = 0; i < lineSize; i++) {
  36. char* line = block_popLine(self);
  37. obj_run(host, line);
  38. }
  39. block_setBody(self, body);
  40. }
  41. exit:
  42. args_deinit(buffs);
  43. }