rizin/librz/arch/arch-asm/luac/lua_arch.c
2024-03-07 18:38:49 +08:00

139 lines
No EOL
2.5 KiB
C

// SPDX-License-Identifier: LGPL-3.0-only
// SPDX-FileCopyrightText: 2021 Heersin <teablearcher@gmail.com>
#include "lua_arch.h"
LuaInstruction lua_build_instruction(const ut8 *buf) {
LuaInstruction ret = 0;
ret |= buf[3] << 24;
ret |= buf[2] << 16;
ret |= buf[1] << 8;
ret |= buf[0];
return ret;
}
void lua_set_instruction(LuaInstruction instruction, ut8 *data) {
data[3] = instruction >> 24;
data[2] = instruction >> 16;
data[1] = instruction >> 8;
data[0] = instruction >> 0;
}
bool free_lua_opnames(LuaOpNameList list) {
if (list != NULL) {
RZ_FREE(list);
return true;
}
return false;
}
/* formatted strings for asm_buf */
char *luaop_new_str_3arg(char *opname, int a, int b, int c) {
char *asm_string;
asm_string = rz_str_newf(
"%s %d %d %d",
opname,
a, b, c);
return asm_string;
}
char *luaop_new_str_2arg(char *opname, int a, int b) {
char *asm_string;
asm_string = rz_str_newf(
"%s %d %d",
opname,
a, b);
return asm_string;
}
char *luaop_new_str_1arg(char *opname, int a) {
char *asm_string;
asm_string = rz_str_newf(
"%s %d",
opname,
a);
return asm_string;
}
/* For the k flag */
char *luaop_new_str_3arg_ex(char *opname, int a, int b, int c, int isk) {
char *asm_string;
asm_string = rz_str_newf(
"%s %d %d %d %d",
opname,
a, b, c, isk);
return asm_string;
}
char *luaop_new_str_2arg_ex(char *opname, int a, int b, int isk) {
char *asm_string;
asm_string = rz_str_newf(
"%s %d %d %d",
opname,
a, b, isk);
return asm_string;
}
char *luaop_new_str_1arg_ex(char *opname, int a, int isk) {
char *asm_string;
asm_string = rz_str_newf(
"%s %d %d",
opname,
a, isk);
return asm_string;
}
int lua_load_next_arg_start(const char *raw_string, char *recv_buf) {
if (!raw_string) {
return 0;
}
const char *arg_start = NULL;
const char *arg_end = NULL;
int arg_len = 0;
/* locate the start point */
arg_start = rz_str_trim_head_ro(raw_string);
if (strlen(arg_start) == 0) {
return 0;
}
arg_end = strchr(arg_start, ' ');
if (arg_end == NULL) {
/* is last arg */
arg_len = strlen(arg_start);
} else {
arg_len = arg_end - arg_start;
}
/* Set NUL */
memcpy(recv_buf, arg_start, arg_len);
recv_buf[arg_len] = 0x00;
/* Calculate offset */
return arg_start - raw_string + arg_len;
}
bool lua_is_valid_num_value_string(const char *str) {
if (!rz_is_valid_input_num_value(NULL, str)) {
RZ_LOG_ERROR("assembler: lua: %s is not a valid number argument\n", str);
return false;
}
return true;
}
int lua_convert_str_to_num(const char *str) {
return strtoll(str, NULL, 0);
}