xref: /freebsd/sys/compat/linuxkpi/common/src/linux_seq_buf.c (revision 710167623d82664ab4276776aed502ab6f91d8ff)
1*71016762SJean-Sébastien Pédron /*
2*71016762SJean-Sébastien Pédron  * Copyright (c) 2025-2026 The FreeBSD Foundation
3*71016762SJean-Sébastien Pédron  * Copyright (c) 2025-2026 Jean-Sébastien Pédron <dumbbell@FreeBSD.org>
4*71016762SJean-Sébastien Pédron  *
5*71016762SJean-Sébastien Pédron  * This software was developed by Jean-Sébastien Pédron under sponsorship
6*71016762SJean-Sébastien Pédron  * from the FreeBSD Foundation.
7*71016762SJean-Sébastien Pédron  *
8*71016762SJean-Sébastien Pédron  * SPDX-License-Identifier: BSD-2-Clause
9*71016762SJean-Sébastien Pédron  */
10*71016762SJean-Sébastien Pédron 
11*71016762SJean-Sébastien Pédron #include <linux/seq_buf.h>
12*71016762SJean-Sébastien Pédron 
13*71016762SJean-Sébastien Pédron void
linuxkpi_seq_buf_init(struct seq_buf * s,char * buf,unsigned int size)14*71016762SJean-Sébastien Pédron linuxkpi_seq_buf_init(struct seq_buf *s, char *buf, unsigned int size)
15*71016762SJean-Sébastien Pédron {
16*71016762SJean-Sébastien Pédron 	s->buffer = buf;
17*71016762SJean-Sébastien Pédron 	s->size = size;
18*71016762SJean-Sébastien Pédron 
19*71016762SJean-Sébastien Pédron 	seq_buf_clear(s);
20*71016762SJean-Sébastien Pédron }
21*71016762SJean-Sébastien Pédron 
22*71016762SJean-Sébastien Pédron int
linuxkpi_seq_buf_printf(struct seq_buf * s,const char * fmt,...)23*71016762SJean-Sébastien Pédron linuxkpi_seq_buf_printf(struct seq_buf *s, const char *fmt, ...)
24*71016762SJean-Sébastien Pédron {
25*71016762SJean-Sébastien Pédron 	int ret;
26*71016762SJean-Sébastien Pédron 	va_list args;
27*71016762SJean-Sébastien Pédron 
28*71016762SJean-Sébastien Pédron 	va_start(args, fmt);
29*71016762SJean-Sébastien Pédron 	ret = seq_buf_vprintf(s, fmt, args);
30*71016762SJean-Sébastien Pédron 	va_end(args);
31*71016762SJean-Sébastien Pédron 
32*71016762SJean-Sébastien Pédron 	return (ret);
33*71016762SJean-Sébastien Pédron }
34*71016762SJean-Sébastien Pédron 
35*71016762SJean-Sébastien Pédron int
linuxkpi_seq_buf_vprintf(struct seq_buf * s,const char * fmt,va_list args)36*71016762SJean-Sébastien Pédron linuxkpi_seq_buf_vprintf(struct seq_buf *s, const char *fmt, va_list args)
37*71016762SJean-Sébastien Pédron {
38*71016762SJean-Sébastien Pédron 	int ret;
39*71016762SJean-Sébastien Pédron 
40*71016762SJean-Sébastien Pédron 	if (!seq_buf_has_overflowed(s)) {
41*71016762SJean-Sébastien Pédron 		ret = vsnprintf(s->buffer + s->len, s->size - s->len, fmt, args);
42*71016762SJean-Sébastien Pédron 		if (s->len + ret < s->size) {
43*71016762SJean-Sébastien Pédron 			s->len += ret;
44*71016762SJean-Sébastien Pédron 			return (0);
45*71016762SJean-Sébastien Pédron 		}
46*71016762SJean-Sébastien Pédron 	}
47*71016762SJean-Sébastien Pédron 
48*71016762SJean-Sébastien Pédron 	seq_buf_set_overflow(s);
49*71016762SJean-Sébastien Pédron 	return (-1);
50*71016762SJean-Sébastien Pédron }
51*71016762SJean-Sébastien Pédron 
52*71016762SJean-Sébastien Pédron const char *
linuxkpi_seq_buf_str(struct seq_buf * s)53*71016762SJean-Sébastien Pédron linuxkpi_seq_buf_str(struct seq_buf *s)
54*71016762SJean-Sébastien Pédron {
55*71016762SJean-Sébastien Pédron 	if (s->size == 0)
56*71016762SJean-Sébastien Pédron 		return ("");
57*71016762SJean-Sébastien Pédron 
58*71016762SJean-Sébastien Pédron 	if (seq_buf_buffer_left(s))
59*71016762SJean-Sébastien Pédron 		s->buffer[s->len] = '\0';
60*71016762SJean-Sébastien Pédron 	else
61*71016762SJean-Sébastien Pédron 		s->buffer[s->size - 1] = '\0';
62*71016762SJean-Sébastien Pédron 
63*71016762SJean-Sébastien Pédron 	return (s->buffer);
64*71016762SJean-Sébastien Pédron }
65