aboutsummaryrefslogtreecommitdiff
path: root/core/print.c
diff options
context:
space:
mode:
authorNathan Reiner <nathan@nathanreiner.xyz>2023-02-15 17:04:48 +0100
committerNathan Reiner <nathan@nathanreiner.xyz>2023-02-15 17:04:48 +0100
commit552899281eb67c6e652be15f46104c4de8c4a936 (patch)
tree4d3f5588afd98dd7a31d5610ae2a8a6ca462cd3a /core/print.c
parent5ecb8aafa496e9dfff51378be50eb29858b5465a (diff)
make print usable
Diffstat (limited to 'core/print.c')
-rw-r--r--core/print.c109
1 files changed, 107 insertions, 2 deletions
diff --git a/core/print.c b/core/print.c
index f0134b9..9eec477 100644
--- a/core/print.c
+++ b/core/print.c
@@ -1,7 +1,112 @@
#include "../lib/io/io.h"
+#include "../lib/malloc/malloc.h"
+#include "../lib/cstr/cstr.h"
+#include "../lib/aec/aec.h"
int main(int argc, char **argv)
{
- for (int i = 1; i < argc; ++i) wstdf("%s ", argv[i]);
- wstd("\n");
+ if (argc < 2) {
+ wff(STDERR_FD, "print <template> [args...]")
+ }
+
+ char *buf = malloc(cstr_length(argv[0]) + 1);
+ char *arg1 = argv[1];
+ char *p = buf;
+ int args_count = 0;
+ void **args = (void **)argv + 2;
+
+ for (; *arg1; ++arg1) {
+ if (*arg1 == '\\') {
+ switch (*(arg1 + 1)) {
+ case 'n': *p = '\n'; break;
+ case 'r': *p = '\r'; break;
+ case 'b': *p = '\b'; break;
+ case 'e': *p = '\e'; break;
+ case 'a': *p = '\a'; break;
+ case 'f': *p = '\f'; break;
+ case 't': *p = '\t'; break;
+ case 'v': *p = '\v'; break;
+ default: --arg1;
+ }
+
+ arg1++;
+ } else {
+ *p = *arg1;
+
+ if (*arg1 == '%' && args_count < argc - 2) {
+ switch (*(arg1 + 1)) {
+ case 'i': args[args_count] = (void*)cstr_to_i64(args[args_count]); break;
+ case 'B':
+ case 'F':
+ if (cstr_compare(args[args_count], "BLACK") == 0)
+ args[args_count] = COLOR_BLACK;
+ else if (cstr_compare(args[args_count], "RED") == 0)
+ args[args_count] = COLOR_RED;
+ else if (cstr_compare(args[args_count], "GREEN") == 0)
+ args[args_count] = COLOR_GREEN;
+ else if (cstr_compare(args[args_count], "YELLOW") == 0)
+ args[args_count] = COLOR_YELLOW;
+ else if (cstr_compare(args[args_count], "BLUE") == 0)
+ args[args_count] = COLOR_BLUE;
+ else if (cstr_compare(args[args_count], "PINK") == 0)
+ args[args_count] = COLOR_PINK;
+ else if (cstr_compare(args[args_count], "CYAN") == 0)
+ args[args_count] = COLOR_CYAN;
+ else if (cstr_compare(args[args_count], "WHITE") == 0)
+ args[args_count] = COLOR_WHITE;
+ break;
+ case 'S':
+ if (cstr_compare(args[args_count], "RESET") == 0)
+ args[args_count] = SGR_RESET;
+ else if (cstr_compare(args[args_count], "BOLD") == 0)
+ args[args_count] = SGR_BOLD;
+ else if (cstr_compare(args[args_count], "FAINT") == 0)
+ args[args_count] = SGR_FAINT;
+ else if (cstr_compare(args[args_count], "ITALIC") == 0)
+ args[args_count] = SGR_ITALIC;
+ else if (cstr_compare(args[args_count], "UNDERLINE") == 0)
+ args[args_count] = SGR_UNDERLINE;
+ else if (cstr_compare(args[args_count], "SLOW_BLINK") == 0)
+ args[args_count] = SGR_SLOW_BLINK;
+ else if (cstr_compare(args[args_count], "RAPID_BLINK") == 0)
+ args[args_count] = SGR_RAPID_BLINK;
+ else if (cstr_compare(args[args_count], "REVERSE") == 0)
+ args[args_count] = SGR_REVERSE;
+ else if (cstr_compare(args[args_count], "CONCEAL") == 0)
+ args[args_count] = SGR_CONCEAL;
+ else if (cstr_compare(args[args_count], "CROSSED_OUT") == 0)
+ args[args_count] = SGR_CROSSED_OUT;
+ else if (cstr_compare(args[args_count], "UNDERLINE_DOUBLE") == 0)
+ args[args_count] = SGR_UNDERLINE_DOUBLE;
+ else if (cstr_compare(args[args_count], "INTENSITY_OFF") == 0)
+ args[args_count] = SGR_INTENSITY_OFF;
+ else if (cstr_compare(args[args_count], "ITALIC_OFF") == 0)
+ args[args_count] = SGR_ITALIC_OFF;
+ else if (cstr_compare(args[args_count], "UNDERLINE_OFF") == 0)
+ args[args_count] = SGR_UNDERLINE_OFF;
+ else if (cstr_compare(args[args_count], "BLINK_OFF") == 0)
+ args[args_count] = SGR_BLINK_OFF;
+ else if (cstr_compare(args[args_count], "REVERSE_OFF") == 0)
+ args[args_count] = SGR_REVERSE_OFF;
+ else if (cstr_compare(args[args_count], "CONCEAL_OFF") == 0)
+ args[args_count] = SGR_CONCEAL_OFF;
+ else if (cstr_compare(args[args_count], "CROSSED_OUT") == 0)
+ args[args_count] = SGR_CROSSED_OUT;
+ else if (cstr_compare(args[args_count], "OVERLINED") == 0)
+ args[args_count] = SGR_OVERLINED;
+ else if (cstr_compare(args[args_count], "OVERLINED_OFF") == 0)
+ args[args_count] = SGR_OVERLINED_OFF;
+ break;
+ }
+
+ args_count++;
+ }
+ }
+
+ ++p;
+ }
+
+ wstdf__(buf, (const void**)args);
+
+ return 0;
}