diff options
Diffstat (limited to 'chad/experimental')
| -rw-r--r-- | chad/experimental/bits.h | 25 | ||||
| -rw-r--r-- | chad/experimental/nargs.h | 20 | ||||
| -rw-r--r-- | chad/experimental/strlist.h | 60 | ||||
| -rw-r--r-- | chad/experimental/terminal.h | 31 |
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 |
