rizin/libr/core/visual.c
pancake 9bd9cbe135 * Fix LIBR_PLUGINS in env.sh
* Initial implementation of the visual mode in core
* Added pc and ps print formats (c code and string)
* Added '/' command in core (search hexa and str)
* Add '-d' to radare2 test program
* New r_file_path to resolve file path thru $PATH
* 'make install' works everywhere
2009-02-09 01:54:09 +01:00

115 lines
2.3 KiB
C

/* radare - LGPL - Copyright 2009 pancake<nopcode.org> */
#include "r_core.h"
static int cursor = 0;
static int flags = R_PRINT_FLAGS_ADDRMOD;
static int printidx = 0;
/* TODO: use r_cmd here in core->vcmd..optimize over 255 table */
int r_core_visual_cmd(struct r_core_t *core, int ch)
{
char buf[1024];
switch(ch) {
case 'c':
cursor ^= 1;
if (cursor) flags|=R_PRINT_FLAGS_CURSOR;
else flags &= !(flags&R_PRINT_FLAGS_CURSOR);
r_print_set_flags(flags);
break;
case 'C':
cursor ^= 1;
if (cursor) flags|=R_PRINT_FLAGS_COLOR;
else flags &= !(flags&R_PRINT_FLAGS_COLOR);
r_print_set_flags(flags);
break;
case 'H':
r_core_cmd(core, "s- 2", 0);
break;
case 'L':
r_core_cmd(core, "s+ 2", 0);
break;
case 'h':
r_core_cmd(core, "s- 1", 0);
break;
case 'l':
r_core_cmd(core, "s+ 1", 0);
break;
case 'j':
r_core_cmd(core, "s+ 16", 0);
break;
case 'k':
r_core_cmd(core, "s- 16", 0);
break;
case 'J':
r_core_cmd(core, "s++", 0);
break;
case 'K':
r_core_cmd(core, "s--", 0);
break;
case 'p':
printidx++;
break;
case 'P':
printidx--;
break;
case '-':
r_core_block_size( core, core->blocksize-1);
break;
case '+':
r_core_block_size( core, core->blocksize+1);
break;
case '/':
r_core_block_size( core, core->blocksize-=16);
break;
case '*':
r_core_block_size( core, core->blocksize+=16);
break;
case ':':
r_cons_fgets(buf, 1023, 0, NULL);
r_core_cmd(core, buf, 0);
break;
case '?':
r_cons_clear00();
r_cons_printf(
"\nVisual mode help:\n\n"
" hjkl - move around\n"
" HJKL - move around faster\n"
" P||p - rotate print modes\n"
" /*+- - change block size\n"
" :cmd - run radare command\n"
" q - back to radare shell\n");
r_cons_flush();
r_cons_any_key();
break;
case 'q':
return 0;
}
return 1;
}
int r_core_visual(struct r_core_t *core, const char *input)
{
int ch;
char *printfmt[] = { "x", "pd", "p8", "pc", "ps" };
while(input[0]) {
if (!r_core_visual_cmd(core, input[0])) {
r_cons_clear00();
r_core_cmd(core, printfmt[printidx%5], 0);
r_cons_flush();
r_cons_any_key();
return 0;
}
input = input + 1;
}
do {
r_cons_clear00();
r_core_cmd(core, printfmt[printidx%5], 0);
r_cons_flush();
ch = r_cons_readchar();
} while (r_core_visual_cmd(core, ch));
return 0;
}