123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- /*
- * Copyright (c) 2023 Lain Bailey <[email protected]>
- *
- * Permission to use, copy, modify, and 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.
- *
- * THE 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 <stdio.h>
- #include <stdlib.h>
- #include "c99defs.h"
- #include "base.h"
- static int crashing = 0;
- static void *log_param = NULL;
- static void *crash_param = NULL;
- static void def_log_handler(int log_level, const char *format, va_list args,
- void *param)
- {
- char out[4096];
- vsnprintf(out, sizeof(out), format, args);
- switch (log_level) {
- case LOG_DEBUG:
- fprintf(stdout, "debug: %s\n", out);
- fflush(stdout);
- break;
- case LOG_INFO:
- fprintf(stdout, "info: %s\n", out);
- fflush(stdout);
- break;
- case LOG_WARNING:
- fprintf(stdout, "warning: %s\n", out);
- fflush(stdout);
- break;
- case LOG_ERROR:
- fprintf(stderr, "error: %s\n", out);
- fflush(stderr);
- }
- UNUSED_PARAMETER(param);
- }
- OBS_NORETURN static void def_crash_handler(const char *format, va_list args,
- void *param)
- {
- vfprintf(stderr, format, args);
- exit(0);
- UNUSED_PARAMETER(param);
- }
- static log_handler_t log_handler = def_log_handler;
- static void (*crash_handler)(const char *, va_list, void *) = def_crash_handler;
- void base_get_log_handler(log_handler_t *handler, void **param)
- {
- if (handler)
- *handler = log_handler;
- if (param)
- *param = log_param;
- }
- void base_set_log_handler(log_handler_t handler, void *param)
- {
- if (!handler)
- handler = def_log_handler;
- log_param = param;
- log_handler = handler;
- }
- void base_set_crash_handler(void (*handler)(const char *, va_list, void *),
- void *param)
- {
- crash_param = param;
- crash_handler = handler;
- }
- OBS_NORETURN void bcrash(const char *format, ...)
- {
- va_list args;
- if (crashing) {
- fputs("Crashed in the crash handler", stderr);
- exit(2);
- }
- crashing = 1;
- va_start(args, format);
- crash_handler(format, args, crash_param);
- va_end(args);
- exit(0);
- }
- void blogva(int log_level, const char *format, va_list args)
- {
- log_handler(log_level, format, args, log_param);
- }
- void blog(int log_level, const char *format, ...)
- {
- va_list args;
- va_start(args, format);
- blogva(log_level, format, args);
- va_end(args);
- }
|