/* * Copyright (c) 2025 Amlogic, Inc. All rights reserved. * * This source code is subject to the terms and conditions defined in the * file 'LICENSE' which is part of this source code package. * * Description: */ #include #include #include "MesonLog.h" #include #define MAX_MSG_BUF 512 #define TIME_BUF 64 static LogLevel g_backend_debug = LOG_LEVEL_INFO; static int g_log_to_logcat = 0; void meson_log_set_debug_level(LogLevel level) { fprintf(stderr, "meson_log_set_debug_level:%d\n", level); g_backend_debug = level; } void meson_log_set_log_to_logcat(int to_logcat) { fprintf(stderr, "meson_log_set_log_to_logcat:%d\n", to_logcat); g_log_to_logcat = to_logcat; } static const char* log_level_to_string(LogLevel level) { switch (level) { case LOG_LEVEL_ERROR: return "[E]MesonDisplay: "; case LOG_LEVEL_WARN: return "[W]MesonDisplay: "; case LOG_LEVEL_INFO: return "[I]MesonDisplay: "; case LOG_LEVEL_DEBUG: return "[D]MesonDisplay: "; case LOG_LEVEL_VERBOSE: return "[V]MesonDisplay: "; default: return "UNKNOWN"; } } void meson_log_impl(LogLevel level, const char *fmt, ...) { struct timespec ts; char time_buf[TIME_BUF] = {0}; char final_msg[MAX_MSG_BUF] = {0}; va_list args; if (level > g_backend_debug ) return; if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) { snprintf(time_buf, sizeof(time_buf), "%lld.%09lld", (long long)ts.tv_sec, (long long)ts.tv_nsec); } else { snprintf(time_buf, sizeof(time_buf), "0.0"); } int len = snprintf(final_msg, sizeof(final_msg), "[%s][%s] ", time_buf, log_level_to_string(level)); if (len > 0 && len < sizeof(final_msg)) { va_start(args, fmt); int written = vsnprintf(final_msg + len, sizeof(final_msg) - len, fmt, args); va_end(args); if (written < 0) { final_msg[len] = '\0'; } } if (g_log_to_logcat) ALOGI("%s\n", final_msg); else fprintf(stderr, "%s\n", final_msg); }