Honor color theme in p=, add palette rainbow primitives in RCons

This commit is contained in:
pancake 2017-05-18 00:01:16 +02:00
parent 6111637a66
commit 0668d04488
8 changed files with 171 additions and 17 deletions

View file

@ -227,3 +227,4 @@ aaaa is experimental
We feed trolls
Mind the tab
Buy a Mac
You have been designated for disassembly

View file

@ -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);
}

View file

@ -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;
}

View file

@ -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;

View file

@ -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);

View file

@ -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);

View file

@ -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;

View file

@ -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;
}