X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=src%2Fcommon%2Fcommon.h;h=a04f2be64cd4747939c9254b7c26c340b1dfdb4d;hp=e4c775e5c473927ae679579f5718381ea8449cb4;hb=0235b0db7de5bcacdb3650c92461f2ce5eb2143d;hpb=15b4e74c9d44271d73a58a1783dd13ecd19c6ef6 diff --git a/src/common/common.h b/src/common/common.h index e4c775e5..a04f2be6 100644 --- a/src/common/common.h +++ b/src/common/common.h @@ -1,29 +1,13 @@ -#ifndef BABELTRACE_COMMON_INTERNAL_H -#define BABELTRACE_COMMON_INTERNAL_H - /* + * SPDX-License-Identifier: MIT + * * Copyright (c) 2018 EfficiOS Inc. and Linux Foundation * Copyright (c) 2018 Philippe Proulx - * - * 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. */ +#ifndef BABELTRACE_COMMON_INTERNAL_H +#define BABELTRACE_COMMON_INTERNAL_H + #include #include #include @@ -31,6 +15,7 @@ #include #include #include +#include #include #include @@ -43,24 +28,72 @@ #include "common/macros.h" #include "common/safe.h" -#define BT_COMMON_COLOR_RESET "\033[0m" -#define BT_COMMON_COLOR_BOLD "\033[1m" -#define BT_COMMON_COLOR_FG_DEFAULT "\033[39m" -#define BT_COMMON_COLOR_FG_RED "\033[31m" -#define BT_COMMON_COLOR_FG_GREEN "\033[32m" -#define BT_COMMON_COLOR_FG_YELLOW "\033[33m" -#define BT_COMMON_COLOR_FG_BLUE "\033[34m" -#define BT_COMMON_COLOR_FG_MAGENTA "\033[35m" -#define BT_COMMON_COLOR_FG_CYAN "\033[36m" -#define BT_COMMON_COLOR_FG_LIGHT_GRAY "\033[37m" -#define BT_COMMON_COLOR_BG_DEFAULT "\033[49m" -#define BT_COMMON_COLOR_BG_RED "\033[41m" -#define BT_COMMON_COLOR_BG_GREEN "\033[42m" -#define BT_COMMON_COLOR_BG_YELLOW "\033[43m" -#define BT_COMMON_COLOR_BG_BLUE "\033[44m" -#define BT_COMMON_COLOR_BG_MAGENTA "\033[45m" -#define BT_COMMON_COLOR_BG_CYAN "\033[46m" -#define BT_COMMON_COLOR_BG_LIGHT_GRAY "\033[47m" +#define BT_COMMON_COLOR_RESET "\033[0m" +#define BT_COMMON_COLOR_BOLD "\033[1m" +#define BT_COMMON_COLOR_FG_DEFAULT "\033[39m" +#define BT_COMMON_COLOR_FG_RED "\033[31m" +#define BT_COMMON_COLOR_FG_GREEN "\033[32m" +#define BT_COMMON_COLOR_FG_YELLOW "\033[33m" +#define BT_COMMON_COLOR_FG_BLUE "\033[34m" +#define BT_COMMON_COLOR_FG_MAGENTA "\033[35m" +#define BT_COMMON_COLOR_FG_CYAN "\033[36m" +#define BT_COMMON_COLOR_FG_LIGHT_GRAY "\033[37m" +#define BT_COMMON_COLOR_FG_BOLD_RED "\033[1m\033[31m" +#define BT_COMMON_COLOR_FG_BOLD_GREEN "\033[1m\033[32m" +#define BT_COMMON_COLOR_FG_BOLD_YELLOW "\033[1m\033[33m" +#define BT_COMMON_COLOR_FG_BOLD_BLUE "\033[1m\033[34m" +#define BT_COMMON_COLOR_FG_BOLD_MAGENTA "\033[1m\033[35m" +#define BT_COMMON_COLOR_FG_BOLD_CYAN "\033[1m\033[36m" +#define BT_COMMON_COLOR_FG_BOLD_LIGHT_GRAY "\033[1m\033[37m" +#define BT_COMMON_COLOR_FG_BRIGHT_RED "\033[91m" +#define BT_COMMON_COLOR_FG_BRIGHT_GREEN "\033[92m" +#define BT_COMMON_COLOR_FG_BRIGHT_YELLOW "\033[93m" +#define BT_COMMON_COLOR_FG_BRIGHT_BLUE "\033[94m" +#define BT_COMMON_COLOR_FG_BRIGHT_MAGENTA "\033[95m" +#define BT_COMMON_COLOR_FG_BRIGHT_CYAN "\033[96m" +#define BT_COMMON_COLOR_FG_BRIGHT_LIGHT_GRAY "\033[97m" +#define BT_COMMON_COLOR_BG_DEFAULT "\033[49m" +#define BT_COMMON_COLOR_BG_RED "\033[41m" +#define BT_COMMON_COLOR_BG_GREEN "\033[42m" +#define BT_COMMON_COLOR_BG_YELLOW "\033[43m" +#define BT_COMMON_COLOR_BG_BLUE "\033[44m" +#define BT_COMMON_COLOR_BG_MAGENTA "\033[45m" +#define BT_COMMON_COLOR_BG_CYAN "\033[46m" +#define BT_COMMON_COLOR_BG_LIGHT_GRAY "\033[47m" + +enum bt_common_color_when { + BT_COMMON_COLOR_WHEN_AUTO, + BT_COMMON_COLOR_WHEN_ALWAYS, + BT_COMMON_COLOR_WHEN_NEVER, +}; + +struct bt_common_color_codes { + const char *reset; + const char *bold; + const char *fg_default; + const char *fg_red; + const char *fg_green; + const char *fg_yellow; + const char *fg_blue; + const char *fg_magenta; + const char *fg_cyan; + const char *fg_light_gray; + const char *fg_bright_red; + const char *fg_bright_green; + const char *fg_bright_yellow; + const char *fg_bright_blue; + const char *fg_bright_magenta; + const char *fg_bright_cyan; + const char *fg_bright_light_gray; + const char *bg_default; + const char *bg_red; + const char *bg_green; + const char *bg_yellow; + const char *bg_blue; + const char *bg_magenta; + const char *bg_cyan; + const char *bg_light_gray; +}; struct bt_common_lttng_live_url_parts { GString *proto; @@ -139,6 +172,27 @@ const char *bt_common_color_fg_cyan(void); BT_HIDDEN const char *bt_common_color_fg_light_gray(void); +BT_HIDDEN +const char *bt_common_color_fg_bright_red(void); + +BT_HIDDEN +const char *bt_common_color_fg_bright_green(void); + +BT_HIDDEN +const char *bt_common_color_fg_bright_yellow(void); + +BT_HIDDEN +const char *bt_common_color_fg_bright_blue(void); + +BT_HIDDEN +const char *bt_common_color_fg_bright_magenta(void); + +BT_HIDDEN +const char *bt_common_color_fg_bright_cyan(void); + +BT_HIDDEN +const char *bt_common_color_fg_bright_light_gray(void); + BT_HIDDEN const char *bt_common_color_bg_default(void); @@ -163,6 +217,10 @@ const char *bt_common_color_bg_cyan(void); BT_HIDDEN const char *bt_common_color_bg_light_gray(void); +BT_HIDDEN +void bt_common_color_get_codes(struct bt_common_color_codes *codes, + enum bt_common_color_when use_colors); + /* * Returns the substring from `input` to the first character found * in the list of characters `end_chars`, unescaping any character @@ -351,6 +409,18 @@ GString *bt_common_fold(const char *str, unsigned int total_length, BT_HIDDEN int bt_common_get_term_size(unsigned int *width, unsigned int *height); +/* + * Appends the textual content of `fp` to `str`, starting from its + * current position to the end of the file. + * + * This function does NOT rewind `fp` once it's done or on error. + */ +BT_HIDDEN +int bt_common_append_file_content_to_g_string(GString *str, FILE *fp); + +BT_HIDDEN +void bt_common_abort(void) __attribute__((noreturn)); + /* * Wraps read() function to handle EINTR and partial reads. * On success, it returns `count` received as parameter. On error, it returns a @@ -362,10 +432,10 @@ ssize_t bt_common_read(int fd, void *buf, size_t count, int log_level) size_t i = 0; ssize_t ret; - BT_ASSERT(buf); + BT_ASSERT_DBG(buf); /* Never return an overflow value. */ - BT_ASSERT(count <= SSIZE_MAX); + BT_ASSERT_DBG(count <= SSIZE_MAX); do { ret = read(fd, buf + i, count - i); @@ -388,7 +458,7 @@ ssize_t bt_common_read(int fd, void *buf, size_t count, int log_level) } } i += ret; - BT_ASSERT(i <= count); + BT_ASSERT_DBG(i <= count); } while (count - i > 0 && ret > 0); end: @@ -407,30 +477,46 @@ static inline const char *bt_common_field_class_type_string(enum bt_field_class_type class_type) { switch (class_type) { + case BT_FIELD_CLASS_TYPE_BOOL: + return "BOOL"; + case BT_FIELD_CLASS_TYPE_BIT_ARRAY: + return "BIT_ARRAY"; case BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER: - return "BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER"; + return "UNSIGNED_INTEGER"; case BT_FIELD_CLASS_TYPE_SIGNED_INTEGER: - return "BT_FIELD_CLASS_TYPE_SIGNED_INTEGER"; - case BT_FIELD_CLASS_TYPE_REAL: - return "BT_FIELD_CLASS_TYPE_REAL"; + return "SIGNED_INTEGER"; case BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION: - return "BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION"; + return "UNSIGNED_ENUMERATION"; case BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION: - return "BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION"; + return "SIGNED_ENUMERATION"; + case BT_FIELD_CLASS_TYPE_SINGLE_PRECISION_REAL: + return "SINGLE_PRECISION_REAL"; + case BT_FIELD_CLASS_TYPE_DOUBLE_PRECISION_REAL: + return "DOUBLE_PRECISION_REAL"; case BT_FIELD_CLASS_TYPE_STRING: - return "BT_FIELD_CLASS_TYPE_STRING"; + return "STRING"; case BT_FIELD_CLASS_TYPE_STRUCTURE: - return "BT_FIELD_CLASS_TYPE_STRUCTURE"; + return "STRUCTURE"; case BT_FIELD_CLASS_TYPE_STATIC_ARRAY: - return "BT_FIELD_CLASS_TYPE_STATIC_ARRAY"; - case BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY: - return "BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY"; - case BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR: - return "BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR"; - case BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_SELECTOR: - return "BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_SELECTOR"; - case BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_SELECTOR: - return "BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_SELECTOR"; + return "STATIC_ARRAY"; + case BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITHOUT_LENGTH_FIELD: + return "DYNAMIC_ARRAY_WITHOUT_LENGTH_FIELD"; + case BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITH_LENGTH_FIELD: + return "DYNAMIC_ARRAY_WITH_LENGTH_FIELD"; + case BT_FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR_FIELD: + return "OPTION_WITHOUT_SELECTOR_FIELD"; + case BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR_FIELD: + return "OPTION_WITH_BOOL_SELECTOR_FIELD"; + case BT_FIELD_CLASS_TYPE_OPTION_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD: + return "OPTION_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD"; + case BT_FIELD_CLASS_TYPE_OPTION_WITH_SIGNED_INTEGER_SELECTOR_FIELD: + return "OPTION_WITH_SIGNED_INTEGER_SELECTOR_FIELD"; + case BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR_FIELD: + return "VARIANT_WITHOUT_SELECTOR_FIELD"; + case BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD: + return "VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD"; + case BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR_FIELD: + return "VARIANT_WITH_SIGNED_INTEGER_SELECTOR_FIELD"; default: return "(unknown)"; } @@ -441,30 +527,30 @@ const char *bt_common_field_class_integer_preferred_display_base_string(enum bt_ { switch (base) { case BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_BINARY: - return "BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_BINARY"; + return "BINARY"; case BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_OCTAL: - return "BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_OCTAL"; + return "OCTAL"; case BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_DECIMAL: - return "BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_DECIMAL"; + return "DECIMAL"; case BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_HEXADECIMAL: - return "BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_HEXADECIMAL"; + return "HEXADECIMAL"; default: return "(unknown)"; } } static inline -const char *bt_common_scope_string(enum bt_scope scope) +const char *bt_common_scope_string(enum bt_field_path_scope scope) { switch (scope) { - case BT_SCOPE_PACKET_CONTEXT: - return "BT_SCOPE_PACKET_CONTEXT"; - case BT_SCOPE_EVENT_COMMON_CONTEXT: - return "BT_SCOPE_EVENT_COMMON_CONTEXT"; - case BT_SCOPE_EVENT_SPECIFIC_CONTEXT: - return "BT_SCOPE_EVENT_SPECIFIC_CONTEXT"; - case BT_SCOPE_EVENT_PAYLOAD: - return "BT_SCOPE_EVENT_PAYLOAD"; + case BT_FIELD_PATH_SCOPE_PACKET_CONTEXT: + return "PACKET_CONTEXT"; + case BT_FIELD_PATH_SCOPE_EVENT_COMMON_CONTEXT: + return "EVENT_COMMON_CONTEXT"; + case BT_FIELD_PATH_SCOPE_EVENT_SPECIFIC_CONTEXT: + return "EVENT_SPECIFIC_CONTEXT"; + case BT_FIELD_PATH_SCOPE_EVENT_PAYLOAD: + return "EVENT_PAYLOAD"; default: return "(unknown)"; } @@ -476,35 +562,35 @@ const char *bt_common_event_class_log_level_string( { switch (level) { case BT_EVENT_CLASS_LOG_LEVEL_EMERGENCY: - return "BT_EVENT_CLASS_LOG_LEVEL_EMERGENCY"; + return "EMERGENCY"; case BT_EVENT_CLASS_LOG_LEVEL_ALERT: - return "BT_EVENT_CLASS_LOG_LEVEL_ALERT"; + return "ALERT"; case BT_EVENT_CLASS_LOG_LEVEL_CRITICAL: - return "BT_EVENT_CLASS_LOG_LEVEL_CRITICAL"; + return "CRITICAL"; case BT_EVENT_CLASS_LOG_LEVEL_ERROR: - return "BT_EVENT_CLASS_LOG_LEVEL_ERROR"; + return "ERROR"; case BT_EVENT_CLASS_LOG_LEVEL_WARNING: - return "BT_EVENT_CLASS_LOG_LEVEL_WARNING"; + return "WARNING"; case BT_EVENT_CLASS_LOG_LEVEL_NOTICE: - return "BT_EVENT_CLASS_LOG_LEVEL_NOTICE"; + return "NOTICE"; case BT_EVENT_CLASS_LOG_LEVEL_INFO: - return "BT_EVENT_CLASS_LOG_LEVEL_INFO"; + return "INFO"; case BT_EVENT_CLASS_LOG_LEVEL_DEBUG_SYSTEM: - return "BT_EVENT_CLASS_LOG_LEVEL_DEBUG_SYSTEM"; + return "DEBUG_SYSTEM"; case BT_EVENT_CLASS_LOG_LEVEL_DEBUG_PROGRAM: - return "BT_EVENT_CLASS_LOG_LEVEL_DEBUG_PROGRAM"; + return "DEBUG_PROGRAM"; case BT_EVENT_CLASS_LOG_LEVEL_DEBUG_PROCESS: - return "BT_EVENT_CLASS_LOG_LEVEL_DEBUG_PROCESS"; + return "DEBUG_PROCESS"; case BT_EVENT_CLASS_LOG_LEVEL_DEBUG_MODULE: - return "BT_EVENT_CLASS_LOG_LEVEL_DEBUG_MODULE"; + return "DEBUG_MODULE"; case BT_EVENT_CLASS_LOG_LEVEL_DEBUG_UNIT: - return "BT_EVENT_CLASS_LOG_LEVEL_DEBUG_UNIT"; + return "DEBUG_UNIT"; case BT_EVENT_CLASS_LOG_LEVEL_DEBUG_FUNCTION: - return "BT_EVENT_CLASS_LOG_LEVEL_DEBUG_FUNCTION"; + return "DEBUG_FUNCTION"; case BT_EVENT_CLASS_LOG_LEVEL_DEBUG_LINE: - return "BT_EVENT_CLASS_LOG_LEVEL_DEBUG_LINE"; + return "DEBUG_LINE"; case BT_EVENT_CLASS_LOG_LEVEL_DEBUG: - return "BT_EVENT_CLASS_LOG_LEVEL_DEBUG"; + return "DEBUG"; default: return "(unknown)"; } @@ -515,21 +601,21 @@ const char *bt_common_value_type_string(enum bt_value_type type) { switch (type) { case BT_VALUE_TYPE_NULL: - return "BT_VALUE_TYPE_NULL"; + return "NULL"; case BT_VALUE_TYPE_BOOL: - return "BT_VALUE_TYPE_BOOL"; + return "BOOL"; case BT_VALUE_TYPE_UNSIGNED_INTEGER: - return "BT_VALUE_TYPE_UNSIGNED_INTEGER"; + return "UNSIGNED_INTEGER"; case BT_VALUE_TYPE_SIGNED_INTEGER: - return "BT_VALUE_TYPE_SIGNED_INTEGER"; + return "SIGNED_INTEGER"; case BT_VALUE_TYPE_REAL: - return "BT_VALUE_TYPE_REAL"; + return "REAL"; case BT_VALUE_TYPE_STRING: - return "BT_VALUE_TYPE_STRING"; + return "STRING"; case BT_VALUE_TYPE_ARRAY: - return "BT_VALUE_TYPE_ARRAY"; + return "ARRAY"; case BT_VALUE_TYPE_MAP: - return "BT_VALUE_TYPE_MAP"; + return "MAP"; default: return "(unknown)"; } @@ -541,7 +627,7 @@ GString *bt_common_field_path_string(struct bt_field_path *path) GString *str = g_string_new(NULL); uint64_t i; - BT_ASSERT(path); + BT_ASSERT_DBG(path); if (!str) { goto end; @@ -563,7 +649,7 @@ GString *bt_common_field_path_string(struct bt_field_path *path) g_string_append(str, ", "); break; default: - abort(); + bt_common_abort(); } } @@ -579,19 +665,19 @@ const char *bt_common_logging_level_string( { switch (level) { case BT_LOGGING_LEVEL_TRACE: - return "BT_LOGGING_LEVEL_TRACE"; + return "TRACE"; case BT_LOGGING_LEVEL_DEBUG: - return "BT_LOGGING_LEVEL_DEBUG"; + return "DEBUG"; case BT_LOGGING_LEVEL_INFO: - return "BT_LOGGING_LEVEL_INFO"; + return "INFO"; case BT_LOGGING_LEVEL_WARNING: - return "BT_LOGGING_LEVEL_WARNING"; + return "WARNING"; case BT_LOGGING_LEVEL_ERROR: - return "BT_LOGGING_LEVEL_ERROR"; + return "ERROR"; case BT_LOGGING_LEVEL_FATAL: - return "BT_LOGGING_LEVEL_FATAL"; + return "FATAL"; case BT_LOGGING_LEVEL_NONE: - return "BT_LOGGING_LEVEL_NONE"; + return "NONE"; default: return "(unknown)"; } @@ -601,16 +687,14 @@ static inline const char *bt_common_func_status_string(int status) { switch (status) { - case __BT_FUNC_STATUS_OVERFLOW: + case __BT_FUNC_STATUS_OVERFLOW_ERROR: return "OVERFLOW"; - case __BT_FUNC_STATUS_INVALID_PARAMS: - return "INVALID_PARAMS"; - case __BT_FUNC_STATUS_INVALID_OBJECT: - return "INVALID_OBJECT"; + case __BT_FUNC_STATUS_UNKNOWN_OBJECT: + return "UNKNOWN_OBJECT"; case __BT_FUNC_STATUS_MEMORY_ERROR: return "MEMORY_ERROR"; - case __BT_FUNC_STATUS_LOADING_ERROR: - return "LOADING_ERROR"; + case __BT_FUNC_STATUS_USER_ERROR: + return "USER_ERROR"; case __BT_FUNC_STATUS_ERROR: return "ERROR"; case __BT_FUNC_STATUS_OK: @@ -621,10 +705,8 @@ const char *bt_common_func_status_string(int status) return "NOT_FOUND"; case __BT_FUNC_STATUS_AGAIN: return "AGAIN"; - case __BT_FUNC_STATUS_UNSUPPORTED: - return "UNSUPPORTED"; - case __BT_FUNC_STATUS_CANCELED: - return "CANCELED"; + case __BT_FUNC_STATUS_INTERRUPTED: + return "INTERRUPTED"; default: return "(unknown)"; } @@ -647,7 +729,7 @@ int bt_common_clock_value_from_ns_from_origin( uint64_t value_period_cycles; int64_t ns_to_add; - BT_ASSERT(raw_value); + BT_ASSERT_DBG(raw_value); /* Compute offset part of requested value, in nanoseconds */ if (!bt_safe_to_mul_int64(cc_offset_seconds, NS_PER_S_I)) { @@ -725,7 +807,7 @@ end: * bt_g_string_append_printf cannot be inlined because it expects a * variadic argument list. */ -BT_HIDDEN +BT_HIDDEN __BT_ATTR_FORMAT_PRINTF(2, 3) int bt_common_g_string_append_printf(GString *str, const char *fmt, ...); static inline