R_API char *r_cons_pal_parse(const char *str) { int i; ut8 r, g, b; char out[128]; char *s = strdup (str); char *p = strchr (s+1, ' '); out[0] = 0; if (p) *p++ = 0; if (!strcmp (str, "random")) { free (s); return r_cons_color_random (0); } if (!strncmp (s, "rgb:", 4)) { r = rgbnum (s[4]); g = rgbnum (s[5]); b = rgbnum (s[6]); r_cons_rgb_str (out, r, g, b, 0); } if (p && !strncmp (p, "rgb:", 4)) { r = rgbnum (p[4]); g = rgbnum (p[5]); b = rgbnum (p[6]); r_cons_rgb_str (out+strlen (out), r, g, b, 1); } for (i=0; colors[i].name; i++) { if (!strcmp (s, colors[i].name)) strcat (out, colors[i].code); if (p && !strcmp (p, colors[i].name)) strcat (out, colors[i].bgcode); } free (s); return *out? strdup (out): NULL; }
R_API char *r_cons_color_random(int bg) { int r, g, b; if (I.truecolor>0) { char out[32]; r = r_num_rand (0xff); g = r_num_rand (0xff); b = r_num_rand (0xff); r_cons_rgb_str (out, r, g, b, bg); return strdup (out); } // random ansi r = r_num_rand (16); switch (r) { case 0: return strdup (Color_RED); case 1: return strdup (Color_BRED); case 2: return strdup (Color_WHITE); case 3: return strdup (Color_BWHITE); case 4: return strdup (Color_GREEN); case 5: return strdup (Color_BGREEN); case 6: return strdup (Color_MAGENTA); case 7: return strdup (Color_BMAGENTA); case 8: return strdup (Color_YELLOW); case 9: return strdup (Color_BYELLOW); case 10: return strdup (Color_CYAN); case 11: return strdup (Color_BCYAN); case 12: return strdup (Color_BLUE); case 13: return strdup (Color_BBLUE); case 14: return strdup (Color_GRAY); case 15: return strdup (Color_BGRAY); } return strdup (Color_RESET); }
static void r_cons_pal_show_rgb () { const int inc = 3; int i, j, k, n = 0; r_cons_print ("\n\nRGB:\n"); for (i = n = 0; i <= 0xf; i += inc) { for (k = 0; k <= 0xf; k += inc) { for (j = 0; j <= 0xf; j += inc) { char fg[32], bg[32]; int r = i * 16; int g = j * 16; int b = k * 16; strcpy (fg, ((i < 6) && (j < 5)) ? Color_WHITE: Color_BLACK); r_cons_rgb_str (bg, r, g, b, 1); r_cons_printf ("%s%s rgb:%02x%02x%02x " Color_RESET, fg, bg, r, g, b); //if (n++==7) { if (n ++== 5) { n = 0; r_cons_newline (); } } } } }
static void r_cons_pal_show_256() { RColor rc = RColor_BLACK; r_cons_print ("\n\nXTerm colors:\n"); int r = 0; int g = 0; int b = 0; for (r = 0x00; r <= 0xff; r += 0x28) { rc.r = r; if (rc.r == 0x28) { rc.r = 0x5f; } for (b = 0x00; b <= 0xff; b += 0x28) { rc.b = b; if (rc.b == 0x28) { rc.b = 0x5f; } for (g = 0x00; g <= 0xff; g += 0x28) { rc.g = g; char bg[32]; if (rc.g == 0x28) { rc.g = 0x5f; } const char *fg = ((rc.r <= 0x5f) && (rc.g <= 0x5f)) ? Color_WHITE: Color_BLACK; r_cons_rgb_str (bg, sizeof (bg), &rc); r_cons_printf ("%s%s rgb:%02x%02x%02x " Color_RESET, fg, bg, rc.r, rc.g, rc.b); } r_cons_newline (); } } }
R_API char *r_cons_color_random(int bg) { int r, g, b; if (I.truecolor > 0) { char out[32]; r = r_num_rand (0xff); g = r_num_rand (0xff); b = r_num_rand (0xff); r_cons_rgb_str (out, r, g, b, bg); return strdup (out); } const char *color = Color_RESET; // random ansi r = r_num_rand (16); switch (r) { case 0: color = Color_RED; break; case 1: color = Color_BRED; break; case 2: color = Color_WHITE; break; case 3: color = Color_BWHITE; break; case 4: color = Color_GREEN; break; case 5: color = Color_BGREEN; break; case 6: color = Color_MAGENTA; break; case 7: color = Color_BMAGENTA; break; case 8: color = Color_YELLOW; break; case 9: color = Color_BYELLOW; break; case 10: color = Color_CYAN; break; case 11: color = Color_BCYAN; break; case 12: color = Color_BLUE; break; case 13: color = Color_BBLUE; break; case 14: color = Color_GRAY; break; case 15: color = Color_BGRAY; break; } return strdup (color); }
R_API char *r_cons_color_random_string(int bg) { int r, g, b; if (I.truecolor > 0) { char out[32]; r = r_num_rand (0xff); g = r_num_rand (0xff); b = r_num_rand (0xff); r_cons_rgb_str (out, r, g, b, bg); return strdup (out); } // random ansi const char *color = "white"; r = r_num_rand (8); switch (r) { case 0: color = "red"; break; case 1: color = "white"; break; case 2: color = "green"; break; case 3: color = "magenta"; break; case 4: color = "yellow"; break; case 5: color = "cyan"; break; case 6: color = "blue"; break; case 7: color = "gray"; break; } return strdup (color); }
static void r_cons_pal_show_rgb() { const int inc = 3; int i, j, k, n = 0; RColor rc = RColor_BLACK; r_cons_print ("\n\nRGB:\n"); for (i = n = 0; i <= 0xf; i += inc) { for (k = 0; k <= 0xf; k += inc) { for (j = 0; j <= 0xf; j += inc) { char fg[32], bg[32]; rc.r = i * 16; rc.g = j * 16; rc.b = k * 16; strcpy (fg, ((i < 6) && (j < 5)) ? Color_WHITE: Color_BLACK); r_cons_rgb_str (bg, sizeof (bg), &rc); r_cons_printf ("%s%s rgb:%02x%02x%02x " Color_RESET, fg, bg, rc.r, rc.g, rc.b); if (n ++== 5) { n = 0; r_cons_newline (); } } } } }
static void r_cons_pal_show_256 () { int r, g, b; r_cons_print ("\n\nXTerm colors:\n"); for (r = 0x00; r <= 0xff; r += 0x28) { if (r == 0x28) { r = 0x5f; } for (b = 0x00; b <= 0xff; b += 0x28) { if (b == 0x28) { b = 0x5f; } for (g = 0x00; g <= 0xff; g += 0x28) { char fg[32], bg[32]; if (g == 0x28) { g = 0x5f; } if ((r <= 0x5f) && (g <= 0x5f)) { strcpy (fg, Color_WHITE); } else { strcpy (fg, Color_BLACK); } r_cons_rgb_str (bg, r, g, b, 1); r_cons_printf ("%s%s rgb:%02x%02x%02x " Color_RESET, fg, bg, r, g, b); if (g == 0xff) { r_cons_newline (); } } } } }
R_API void r_cons_pal_show () { const int inc = 3; int i, j, k, n = 0; for (i=0; colors[i].name; i++) { r_cons_printf ("%s%s__"Color_RESET" %s\n", colors[i].code, colors[i].bgcode, colors[i].name); } r_cons_printf ("\nGreyscale:\n"); for (i=n=0; i<=0xf; i+=1) { char fg[32], bg[32]; int r = i*16; if (i<5) strcpy (fg, Color_WHITE); else r_cons_rgb_str (fg, 0, 0, 0, 0); r_cons_rgb_str (bg, r, r, r, 1); r_cons_printf ("%s%s rgb:%x%x%x " Color_RESET, fg, bg, i, i, i); if (n++==5) { n = 0; r_cons_newline(); } } r_cons_printf ("\n\nRGB:\n"); for (i=n=0; i<=0xf; i+=inc) { for (k=0; k<=0xf; k+=inc) { for (j=0; j<=0xf; j+=inc) { char fg[32], bg[32]; int r = i*16; int g = j*16; int b = k*16; if ((i<6) && (j<5) ) strcpy (fg, Color_WHITE); //if (i<2 && j<6 && k<13) else r_cons_rgb_str (fg, 0, 0, 0, 0); r_cons_rgb_str (bg, r, g, b, 1); r_cons_printf ("%s%s rgb:%x%x%x "Color_RESET, fg, bg, i, j, k); //if (n++==7) { if (n++==5) { n = 0; r_cons_newline(); } } } } }
R_API void r_cons_rgb (ut8 r, ut8 g, ut8 b, int is_bg) { #if __WINDOWS__ #warning r_cons_rgb not yet supported on windows #else char outstr[64]; r_cons_strcat (r_cons_rgb_str (outstr, r, g, b, is_bg)); #endif }
R_API void r_cons_pal_list (int rad) { RConsPalette *pal = &(r_cons_singleton ()->pal); ut8 *p = (ut8*)pal; ut8 r, g, b; char **color, rgbstr[32]; const char *hasnext; int i; if (rad=='j') r_cons_printf ("{"); for (i=0; keys[i].name; i++) { color = (char**)(p + keys[i].off); switch (rad) { case 'j': r = g = b = 0; r_cons_rgb_parse (*color, &r, &g, &b, NULL); hasnext = (keys[i+1].name)?",":""; r_cons_printf ("\"%s\":[%d,%d,%d]%s", keys[i].name, r, g, b, hasnext); break; case 'c': { r = g = b = 0; r_cons_rgb_parse (*color, &r, &g, &b, NULL); hasnext = (keys[i+1].name) ? "\n" : ""; //Need to replace the '.' char because this is not valid CSS char *name = strdup(keys[i].name); int j, len = strlen(name); for(j=0; j < len; j++) { if(name[j] == '.') name[j] = '_'; } r_cons_printf (".%s { color: rgb(%d, %d, %d); }%s", name, r, g, b, hasnext); free(name); } break; case '*': case 'r': case 1: r = g = b = 0; r_cons_rgb_parse (*color, &r, &g, &b, NULL); rgbstr[0] = 0; r_cons_rgb_str (rgbstr, r, g, b, 0); r >>= 4; g >>= 4; b >>= 4; r_cons_printf ("ec %s rgb:%x%x%x\n", keys[i].name, r&0xf, g&0xf, b&0xf); break; default: r_cons_printf (" %s##"Color_RESET" %s\n", *color, keys[i].name); } } if (rad=='j') r_cons_printf ("}\n"); }
static void r_cons_pal_show_gs () { int i, n; r_cons_print ("\nGreyscale:\n"); for (i = 0x08, n = 0; i <= 0xee; i += 0xa) { char fg[32], bg[32]; if (i < 0x76) strcpy (fg, Color_WHITE); else strcpy (fg, Color_BLACK); r_cons_rgb_str (bg, i, i, i, 1); r_cons_printf ("%s%s rgb:%02x%02x%02x "Color_RESET, fg, bg, i, i, i); if (n++ == 5) { n = 0; r_cons_newline (); } } }
R_API void r_cons_pal_list (int rad) { RConsPalette *pal = &(r_cons_singleton ()->pal); ut8 *p = (ut8*)pal; ut8 r, g, b; char **color, rgbstr[32];; int i; for (i=0; keys[i].name; i++) { color = (char**)(p + keys[i].off); if (rad) { r = g = b = 0; r_cons_rgb_parse (*color, &r, &g, &b, NULL); rgbstr[0] = 0; r_cons_rgb_str (rgbstr, r, g, b, 0); r >>= 4; g >>= 4; b >>= 4; r_cons_printf ("ec %s rgb:%x%x%x\n", keys[i].name, r, g, b); } else r_cons_printf (" %s##"Color_RESET" %s\n", *color, keys[i].name); }
R_API void r_cons_pal_list (int rad) { RConsPalette *pal = &(r_cons_singleton ()->pal); ut8 *p = (ut8*)pal; ut8 r, g, b; char **color, rgbstr[32]; const char *hasnext; int i; if (rad=='j') r_cons_printf ("{"); for (i=0; keys[i].name; i++) { color = (char**)(p + keys[i].off); switch (rad) { case 'j': r = g = b = 0; r_cons_rgb_parse (*color, &r, &g, &b, NULL); hasnext = (keys[i+1].name)?",":""; r_cons_printf ("\"%s\":[%d,%d,%d]%s", keys[i].name, r, g, b, hasnext); break; case '*': case 'r': case 1: r = g = b = 0; r_cons_rgb_parse (*color, &r, &g, &b, NULL); rgbstr[0] = 0; r_cons_rgb_str (rgbstr, r, g, b, 0); // r >>= 4; // g >>= 4; // b >>= 4; r_cons_printf ("ec %s rgb:%02x%02x%02x\n", keys[i].name, r, g, b); break; default: r_cons_printf (" %s##"Color_RESET" %s\n", *color, keys[i].name); } } if (rad=='j') r_cons_printf ("}\n"); }
R_API char *r_cons_pal_parse(const char *str) { int i; ut8 r, g, b; char out[128]; char *s = r_str_trim_head_tail (strdup (str)); r_str_split (s, ' '); int length = strlen (s); out[0] = 0; if (!strcmp (str, "random")) { free (s); return r_cons_color_random (0); } if (!strncmp (s, "rgb:", 4)) { int correct = 0; if (length == 7) { r = rgbnum (s[4],s[4]); g = rgbnum (s[5],s[5]); b = rgbnum (s[6],s[6]); correct = 1; } else if (length == 10) { r = rgbnum(s[4],s[5]); g = rgbnum(s[6],s[7]); b = rgbnum(s[8],s[9]); correct = 1; } if (correct) { r_cons_rgb_str (out, r, g, b, 0); } else { eprintf ("Invalid rgb string (%s)\n", str); } } for (i=0; colors[i].name; i++) { if (!strcmp (s, colors[i].name)) strcat (out, colors[i].code); } free (s); return *out? strdup (out): NULL; }
R_API void r_cons_pal_update_event() { Sdb *db = sdb_new0 (); int i, n = 0; char **color; /* Compute cons->pal values */ for (i = 0; keys[i].name; i++) { RColor *rcolor = RCOLOR_AT (i); color = COLOR_AT (i); // Color is dynamically allocated, needs to be freed if (*color) { R_FREE (*color); } *color = r_cons_rgb_str (NULL, 0, rcolor); const char *rgb = sdb_fmt ("rgb:%02x%02x%02x", rcolor->r, rcolor->g, rcolor->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) { r_cons_singleton ()->pal.rainbow[n++] = strdup (kv->key); }
static void r_cons_pal_show_gs() { int i, n; r_cons_print ("\nGreyscale:\n"); RColor rcolor = RColor_BLACK; for (i = 0x08, n = 0; i <= 0xee; i += 0xa) { char fg[32], bg[32]; rcolor.r = i; rcolor.g = i; rcolor.b = i; if (i < 0x76) { strcpy (fg, Color_WHITE); } else { strcpy (fg, Color_BLACK); } r_cons_rgb_str (bg, sizeof (bg), &rcolor); r_cons_printf ("%s%s rgb:%02x%02x%02x "Color_RESET, fg, bg, i, i, i); if (n++ == 5) { n = 0; r_cons_newline (); } } }
R_API char *r_cons_color_random_string(int bg) { int r, g, b; if (I.truecolor>0) { char out[32]; r = r_num_rand (0xff); g = r_num_rand (0xff); b = r_num_rand (0xff); r_cons_rgb_str (out, r, g, b, bg); return strdup (out); } // random ansi r = r_num_rand (8); switch (r) { case 0: return strdup ("red"); case 1: return strdup ("white"); case 2: return strdup ("green"); case 3: return strdup ("magenta"); case 4: return strdup ("yellow"); case 5: return strdup ("cyan"); case 6: return strdup ("blue"); case 7: return strdup ("gray"); } return strdup ("white"); }
R_API char *r_cons_pal_parse (const char *str) { int i; ut8 r, g, b; char out[128]; char *s = strdup (str); if (!s) return NULL; char *p = strchr (s + 1, ' '); out[0] = 0; if (p) *p++ = 0; if (!strcmp (str, "random")) { free (s); return r_cons_color_random (0); } if (!strncmp (s, "#", 1)) { if (strlen (s) == 7) { #define C(x) (x >> 4) int R, G, B; sscanf (s, "%02x%02x%02x", &R, &G, &B); r_cons_rgb_str (out, C(R), C(G), C(B), 0); } else { eprintf ("Invalid html color code\n"); } } else if (!strncmp (s, "rgb:", 4)) { if (strlen (s) == 7) { r = rgbnum (s[4], '0'); g = rgbnum (s[5], '0'); b = rgbnum (s[6], '0'); r_cons_rgb_str (out, r, g, b, 0); } else if (strlen (s) == 10) { r = rgbnum (s[4], s[5]); g = rgbnum (s[6], s[7]); b = rgbnum (s[8], s[9]); r_cons_rgb_str (out, r, g, b, 0); } } if (p && !strncmp (p, "rgb:", 4)) { if (strlen (s) == 7) { r = rgbnum (p[4], '0'); g = rgbnum (p[5], '0'); b = rgbnum (p[6], '0'); r_cons_rgb_str (out + strlen (out), r, g, b, 1); } else if (strlen (s) == 10) { r = rgbnum (p[4], p[5]); g = rgbnum (p[6], p[7]); b = rgbnum (p[8], p[9]); r_cons_rgb_str (out + strlen (out), r, g, b, 1); } } for (i = 0; colors[i].name; i++) { if (!strcmp (s, colors[i].name)) { strncat (out, colors[i].code, sizeof (out) - strlen (out) - 1); } if (p && !strcmp (p, colors[i].name)) { strncat (out, colors[i].bgcode, sizeof (out) - strlen (out) - 1); } } free (s); return *out ? strdup (out) : NULL; }
/* Return NULL if outcol is given */ R_API char *r_cons_pal_parse(const char *str, RColor *outcol) { int i; RColor rcolor = (RColor) RColor_BLACK; char *fgcolor; char *bgcolor; char *attr = NULL; char out[128]; if (!str) { return NULL; } fgcolor = strdup (str); if (!fgcolor) { return NULL; } bgcolor = strchr (fgcolor + 1, ' '); out[0] = 0; if (bgcolor) { *bgcolor++ = '\0'; attr = strchr (bgcolor, ' '); if (attr) { *attr++ = '\0'; } } // Handle first color (fgcolor) if (!strcmp (fgcolor, "random")) { rcolor = r_cons_color_random (ALPHA_FG); if (!outcol) { r_cons_rgb_str (out, sizeof (out), &rcolor); } } else if (!strncmp (fgcolor, "#", 1)) { // "#00ff00" HTML format if (strlen (fgcolor) == 7) { i = sscanf (fgcolor + 1, "%02hhx%02hhx%02hhx", &rcolor.r, &rcolor.g, &rcolor.b); if (i != 3) { eprintf ("Error while parsing HTML color: %s\n", fgcolor); } if (!outcol) { r_cons_rgb_str (out, sizeof (out), &rcolor); } } else { eprintf ("Invalid html color code\n"); } } else if (!strncmp (fgcolor, "rgb:", 4)) { // "rgb:123" rgb format if (strlen (fgcolor) == 7) { rcolor.r = rgbnum (fgcolor[4], '0'); rcolor.g = rgbnum (fgcolor[5], '0'); rcolor.b = rgbnum (fgcolor[6], '0'); if (!outcol) { r_cons_rgb_str (out, sizeof (out), &rcolor); } } else if (strlen (fgcolor) == 10) { rcolor.r = rgbnum (fgcolor[4], fgcolor[5]); rcolor.g = rgbnum (fgcolor[6], fgcolor[7]); rcolor.b = rgbnum (fgcolor[8], fgcolor[9]); if (!outcol) { r_cons_rgb_str (out, sizeof (out), &rcolor); } } } // Handle second color (bgcolor) if (bgcolor && !strncmp (bgcolor, "rgb:", 4)) { // "rgb:123" rgb format if (strlen (bgcolor) == 7) { rcolor.a |= ALPHA_BG; rcolor.r2 = rgbnum (bgcolor[4], '0'); rcolor.g2 = rgbnum (bgcolor[5], '0'); rcolor.b2 = rgbnum (bgcolor[6], '0'); if (!outcol) { size_t len = strlen (out); r_cons_rgb_str (out + len, sizeof (out) - len, &rcolor); } } else if (strlen (bgcolor) == 10) { rcolor.a |= ALPHA_BG; rcolor.r2 = rgbnum (bgcolor[4], bgcolor[5]); rcolor.g2 = rgbnum (bgcolor[6], bgcolor[7]); rcolor.b2 = rgbnum (bgcolor[8], bgcolor[9]); if (!outcol) { size_t len = strlen (out); r_cons_rgb_str (out + len, sizeof (out) - len, &rcolor); } } } // No suitable format, checking if colors are named for (i = 0; colors[i].name; i++) { if (!strcmp (fgcolor, colors[i].name)) { rcolor.r = colors[i].rcolor.r; rcolor.g = colors[i].rcolor.g; rcolor.b = colors[i].rcolor.b; if (!outcol) { strncat (out, colors[i].code, sizeof (out) - strlen (out) - 1); } } if (bgcolor && !strcmp (bgcolor, colors[i].name)) { rcolor.a |= ALPHA_BG; rcolor.r2 = colors[i].rcolor.r; // Initial color doesn't rcolor.g2 = colors[i].rcolor.g; // have r2, g2, b2 rcolor.b2 = colors[i].rcolor.b; if (!outcol) { strncat (out, colors[i].bgcode, sizeof (out) - strlen (out) - 1); } } } if (attr) { // Parse extra attributes. const char *p = attr; while (p) { if (!strncmp(p, "bold", 4)) { rcolor.attr |= R_CONS_ATTR_BOLD; } else if (!strncmp(p, "dim", 3)) { rcolor.attr |= 1u << 2; } else if (!strncmp(p, "italic", 6)) { rcolor.attr |= 1u << 3; } else if (!strncmp(p, "underline", 9)) { rcolor.attr |= 1u << 4; } else if (!strncmp(p, "blink", 5)) { rcolor.attr |= 1u << 5; } else { eprintf ("Failed to parse terminal attributes: %s\n", p); break; } p = strchr (p, ' '); if (p) { p++; } } } if (outcol) { if (outcol->a == ALPHA_BG && !bgcolor) { rcolor.a = ALPHA_BG; } *outcol = rcolor; } free (fgcolor); return (*out && !outcol) ? strdup (out) : NULL; }
R_API void r_cons_pal_list (int rad, const char *arg) { RConsPalette *pal = & (r_cons_singleton ()->pal); ut8 r, g, b, *p = (ut8*)pal; char *name, **color, rgbstr[32]; const char *hasnext; int i; if (rad == 'j') r_cons_print ("{"); for (i = 0; keys[i].name; i++) { color = (char**) (p + keys[i].off); switch (rad) { case 'j': r = g = b = 0; r_cons_rgb_parse (*color, &r, &g, &b, NULL); hasnext = (keys[i + 1].name) ? "," : ""; r_cons_printf ("\"%s\":[%d,%d,%d]%s", keys[i].name, r, g, b, hasnext); break; case 'c': { const char *prefix = r_str_chop_ro (arg); if (!prefix) { prefix = ""; } r = g = b = 0; r_cons_rgb_parse (*color, &r, &g, &b, NULL); hasnext = (keys[i + 1].name) ? "\n" : ""; //Need to replace the '.' char because this is not //valid CSS char *name = strdup (keys[i].name); int j, len = strlen (name); for (j = 0; j < len; j++) { if (name[j] == '.') { name[j] = '_'; } } r_cons_printf (".%s%s { color: rgb(%d, %d, %d); }%s", prefix, name, r, g, b, hasnext); free (name); } break; case 'h': r = g = b = 0; r_cons_rgb_parse (*color, &r, &g, &b, NULL); rgbstr[0] = 0; name = strdup (keys[i].name); r_str_replace_char (name, '.', '_'); r_cons_printf (".%s { color:#%02x%02x%02x }\n", name, r, g, b); free (name); break; case '*': case 'r': case 1: r = g = b = 0; r_cons_rgb_parse (*color, &r, &g, &b, NULL); rgbstr[0] = 0; r_cons_rgb_str (rgbstr, r, g, b, 0); r_cons_printf ("ec %s rgb:%02x%02x%02x\n", keys[i].name, r, g, b); break; default: r_cons_printf (" %s##"Color_RESET" %s\n", *color, keys[i].name); } } if (rad == 'j') r_cons_print ("}\n"); }