From 4d1f264f0c0f777c7f1bea7587466f71a9a631a0 Mon Sep 17 00:00:00 2001 From: lyon Date: Sun, 5 Sep 2021 10:25:23 +0800 Subject: [PATCH] add while --- src/.vscode/launch.json | 6 +-- .../pikascript/pikascript-core/PikaBlock.c | 5 +++ .../pikascript/pikascript-core/PikaBlock.h | 1 + .../pikascript/pikascript-core/PikaObj.c | 23 +++++++++- .../pikascript/pikascript-core/PikaWhile.c | 42 ++++++++++++++++++- .../pikascript/pikascript-core/PikaWhile.h | 6 +++ 6 files changed, 78 insertions(+), 5 deletions(-) diff --git a/src/.vscode/launch.json b/src/.vscode/launch.json index 7c15a6fbc..402270b4b 100644 --- a/src/.vscode/launch.json +++ b/src/.vscode/launch.json @@ -8,12 +8,12 @@ "name": "test", "type": "cppdbg", "request": "launch", - // "program": "${workspaceFolder}/../build/src/test/pikascript_test", - "program": "${workspaceFolder}/../build/src/boot/demo06-pikamain/pikascript_demo06-pikamain", + "program": "${workspaceFolder}/../build/src/test/pikascript_test", + // "program": "${workspaceFolder}/../build/src/boot/demo06-pikamain/pikascript_demo06-pikamain", "args": [ // "--gtest_filter=object_test.test2" // "--gtest_filter=block.init" - // "--gtest_filter=block.ifrun1" + "--gtest_filter=block.ifrun1" // "--gtest_filter=sysObj.print" // "--gtest_filter=object_test.a_b" // "--gtest_filter=object_test.voidRun" diff --git a/src/package/pikascript/pikascript-core/PikaBlock.c b/src/package/pikascript/pikascript-core/PikaBlock.c index 136155459..bacc2a842 100644 --- a/src/package/pikascript/pikascript-core/PikaBlock.c +++ b/src/package/pikascript/pikascript-core/PikaBlock.c @@ -28,6 +28,11 @@ char *block_getBody(PikaObj *self) return obj_getStr(self, "body"); } +char *block_setBody(PikaObj *self, char *body) +{ + return obj_setStr(self, "body", body); +} + uint8_t block_checkAssert(PikaObj *self) { Args *buffs = New_strBuff(); diff --git a/src/package/pikascript/pikascript-core/PikaBlock.h b/src/package/pikascript/pikascript-core/PikaBlock.h index dc60b6221..96a883679 100644 --- a/src/package/pikascript/pikascript-core/PikaBlock.h +++ b/src/package/pikascript/pikascript-core/PikaBlock.h @@ -13,4 +13,5 @@ uint8_t block_checkAssert(PikaObj *self); uint16_t block_getLineSize(PikaObj *self); void block_setMode(PikaObj *self, char *mode); char *block_getMode(PikaObj *self); +char *block_setBody(PikaObj *self, char *body); #endif \ No newline at end of file diff --git a/src/package/pikascript/pikascript-core/PikaObj.c b/src/package/pikascript/pikascript-core/PikaObj.c index 69f400757..d9f028054 100644 --- a/src/package/pikascript/pikascript-core/PikaObj.c +++ b/src/package/pikascript/pikascript-core/PikaObj.c @@ -7,6 +7,7 @@ #include #include "PikaBlock.h" #include "PikaIf.h" +#include "PikaWhile.h" PikaObj *obj_getContext(PikaObj *self) { @@ -616,6 +617,11 @@ Args *obj_runDirect(PikaObj *self, char *cmd) if_pushLine(block, cmd); goto exit; } + if (strEqu(block_getMode(block), "while")) + { + while_pushLine(block, cmd); + goto exit; + } goto exit; } /* the block is end */ @@ -625,8 +631,12 @@ Args *obj_runDirect(PikaObj *self, char *cmd) if (strEqu(block_getMode(block), "if")) { if_run(block); - obj_removeArg(self, "_block"); } + if (strEqu(block_getMode(block), "while")) + { + while_run(block); + } + obj_removeArg(self, "_block"); /* not finished */ } } @@ -642,6 +652,17 @@ Args *obj_runDirect(PikaObj *self, char *cmd) goto exit; } + /* while block */ + if (strIsStartWith(cmd, "while ")) + { + obj_setInt(self, "_isInBlock", 1); + obj_setObjWithoutClass(self, "_block", block_init); + PikaObj *block = obj_getObj(self, "_block", 0); + while_setAssert(block, cmd); + /* this line processed ok */ + goto exit; + } + /* run script */ if (strIsContain(cmd, '(') && strIsContain(cmd, ')')) { diff --git a/src/package/pikascript/pikascript-core/PikaWhile.c b/src/package/pikascript/pikascript-core/PikaWhile.c index 802d72831..ced8a8795 100644 --- a/src/package/pikascript/pikascript-core/PikaWhile.c +++ b/src/package/pikascript/pikascript-core/PikaWhile.c @@ -3,4 +3,44 @@ #include "dataMemory.h" #include "dataString.h" #include "dataStrs.h" -#include \ No newline at end of file +#include "PikaBlock.h" +#include + +void while_setAssert(PikaObj *self, char *line) +{ + Args *buffs = New_strBuff(); + char *assert = strsRemovePrefix(buffs, line, "while "); + assert = strsGetFirstToken(buffs, assert, ':'); + block_setAssert(self, assert); + block_setMode(self, "while"); + args_deinit(buffs); +} + +void while_pushLine(PikaObj *self, char *line) +{ + Args *buffs = New_strBuff(); + char *bodyLine = strsRemovePrefix(buffs, line, " "); + block_pushLine(self, bodyLine); + goto exit; +exit: + args_deinit(buffs); + return; +} + +void while_run(PikaObj *self) +{ + Args *buffs = New_strBuff(); + char *body = strsCopy(buffs, block_getBody(self)); + while (block_checkAssert(self)) + { + PikaObj *host = obj_getContext(self); + while (0 != block_getLineSize(self)) + { + char *line = block_popLine(self); + obj_run(host, line); + } + block_setBody(self, body); + } +exit: + args_deinit(buffs); +} diff --git a/src/package/pikascript/pikascript-core/PikaWhile.h b/src/package/pikascript/pikascript-core/PikaWhile.h index ebac115d3..4ad238912 100644 --- a/src/package/pikascript/pikascript-core/PikaWhile.h +++ b/src/package/pikascript/pikascript-core/PikaWhile.h @@ -1,3 +1,9 @@ #ifndef _pikaWhile__H #define _pikaWhile__H +#include "PikaObj.h" + +void while_setAssert(PikaObj *self, char *line); +void while_pushLine(PikaObj *self, char *line); +void while_run(PikaObj *self); + #endif \ No newline at end of file