]>
git.proxmox.com Git - mirror_frr.git/blob - lib/sbuf.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
5 * Copyright (C) 2017 Christian Franke
13 void sbuf_init(struct sbuf
*dest
, char *buf
, size_t size
)
15 dest
->fixed
= (size
> 0);
20 dest
->buf
= XMALLOC(MTYPE_TMP
, SBUF_DEFAULT_SIZE
);
21 dest
->size
= SBUF_DEFAULT_SIZE
;
28 void sbuf_reset(struct sbuf
*dest
)
34 const char *sbuf_buf(struct sbuf
*buf
)
39 void sbuf_free(struct sbuf
*buf
)
42 XFREE(MTYPE_TMP
, buf
->buf
);
45 void sbuf_push(struct sbuf
*buf
, int indent
, const char *format
, ...)
51 int written1
, written2
;
55 va_start(args
, format
);
56 written2
= vsnprintfrr(NULL
, 0, format
, args
);
60 if (written1
>= 0 && written2
>= 0) {
61 while (buf
->pos
+ written1
+ written2
>= new_size
)
63 if (new_size
> buf
->size
) {
65 XREALLOC(MTYPE_TMP
, buf
->buf
, new_size
);
71 written
= snprintf(buf
->buf
+ buf
->pos
, buf
->size
- buf
->pos
, "%*s",
76 if (buf
->pos
> buf
->size
)
79 va_start(args
, format
);
80 written
= vsnprintfrr(buf
->buf
+ buf
->pos
, buf
->size
- buf
->pos
,
86 if (buf
->pos
> buf
->size
)
89 if (buf
->pos
== buf
->size
)
90 assert(!"Buffer filled up!");