Honor color theme in p=, add palette rainbow primitives in RCons
This commit is contained in:
parent
6111637a66
commit
0668d04488
8 changed files with 171 additions and 17 deletions
|
|
@ -227,3 +227,4 @@ aaaa is experimental
|
|||
We feed trolls
|
||||
Mind the tab
|
||||
Buy a Mac
|
||||
You have been designated for disassembly
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* radare - LGPL - Copyright 2013-2016 - pancake, sghctoma */
|
||||
/* radare - LGPL - Copyright 2013-2017 - pancake, sghctoma */
|
||||
|
||||
#include <r_cons.h>
|
||||
|
||||
|
|
@ -13,6 +13,8 @@ R_API void r_cons_pal_free () {
|
|||
R_API void r_cons_pal_init (const char *foo) {
|
||||
RCons *cons = r_cons_singleton ();
|
||||
memset (&cons->pal, 0, sizeof (cons->pal));
|
||||
cons->pal.rainbow = NULL;
|
||||
cons->pal.rainbow_sz = 0;
|
||||
cons->pal.b0x00 = Color_GREEN;
|
||||
cons->pal.b0x7f = Color_CYAN;
|
||||
cons->pal.b0xff = Color_RED;
|
||||
|
|
@ -82,6 +84,8 @@ R_API void r_cons_pal_init (const char *foo) {
|
|||
cons->pal.list[5] = strdup (Color_GRAY);
|
||||
cons->pal.list[6] = strdup (Color_BLUE);
|
||||
cons->pal.list[7] = strdup (Color_GREEN);
|
||||
|
||||
r_cons_pal_update_event();
|
||||
}
|
||||
|
||||
struct {
|
||||
|
|
@ -145,6 +149,7 @@ R_API void r_cons_pal_random () {
|
|||
if (cons->pal.list[i]) R_FREE (cons->pal.list[i]);
|
||||
cons->pal.list[i] = r_cons_color_random (0);
|
||||
}
|
||||
r_cons_pal_update_event();
|
||||
}
|
||||
|
||||
R_API char *r_cons_pal_parse (const char *str) {
|
||||
|
|
@ -390,7 +395,9 @@ R_API void r_cons_pal_list (int rad, const char *arg) {
|
|||
char *name, **color, rgbstr[32];
|
||||
const char *hasnext;
|
||||
int i;
|
||||
if (rad == 'j') r_cons_print ("{");
|
||||
if (rad == 'j') {
|
||||
r_cons_print ("{");
|
||||
}
|
||||
for (i = 0; keys[i].name; i++) {
|
||||
color = (char**) (p + keys[i].off);
|
||||
switch (rad) {
|
||||
|
|
@ -448,7 +455,9 @@ R_API void r_cons_pal_list (int rad, const char *arg) {
|
|||
keys[i].name);
|
||||
}
|
||||
}
|
||||
if (rad == 'j') r_cons_print ("}\n");
|
||||
if (rad == 'j') {
|
||||
r_cons_print ("}\n");
|
||||
}
|
||||
}
|
||||
|
||||
R_API int r_cons_pal_set(const char *key, const char *val) {
|
||||
|
|
@ -467,8 +476,7 @@ R_API int r_cons_pal_set(const char *key, const char *val) {
|
|||
R_API const char *r_cons_pal_get_i(int n) {
|
||||
int i;
|
||||
for (i = 0; i < n && keys[i].name; i++) {}
|
||||
if (i == n) return keys[n].name;
|
||||
return NULL;
|
||||
return (i == n) ? keys[n].name : NULL;
|
||||
}
|
||||
|
||||
R_API const char *r_cons_pal_get (const char *key) {
|
||||
|
|
@ -481,3 +489,75 @@ R_API const char *r_cons_pal_get (const char *key) {
|
|||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
R_API void r_cons_pal_update_event() {
|
||||
RConsPalette *pal = & (r_cons_singleton ()->pal);
|
||||
ut8 *p = (ut8*)pal;
|
||||
Sdb *db = sdb_new0 ();
|
||||
RCons *cons = r_cons_singleton ();
|
||||
int i, n = 0;
|
||||
for (i = 0; keys[i].name; i++) {
|
||||
char **color = (char**) (p + keys[i].off);
|
||||
ut8 r, g, b;
|
||||
r = g = b = 0;
|
||||
r_cons_rgb_parse (*color, &r, &g, &b, NULL);
|
||||
if (r <= 0x20 && g <= 0x20 && b < 0x20) {
|
||||
continue;
|
||||
}
|
||||
if (r >= 0xf0 && g >= 0xf0 && b >= 0xf0) {
|
||||
continue;
|
||||
}
|
||||
const char *rgb = sdb_fmt (0, "rgb:%02x%02x%02x", r, g, b);
|
||||
sdb_set (db, rgb, "1", 0);
|
||||
}
|
||||
SdbList *list = sdb_foreach_list (db, true);
|
||||
SdbListIter *iter;
|
||||
SdbKv *kv;
|
||||
r_cons_rainbow_free ();
|
||||
r_cons_rainbow_new (list->length);
|
||||
ls_foreach (list, iter, kv) {
|
||||
cons->pal.rainbow[n++] = strdup (kv->key);
|
||||
}
|
||||
cons->pal.rainbow_sz = n;
|
||||
ls_free (list);
|
||||
sdb_free (db);
|
||||
}
|
||||
|
||||
R_API void r_cons_rainbow_new(int sz) {
|
||||
RCons *cons = r_cons_singleton ();
|
||||
cons->pal.rainbow_sz = sz;
|
||||
free (cons->pal.rainbow);
|
||||
cons->pal.rainbow = calloc (sizeof (char *), sz);
|
||||
}
|
||||
|
||||
R_API void r_cons_rainbow_free() {
|
||||
RCons *cons = r_cons_singleton ();
|
||||
int i, sz = cons->pal.rainbow_sz;
|
||||
if (cons->pal.rainbow) {
|
||||
for (i = 0; i < sz ; i++) {
|
||||
free (cons->pal.rainbow[i]);
|
||||
}
|
||||
}
|
||||
cons->pal.rainbow_sz = 0;
|
||||
R_FREE (cons->pal.rainbow);
|
||||
}
|
||||
|
||||
R_API const char *r_cons_rainbow_get(int idx, int last, bool bg) {
|
||||
RCons *cons = r_cons_singleton ();
|
||||
if (last < 0) {
|
||||
last = cons->pal.rainbow_sz;
|
||||
}
|
||||
if (idx < 0 || idx >= last || !cons->pal.rainbow) {
|
||||
return NULL;
|
||||
}
|
||||
int x = (last == cons->pal.rainbow_sz)
|
||||
? idx : (cons->pal.rainbow_sz * idx) / (last + 1);
|
||||
const char *a = cons->pal.rainbow[x];
|
||||
if (bg) {
|
||||
char *dup = r_str_newf ("%s %s", a, a);
|
||||
const char *res = r_cons_pal_parse (dup);
|
||||
free (dup);
|
||||
return res;
|
||||
}
|
||||
return r_cons_pal_parse (a);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* radare2 - LGPL - Copyright 2009-2016 - pancake */
|
||||
/* radare2 - LGPL - Copyright 2009-2017 - pancake */
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdbool.h>
|
||||
|
|
@ -10,6 +10,7 @@ static bool getNext = false;
|
|||
static bool load_theme(RCore *core, const char *path) {
|
||||
core->cmdfilter = "ec ";
|
||||
bool res = r_core_cmd_file (core, path);
|
||||
r_cons_pal_update_event ();
|
||||
core->cmdfilter = NULL;
|
||||
return res;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1553,6 +1553,7 @@ R_API bool r_core_init(RCore *core) {
|
|||
core->print->get_bitfield = getbitfield;
|
||||
core->print->offname = r_core_print_offname;
|
||||
core->print->cb_printf = r_cons_printf;
|
||||
core->print->cb_color = r_cons_rainbow_get;
|
||||
core->print->write = mywrite;
|
||||
core->print->disasm = __disasm;
|
||||
core->print->colorfor = (RPrintColorFor)r_core_anal_optype_colorfor;
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ extern "C" {
|
|||
#include <unistd.h>
|
||||
|
||||
/* constants */
|
||||
#define ENUM_FOR_PAL 0
|
||||
#define CONS_MAX_USER 102400
|
||||
#define CONS_BUFSZ 0x4f00
|
||||
#define STR_IS_NULL(x) (!x || !x[0])
|
||||
|
|
@ -74,7 +75,73 @@ typedef struct r_cons_grep_t {
|
|||
int end;
|
||||
} RConsGrep;
|
||||
|
||||
#if ENUM_FOR_PAL
|
||||
enum {
|
||||
R_CONS_PAL_0x00 = 0,
|
||||
R_CONS_PAL_0x7f,
|
||||
R_CONS_PAL_0xff,
|
||||
R_CONS_PAL_args,
|
||||
R_CONS_PAL_bin,
|
||||
R_CONS_PAL_btext,
|
||||
R_CONS_PAL_CALL,
|
||||
R_CONS_PAL_CJMP,
|
||||
R_CONS_PAL_CMP,
|
||||
R_CONS_PAL_COMMENT,
|
||||
R_CONS_PAL_CREG,
|
||||
R_CONS_PAL_FLAG,
|
||||
R_CONS_PAL_FLINE,
|
||||
R_CONS_PAL_FLOC,
|
||||
R_CONS_PAL_FLOW,
|
||||
R_CONS_PAL_FLOW2,
|
||||
R_CONS_PAL_fname,
|
||||
R_CONS_PAL_help,
|
||||
R_CONS_PAL_input,
|
||||
R_CONS_PAL_INVALID,
|
||||
R_CONS_PAL_JMP,
|
||||
R_CONS_PAL_LABEL,
|
||||
R_CONS_PAL_MATH,
|
||||
R_CONS_PAL_MOV,
|
||||
R_CONS_PAL_NOP,
|
||||
R_CONS_PAL_NUM,
|
||||
R_CONS_PAL_OFFSET,
|
||||
R_CONS_PAL_OTHER,
|
||||
R_CONS_PAL_POP,
|
||||
R_CONS_PAL_PROMPT,
|
||||
R_CONS_PAL_PUSH,
|
||||
R_CONS_PAL_CRYPTO,
|
||||
R_CONS_PAL_REG,
|
||||
R_CONS_PAL_RESET,
|
||||
R_CONS_PAL_RET,
|
||||
R_CONS_PAL_SWI,
|
||||
R_CONS_PAL_TRAP,
|
||||
R_CONS_PAL_AI_READ,
|
||||
R_CONS_PAL_AI_WRITE,
|
||||
R_CONS_PAL_AI_EXEC,
|
||||
R_CONS_PAL_AI_SEQ,
|
||||
R_CONS_PAL_AI_ASCII,
|
||||
R_CONS_PAL_GUI_CFLOW,
|
||||
R_CONS_PAL_GUI_DATAOFFSET,
|
||||
R_CONS_PAL_GUI_BACKGROUND,
|
||||
R_CONS_PAL_GUI_ALT_BACKGROUND,
|
||||
R_CONS_PAL_GUI_BORDER,
|
||||
R_CONS_PAL_GRAPH_BOX,
|
||||
R_CONS_PAL_GRAPH_BOX2,
|
||||
R_CONS_PAL_GRAPH_BOX3,
|
||||
R_CONS_PAL_GRAPH_BOX4,
|
||||
R_CONS_PAL_GRAPH_TRUE,
|
||||
R_CONS_PAL_GRAPH_FALSE,
|
||||
R_CONS_PAL_GRAPH_TRUFAE,
|
||||
R_CONS_PAL_GRAPH_TRACED,
|
||||
R_CONS_PAL_GRAPH_CURRENT,
|
||||
R_CONS_PAL_LAST
|
||||
}
|
||||
#endif
|
||||
|
||||
typedef struct r_cons_palette_t {
|
||||
// TODO: this must be an array of char *
|
||||
#if ENUM_FOR_PAL
|
||||
char *color[R_CONS_PAL_LAST];
|
||||
#else
|
||||
char *b0x00;
|
||||
char *b0x7f;
|
||||
char *b0xff;
|
||||
|
|
@ -133,11 +200,17 @@ typedef struct r_cons_palette_t {
|
|||
char *graph_trufae;
|
||||
char *graph_traced;
|
||||
char *graph_current;
|
||||
|
||||
#endif
|
||||
#define R_CONS_PALETTE_LIST_SIZE 8
|
||||
char *list[R_CONS_PALETTE_LIST_SIZE];
|
||||
char **rainbow; // rainbow
|
||||
int rainbow_sz; // size of rainbow
|
||||
} RConsPalette;
|
||||
|
||||
R_API const char *r_cons_rainbow_get(int idx, int last, bool bg);
|
||||
R_API void r_cons_rainbow_free();
|
||||
R_API void r_cons_rainbow_new(int sz);
|
||||
|
||||
typedef void (*RConsEvent)(void *);
|
||||
|
||||
#define CONS_MAX_ATTR_SZ 15
|
||||
|
|
@ -494,6 +567,7 @@ R_API int r_cons_eof(void);
|
|||
|
||||
R_API int r_cons_palette_init(const unsigned char *pal);
|
||||
R_API int r_cons_pal_set (const char *key, const char *val);
|
||||
R_API void r_cons_pal_update_event();
|
||||
R_API void r_cons_pal_free(void);
|
||||
R_API void r_cons_pal_init(const char *foo);
|
||||
R_API char *r_cons_pal_parse(const char *str);
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@ typedef struct r_print_t {
|
|||
int datezone;
|
||||
int (*write)(const unsigned char *buf, int len);
|
||||
void (*cb_printf)(const char *str, ...);
|
||||
const char *(*cb_color)(int idx, int last, bool bg);
|
||||
int (*disasm)(void *p, ut64 addr);
|
||||
void (*oprintf)(const char *str, ...);
|
||||
char* (*get_bitfield)(void *user, const char *name, ut64 value);
|
||||
|
|
|
|||
|
|
@ -427,7 +427,6 @@ R_API void *r_list_get_n(const RList *list, int n) {
|
|||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
R_API RListIter *r_list_contains(const RList *list, const void *p) {
|
||||
void *q;
|
||||
RListIter *iter;
|
||||
|
|
|
|||
|
|
@ -1333,6 +1333,7 @@ static RPrint staticp = {
|
|||
|
||||
/* TODO: handle screen width */
|
||||
R_API void r_print_progressbar(RPrint *p, int pc, int _cols) {
|
||||
// TODO: add support for colors
|
||||
int i, cols = (_cols == -1)? 78: _cols;
|
||||
if (!p) {
|
||||
p = &staticp;
|
||||
|
|
@ -1439,15 +1440,12 @@ R_API void r_print_zoom(RPrint *p, void *user, RPrintZoomCallback cb, ut64 from,
|
|||
|
||||
R_API void r_print_fill(RPrint *p, const ut8 *arr, int size, ut64 addr, int step) {
|
||||
const int show_colors = p->flags & R_PRINT_FLAGS_COLOR;
|
||||
const char *firebow[6] = {
|
||||
Color_BGBLUE,
|
||||
Color_BGGREEN,
|
||||
Color_BGMAGENTA,
|
||||
Color_BGRED,
|
||||
Color_BGYELLOW,
|
||||
Color_BGWHITE,
|
||||
};
|
||||
const char *firebow[6] = { NULL };
|
||||
int i = 0, j;
|
||||
|
||||
for (i = 0; i < 6; i++) {
|
||||
firebow[i] = p->cb_color (i, 6, true);
|
||||
}
|
||||
#define INC 5
|
||||
#if TOPLINE
|
||||
if (arr[0] > 1) {
|
||||
|
|
@ -1922,4 +1920,3 @@ R_API int r_print_jsondump(RPrint *p, const ut8 *buf, int len, int wordsize) {
|
|||
p->cb_printf ("]\n");
|
||||
return words;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue