summaryrefslogblamecommitdiffstats
path: root/io/log.c
blob: 14397a7f0c6b9bc2fb89e639c31e3e5a5d6c44c4 (plain) (tree)



































































                                                          
#include "log.h"
#include "lib/jove.h"
#include "lib/string.h"
#include "lib/format.h"

static struct LogDevice *s_first_logdev = NULL;

void
klog_newdev(struct LogDevice *dev)
{
    if(s_first_logdev == NULL) {
        s_first_logdev = dev;
    }else{
        dev->chain = s_first_logdev;
        s_first_logdev = dev;
    }
}

static void
s_klogc(struct LogDevice *dev, char c)
{
    dev->out(&c, 1);
    if(dev->chain != NULL)
        s_klogc(dev->chain, c);
}

void
klogc(char c)
{
    s_klogc(s_first_logdev, c);
}

static void
s_klogs(struct LogDevice *dev, const char *s, size_t slen)
{
    dev->out(s, slen);
    if(dev->chain != NULL)
        s_klogs(dev->chain, s, slen);
}

void
klogs(const char *s)
{
    size_t slen = strlen(s);
    s_klogs(s_first_logdev, s, slen);
}

void
klogsn(const char *s, size_t len)
{
    s_klogs(s_first_logdev, s, len);
}

void
kvlogf(const char *fmt, va_list ap)
{
    char buffer[256];
    svfmt(buffer, 256, fmt, ap);
    klogs(buffer);
}

void klogf(const char *fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);
    kvlogf(fmt, ap);
    va_end(ap);
}