/*
- * Babeltrace common functions
+ * SPDX-License-Identifier: MIT
*
* Copyright 2016 Philippe Proulx <pproulx@efficios.com>
*
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
+ * Babeltrace common functions
*/
#define BT_LOG_OUTPUT_LEVEL log_level
#include "common/macros.h"
#include "common/common.h"
#include "compat/unistd.h"
+#include "compat/limits.h"
#ifndef __MINGW32__
#include <pwd.h>
static const char *bt_common_color_code_bg_cyan = "";
static const char *bt_common_color_code_bg_light_gray = "";
+/*
+ * A color codes structure always filled with the proper color codes for the
+ * terminal.
+ */
+static struct bt_common_color_codes color_codes;
+
+/*
+ * A color codes structure always filled with empty strings, for when we want no
+ * colors.
+ */
+static struct bt_common_color_codes no_color_codes = {
+ "", "", "", "", "", "", "", "", "", "",
+ "", "", "", "", "", "", "", "", "", "",
+ "", "", "", "", "",
+};
+
static
void __attribute__((constructor)) bt_common_color_ctor(void)
{
- if (bt_common_colors_supported()) {
- const char *term_env_var;
- const char *bright_means_bold_env_var;
- bool bright_means_bold = true;
+ const char *term_env_var;
+ const char *bright_means_bold_env_var;
+ bool bright_means_bold = true;
+ const char *code_fg_bright_red;
+ const char *code_fg_bright_green;
+ const char *code_fg_bright_yellow;
+ const char *code_fg_bright_blue;
+ const char *code_fg_bright_magenta;
+ const char *code_fg_bright_cyan;
+ const char *code_fg_bright_light_gray;
+
+ /*
+ * Check whether or not the terminal supports having
+ * bold foreground colors which do _not_ become bright
+ * colors, that is, the lines
+ *
+ * $ echo -e "\033[31mTHIS\n\033[1mTHAT\033[0m"
+ *
+ * have the _same_ color, but `THAT` uses a bold font.
+ *
+ * This is the case of the kitty terminal emulator.
+ *
+ * It's also possible with GNOME Terminal since 3.27.2
+ * and xfce4-terminal since 0.8.7 (and GNOME VTE since
+ * 0.51.2), but it's user-configurable. Since we don't
+ * have this configuration value here, assume it's not
+ * the case to support old versions of GNOME Terminal.
+ *
+ * Any user can set the
+ * `BABELTRACE_TERM_COLOR_BRIGHT_MEANS_BOLD` environment
+ * variable to `0` to use the bright foreground color
+ * codes instead of making the normal foreground color
+ * codes bold.
+ *
+ * Summary:
+ *
+ * With kitty or when
+ * `BABELTRACE_TERM_COLOR_BRIGHT_MEANS_BOLD` is `0`:
+ * Output bright colors using dedicated SGR codes
+ * 90 to 97.
+ *
+ * Otherwise:
+ * Output bright colors with bold + SGR codes 30 to
+ * 37.
+ */
+ term_env_var = getenv("TERM");
+
+ if (term_env_var && strcmp(term_env_var, "xterm-kitty") == 0) {
+ /*
+ * The kitty terminal emulator supports
+ * non-bright bold foreground colors.
+ */
+ bright_means_bold = false;
+ }
+ bright_means_bold_env_var =
+ getenv("BABELTRACE_TERM_COLOR_BRIGHT_MEANS_BOLD");
+
+ if (bright_means_bold_env_var) {
+ bright_means_bold =
+ !(strcmp(bright_means_bold_env_var, "0") == 0);
+ }
+
+ if (bright_means_bold) {
+ code_fg_bright_red = BT_COMMON_COLOR_FG_BOLD_RED;
+ code_fg_bright_green = BT_COMMON_COLOR_FG_BOLD_GREEN;
+ code_fg_bright_yellow = BT_COMMON_COLOR_FG_BOLD_YELLOW;
+ code_fg_bright_blue = BT_COMMON_COLOR_FG_BOLD_BLUE;
+ code_fg_bright_magenta = BT_COMMON_COLOR_FG_BOLD_MAGENTA;
+ code_fg_bright_cyan = BT_COMMON_COLOR_FG_BOLD_CYAN;
+ code_fg_bright_light_gray = BT_COMMON_COLOR_FG_BOLD_LIGHT_GRAY;
+ } else {
+ code_fg_bright_red = BT_COMMON_COLOR_FG_BRIGHT_RED;
+ code_fg_bright_green = BT_COMMON_COLOR_FG_BRIGHT_GREEN;
+ code_fg_bright_yellow = BT_COMMON_COLOR_FG_BRIGHT_YELLOW;
+ code_fg_bright_blue = BT_COMMON_COLOR_FG_BRIGHT_BLUE;
+ code_fg_bright_magenta = BT_COMMON_COLOR_FG_BRIGHT_MAGENTA;
+ code_fg_bright_cyan = BT_COMMON_COLOR_FG_BRIGHT_CYAN;
+ code_fg_bright_light_gray = BT_COMMON_COLOR_FG_BRIGHT_LIGHT_GRAY;
+ }
+
+ if (bt_common_colors_supported()) {
bt_common_color_code_reset = BT_COMMON_COLOR_RESET;
bt_common_color_code_bold = BT_COMMON_COLOR_BOLD;
bt_common_color_code_fg_default = BT_COMMON_COLOR_FG_DEFAULT;
bt_common_color_code_fg_cyan = BT_COMMON_COLOR_FG_CYAN;
bt_common_color_code_fg_light_gray = BT_COMMON_COLOR_FG_LIGHT_GRAY;
- /*
- * Check whether or not the terminal supports having
- * bold foreground colors which do _not_ become bright
- * colors, that is, the lines
- *
- * $ echo -e "\033[31mTHIS\n\033[1mTHAT\033[0m"
- *
- * have the _same_ color, but `THAT` uses a bold font.
- *
- * This is the case of the kitty terminal emulator.
- *
- * It's also possible with GNOME Terminal since 3.27.2
- * and xfce4-terminal since 0.8.7 (and GNOME VTE since
- * 0.51.2), but it's user-configurable. Since we don't
- * have this configuration value here, assume it's not
- * the case to support old versions of GNOME Terminal.
- *
- * Any user can set the
- * `BABELTRACE_TERM_COLOR_BRIGHT_MEANS_BOLD` environment
- * variable to `0` to use the bright foreground color
- * codes instead of making the normal foreground color
- * codes bold.
- *
- * Summary:
- *
- * With kitty or when
- * `BABELTRACE_TERM_COLOR_BRIGHT_MEANS_BOLD` is `0`:
- * Output bright colors using dedicated SGR codes
- * 90 to 97.
- *
- * Otherwise:
- * Output bright colors with bold + SGR codes 30 to
- * 37.
- */
- term_env_var = getenv("TERM");
- BT_ASSERT(term_env_var);
-
- if (strcmp(term_env_var, "xterm-kitty") == 0) {
- /*
- * The kitty terminal emulator supports
- * non-bright bold foreground colors.
- */
- bright_means_bold = false;
- }
-
- bright_means_bold_env_var =
- getenv("BABELTRACE_TERM_COLOR_BRIGHT_MEANS_BOLD");
-
- if (bright_means_bold_env_var) {
- bright_means_bold =
- !(strcmp(bright_means_bold_env_var, "0") == 0);
- }
-
- if (bright_means_bold) {
- bt_common_color_code_fg_bright_red = BT_COMMON_COLOR_FG_BOLD_RED;
- bt_common_color_code_fg_bright_green = BT_COMMON_COLOR_FG_BOLD_GREEN;
- bt_common_color_code_fg_bright_yellow = BT_COMMON_COLOR_FG_BOLD_YELLOW;
- bt_common_color_code_fg_bright_blue = BT_COMMON_COLOR_FG_BOLD_BLUE;
- bt_common_color_code_fg_bright_magenta = BT_COMMON_COLOR_FG_BOLD_MAGENTA;
- bt_common_color_code_fg_bright_cyan = BT_COMMON_COLOR_FG_BOLD_CYAN;
- bt_common_color_code_fg_bright_light_gray = BT_COMMON_COLOR_FG_BOLD_LIGHT_GRAY;
- } else {
- bt_common_color_code_fg_bright_red = BT_COMMON_COLOR_FG_BRIGHT_RED;
- bt_common_color_code_fg_bright_green = BT_COMMON_COLOR_FG_BRIGHT_GREEN;
- bt_common_color_code_fg_bright_yellow = BT_COMMON_COLOR_FG_BRIGHT_YELLOW;
- bt_common_color_code_fg_bright_blue = BT_COMMON_COLOR_FG_BRIGHT_BLUE;
- bt_common_color_code_fg_bright_magenta = BT_COMMON_COLOR_FG_BRIGHT_MAGENTA;
- bt_common_color_code_fg_bright_cyan = BT_COMMON_COLOR_FG_BRIGHT_CYAN;
- bt_common_color_code_fg_bright_light_gray = BT_COMMON_COLOR_FG_BRIGHT_LIGHT_GRAY;
- }
+ bt_common_color_code_fg_bright_red = code_fg_bright_red;
+ bt_common_color_code_fg_bright_green = code_fg_bright_green;
+ bt_common_color_code_fg_bright_yellow = code_fg_bright_yellow;
+ bt_common_color_code_fg_bright_blue = code_fg_bright_blue;
+ bt_common_color_code_fg_bright_magenta = code_fg_bright_magenta;
+ bt_common_color_code_fg_bright_cyan = code_fg_bright_cyan;
+ bt_common_color_code_fg_bright_light_gray = code_fg_bright_light_gray;
bt_common_color_code_bg_default = BT_COMMON_COLOR_BG_DEFAULT;
bt_common_color_code_bg_red = BT_COMMON_COLOR_BG_RED;
bt_common_color_code_bg_cyan = BT_COMMON_COLOR_BG_CYAN;
bt_common_color_code_bg_light_gray = BT_COMMON_COLOR_BG_LIGHT_GRAY;
}
+
+ color_codes.reset = BT_COMMON_COLOR_RESET;
+ color_codes.bold = BT_COMMON_COLOR_BOLD;
+ color_codes.fg_default = BT_COMMON_COLOR_FG_DEFAULT;
+ color_codes.fg_red = BT_COMMON_COLOR_FG_RED;
+ color_codes.fg_green = BT_COMMON_COLOR_FG_GREEN;
+ color_codes.fg_yellow = BT_COMMON_COLOR_FG_YELLOW;
+ color_codes.fg_blue = BT_COMMON_COLOR_FG_BLUE;
+ color_codes.fg_magenta = BT_COMMON_COLOR_FG_MAGENTA;
+ color_codes.fg_cyan = BT_COMMON_COLOR_FG_CYAN;
+ color_codes.fg_light_gray = BT_COMMON_COLOR_FG_LIGHT_GRAY;
+ color_codes.fg_bright_red = code_fg_bright_red;
+ color_codes.fg_bright_green = code_fg_bright_green;
+ color_codes.fg_bright_yellow = code_fg_bright_yellow;
+ color_codes.fg_bright_blue = code_fg_bright_blue;
+ color_codes.fg_bright_magenta = code_fg_bright_magenta;
+ color_codes.fg_bright_cyan = code_fg_bright_cyan;
+ color_codes.fg_bright_light_gray = code_fg_bright_light_gray;
+ color_codes.bg_default = BT_COMMON_COLOR_BG_DEFAULT;
+ color_codes.bg_red = BT_COMMON_COLOR_BG_RED;
+ color_codes.bg_green = BT_COMMON_COLOR_BG_GREEN;
+ color_codes.bg_yellow = BT_COMMON_COLOR_BG_YELLOW;
+ color_codes.bg_blue = BT_COMMON_COLOR_BG_BLUE;
+ color_codes.bg_magenta = BT_COMMON_COLOR_BG_MAGENTA;
+ color_codes.bg_cyan = BT_COMMON_COLOR_BG_CYAN;
+ color_codes.bg_light_gray = BT_COMMON_COLOR_BG_LIGHT_GRAY;
}
-BT_HIDDEN
const char *bt_common_get_system_plugin_path(void)
{
return SYSTEM_PLUGIN_PATH;
}
#ifdef __MINGW32__
-BT_HIDDEN
bool bt_common_is_setuid_setgid(void)
{
return false;
}
#else /* __MINGW32__ */
-BT_HIDDEN
bool bt_common_is_setuid_setgid(void)
{
return (geteuid() != getuid() || getegid() != getgid());
}
#endif /* __MINGW32__ */
-BT_HIDDEN
char *bt_common_get_home_plugin_path(int log_level)
{
char *path = NULL;
return path;
}
-BT_HIDDEN
int bt_common_append_plugin_path_dirs(const char *paths, GPtrArray *dirs)
{
int ret = 0;
return istty;
}
-BT_HIDDEN
bool bt_common_colors_supported(void)
{
static bool supports_colors = false;
return supports_colors;
}
-BT_HIDDEN
const char *bt_common_color_reset(void)
{
return bt_common_color_code_reset;
}
-BT_HIDDEN
const char *bt_common_color_bold(void)
{
return bt_common_color_code_bold;
}
-BT_HIDDEN
const char *bt_common_color_fg_default(void)
{
return bt_common_color_code_fg_default;
}
-BT_HIDDEN
const char *bt_common_color_fg_red(void)
{
return bt_common_color_code_fg_red;
}
-BT_HIDDEN
const char *bt_common_color_fg_green(void)
{
return bt_common_color_code_fg_green;
}
-BT_HIDDEN
const char *bt_common_color_fg_yellow(void)
{
return bt_common_color_code_fg_yellow;
}
-BT_HIDDEN
const char *bt_common_color_fg_blue(void)
{
return bt_common_color_code_fg_blue;
}
-BT_HIDDEN
const char *bt_common_color_fg_magenta(void)
{
return bt_common_color_code_fg_magenta;
}
-BT_HIDDEN
const char *bt_common_color_fg_cyan(void)
{
return bt_common_color_code_fg_cyan;
}
-BT_HIDDEN
const char *bt_common_color_fg_light_gray(void)
{
return bt_common_color_code_fg_light_gray;
}
-BT_HIDDEN
const char *bt_common_color_fg_bright_red(void)
{
return bt_common_color_code_fg_bright_red;
}
-BT_HIDDEN
const char *bt_common_color_fg_bright_green(void)
{
return bt_common_color_code_fg_bright_green;
}
-BT_HIDDEN
const char *bt_common_color_fg_bright_yellow(void)
{
return bt_common_color_code_fg_bright_yellow;
}
-BT_HIDDEN
const char *bt_common_color_fg_bright_blue(void)
{
return bt_common_color_code_fg_bright_blue;
}
-BT_HIDDEN
const char *bt_common_color_fg_bright_magenta(void)
{
return bt_common_color_code_fg_bright_magenta;
}
-BT_HIDDEN
const char *bt_common_color_fg_bright_cyan(void)
{
return bt_common_color_code_fg_bright_cyan;
}
-BT_HIDDEN
const char *bt_common_color_fg_bright_light_gray(void)
{
return bt_common_color_code_fg_bright_light_gray;
}
-BT_HIDDEN
const char *bt_common_color_bg_default(void)
{
return bt_common_color_code_bg_default;
}
-BT_HIDDEN
const char *bt_common_color_bg_red(void)
{
return bt_common_color_code_bg_red;
}
-BT_HIDDEN
const char *bt_common_color_bg_green(void)
{
return bt_common_color_code_bg_green;
}
-BT_HIDDEN
const char *bt_common_color_bg_yellow(void)
{
return bt_common_color_code_bg_yellow;
}
-BT_HIDDEN
const char *bt_common_color_bg_blue(void)
{
return bt_common_color_code_bg_blue;
}
-BT_HIDDEN
const char *bt_common_color_bg_magenta(void)
{
return bt_common_color_code_bg_magenta;
}
-BT_HIDDEN
const char *bt_common_color_bg_cyan(void)
{
return bt_common_color_code_bg_cyan;
}
-BT_HIDDEN
const char *bt_common_color_bg_light_gray(void)
{
return bt_common_color_code_bg_light_gray;
}
-BT_HIDDEN
+void bt_common_color_get_codes(struct bt_common_color_codes *codes,
+ enum bt_common_color_when use_colors)
+{
+ if (use_colors == BT_COMMON_COLOR_WHEN_ALWAYS) {
+ *codes = color_codes;
+ } else if (use_colors == BT_COMMON_COLOR_WHEN_NEVER) {
+ *codes = no_color_codes;
+ } else {
+ BT_ASSERT(use_colors == BT_COMMON_COLOR_WHEN_AUTO);
+
+ if (bt_common_colors_supported()) {
+ *codes = color_codes;
+ } else {
+ *codes = no_color_codes;
+ }
+ }
+}
+
GString *bt_common_string_until(const char *input, const char *escapable_chars,
const char *end_chars, size_t *end_pos)
{
return output;
}
-BT_HIDDEN
GString *bt_common_shell_quote(const char *input, bool with_single_quotes)
{
GString *output = g_string_new(NULL);
return output;
}
-BT_HIDDEN
bool bt_common_string_is_printable(const char *input)
{
const char *ch;
BT_ASSERT_DBG(input);
for (ch = input; *ch != '\0'; ch++) {
- if (!isprint(*ch) && *ch != '\n' && *ch != '\r' &&
+ if (!isprint((unsigned char) *ch) && *ch != '\n' && *ch != '\r' &&
*ch != '\t' && *ch != '\v') {
printable = false;
goto end;
return printable;
}
-BT_HIDDEN
void bt_common_destroy_lttng_live_url_parts(
struct bt_common_lttng_live_url_parts *parts)
{
return;
}
-BT_HIDDEN
struct bt_common_lttng_live_url_parts bt_common_parse_lttng_live_url(
const char *url, char *error_buf, size_t error_buf_size)
{
return parts;
}
-BT_HIDDEN
void bt_common_normalize_star_glob_pattern(char *pattern)
{
const char *p;
* string length of `pattern` or `candidate` if the string is
* null-terminated.
*/
-BT_HIDDEN
bool bt_common_star_glob_match(const char *pattern, size_t pattern_len,
const char *candidate, size_t candidate_len) {
const char *retry_c = candidate, *retry_p = pattern, *c, *p;
}
#ifdef __MINGW32__
-BT_HIDDEN
GString *bt_common_normalize_path(const char *path, const char *wd)
{
char *tmp;
(void) g_string_free(gstring, TRUE);
}
-BT_HIDDEN
GString *bt_common_normalize_path(const char *path, const char *wd)
{
size_t i;
}
#endif
-BT_HIDDEN
size_t bt_common_get_page_size(int log_level)
{
int page_size;
size_t _tmp_fmt_size = (size_t) (fmt_ch - *out_fmt_ch); \
strncpy(_tmp_fmt, *out_fmt_ch, _tmp_fmt_size); \
_tmp_fmt[_tmp_fmt_size] = '\0'; \
+ _Pragma("GCC diagnostic push") \
+ _Pragma("GCC diagnostic ignored \"-Wformat-nonliteral\"") \
_count = snprintf(*buf_ch, _size, _tmp_fmt, __VA_ARGS__); \
- BT_ASSERT_DBG(_count >= 0); \
+ _Pragma("GCC diagnostic pop") \
+ BT_ASSERT_DBG(_count >= 0); \
*buf_ch += MIN(_count, _size); \
} while (0)
*out_fmt_ch = fmt_ch;
}
-BT_HIDDEN
void bt_common_custom_vsnprintf(char *buf, size_t buf_size,
char intro,
bt_common_handle_custom_specifier_func handle_specifier,
*buf_ch = '\0';
}
-BT_HIDDEN
void bt_common_custom_snprintf(char *buf, size_t buf_size,
char intro,
bt_common_handle_custom_specifier_func handle_specifier,
va_end(args);
}
-BT_HIDDEN
void bt_common_sep_digits(char *str, unsigned int digits_per_group, char sep)
{
const char *rd;
}
}
-BT_HIDDEN
GString *bt_common_fold(const char *str, unsigned int total_length,
unsigned int indent)
{
}
#ifdef __MINGW32__
-BT_HIDDEN
int bt_common_get_term_size(unsigned int *width, unsigned int *height)
{
/* Not supported on Windows yet */
return -1;
}
#else /* __MINGW32__ */
-BT_HIDDEN
int bt_common_get_term_size(unsigned int *width, unsigned int *height)
{
int ret = 0;
}
#endif /* __MINGW32__ */
-BT_HIDDEN
int bt_common_g_string_append_printf(GString *str, const char *fmt, ...)
{
va_list ap;
/* Resize. */
g_string_set_size(str, len + print_len);
va_start(ap, fmt);
- print_len = vsprintf(str->str + len, fmt, ap);
+ print_len = vsnprintf(str->str + len, print_len + 1, fmt, ap);
va_end(ap);
} else {
str->len = len + print_len;
return print_len;
}
-BT_HIDDEN
int bt_common_append_file_content_to_g_string(GString *str, FILE *fp)
{
const size_t chunk_size = 4096;
return ret;
}
-BT_HIDDEN
void bt_common_abort(void)
{
static const char * const exec_on_abort_env_name =