0001
0002 #ifndef _LINUX_SEQ_BUF_H
0003 #define _LINUX_SEQ_BUF_H
0004
0005 #include <linux/fs.h>
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019 struct seq_buf {
0020 char *buffer;
0021 size_t size;
0022 size_t len;
0023 loff_t readpos;
0024 };
0025
0026 static inline void seq_buf_clear(struct seq_buf *s)
0027 {
0028 s->len = 0;
0029 s->readpos = 0;
0030 }
0031
0032 static inline void
0033 seq_buf_init(struct seq_buf *s, char *buf, unsigned int size)
0034 {
0035 s->buffer = buf;
0036 s->size = size;
0037 seq_buf_clear(s);
0038 }
0039
0040
0041
0042
0043
0044 static inline bool
0045 seq_buf_has_overflowed(struct seq_buf *s)
0046 {
0047 return s->len > s->size;
0048 }
0049
0050 static inline void
0051 seq_buf_set_overflow(struct seq_buf *s)
0052 {
0053 s->len = s->size + 1;
0054 }
0055
0056
0057
0058
0059 static inline unsigned int
0060 seq_buf_buffer_left(struct seq_buf *s)
0061 {
0062 if (seq_buf_has_overflowed(s))
0063 return 0;
0064
0065 return s->size - s->len;
0066 }
0067
0068
0069 static inline unsigned int seq_buf_used(struct seq_buf *s)
0070 {
0071 return min(s->len, s->size);
0072 }
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088 static inline void seq_buf_terminate(struct seq_buf *s)
0089 {
0090 if (WARN_ON(s->size == 0))
0091 return;
0092
0093 if (seq_buf_buffer_left(s))
0094 s->buffer[s->len] = 0;
0095 else
0096 s->buffer[s->size - 1] = 0;
0097 }
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107 static inline size_t seq_buf_get_buf(struct seq_buf *s, char **bufp)
0108 {
0109 WARN_ON(s->len > s->size + 1);
0110
0111 if (s->len < s->size) {
0112 *bufp = s->buffer + s->len;
0113 return s->size - s->len;
0114 }
0115
0116 *bufp = NULL;
0117 return 0;
0118 }
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129 static inline void seq_buf_commit(struct seq_buf *s, int num)
0130 {
0131 if (num < 0) {
0132 seq_buf_set_overflow(s);
0133 } else {
0134
0135 BUG_ON(s->len + num > s->size);
0136 s->len += num;
0137 }
0138 }
0139
0140 extern __printf(2, 3)
0141 int seq_buf_printf(struct seq_buf *s, const char *fmt, ...);
0142 extern __printf(2, 0)
0143 int seq_buf_vprintf(struct seq_buf *s, const char *fmt, va_list args);
0144 extern int seq_buf_print_seq(struct seq_file *m, struct seq_buf *s);
0145 extern int seq_buf_to_user(struct seq_buf *s, char __user *ubuf,
0146 int cnt);
0147 extern int seq_buf_puts(struct seq_buf *s, const char *str);
0148 extern int seq_buf_putc(struct seq_buf *s, unsigned char c);
0149 extern int seq_buf_putmem(struct seq_buf *s, const void *mem, unsigned int len);
0150 extern int seq_buf_putmem_hex(struct seq_buf *s, const void *mem,
0151 unsigned int len);
0152 extern int seq_buf_path(struct seq_buf *s, const struct path *path, const char *esc);
0153 extern int seq_buf_hex_dump(struct seq_buf *s, const char *prefix_str,
0154 int prefix_type, int rowsize, int groupsize,
0155 const void *buf, size_t len, bool ascii);
0156
0157 #ifdef CONFIG_BINARY_PRINTF
0158 extern int
0159 seq_buf_bprintf(struct seq_buf *s, const char *fmt, const u32 *binary);
0160 #endif
0161
0162 #endif