aboutsummaryrefslogtreecommitdiff
path: root/core/print.c
blob: 9eec477214cc4bd4f47255996ee177e309eba72f (plain)
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;
}