diff options
Diffstat (limited to 'src/log.c')
-rw-r--r-- | src/log.c | 155 |
1 files changed, 106 insertions, 49 deletions
@@ -1,60 +1,117 @@ -/* - Copyright 2007-2016 David Robillard <http://drobilla.net> +// Copyright 2007-2022 David Robillard <d@drobilla.net> +// SPDX-License-Identifier: ISC - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. +#include "log.h" - THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ +#include "jalv_config.h" -#include "jalv_internal.h" +#include <lv2/log/log.h> +#include <lv2/urid/urid.h> + +#if USE_ISATTY +# include <unistd.h> +#endif + +#include <stdarg.h> +#include <stdbool.h> +#include <stdio.h> + +JALV_LOG_FUNC(2, 0) +static int +jalv_vlog(const JalvLogLevel level, const char* const fmt, va_list ap) +{ + bool fancy = false; + switch (level) { + case JALV_LOG_ERR: + fancy = jalv_ansi_start(stderr, 31); + fprintf(stderr, "error: "); + break; + case JALV_LOG_WARNING: + fancy = jalv_ansi_start(stderr, 33); + fprintf(stderr, "warning: "); + break; + case JALV_LOG_INFO: + break; + case JALV_LOG_DEBUG: + fancy = jalv_ansi_start(stderr, 32); + fprintf(stderr, "trace: "); + break; + } + + const int st = vfprintf(stderr, fmt, ap); + + if (fancy) { + jalv_ansi_reset(stderr); + } + + return st; +} + +int +jalv_log(const JalvLogLevel level, const char* const fmt, ...) +{ + va_list args; + va_start(args, fmt); + + const int ret = jalv_vlog(level, fmt, args); + + va_end(args); + return ret; +} int -jalv_printf(LV2_Log_Handle handle, - LV2_URID type, - const char* fmt, ...) +jalv_vprintf(LV2_Log_Handle handle, LV2_URID type, const char* fmt, va_list ap) { - va_list args; - va_start(args, fmt); - const int ret = jalv_vprintf(handle, type, fmt, args); - va_end(args); - return ret; + JalvLog* const log = (JalvLog*)handle; + + if (type == log->urids->log_Trace) { + return log->tracing ? jalv_vlog(JALV_LOG_DEBUG, fmt, ap) : 0; + } + + if (type == log->urids->log_Error) { + return jalv_vlog(JALV_LOG_ERR, fmt, ap); + } + + if (type == log->urids->log_Warning) { + return jalv_vlog(JALV_LOG_WARNING, fmt, ap); + } + + return vfprintf(stderr, fmt, ap); } int -jalv_vprintf(LV2_Log_Handle handle, - LV2_URID type, - const char* fmt, - va_list ap) +jalv_printf(LV2_Log_Handle handle, LV2_URID type, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + const int ret = jalv_vprintf(handle, type, fmt, args); + va_end(args); + return ret; +} + +bool +jalv_ansi_start(FILE* stream, int color) +{ +#if USE_ISATTY && USE_FILENO + if (isatty(fileno(stream))) { + return fprintf(stream, "\033[0;%dm", color); + } +#else + (void)stream; + (void)color; +#endif + return 0; +} + +void +jalv_ansi_reset(FILE* stream) { - // TODO: Lock - Jalv* jalv = (Jalv*)handle; - bool fancy = true; - if (type == jalv->urids.log_Trace && jalv->opts.trace) { - jalv_ansi_start(stderr, 32); - fprintf(stderr, "trace: "); - } else if (type == jalv->urids.log_Error) { - jalv_ansi_start(stderr, 31); - fprintf(stderr, "error: "); - } else if (type == jalv->urids.log_Warning) { - jalv_ansi_start(stderr, 33); - fprintf(stderr, "warning: "); - } else { - fancy = false; - } - - const int st = vfprintf(stderr, fmt, ap); - - if (fancy) { - jalv_ansi_reset(stderr); - } - - return st; +#if USE_ISATTY + if (isatty(fileno(stream))) { + fprintf(stream, "\033[0m"); + fflush(stream); + } +#else + (void)stream; +#endif } |