| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #include <stdbool.h> | ||
| 2 | #include <stdio.h> | ||
| 3 | #include "palette.h" | ||
| 4 | |||
| 5 | 18 | static void seq ( | |
| 6 | const char *sgr_prefix, | ||
| 7 | unsigned int seq_start, | ||
| 8 | unsigned int seq_end, | ||
| 9 | int width, // Space-padded width of printed number | ||
| 10 | const char *suffix, | ||
| 11 | bool sgr_starts_at_zero | ||
| 12 | ) { | ||
| 13 |
2/2✓ Branch 7 → 3 taken 270 times.
✓ Branch 7 → 8 taken 18 times.
|
288 | for (unsigned int i = seq_start; i <= seq_end; i++) { |
| 14 |
2/2✓ Branch 3 → 4 taken 15 times.
✓ Branch 3 → 5 taken 255 times.
|
270 | unsigned int sgr = sgr_starts_at_zero ? i - seq_start : i; |
| 15 | 270 | fprintf(stdout, "\033[%s%um %*u%s", sgr_prefix, sgr, width, i, suffix); | |
| 16 | } | ||
| 17 | 18 | } | |
| 18 | |||
| 19 | 34 | static void str(const char *s) | |
| 20 | { | ||
| 21 | 34 | fputs(s, stdout); | |
| 22 | 34 | } | |
| 23 | |||
| 24 | // Print a visual representation of the XTerm style color palette to | ||
| 25 | // stdout. No effort is made to limit the emitted SGR sequences to the | ||
| 26 | // set supported by the terminal, or even to detect whether stdout is | ||
| 27 | // in fact a terminal. | ||
| 28 | 1 | ExitCode print_256_color_palette(void) | |
| 29 | { | ||
| 30 | // Row 1: basic ECMA-48 palette colors | ||
| 31 | 1 | str("\033[0m\n "); | |
| 32 | 1 | seq("4", 0, 6, 2, " ", false); | |
| 33 | 1 | str("\033[30;47m 7 \033[0m"); | |
| 34 | 1 | seq("3", 0, 7, 2, " ", false); | |
| 35 | 1 | str("\033[0m default \033[0m\n "); | |
| 36 | |||
| 37 | // Row 2: aixterm-style "bright" palette colors | ||
| 38 | 1 | seq("10", 8, 14, 2, " ", true); | |
| 39 | 1 | str("\033[30;107m 15 \033[0m"); | |
| 40 | 1 | seq("9", 8, 15, 2, " ", true); | |
| 41 | 1 | str("\033[0;2m dim\033[0m\n\n"); | |
| 42 | |||
| 43 | // First half of color cube (light foreground) | ||
| 44 | 1 | str("\033[38;5;253m"); | |
| 45 |
2/2✓ Branch 17 → 13 taken 6 times.
✓ Branch 17 → 18 taken 1 time.
|
7 | for (unsigned int i = 0; i < 6; i++) { |
| 46 | 6 | unsigned int start = 16 + (i * 36); // Sequence: 16 52 88 124 160 196 | |
| 47 | 6 | str(" "); | |
| 48 | 6 | seq("48;5;", start, start + 17, 3, "", false); | |
| 49 | 6 | str("\033[49m\n"); | |
| 50 | } | ||
| 51 | |||
| 52 | // Second half of color cube (dark foreground) | ||
| 53 | 1 | str("\033[38;5;235m"); | |
| 54 |
2/2✓ Branch 24 → 20 taken 6 times.
✓ Branch 24 → 25 taken 1 time.
|
7 | for (unsigned int i = 0; i < 6; i++) { |
| 55 | 6 | unsigned int start = 34 + (i * 36); // Sequence: 34 70 106 142 178 214 | |
| 56 | 6 | str(" "); | |
| 57 | 6 | seq("48;5;", start, start + 17, 3, "", false); | |
| 58 | 6 | str("\033[49m\n"); | |
| 59 | } | ||
| 60 | |||
| 61 | // First row of grayscales (light foreground) | ||
| 62 | 1 | str("\033[0;38;5;253m\n "); | |
| 63 | 1 | seq("48;5;", 232, 243, 4, " ", false); | |
| 64 | |||
| 65 | // Second row of grayscales (dark foreground) | ||
| 66 | 1 | str("\033[0;38;5;235m\n "); | |
| 67 | 1 | seq("48;5;", 244, 255, 4, " ", false); | |
| 68 | |||
| 69 | 1 | str("\033[0m\n\n"); | |
| 70 | 1 | return EC_OK; | |
| 71 | } | ||
| 72 |