summaryrefslogtreecommitdiffstats
path: root/io/log.c
blob: 14397a7f0c6b9bc2fb89e639c31e3e5a5d6c44c4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#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);
}