xref: /freebsd/sys/compat/linuxkpi/common/include/linux/seq_buf.h (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 #ifndef _LINUXKPI_LINUX_SEQ_BUF_H_
12*71016762SJean-Sébastien Pédron #define	_LINUXKPI_LINUX_SEQ_BUF_H_
13*71016762SJean-Sébastien Pédron 
14*71016762SJean-Sébastien Pédron #include <linux/bug.h>
15*71016762SJean-Sébastien Pédron #include <linux/minmax.h>
16*71016762SJean-Sébastien Pédron #include <linux/seq_file.h>
17*71016762SJean-Sébastien Pédron #include <linux/types.h>
18*71016762SJean-Sébastien Pédron 
19*71016762SJean-Sébastien Pédron struct seq_buf {
20*71016762SJean-Sébastien Pédron 	char	*buffer;
21*71016762SJean-Sébastien Pédron 	size_t	 size;
22*71016762SJean-Sébastien Pédron 	size_t	 len;
23*71016762SJean-Sébastien Pédron };
24*71016762SJean-Sébastien Pédron 
25*71016762SJean-Sébastien Pédron #define DECLARE_SEQ_BUF(NAME, SIZE)			\
26*71016762SJean-Sébastien Pédron 	struct seq_buf NAME = {				\
27*71016762SJean-Sébastien Pédron 		.buffer = (char[SIZE]) { 0 },		\
28*71016762SJean-Sébastien Pédron 		.size = SIZE,				\
29*71016762SJean-Sébastien Pédron 	}
30*71016762SJean-Sébastien Pédron 
31*71016762SJean-Sébastien Pédron static inline void
seq_buf_clear(struct seq_buf * s)32*71016762SJean-Sébastien Pédron seq_buf_clear(struct seq_buf *s)
33*71016762SJean-Sébastien Pédron {
34*71016762SJean-Sébastien Pédron 	s->len = 0;
35*71016762SJean-Sébastien Pédron 	if (s->size > 0)
36*71016762SJean-Sébastien Pédron 		s->buffer[0] = '\0';
37*71016762SJean-Sébastien Pédron }
38*71016762SJean-Sébastien Pédron 
39*71016762SJean-Sébastien Pédron static inline void
seq_buf_set_overflow(struct seq_buf * s)40*71016762SJean-Sébastien Pédron seq_buf_set_overflow(struct seq_buf *s)
41*71016762SJean-Sébastien Pédron {
42*71016762SJean-Sébastien Pédron 	s->len = s->size + 1;
43*71016762SJean-Sébastien Pédron }
44*71016762SJean-Sébastien Pédron 
45*71016762SJean-Sébastien Pédron static inline bool
seq_buf_has_overflowed(struct seq_buf * s)46*71016762SJean-Sébastien Pédron seq_buf_has_overflowed(struct seq_buf *s)
47*71016762SJean-Sébastien Pédron {
48*71016762SJean-Sébastien Pédron 	return (s->len > s->size);
49*71016762SJean-Sébastien Pédron }
50*71016762SJean-Sébastien Pédron 
51*71016762SJean-Sébastien Pédron static inline bool
seq_buf_buffer_left(struct seq_buf * s)52*71016762SJean-Sébastien Pédron seq_buf_buffer_left(struct seq_buf *s)
53*71016762SJean-Sébastien Pédron {
54*71016762SJean-Sébastien Pédron 	if (seq_buf_has_overflowed(s))
55*71016762SJean-Sébastien Pédron 		return (0);
56*71016762SJean-Sébastien Pédron 
57*71016762SJean-Sébastien Pédron 	return (s->size - s->len);
58*71016762SJean-Sébastien Pédron }
59*71016762SJean-Sébastien Pédron 
60*71016762SJean-Sébastien Pédron #define	seq_buf_init(s, buf, size) linuxkpi_seq_buf_init((s), (buf), (size))
61*71016762SJean-Sébastien Pédron void linuxkpi_seq_buf_init(struct seq_buf *s, char *buf, unsigned int size);
62*71016762SJean-Sébastien Pédron 
63*71016762SJean-Sébastien Pédron #define	seq_buf_printf(s, f, ...) linuxkpi_seq_buf_printf((s), (f), __VA_ARGS__)
64*71016762SJean-Sébastien Pédron int linuxkpi_seq_buf_printf(struct seq_buf *s, const char *fmt, ...) \
65*71016762SJean-Sébastien Pédron     __printflike(2, 3);
66*71016762SJean-Sébastien Pédron 
67*71016762SJean-Sébastien Pédron #define	seq_buf_vprintf(s, f, a) linuxkpi_seq_buf_vprintf((s), (f), (a))
68*71016762SJean-Sébastien Pédron int linuxkpi_seq_buf_vprintf(struct seq_buf *s, const char *fmt, va_list args);
69*71016762SJean-Sébastien Pédron 
70*71016762SJean-Sébastien Pédron #define	seq_buf_str(s) linuxkpi_seq_buf_str((s))
71*71016762SJean-Sébastien Pédron const char * linuxkpi_seq_buf_str(struct seq_buf *s);
72*71016762SJean-Sébastien Pédron 
73*71016762SJean-Sébastien Pédron #endif
74