Path: blob/main/system/lib/libc/emscripten_console.c
6162 views
/*1* Copyright 2021 The Emscripten Authors. All rights reserved.2* Emscripten is available under two separate licenses, the MIT license and the3* University of Illinois/NCSA Open Source License. Both these licenses can be4* found in the LICENSE file.5*/6#include <alloca.h>7#include <stdarg.h>8#include <stdio.h>910#include <emscripten.h>11#include <emscripten/console.h>12#include "emscripten_internal.h"1314static void vlogf(const char* fmt, va_list ap, void (*callback)(const char*)) {15va_list ap2;16va_copy(ap2, ap);17size_t len = vsnprintf(0, 0, fmt, ap2);18va_end(ap2);19char* buf = alloca(len + 1);20vsnprintf(buf, len + 1, fmt, ap);21callback(buf);22}2324void emscripten_console_logf(const char* fmt, ...) {25va_list ap;26va_start(ap, fmt);27vlogf(fmt, ap, &emscripten_console_log);28va_end(ap);29}3031void emscripten_console_errorf(const char* fmt, ...) {32va_list ap;33va_start(ap, fmt);34vlogf(fmt, ap, &emscripten_console_error);35va_end(ap);36}3738void emscripten_console_warnf(const char* fmt, ...) {39va_list ap;40va_start(ap, fmt);41vlogf(fmt, ap, &emscripten_console_warn);42va_end(ap);43}4445void emscripten_console_tracef(const char* fmt, ...) {46va_list ap;47va_start(ap, fmt);48vlogf(fmt, ap, &emscripten_console_trace);49va_end(ap);50}5152void emscripten_outf(const char* fmt, ...) {53va_list ap;54va_start(ap, fmt);55vlogf(fmt, ap, &emscripten_out);56va_end(ap);57}5859void emscripten_errf(const char* fmt, ...) {60va_list ap;61va_start(ap, fmt);62vlogf(fmt, ap, &emscripten_err);63va_end(ap);64}6566#ifndef NDEBUG67void emscripten_dbgf(const char* fmt, ...) {68va_list ap;69va_start(ap, fmt);70vlogf(fmt, ap, &emscripten_dbg);71va_end(ap);72}7374void emscripten_dbg_backtracef(const char* fmt, ...) {75va_list ap;76va_start(ap, fmt);77vlogf(fmt, ap, &emscripten_dbg_backtrace);78va_end(ap);79}80#endif8182void emscripten_log(int flags, const char* fmt, ...) {83va_list ap;84va_start(ap, fmt);85// Note: we have to inline `vlogf` here instead of using it, because86// `_emscripten_log_formatted` has a different signature than the87// `callback` parameter of `vlogf`, and we can't use it without a callback88// as we need `alloca` to remain on stack.89va_list ap2;90va_copy(ap2, ap);91size_t len = vsnprintf(0, 0, fmt, ap2);92va_end(ap2);93char* buf = alloca(len + 1);94vsnprintf(buf, len + 1, fmt, ap);95va_end(ap);96_emscripten_log_formatted(flags, buf);97}9899100