aboutsummaryrefslogtreecommitdiff
path: root/src/main.cpp
diff options
context:
space:
mode:
authorLaytan Laats <laytanlaats@hotmail.com>2023-07-02 21:11:19 +0200
committerLaytan Laats <laytanlaats@hotmail.com>2023-07-02 21:11:19 +0200
commitf68a3639b4ce2ba8fe90f6907e162ff0a5bbadc7 (patch)
tree34ea101844d79d2cd317282f707de4a20e2a7808 /src/main.cpp
parentf4e87c9720fada536c756110f900c4317fc1c1ce (diff)
use more common detection method and add FORCE_COLOR and NO_COLOR support
Diffstat (limited to 'src/main.cpp')
-rw-r--r--src/main.cpp36
1 files changed, 21 insertions, 15 deletions
diff --git a/src/main.cpp b/src/main.cpp
index 80a6c819c..0bd45b1eb 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -2547,12 +2547,24 @@ gb_internal int strip_semicolons(Parser *parser) {
return cast(int)failed;
}
-#if defined(GB_SYSTEM_OSX) || defined(GB_SYSTEM_UNIX)
-#include <stdio.h>
-#endif
-
gb_internal void init_terminal(void) {
build_context.has_ansi_terminal_colours = false;
+
+ gbAllocator a = heap_allocator();
+
+ char const *no_color = gb_get_env("NO_COLOR", a);
+ defer (gb_free(a, cast(void *)no_color));
+ if (no_color != nullptr) {
+ return;
+ }
+
+ char const *force_color = gb_get_env("FORCE_COLOR", a);
+ defer (gb_free(a, cast(void *)force_color));
+ if (force_color != nullptr) {
+ build_context.has_ansi_terminal_colours = true;
+ return;
+ }
+
#if defined(GB_SYSTEM_WINDOWS)
HANDLE hnd = GetStdHandle(STD_ERROR_HANDLE);
DWORD mode = 0;
@@ -2563,21 +2575,15 @@ gb_internal void init_terminal(void) {
}
}
#elif defined(GB_SYSTEM_OSX) || defined(GB_SYSTEM_UNIX)
- FILE* file = popen("tput colors 2>/dev/null", "r");
- if (file) {
- char buffer[20];
- if (fgets(&buffer[0], 20, file)) {
- u64 colors = gb_str_to_u64(buffer, nullptr, 10);
- if (colors >= 8) {
- build_context.has_ansi_terminal_colours = true;
- }
- }
- pclose(file);
+ char const *term_ = gb_get_env("TERM", a);
+ defer (gb_free(a, cast(void *)term_));
+ String term = make_string_c(term_);
+ if (!str_eq(term, str_lit("dumb")) && isatty(STDERR_FILENO)) {
+ build_context.has_ansi_terminal_colours = true;
}
#endif
if (!build_context.has_ansi_terminal_colours) {
- gbAllocator a = heap_allocator();
char const *odin_terminal_ = gb_get_env("ODIN_TERMINAL", a);
defer (gb_free(a, cast(void *)odin_terminal_));
String odin_terminal = make_string_c(odin_terminal_);