Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Port command pb/B to new shell #2828

Merged
merged 4 commits into from
Jul 28, 2022
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 40 additions & 64 deletions librz/core/cmd/cmd_print.c
Original file line number Diff line number Diff line change
Expand Up @@ -4885,70 +4885,6 @@ RZ_IPI int rz_cmd_print(void *data, const char *input) {
rz_config_set_i(core->config, "search.to", saved_to);
}
} break;
case 'b': { // "pb"
if (input[1] == '?') {
rz_cons_printf("|Usage: p[bB] [len] ([skip]) ; see also pB and pxb\n");
} else if (l != 0) {
int from, to;
const int size = len * 8;
char *spc, *buf = malloc(size + 1);
spc = strchr(input, ' ');
if (spc) {
len = rz_num_math(core->num, spc + 1);
if (len < 1) {
len = 1;
}
spc = strchr(spc + 1, ' ');
if (spc) {
from = rz_num_math(core->num, spc + 1);
} else {
from = 0;
}
to = from + len;
} else {
from = 0;
to = size;
}
if (buf) {
int buf_len;
rz_str_bits(buf, block, size, NULL);
buf_len = strlen(buf);
if (from >= 0 && to >= 0) {
if (from >= buf_len) {
from = buf_len;
}
if (to < buf_len) {
buf[to] = 0;
// buf[buf_len - 1] = 0;
}
rz_cons_println(buf + from);
}
free(buf);
} else {
eprintf("ERROR: Cannot malloc %d byte(s)\n", size);
}
}
} break;
case 'B': { // "pB"
if (input[1] == '?') {
rz_cons_printf("|Usage: p[bB] [len] bitstream of N bytes\n");
} else if (l != 0) {
int size;
char *buf;
if (!rz_core_block_size(core, len)) {
len = core->blocksize;
}
size = len * 8;
buf = malloc(size + 1);
if (buf) {
rz_str_bits(buf, core->block, size, NULL);
rz_cons_println(buf);
free(buf);
} else {
eprintf("ERROR: Cannot malloc %d byte(s)\n", size);
}
}
} break;
case 'I': // "pI"
switch (input[1]) {
case 'f': // "pIf"
Expand Down Expand Up @@ -7288,4 +7224,44 @@ RZ_IPI RzCmdStatus rz_cmd_base64_decode_handler(RzCore *core, int argc, const ch
rz_cons_println((const char *)buf);
free(buf);
return RZ_CMD_STATUS_OK;
}

RZ_IPI RzCmdStatus rz_print_bitstream_handler(RzCore *core, int argc, const char **argv, RzOutputMode mode) {
int len = (int)rz_num_math(core->num, argv[1]);
int skip = (int)rz_num_math(core->num, argv[2]);
if (len < 0 || skip < 0) {
RZ_LOG_ERROR("len and skip should be positive numbers\n");
return RZ_CMD_STATUS_ERROR;
}
// `pb len skip` means skip <skip> bits then print <len> bits
char *buf = RZ_NEWS0(char, len + skip + 1);
if (!buf) {
RZ_LOG_ERROR("Fail to allocate memory\n");
return RZ_CMD_STATUS_ERROR;
}
rz_str_bits(buf, core->block, len + skip, NULL);
rz_cons_println(buf + skip);
free(buf);
return RZ_CMD_STATUS_OK;
}

RZ_IPI RzCmdStatus rz_print_byte_bitstream_handler(RzCore *core, int argc, const char **argv, RzOutputMode mode) {
ut64 cur_off = core->offset;
int len = (int)rz_num_math(core->num, argv[1]);
if (len < 0) {
len *= -1;
rz_core_seek(core, cur_off - len, SEEK_SET);
rz_core_block_read(core);
}
char *buf = RZ_NEWS0(char, len * 8 + 1);
if (!buf) {
RZ_LOG_ERROR("Fail to allocate memory\n");
return RZ_CMD_STATUS_ERROR;
}
rz_str_bits(buf, core->block, len * 8, NULL);
rz_cons_println(buf);
rz_core_seek(core, cur_off, SEEK_SET);
rz_core_block_read(core);
free(buf);
return RZ_CMD_STATUS_OK;
}
42 changes: 42 additions & 0 deletions librz/core/cmd_descs/cmd_descs.c
Original file line number Diff line number Diff line change
Expand Up @@ -451,6 +451,8 @@ static const RzCmdDescArg open_maps_prioritize_binid_args[2];
static const RzCmdDescArg open_maps_deprioritize_args[2];
static const RzCmdDescArg open_maps_prioritize_fd_args[2];
static const RzCmdDescArg open_exchange_args[3];
static const RzCmdDescArg print_bitstream_args[3];
static const RzCmdDescArg print_byte_bitstream_args[2];
static const RzCmdDescArg hex_of_assembly_args[2];
static const RzCmdDescArg esil_of_assembly_args[2];
static const RzCmdDescArg assembly_of_hex_args[2];
Expand Down Expand Up @@ -10422,6 +10424,40 @@ static const RzCmdDescHelp open_exchange_help = {
static const RzCmdDescHelp cmd_print_help = {
.summary = "Print commands",
};
static const RzCmdDescArg print_bitstream_args[] = {
{
.name = "n",
.type = RZ_CMD_ARG_TYPE_RZNUM,

},
{
.name = "skip",
.type = RZ_CMD_ARG_TYPE_RZNUM,
.flags = RZ_CMD_ARG_FLAG_LAST,
.default_value = "0",

},
{ 0 },
};
static const RzCmdDescHelp print_bitstream_help = {
.summary = "Print bitstream of <n> bits, skipping the first <skip> bits.",
.args = print_bitstream_args,
};

static const RzCmdDescArg print_byte_bitstream_args[] = {
{
.name = "n",
.type = RZ_CMD_ARG_TYPE_RZNUM,
.flags = RZ_CMD_ARG_FLAG_LAST,

},
{ 0 },
};
static const RzCmdDescHelp print_byte_bitstream_help = {
.summary = "Print bitstream of <n> bytes",
.args = print_byte_bitstream_args,
};

static const RzCmdDescHelp pa_help = {
.summary = "Print (dis)assembly of given hexpairs/assembly",
};
Expand Down Expand Up @@ -16277,6 +16313,12 @@ RZ_IPI void rzshell_cmddescs_init(RzCore *core) {

RzCmdDesc *cmd_print_cd = rz_cmd_desc_oldinput_new(core->rcmd, root_cd, "p", rz_cmd_print, &cmd_print_help);
rz_warn_if_fail(cmd_print_cd);
RzCmdDesc *print_bitstream_cd = rz_cmd_desc_argv_modes_new(core->rcmd, cmd_print_cd, "pb", RZ_OUTPUT_MODE_STANDARD, rz_print_bitstream_handler, &print_bitstream_help);
rz_warn_if_fail(print_bitstream_cd);

RzCmdDesc *print_byte_bitstream_cd = rz_cmd_desc_argv_modes_new(core->rcmd, cmd_print_cd, "pB", RZ_OUTPUT_MODE_STANDARD, rz_print_byte_bitstream_handler, &print_byte_bitstream_help);
rz_warn_if_fail(print_byte_bitstream_cd);

RzCmdDesc *pa_cd = rz_cmd_desc_group_modes_new(core->rcmd, cmd_print_cd, "pa", RZ_OUTPUT_MODE_STANDARD, rz_hex_of_assembly_handler, &hex_of_assembly_help, &pa_help);
rz_warn_if_fail(pa_cd);
RzCmdDesc *esil_of_assembly_cd = rz_cmd_desc_argv_modes_new(core->rcmd, pa_cd, "pae", RZ_OUTPUT_MODE_STANDARD, rz_esil_of_assembly_handler, &esil_of_assembly_help);
Expand Down
2 changes: 2 additions & 0 deletions librz/core/cmd_descs/cmd_descs.h
Original file line number Diff line number Diff line change
Expand Up @@ -757,6 +757,8 @@ RZ_IPI RzCmdStatus rz_open_maps_prioritize_binid_handler(RzCore *core, int argc,
RZ_IPI RzCmdStatus rz_open_maps_deprioritize_handler(RzCore *core, int argc, const char **argv);
RZ_IPI RzCmdStatus rz_open_maps_prioritize_fd_handler(RzCore *core, int argc, const char **argv);
RZ_IPI RzCmdStatus rz_open_exchange_handler(RzCore *core, int argc, const char **argv);
RZ_IPI RzCmdStatus rz_print_bitstream_handler(RzCore *core, int argc, const char **argv, RzOutputMode mode);
RZ_IPI RzCmdStatus rz_print_byte_bitstream_handler(RzCore *core, int argc, const char **argv, RzOutputMode mode);
RZ_IPI RzCmdStatus rz_hex_of_assembly_handler(RzCore *core, int argc, const char **argv, RzOutputMode mode);
RZ_IPI RzCmdStatus rz_esil_of_assembly_handler(RzCore *core, int argc, const char **argv, RzOutputMode mode);
RZ_IPI RzCmdStatus rz_assembly_of_hex_handler(RzCore *core, int argc, const char **argv, RzOutputMode mode);
Expand Down
19 changes: 19 additions & 0 deletions librz/core/cmd_descs/cmd_print.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,25 @@
---
name: cmd_print
commands:
- name: pb
summary: Print bitstream of <n> bits, skipping the first <skip> bits.
cname: print_bitstream
modes:
- RZ_OUTPUT_MODE_STANDARD
args:
- name: n
type: RZ_CMD_ARG_TYPE_RZNUM
- name: skip
type: RZ_CMD_ARG_TYPE_RZNUM
default_value: 0
- name: pB
summary: Print bitstream of <n> bytes
cname: print_byte_bitstream
modes:
- RZ_OUTPUT_MODE_STANDARD
args:
- name: n
type: RZ_CMD_ARG_TYPE_RZNUM
- name: pa
summary: Print (dis)assembly of given hexpairs/assembly
subcommands:
Expand Down
2 changes: 2 additions & 0 deletions test/db/cmd/cmd_0
Original file line number Diff line number Diff line change
Expand Up @@ -51,13 +51,15 @@ NAME=pb 0
FILE=bins/elf/analysis/hello-arm32
CMDS=pb 0
EXPECT=<<EOF

EOF
RUN

NAME=pB 0
FILE=bins/elf/analysis/hello-arm32
CMDS=pB 0
EXPECT=<<EOF

EOF
RUN

Expand Down