mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-29 17:22:56 +08:00
support '\x33' for str
This commit is contained in:
parent
b015af566d
commit
9bbb9e43cd
@ -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);
|
||||
}
|
||||
|
24
src/PikaVM.c
24
src/PikaVM.c
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user