Lines Matching +full:- +full:s

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 2000-2008 Poul-Henning Kamp
5 * Copyright (c) 2000-2008 Dag-Erling Smørgrav
67 #define SBUF_ISDYNAMIC(s) ((s)->s_flags & SBUF_DYNAMIC) argument
68 #define SBUF_ISDYNSTRUCT(s) ((s)->s_flags & SBUF_DYNSTRUCT) argument
69 #define SBUF_ISFINISHED(s) ((s)->s_flags & SBUF_FINISHED) argument
70 #define SBUF_ISDRAINATEOL(s) ((s)->s_flags & SBUF_DRAINATEOL) argument
71 #define SBUF_HASROOM(s) ((s)->s_len < (s)->s_size - 1) argument
72 #define SBUF_FREESPACE(s) ((s)->s_size - ((s)->s_len + 1)) argument
73 #define SBUF_CANEXTEND(s) ((s)->s_flags & SBUF_AUTOEXTEND) argument
74 #define SBUF_ISSECTION(s) ((s)->s_flags & SBUF_INSECTION) argument
75 #define SBUF_NULINCLUDED(s) ((s)->s_flags & SBUF_INCLUDENUL) argument
76 #define SBUF_ISDRAINTOEOR(s) ((s)->s_flags & SBUF_DRAINTOEOR) argument
77 #define SBUF_DODRAINTOEOR(s) (SBUF_ISSECTION(s) && SBUF_ISDRAINTOEOR(s)) argument
78 #define SBUF_MALLOCFLAG(s) \ argument
79 (((s)->s_flags & SBUF_NOWAIT) ? M_NOWAIT : M_WAITOK)
84 #define SBUF_SETFLAG(s, f) do { (s)->s_flags |= (f); } while (0) argument
85 #define SBUF_CLEARFLAG(s, f) do { (s)->s_flags &= ~(f); } while (0) argument
104 _assert_sbuf_integrity(const char *fun, struct sbuf *s) in _assert_sbuf_integrity() argument
107 KASSERT(s != NULL, in _assert_sbuf_integrity()
108 ("%s called with a NULL sbuf pointer", fun)); in _assert_sbuf_integrity()
109 KASSERT(s->s_buf != NULL, in _assert_sbuf_integrity()
110 ("%s called with uninitialized or corrupt sbuf", fun)); in _assert_sbuf_integrity()
111 if (SBUF_ISFINISHED(s) && SBUF_NULINCLUDED(s)) { in _assert_sbuf_integrity()
112 KASSERT(s->s_len <= s->s_size, in _assert_sbuf_integrity()
114 (intmax_t)s->s_len, (intmax_t)s->s_size)); in _assert_sbuf_integrity()
116 KASSERT(s->s_len < s->s_size, in _assert_sbuf_integrity()
118 (intmax_t)s->s_len, (intmax_t)s->s_size)); in _assert_sbuf_integrity()
123 _assert_sbuf_state(const char *fun, struct sbuf *s, int state) in _assert_sbuf_state() argument
126 KASSERT((s->s_flags & SBUF_FINISHED) == state, in _assert_sbuf_state()
127 ("%s called with %sfinished or corrupt sbuf", fun, in _assert_sbuf_state()
131 #define assert_sbuf_integrity(s) _assert_sbuf_integrity(__func__, (s)) argument
132 #define assert_sbuf_state(s, i) _assert_sbuf_state(__func__, (s), (i)) argument
136 #define assert_sbuf_integrity(s) do { } while (0) argument
137 #define assert_sbuf_state(s, i) do { } while (0) argument
158 KASSERT(newsize >= size, ("%s: %d < %d\n", __func__, newsize, size)); in sbuf_extendsize()
166 sbuf_extend(struct sbuf *s, int addlen) in sbuf_extend() argument
171 if (!SBUF_CANEXTEND(s)) in sbuf_extend()
172 return (-1); in sbuf_extend()
173 newsize = sbuf_extendsize(s->s_size + addlen); in sbuf_extend()
174 newbuf = SBMALLOC(newsize, SBUF_MALLOCFLAG(s)); in sbuf_extend()
176 return (-1); in sbuf_extend()
177 memcpy(newbuf, s->s_buf, s->s_size); in sbuf_extend()
178 if (SBUF_ISDYNAMIC(s)) in sbuf_extend()
179 SBFREE(s->s_buf); in sbuf_extend()
181 SBUF_SETFLAG(s, SBUF_DYNAMIC); in sbuf_extend()
182 s->s_buf = newbuf; in sbuf_extend()
183 s->s_size = newsize; in sbuf_extend()
189 * If buf is non-NULL, it points to a static or already-allocated string
193 sbuf_new(struct sbuf *s, char *buf, int length, int flags) in sbuf_new() argument
199 ("%s called with invalid flags", __func__)); in sbuf_new()
207 * Allocate 'DYNSTRUCT' sbuf from the heap, if NULL 's' was provided. in sbuf_new()
209 if (s == NULL) { in sbuf_new()
210 s = SBMALLOC(sizeof(*s), in sbuf_new()
212 if (s == NULL) in sbuf_new()
214 SBUF_SETFLAG(s, SBUF_DYNSTRUCT); in sbuf_new()
218 * user-provided sbuf objects must be initialized. in sbuf_new()
220 memset(s, 0, sizeof(*s)); in sbuf_new()
223 s->s_flags |= flags; in sbuf_new()
224 s->s_size = length; in sbuf_new()
225 s->s_buf = buf; in sbuf_new()
227 * Never-written sbufs do not need \n termination. in sbuf_new()
229 SBUF_SETFLAG(s, SBUF_DRAINATEOL); in sbuf_new()
235 if (s->s_buf == NULL) { in sbuf_new()
236 if (SBUF_CANEXTEND(s)) in sbuf_new()
237 s->s_size = sbuf_extendsize(s->s_size); in sbuf_new()
238 s->s_buf = SBMALLOC(s->s_size, SBUF_MALLOCFLAG(s)); in sbuf_new()
239 if (s->s_buf == NULL) in sbuf_new()
241 SBUF_SETFLAG(s, SBUF_DYNAMIC); in sbuf_new()
245 if (s != NULL && s->s_buf == NULL) { in sbuf_new()
246 if (SBUF_ISDYNSTRUCT(s)) in sbuf_new()
247 SBFREE(s); in sbuf_new()
248 s = NULL; in sbuf_new()
250 return (s); in sbuf_new()
258 sbuf_uionew(struct sbuf *s, struct uio *uio, int *error) in sbuf_uionew() argument
262 ("%s called with NULL uio pointer", __func__)); in sbuf_uionew()
264 ("%s called with NULL error pointer", __func__)); in sbuf_uionew()
266 if (uio->uio_resid >= INT_MAX || uio->uio_resid < SBUF_MINSIZE - 1) { in sbuf_uionew()
270 s = sbuf_new(s, NULL, uio->uio_resid + 1, 0); in sbuf_uionew()
271 if (s == NULL) { in sbuf_uionew()
275 *error = uiomove(s->s_buf, uio->uio_resid, uio); in sbuf_uionew()
277 sbuf_delete(s); in sbuf_uionew()
280 s->s_len = s->s_size - 1; in sbuf_uionew()
281 if (SBUF_ISSECTION(s)) in sbuf_uionew()
282 s->s_sect_len = s->s_size - 1; in sbuf_uionew()
284 return (s); in sbuf_uionew()
289 sbuf_get_flags(struct sbuf *s) in sbuf_get_flags() argument
292 return (s->s_flags & SBUF_USRFLAGMSK); in sbuf_get_flags()
296 sbuf_clear_flags(struct sbuf *s, int flags) in sbuf_clear_flags() argument
299 s->s_flags &= ~(flags & SBUF_USRFLAGMSK); in sbuf_clear_flags()
303 sbuf_set_flags(struct sbuf *s, int flags) in sbuf_set_flags() argument
306 s->s_flags |= (flags & SBUF_USRFLAGMSK); in sbuf_set_flags()
313 sbuf_clear(struct sbuf *s) in sbuf_clear() argument
316 assert_sbuf_integrity(s); in sbuf_clear()
317 /* don't care if it's finished or not */ in sbuf_clear()
318 KASSERT(s->s_drain_func == NULL, in sbuf_clear()
319 ("%s makes no sense on sbuf %p with drain", __func__, s)); in sbuf_clear()
321 SBUF_CLEARFLAG(s, SBUF_FINISHED); in sbuf_clear()
322 s->s_error = 0; in sbuf_clear()
323 s->s_len = 0; in sbuf_clear()
324 s->s_rec_off = 0; in sbuf_clear()
325 s->s_sect_len = 0; in sbuf_clear()
329 * Set the sbuf's end position to an arbitrary value.
333 sbuf_setpos(struct sbuf *s, ssize_t pos) in sbuf_setpos() argument
336 assert_sbuf_integrity(s); in sbuf_setpos()
337 assert_sbuf_state(s, 0); in sbuf_setpos()
341 KASSERT(pos < s->s_size, in sbuf_setpos()
343 (intmax_t)pos, (intmax_t)s->s_size)); in sbuf_setpos()
344 KASSERT(!SBUF_ISSECTION(s), in sbuf_setpos()
347 if (pos < 0 || pos > s->s_len) in sbuf_setpos()
348 return (-1); in sbuf_setpos()
349 s->s_len = pos; in sbuf_setpos()
373 sbuf_set_drain(struct sbuf *s, sbuf_drain_func *func, void *ctx) in sbuf_set_drain() argument
376 assert_sbuf_state(s, 0); in sbuf_set_drain()
377 assert_sbuf_integrity(s); in sbuf_set_drain()
378 KASSERT(func == s->s_drain_func || s->s_len == 0, in sbuf_set_drain()
379 ("Cannot change drain to %p on non-empty sbuf %p", func, s)); in sbuf_set_drain()
380 s->s_drain_func = func; in sbuf_set_drain()
381 s->s_drain_arg = ctx; in sbuf_set_drain()
388 sbuf_drain(struct sbuf *s) in sbuf_drain() argument
396 if ((s->s_len == 0) || (s->s_error != 0)) in sbuf_drain()
397 return(s->s_error); in sbuf_drain()
399 if (SBUF_DODRAINTOEOR(s) && s->s_rec_off == 0) in sbuf_drain()
400 return (s->s_error = EDEADLK); in sbuf_drain()
401 len = s->s_drain_func(s->s_drain_arg, s->s_buf, in sbuf_drain()
402 SBUF_DODRAINTOEOR(s) ? s->s_rec_off : s->s_len); in sbuf_drain()
404 s->s_error = len ? -len : EDEADLK; in sbuf_drain()
405 return (s->s_error); in sbuf_drain()
407 KASSERT(len > 0 && len <= s->s_len, in sbuf_drain()
408 ("Bad drain amount %d for sbuf %p", len, s)); in sbuf_drain()
409 s->s_len -= len; in sbuf_drain()
410 s->s_rec_off -= len; in sbuf_drain()
415 if (s->s_len == 0) { in sbuf_drain()
421 if (s->s_buf[len - 1] == '\n') in sbuf_drain()
422 SBUF_SETFLAG(s, SBUF_DRAINATEOL); in sbuf_drain()
424 SBUF_CLEARFLAG(s, SBUF_DRAINATEOL); in sbuf_drain()
431 memmove(s->s_buf, s->s_buf + len, s->s_len); in sbuf_drain()
441 sbuf_put_bytes(struct sbuf *s, const char *buf, size_t len) in sbuf_put_bytes() argument
445 assert_sbuf_integrity(s); in sbuf_put_bytes()
446 assert_sbuf_state(s, 0); in sbuf_put_bytes()
448 if (s->s_error != 0) in sbuf_put_bytes()
451 if (SBUF_FREESPACE(s) <= 0) { in sbuf_put_bytes()
456 if (s->s_drain_func != NULL) in sbuf_put_bytes()
457 (void)sbuf_drain(s); in sbuf_put_bytes()
458 else if (sbuf_extend(s, len > INT_MAX ? INT_MAX : len) in sbuf_put_bytes()
460 s->s_error = ENOMEM; in sbuf_put_bytes()
461 if (s->s_error != 0) in sbuf_put_bytes()
464 n = SBUF_FREESPACE(s); in sbuf_put_bytes()
467 memcpy(&s->s_buf[s->s_len], buf, n); in sbuf_put_bytes()
468 s->s_len += n; in sbuf_put_bytes()
469 if (SBUF_ISSECTION(s)) in sbuf_put_bytes()
470 s->s_sect_len += n; in sbuf_put_bytes()
471 len -= n; in sbuf_put_bytes()
477 sbuf_put_byte(struct sbuf *s, char c) in sbuf_put_byte() argument
480 assert_sbuf_integrity(s); in sbuf_put_byte()
481 assert_sbuf_state(s, 0); in sbuf_put_byte()
483 if (__predict_false(s->s_error != 0)) in sbuf_put_byte()
485 if (__predict_false(SBUF_FREESPACE(s) <= 0)) { in sbuf_put_byte()
490 if (s->s_drain_func != NULL) in sbuf_put_byte()
491 (void)sbuf_drain(s); in sbuf_put_byte()
492 else if (sbuf_extend(s, 1) < 0) in sbuf_put_byte()
493 s->s_error = ENOMEM; in sbuf_put_byte()
494 if (s->s_error != 0) in sbuf_put_byte()
497 s->s_buf[s->s_len++] = c; in sbuf_put_byte()
498 if (SBUF_ISSECTION(s)) in sbuf_put_byte()
499 s->s_sect_len++; in sbuf_put_byte()
506 sbuf_bcat(struct sbuf *s, const void *buf, size_t len) in sbuf_bcat() argument
509 sbuf_put_bytes(s, buf, len); in sbuf_bcat()
510 if (s->s_error != 0) in sbuf_bcat()
511 return (-1); in sbuf_bcat()
520 sbuf_bcopyin(struct sbuf *s, const void *uaddr, size_t len) in sbuf_bcopyin() argument
523 assert_sbuf_integrity(s); in sbuf_bcopyin()
524 assert_sbuf_state(s, 0); in sbuf_bcopyin()
525 KASSERT(s->s_drain_func == NULL, in sbuf_bcopyin()
526 ("Nonsensical copyin to sbuf %p with a drain", s)); in sbuf_bcopyin()
528 if (s->s_error != 0) in sbuf_bcopyin()
529 return (-1); in sbuf_bcopyin()
532 if (len > SBUF_FREESPACE(s)) { in sbuf_bcopyin()
533 sbuf_extend(s, len - SBUF_FREESPACE(s)); in sbuf_bcopyin()
534 if (SBUF_FREESPACE(s) < len) in sbuf_bcopyin()
535 len = SBUF_FREESPACE(s); in sbuf_bcopyin()
537 if (copyin(uaddr, s->s_buf + s->s_len, len) != 0) in sbuf_bcopyin()
538 return (-1); in sbuf_bcopyin()
539 s->s_len += len; in sbuf_bcopyin()
549 sbuf_bcpy(struct sbuf *s, const void *buf, size_t len) in sbuf_bcpy() argument
552 assert_sbuf_integrity(s); in sbuf_bcpy()
553 assert_sbuf_state(s, 0); in sbuf_bcpy()
555 sbuf_clear(s); in sbuf_bcpy()
556 return (sbuf_bcat(s, buf, len)); in sbuf_bcpy()
563 sbuf_cat(struct sbuf *s, const char *str) in sbuf_cat() argument
568 sbuf_put_bytes(s, str, n); in sbuf_cat()
569 if (s->s_error != 0) in sbuf_cat()
570 return (-1); in sbuf_cat()
579 sbuf_copyin(struct sbuf *s, const void *uaddr, size_t len) in sbuf_copyin() argument
583 assert_sbuf_integrity(s); in sbuf_copyin()
584 assert_sbuf_state(s, 0); in sbuf_copyin()
585 KASSERT(s->s_drain_func == NULL, in sbuf_copyin()
586 ("Nonsensical copyin to sbuf %p with a drain", s)); in sbuf_copyin()
588 if (s->s_error != 0) in sbuf_copyin()
589 return (-1); in sbuf_copyin()
592 len = SBUF_FREESPACE(s); /* XXX return 0? */ in sbuf_copyin()
593 if (len > SBUF_FREESPACE(s)) { in sbuf_copyin()
594 sbuf_extend(s, len); in sbuf_copyin()
595 if (SBUF_FREESPACE(s) < len) in sbuf_copyin()
596 len = SBUF_FREESPACE(s); in sbuf_copyin()
598 switch (copyinstr(uaddr, s->s_buf + s->s_len, len + 1, &done)) { in sbuf_copyin()
600 s->s_error = ENOMEM; in sbuf_copyin()
603 s->s_len += done - 1; in sbuf_copyin()
604 if (SBUF_ISSECTION(s)) in sbuf_copyin()
605 s->s_sect_len += done - 1; in sbuf_copyin()
608 return (-1); /* XXX */ in sbuf_copyin()
619 sbuf_cpy(struct sbuf *s, const char *str) in sbuf_cpy() argument
622 assert_sbuf_integrity(s); in sbuf_cpy()
623 assert_sbuf_state(s, 0); in sbuf_cpy()
625 sbuf_clear(s); in sbuf_cpy()
626 return (sbuf_cat(s, str)); in sbuf_cpy()
635 * Append a non-NUL character to an sbuf. This prototype signature is
647 sbuf_vprintf(struct sbuf *s, const char *fmt, va_list ap) in sbuf_vprintf() argument
650 assert_sbuf_integrity(s); in sbuf_vprintf()
651 assert_sbuf_state(s, 0); in sbuf_vprintf()
654 ("%s called with a NULL format string", __func__)); in sbuf_vprintf()
656 (void)kvprintf(fmt, sbuf_putc_func, s, 10, ap); in sbuf_vprintf()
657 if (s->s_error != 0) in sbuf_vprintf()
658 return (-1); in sbuf_vprintf()
663 sbuf_vprintf(struct sbuf *s, const char *fmt, va_list ap) in sbuf_vprintf() argument
668 assert_sbuf_integrity(s); in sbuf_vprintf()
669 assert_sbuf_state(s, 0); in sbuf_vprintf()
672 ("%s called with a NULL format string", __func__)); in sbuf_vprintf()
674 if (s->s_error != 0) in sbuf_vprintf()
675 return (-1); in sbuf_vprintf()
682 * In userspace, while drains are useful, there's generally in sbuf_vprintf()
691 len = vsnprintf(&s->s_buf[s->s_len], SBUF_FREESPACE(s) + 1, in sbuf_vprintf()
694 s->s_error = errno; in sbuf_vprintf()
695 return (-1); in sbuf_vprintf()
699 if (SBUF_FREESPACE(s) >= len) in sbuf_vprintf()
702 if (s->s_drain_func != NULL && s->s_len > 0) in sbuf_vprintf()
703 error = sbuf_drain(s); /* sbuf_drain() sets s_error. */ in sbuf_vprintf()
704 else if (sbuf_extend(s, len - SBUF_FREESPACE(s)) != 0) in sbuf_vprintf()
705 s->s_error = error = ENOMEM; in sbuf_vprintf()
709 * s->s_len is the length of the string, without the terminating nul. in sbuf_vprintf()
710 * When updating s->s_len, we must subtract 1 from the length that in sbuf_vprintf()
715 * given sufficient space, so don't over-increment s_len. in sbuf_vprintf()
717 if (SBUF_FREESPACE(s) < len) in sbuf_vprintf()
718 len = SBUF_FREESPACE(s); in sbuf_vprintf()
719 s->s_len += len; in sbuf_vprintf()
720 if (SBUF_ISSECTION(s)) in sbuf_vprintf()
721 s->s_sect_len += len; in sbuf_vprintf()
723 KASSERT(s->s_len < s->s_size, in sbuf_vprintf()
724 ("wrote past end of sbuf (%d >= %d)", s->s_len, s->s_size)); in sbuf_vprintf()
726 if (s->s_error != 0) in sbuf_vprintf()
727 return (-1); in sbuf_vprintf()
736 sbuf_printf(struct sbuf *s, const char *fmt, ...) in sbuf_printf() argument
742 result = sbuf_vprintf(s, fmt, ap); in sbuf_printf()
751 sbuf_putc(struct sbuf *s, int c) in sbuf_putc() argument
754 sbuf_put_byte(s, c); in sbuf_putc()
755 if (s->s_error != 0) in sbuf_putc()
756 return (-1); in sbuf_putc()
761 * Append a trailing newline to a non-empty sbuf, if one is not already
765 sbuf_nl_terminate(struct sbuf *s) in sbuf_nl_terminate() argument
768 assert_sbuf_integrity(s); in sbuf_nl_terminate()
769 assert_sbuf_state(s, 0); in sbuf_nl_terminate()
772 * If the s_buf isn't empty, the last byte is simply s_buf[s_len - 1]. in sbuf_nl_terminate()
781 if (s->s_len == 0) { in sbuf_nl_terminate()
782 if (!SBUF_ISDRAINATEOL(s)) in sbuf_nl_terminate()
783 sbuf_put_byte(s, '\n'); in sbuf_nl_terminate()
784 } else if (s->s_buf[s->s_len - 1] != '\n') in sbuf_nl_terminate()
785 sbuf_put_byte(s, '\n'); in sbuf_nl_terminate()
787 if (s->s_error != 0) in sbuf_nl_terminate()
788 return (-1); in sbuf_nl_terminate()
796 sbuf_trim(struct sbuf *s) in sbuf_trim() argument
799 assert_sbuf_integrity(s); in sbuf_trim()
800 assert_sbuf_state(s, 0); in sbuf_trim()
801 KASSERT(s->s_drain_func == NULL, in sbuf_trim()
802 ("%s makes no sense on sbuf %p with drain", __func__, s)); in sbuf_trim()
804 if (s->s_error != 0) in sbuf_trim()
805 return (-1); in sbuf_trim()
807 while (s->s_len > 0 && isspace(s->s_buf[s->s_len-1])) { in sbuf_trim()
808 --s->s_len; in sbuf_trim()
809 if (SBUF_ISSECTION(s)) in sbuf_trim()
810 s->s_sect_len--; in sbuf_trim()
820 sbuf_error(const struct sbuf *s) in sbuf_error() argument
823 return (s->s_error); in sbuf_error()
830 sbuf_finish(struct sbuf *s) in sbuf_finish() argument
833 assert_sbuf_integrity(s); in sbuf_finish()
834 assert_sbuf_state(s, 0); in sbuf_finish()
836 s->s_buf[s->s_len] = '\0'; in sbuf_finish()
837 if (SBUF_NULINCLUDED(s)) in sbuf_finish()
838 s->s_len++; in sbuf_finish()
839 if (s->s_drain_func != NULL) { in sbuf_finish()
840 while (s->s_len > 0 && s->s_error == 0) in sbuf_finish()
841 s->s_error = sbuf_drain(s); in sbuf_finish()
843 SBUF_SETFLAG(s, SBUF_FINISHED); in sbuf_finish()
845 return (s->s_error); in sbuf_finish()
847 if (s->s_error != 0) { in sbuf_finish()
848 errno = s->s_error; in sbuf_finish()
849 return (-1); in sbuf_finish()
859 sbuf_data(struct sbuf *s) in sbuf_data() argument
862 assert_sbuf_integrity(s); in sbuf_data()
863 assert_sbuf_state(s, SBUF_FINISHED); in sbuf_data()
864 KASSERT(s->s_drain_func == NULL, in sbuf_data()
865 ("%s makes no sense on sbuf %p with drain", __func__, s)); in sbuf_data()
867 return (s->s_buf); in sbuf_data()
874 sbuf_len(struct sbuf *s) in sbuf_len() argument
877 assert_sbuf_integrity(s); in sbuf_len()
878 /* don't care if it's finished or not */ in sbuf_len()
879 KASSERT(s->s_drain_func == NULL, in sbuf_len()
880 ("%s makes no sense on sbuf %p with drain", __func__, s)); in sbuf_len()
882 if (s->s_error != 0) in sbuf_len()
883 return (-1); in sbuf_len()
886 if (SBUF_NULINCLUDED(s) && !SBUF_ISFINISHED(s)) in sbuf_len()
887 return (s->s_len + 1); in sbuf_len()
888 return (s->s_len); in sbuf_len()
895 sbuf_delete(struct sbuf *s) in sbuf_delete() argument
899 assert_sbuf_integrity(s); in sbuf_delete()
900 /* don't care if it's finished or not */ in sbuf_delete()
902 if (SBUF_ISDYNAMIC(s)) in sbuf_delete()
903 SBFREE(s->s_buf); in sbuf_delete()
904 isdyn = SBUF_ISDYNSTRUCT(s); in sbuf_delete()
905 memset(s, 0, sizeof(*s)); in sbuf_delete()
907 SBFREE(s); in sbuf_delete()
914 sbuf_done(const struct sbuf *s) in sbuf_done() argument
917 return (SBUF_ISFINISHED(s)); in sbuf_done()
924 sbuf_start_section(struct sbuf *s, ssize_t *old_lenp) in sbuf_start_section() argument
927 assert_sbuf_integrity(s); in sbuf_start_section()
928 assert_sbuf_state(s, 0); in sbuf_start_section()
930 if (!SBUF_ISSECTION(s)) { in sbuf_start_section()
931 KASSERT(s->s_sect_len == 0, in sbuf_start_section()
934 *old_lenp = -1; in sbuf_start_section()
935 s->s_rec_off = s->s_len; in sbuf_start_section()
936 SBUF_SETFLAG(s, SBUF_INSECTION); in sbuf_start_section()
940 *old_lenp = s->s_sect_len; in sbuf_start_section()
941 s->s_sect_len = 0; in sbuf_start_section()
950 sbuf_end_section(struct sbuf *s, ssize_t old_len, size_t pad, int c) in sbuf_end_section() argument
954 assert_sbuf_integrity(s); in sbuf_end_section()
955 assert_sbuf_state(s, 0); in sbuf_end_section()
956 KASSERT(SBUF_ISSECTION(s), in sbuf_end_section()
960 len = roundup(s->s_sect_len, pad) - s->s_sect_len; in sbuf_end_section()
961 for (; s->s_error == 0 && len > 0; len--) in sbuf_end_section()
962 sbuf_put_byte(s, c); in sbuf_end_section()
964 len = s->s_sect_len; in sbuf_end_section()
965 if (old_len == -1) { in sbuf_end_section()
966 s->s_rec_off = s->s_sect_len = 0; in sbuf_end_section()
967 SBUF_CLEARFLAG(s, SBUF_INSECTION); in sbuf_end_section()
969 s->s_sect_len += old_len; in sbuf_end_section()
971 if (s->s_error != 0) in sbuf_end_section()
972 return (-1); in sbuf_end_section()