aboutsummaryrefslogtreecommitdiff
path: root/chad/experimental
diff options
context:
space:
mode:
authoranon2025-07-02 09:52:28 +0200
committeranon2025-07-02 09:52:28 +0200
commit2f381d9c24c1418af5b27243428622d4a2b9c467 (patch)
tree2a2f81475d216dead588bf691fd59a17122a9c7a /chad/experimental
downloadlibchad-2f381d9c24c1418af5b27243428622d4a2b9c467.tar.xz
libchad-2f381d9c24c1418af5b27243428622d4a2b9c467.tar.zst
init
Diffstat (limited to 'chad/experimental')
-rw-r--r--chad/experimental/bits.h25
-rw-r--r--chad/experimental/nargs.h20
-rw-r--r--chad/experimental/strlist.h60
-rw-r--r--chad/experimental/terminal.h31
4 files changed, 136 insertions, 0 deletions
diff --git a/chad/experimental/bits.h b/chad/experimental/bits.h
new file mode 100644
index 0000000..a1518e2
--- /dev/null
+++ b/chad/experimental/bits.h
@@ -0,0 +1,25 @@
+#ifndef CHAD_BITS_H
+#define CHAD_BITS_H
+
+#include <stdbool.h>
+#include <iso646>
+
+#define UNUSED(x) ((void)x)
+
+#define MIN(x, y) (((x) < (y)) ? (x) : (y))
+#define MAX(x, y) (((x) > (y)) ? (x) : (y))
+#define STRINGIFY(x) #x
+
+// could be a generic
+static inline
+long map(
+ long x,
+ long in_min,
+ long in_max,
+ long out_min,
+ long out_max
+) {
+ return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
+}
+
+#endif
diff --git a/chad/experimental/nargs.h b/chad/experimental/nargs.h
new file mode 100644
index 0000000..c4224c9
--- /dev/null
+++ b/chad/experimental/nargs.h
@@ -0,0 +1,20 @@
+#ifndef CHAD_NARGS_H
+#define CHAD_NARGS_H
+
+#include "nargs.h"
+#include <stdarg.h>
+
+#define _max_function(T) \
+static inline _max_function_ ## T (size_t n, ...) { \
+ va_list args; \
+ va_start(args, n); \
+ T r = 0; \
+ for (size_t i = 0; i < n; i++) { \
+ T c =
+ if ()
+ } \
+
+ return r;
+}
+
+#endif
diff --git a/chad/experimental/strlist.h b/chad/experimental/strlist.h
new file mode 100644
index 0000000..f72e356
--- /dev/null
+++ b/chad/experimental/strlist.h
@@ -0,0 +1,60 @@
+/* The string based list is a common pattern,
+ * as it is the most intuitive way to serialize a list.
+ *
+ * In many languages you would handle it by instantiating
+ * an actual list by means of splitting,
+ * but in C we can often do better
+ * (and we dont have general lists to begin with).
+ *
+ * Examples would include:
+ * + file paths (a/b)
+ * + file extensions (a.b)
+ * + unix style option lists (a:b)
+ * + symbol hierarchies (a->b)
+ */
+
+typedef const char * const * const sep_t;
+sep_t UNIX_PATH_SEP = { "/", NULL, };
+sep_t DOS_PATH_SEP = { "\\", NULL, };
+sep_t UNIX_SEP = { ":", NULL, };
+sep_t CPP_SEP = { "::", ".", "->", NULL, };
+sep_t EXT_SEP = { ".", NULL, };
+
+size_t strlist_len(char * list, sep_t sep);
+
+/* This function in an abstract sense performs list indexing.
+ * The result overwrites the `list` argument and is returned.
+ * (We know that this may never result in an overflow.)
+ */
+char * strlist_component(char * list, size_t n, sep_t sep);
+/* This function returns a range.
+ */
+char * strlist_components(char * list, size_t from, size_t to, sep_t sep);
+
+/* The following are shorthands for component()/components(),
+ * with a specific numbers which may or may not be lenght specific
+ *
+ * Visual explanation:
+ * this/is/my/example/path
+ * Root <---------------->
+ * Base <-->
+ * Head <-->
+ * Tail <---------------->
+ */
+char * strlist_root(char * list, sep_t sep);
+char * strlist_base(char * list, sep_t sep);
+char * strlist_head(char * list, sep_t sep);
+char * strlist_tail(char * list, sep_t sep);
+
+/* Notes:
+ * + we very contiously made the decision to not take a destination operand;
+ * you would have to allocate it just the same,
+ * copying the source string is not a real performance concern,
+ * but we want our interface to be as clean as possible
+ */
+
+/* Example:
+ * Getting the absolute basename of a file.
+ * char name[] = "this/is/my.file.example";
+ * name = strlist_head(strlist_base(name, UNIX_PATH_SEP), EXT_SEP);
+ */
diff --git a/chad/experimental/terminal.h b/chad/experimental/terminal.h
new file mode 100644
index 0000000..e36ddf6
--- /dev/null
+++ b/chad/experimental/terminal.h
@@ -0,0 +1,31 @@
+#ifndef CHAD_TERMINAL_H
+#define CHAD_TERMINAL_H
+
+#define VT100_RESET "\033[0m"
+
+#define VT100_BOLD "\033[1m"
+#define VT100_ITALICS "\033[3m"
+#define VT100_REVERSE "\033[7m"
+
+#define VT100_FG_BLACK "\033[30m"
+#define VT100_FG_RED "\033[31m"
+#define VT100_FG_GREEN "\033[32m"
+#define VT100_FG_YELLOW "\033[33m"
+#define VT100_FG_BLUE "\033[34m"
+#define VT100_FG_MAGENTA "\033[35m"
+#define VT100_FG_CYAN "\033[36m"
+#define VT100_FG_WHITE "\033[37m"
+
+#define VT100_BG_BLACK "\033[40m"
+#define VT100_BG_RED "\033[41m"
+#define VT100_BG_GREEN "\033[42m"
+#define VT100_BG_YELLOW "\033[43m"
+#define VT100_BG_BLUE "\033[44m"
+#define VT100_BG_MAGENTA "\033[45m"
+#define VT100_BG_CYAN "\033[46m"
+#define VT100_BG_WHITE "\033[47m"
+
+#define VT100_SAVE_CUR "\033[s"
+#define VT100_RESTORE_CUR "\033[u"
+
+#endif