1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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)
{
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;
}
|