summaryrefslogtreecommitdiff
path: root/linux/printbuf_userspace.c
blob: 0ae56ee1b9ad6bd80bf62fbc3cce25aba46318a6 (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

#include <stdio.h>
#include <linux/printbuf.h>

void prt_vprintf(struct printbuf *out, const char *fmt, va_list args)
{
	int len;

	do {
		va_list args2;

		va_copy(args2, args);
		len = vsnprintf(out->buf + out->pos, printbuf_remaining(out), fmt, args2);
	} while (len + 1 >= printbuf_remaining(out) &&
		 !printbuf_make_room(out, len + 1));

	len = min_t(size_t, len,
		  printbuf_remaining(out) ? printbuf_remaining(out) - 1 : 0);
	out->pos += len;
}

void prt_printf(struct printbuf *out, const char *fmt, ...)
{
	va_list args;

	va_start(args, fmt);
	prt_vprintf(out, fmt, args);
	va_end(args);
}

void prt_u64(struct printbuf *out, u64 v)
{
	prt_printf(out, "%llu", v);
}