aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoraxtloss <axtlos@disroot.org>2024-10-17 02:39:27 +0200
committeraxtloss <axtlos@disroot.org>2024-10-17 02:39:27 +0200
commit7f0fc08c05142f9f70cb05a4b1b1d6f0b1a3279b (patch)
tree0c1934e2d6940a99e97f2adefdac46cd3b9e384d /src
parentb2182396df5d99ff5c26161aaffa5ced879742c5 (diff)
downloadextlib-7f0fc08c05142f9f70cb05a4b1b1d6f0b1a3279b.tar.gz
extlib-7f0fc08c05142f9f70cb05a4b1b1d6f0b1a3279b.tar.bz2
Add strfmt
Diffstat (limited to 'src')
-rw-r--r--src/extlib.h71
-rw-r--r--src/extstring.c75
2 files changed, 146 insertions, 0 deletions
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 <stdio.h>
#include <unistd.h>
#include <stdint.h>
+#include <stdbool.h>
#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 <ctype.h>
#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;
+}