diff options
| author | Nathan Reiner <nathan@nathanreiner.xyz> | 2023-02-15 17:04:48 +0100 |
|---|---|---|
| committer | Nathan Reiner <nathan@nathanreiner.xyz> | 2023-02-15 17:04:48 +0100 |
| commit | 552899281eb67c6e652be15f46104c4de8c4a936 (patch) | |
| tree | 4d3f5588afd98dd7a31d5610ae2a8a6ca462cd3a /core | |
| parent | 5ecb8aafa496e9dfff51378be50eb29858b5465a (diff) | |
make print usable
Diffstat (limited to 'core')
| -rw-r--r-- | core/print.c | 109 |
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; } |