support '\x33' for str

This commit is contained in:
lyon1998 2022-04-19 19:16:53 +08:00
parent b015af566d
commit 9bbb9e43cd
2 changed files with 41 additions and 1 deletions

View File

@ -972,3 +972,21 @@ TEST(VM, a_3) {
args_deinit(buffs);
EXPECT_EQ(pikaMemNow(), 0);
}
TEST(VM, hex_str) {
char* line = (char*)"a = '\\x33\\x35'";
Args* buffs = New_strBuff();
char* pikaAsm = Parser_LineToAsm(buffs, line, NULL);
printf("%s", pikaAsm);
PikaObj* self = newRootObj((char*)"root", New_PikaStdLib_SysObj);
__platform_printf((char*)"BEGIN\r\n");
pikaVM_runAsm(self, pikaAsm);
/* collect */
char* a = obj_getStr(self, (char*)"a");
/* assert */
EXPECT_STREQ(a, (char*)"35");
/* deinit */
obj_deinit(self);
args_deinit(buffs);
EXPECT_EQ(pikaMemNow(), 0);
}

View File

@ -278,7 +278,6 @@ exit:
strsDeinit(&buffs);
}
#if PIKA_BUILTIN_LIST_ENABLE
void PikaStdData_List_append(PikaObj* self, Arg* arg);
void PikaStdData_List___init__(PikaObj* self);
@ -418,6 +417,29 @@ exit:
static Arg* VM_instruction_handler_STR(PikaObj* self, VMState* vs, char* data) {
Arg* strArg = New_arg(NULL);
if (strIsContain(data, '\\')) {
Args buffs = {0};
char* transfered_str = args_getBuff(&buffs, strGetSize(data));
size_t i_out = 0;
for (size_t i = 0; i < strGetSize(data); i++) {
/* eg. replace '\x33' to '3' */
if ((data[i] == '\\') && (data[i + 1] == 'x')) {
char hex_str[] = "0x00";
hex_str[2] = data[i + 3];
hex_str[3] = data[i + 4];
char hex = (char)strtol(hex_str, NULL, 0) + '0';
transfered_str[i_out++] = hex;
i += 3;
continue;
}
/* normal char */
transfered_str[i_out++] = data[i];
}
Arg* return_arg = New_arg(NULL);
return_arg = arg_setStr(return_arg, "", transfered_str);
strsDeinit(&buffs);
return return_arg;
}
return arg_setStr(strArg, "", data);
}