summaryrefslogtreecommitdiff
path: root/kernel/src/klibc/stdio.cpp
blob: 518e5e287d457acc673daf42145c481c75d80673 (plain)
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
#include <klibc/stdio.hpp>
#include <klibc/string.hpp>
#include <utils/flanterm.hpp>
#include <cstdint>
#include <cstddef>
#include <cstdarg>

#define NANOPRINTF_USE_FIELD_WIDTH_FORMAT_SPECIFIERS 1
#define NANOPRINTF_USE_PRECISION_FORMAT_SPECIFIERS 1
#define NANOPRINTF_USE_LARGE_FORMAT_SPECIFIERS 1
#define NANOPRINTF_USE_SMALL_FORMAT_SPECIFIERS 1
#define NANOPRINTF_USE_FLOAT_FORMAT_SPECIFIERS 0
#define NANOPRINTF_USE_BINARY_FORMAT_SPECIFIERS 1
#define NANOPRINTF_USE_WRITEBACK_FORMAT_SPECIFIERS 0
#define NANOPRINTF_IMPLEMENTATION
#include <nanoprintf.h>

#include <cstdint>
#include <cstddef>
#if defined(__x86_64__)
#include <arch/x86_64/drivers/serial.hpp>
#endif
#include <generic/lock/spinlock.hpp>

locks::spinlock print_lock;

int klibc::_snprintf(char *buffer, std::size_t bufsz, char const *fmt, va_list vlist) {
    int const rv = npf_vsnprintf(buffer, bufsz, fmt, vlist);
    return rv;
}

void klibc::printf(const char* fmt, ...) {
    print_lock.lock();
    va_list val;
    va_start(val, fmt);
    char buffer[4096];
    memset(buffer,0,4096);
    int len = _snprintf(buffer,4096,fmt,val);
    utils::flanterm::write(buffer,len);
#if defined(__x86_64__)
    x86_64::serial::write_data(buffer,len);
#endif
    va_end(val);
    print_lock.unlock();
}