From 7f0fc08c05142f9f70cb05a4b1b1d6f0b1a3279b Mon Sep 17 00:00:00 2001 From: axtloss Date: Thu, 17 Oct 2024 02:39:27 +0200 Subject: Add strfmt --- src/extlib.h | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/extstring.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 146 insertions(+) (limited to 'src') diff --git a/src/extlib.h b/src/extlib.h index 03bb53b..c3d342a 100644 --- a/src/extlib.h +++ b/src/extlib.h @@ -6,6 +6,7 @@ #include #include #include +#include #ifdef USE_SECURE_MEM #define free(x) error - use free_secure @@ -76,3 +77,73 @@ float min (float v, float min_v); /// Limit a value between min and max float cap (float v, float min_v, float max_v); + +#ifndef STYLESDEF +/// Original 16 terminal colors +enum colors16 { + BLACK, + RED, + GREEN, + YELLOW, + BLUE, + MAGENTA, + CYAN, + WHITE, + GRAY, + BRIGHTRED, + BRIGHTGREEN, + BRIGHTYELLOW, + BRIGHTBLUE, + BRIGHTMAGENTA, + BRIGHTCYAN, + BRIGHTWHITE +}; + +enum grayscale { + GRAY1 = 232, + GRAY2, + GRAY3, + GRAY4, + GRAY5, + GRAY6, + GRAY7, + GRAY8, + GRAY9, + GRAY10, + GRAY11, + GRAY12, + GRAY13, + GRAY14, + GRAY15, + GRAY16, + GRAY17, + GRAY18, + GRAY19, + GRAY20, + GRAY21, + GRAY22, + GRAY23, + GRAY24 +}; + +enum effects { + BOLD = 1, + DIM = 2, + ITALIC = 4, + UNDERLINE = 8, + BLINKING = 16, + INVERSE = 32, + HIDDEN = 64, + STRIKETHROUGH = 128 +}; + +struct style { + int color; + bool background; + int styles; +}; +#define STYLESDEF +#endif + +/// Format a string with ANSI escape codes +char *strfmt (char *s, struct style); diff --git a/src/extstring.c b/src/extstring.c index b69b1f7..685db4f 100644 --- a/src/extstring.c +++ b/src/extstring.c @@ -8,6 +8,17 @@ #include #include "extlib.h" +enum gfxnums { + num_BOLD = 1, + num_DIM, + num_ITALIC, + num_UNDERLINE, + num_BLINKING, + num_INVERSE, + num_HIDDEN, + num_STRIKETHROUGH, +}; + char * strlwr (char *s) { @@ -122,3 +133,67 @@ join_str (char **s, size_t len, char *delim) return ret; } + +// all freed strings in this function dont contain confidential data +// so free_secure isnt necessary +#undef free +void +append_gfxsqnc (char **escape_sqnc, size_t *sqnc_size, int gfx_num) +{ + size_t gfxbase_len = strlen ("\e[XXm")+1; + char *tmp_sqnc = malloc (*sqnc_size + gfxbase_len); + *sqnc_size += gfxbase_len; + sprintf (tmp_sqnc, "%s\e[%dm", *escape_sqnc, gfx_num); + free (*escape_sqnc); + *escape_sqnc = tmp_sqnc; +} + +char * +strfmt (char *s, struct style fmt) +{ + size_t gfxbase_len = strlen ("\e[XXm")+1; + size_t sqnc_size = strlen ("\e[0m") + strlen (s)+1; + char *escape_sqnc = strdup (""); + if (fmt.color > 0) { + char *clrbase = malloc (strlen ("\e[38;5;m")+4); + sprintf (clrbase, "\e[%d;5;%dm", fmt.background ? 48 : 38, fmt.color); + char *tmp_sqnc = malloc (sqnc_size + strlen (clrbase)); + sqnc_size += strlen (clrbase); + sprintf (tmp_sqnc, "%s%s", escape_sqnc, clrbase); + free (escape_sqnc); + escape_sqnc = tmp_sqnc; + free (clrbase); + } + + if ((fmt.styles & BOLD)) + append_gfxsqnc (&escape_sqnc, &sqnc_size, num_BOLD); + + if ((fmt.styles & DIM)) + append_gfxsqnc (&escape_sqnc, &sqnc_size, num_DIM); + + if ((fmt.styles & ITALIC)) + append_gfxsqnc (&escape_sqnc, &sqnc_size, num_ITALIC); + + if ((fmt.styles & UNDERLINE)) + append_gfxsqnc (&escape_sqnc, &sqnc_size, num_UNDERLINE); + + if ((fmt.styles & BLINKING)) + append_gfxsqnc (&escape_sqnc, &sqnc_size, num_BLINKING); + + if ((fmt.styles & INVERSE)) + append_gfxsqnc (&escape_sqnc, &sqnc_size, num_INVERSE); + + if ((fmt.styles & HIDDEN)) + append_gfxsqnc (&escape_sqnc, &sqnc_size, num_HIDDEN); + + if ((fmt.styles & STRIKETHROUGH)) + append_gfxsqnc (&escape_sqnc, &sqnc_size, num_STRIKETHROUGH); + + if (strlen (escape_sqnc) <= 2) { + free (escape_sqnc); + return strdup (s); + } + + sprintf (escape_sqnc, "%s%s\e[0m", escape_sqnc, s); + return escape_sqnc; +} -- cgit v1.2.3