From d3fd9512b4793e23073f31ca71a610675bce143e Mon Sep 17 00:00:00 2001 From: lyon Date: Wed, 25 May 2022 15:53:39 +0800 Subject: [PATCH] support and tested char() and ord() builtin-fun --- package/PikaStdLib/PikaStdLib.pyi | 2 ++ package/PikaStdLib/PikaStdLib_SysObj.c | 20 +++++++++++-- port/linux/package/pikascript/PikaStdLib.pyi | 2 ++ .../PikaStdLib/PikaStdLib_SysObj.c | 20 +++++++++++-- port/linux/test/pikaMain-test.cpp | 30 +++++++++++++++++++ 5 files changed, 68 insertions(+), 6 deletions(-) diff --git a/package/PikaStdLib/PikaStdLib.pyi b/package/PikaStdLib/PikaStdLib.pyi index fbc1d91b5..11c631f11 100644 --- a/package/PikaStdLib/PikaStdLib.pyi +++ b/package/PikaStdLib/PikaStdLib.pyi @@ -23,6 +23,8 @@ class SysObj(BaseObj): def list(self) -> any: ... def dict(self) -> any: ... def hex(self, val: int) -> str: ... + def ord(self, val: str) -> int: ... + def chr(self, val: int) -> str: ... class RangeObj(TinyObj): diff --git a/package/PikaStdLib/PikaStdLib_SysObj.c b/package/PikaStdLib/PikaStdLib_SysObj.c index d012fdd92..228bcd870 100644 --- a/package/PikaStdLib/PikaStdLib_SysObj.c +++ b/package/PikaStdLib/PikaStdLib_SysObj.c @@ -270,14 +270,28 @@ Arg* PikaStdLib_SysObj_dict(PikaObj* self) { return arg_setNull(NULL); } -char* PikaStdLib_SysObj_hex(PikaObj *self, int val){ +char* PikaStdLib_SysObj_hex(PikaObj* self, int val) { char buff[PIKA_SPRINTF_BUFF_SIZE] = {0}; - if(val > 0){ + if (val > 0) { __platform_sprintf(buff, "0x%02x", val); - }else{ + } else { __platform_sprintf(buff, "-0x%02x", -val); } /* load the string from stack to heap */ obj_setStr(self, "__buf", buff); return obj_getStr(self, "__buf"); } + +int PikaStdLib_SysObj_ord(PikaObj* self, char* val) { + return (int)val[0]; +} + +char* PikaStdLib_SysObj_chr(PikaObj* self, int val) { + char buff[PIKA_SPRINTF_BUFF_SIZE] = {0}; + char to_str[] = "0"; + to_str[0] = val; + __platform_sprintf(buff, "%s", to_str); + /* load the string from stack to heap */ + obj_setStr(self, "__buf", buff); + return obj_getStr(self, "__buf"); +} diff --git a/port/linux/package/pikascript/PikaStdLib.pyi b/port/linux/package/pikascript/PikaStdLib.pyi index fbc1d91b5..11c631f11 100644 --- a/port/linux/package/pikascript/PikaStdLib.pyi +++ b/port/linux/package/pikascript/PikaStdLib.pyi @@ -23,6 +23,8 @@ class SysObj(BaseObj): def list(self) -> any: ... def dict(self) -> any: ... def hex(self, val: int) -> str: ... + def ord(self, val: str) -> int: ... + def chr(self, val: int) -> str: ... class RangeObj(TinyObj): diff --git a/port/linux/package/pikascript/pikascript-lib/PikaStdLib/PikaStdLib_SysObj.c b/port/linux/package/pikascript/pikascript-lib/PikaStdLib/PikaStdLib_SysObj.c index d012fdd92..228bcd870 100644 --- a/port/linux/package/pikascript/pikascript-lib/PikaStdLib/PikaStdLib_SysObj.c +++ b/port/linux/package/pikascript/pikascript-lib/PikaStdLib/PikaStdLib_SysObj.c @@ -270,14 +270,28 @@ Arg* PikaStdLib_SysObj_dict(PikaObj* self) { return arg_setNull(NULL); } -char* PikaStdLib_SysObj_hex(PikaObj *self, int val){ +char* PikaStdLib_SysObj_hex(PikaObj* self, int val) { char buff[PIKA_SPRINTF_BUFF_SIZE] = {0}; - if(val > 0){ + if (val > 0) { __platform_sprintf(buff, "0x%02x", val); - }else{ + } else { __platform_sprintf(buff, "-0x%02x", -val); } /* load the string from stack to heap */ obj_setStr(self, "__buf", buff); return obj_getStr(self, "__buf"); } + +int PikaStdLib_SysObj_ord(PikaObj* self, char* val) { + return (int)val[0]; +} + +char* PikaStdLib_SysObj_chr(PikaObj* self, int val) { + char buff[PIKA_SPRINTF_BUFF_SIZE] = {0}; + char to_str[] = "0"; + to_str[0] = val; + __platform_sprintf(buff, "%s", to_str); + /* load the string from stack to heap */ + obj_setStr(self, "__buf", buff); + return obj_getStr(self, "__buf"); +} diff --git a/port/linux/test/pikaMain-test.cpp b/port/linux/test/pikaMain-test.cpp index d80c32b71..d78ccd57a 100644 --- a/port/linux/test/pikaMain-test.cpp +++ b/port/linux/test/pikaMain-test.cpp @@ -1805,3 +1805,33 @@ TEST(pikaMain, builtin_hex) { obj_deinit(self); EXPECT_EQ(pikaMemNow(), 0); } + +TEST(pikaMain, builtin_ord) { + /* init */ + pikaMemInfo.heapUsedMax = 0; + /* run */ + PikaObj* self = newRootObj("pikaMain", New_PikaMain); + __platform_printf("BEGIN\r\n"); + obj_run(self, "ord('a')\n"); + /* assert */ + EXPECT_STREQ(log_buff[1], "BEGIN\r\n"); + EXPECT_STREQ(log_buff[0], "97\r\n"); + /* deinit */ + obj_deinit(self); + EXPECT_EQ(pikaMemNow(), 0); +} + +TEST(pikaMain, builtin_chr) { + /* init */ + pikaMemInfo.heapUsedMax = 0; + /* run */ + PikaObj* self = newRootObj("pikaMain", New_PikaMain); + __platform_printf("BEGIN\r\n"); + obj_run(self, "chr(97)\n"); + /* assert */ + EXPECT_STREQ(log_buff[1], "BEGIN\r\n"); + EXPECT_STREQ(log_buff[0], "a\r\n"); + /* deinit */ + obj_deinit(self); + EXPECT_EQ(pikaMemNow(), 0); +}