/* * Initialize an sbuf. * If buf is non-NULL, it points to a static or already-allocated string * big enough to hold at least length characters. */ struct sbuf * sbuf_new(struct sbuf *s, char *buf, int length, int flags) { KASSERT(length >= 0); KASSERT((flags & ~SBUF_USRFLAGMSK) == 0); flags &= SBUF_USRFLAGMSK; if (s == NULL) { s = (struct sbuf *)SBMALLOC(sizeof *s); if (s == NULL) return (NULL); bzero(s, sizeof *s); s->s_flags = flags; SBUF_SETFLAG(s, SBUF_DYNSTRUCT); } else { bzero(s, sizeof *s); s->s_flags = flags; } s->s_size = length; if (buf) { s->s_buf = buf; return (s); } if (flags & SBUF_AUTOEXTEND) s->s_size = sbuf_extendsize(s->s_size); s->s_buf = (char *)SBMALLOC(s->s_size); if (s->s_buf == NULL) { if (SBUF_ISDYNSTRUCT(s)) SBFREE(s); return (NULL); } SBUF_SETFLAG(s, SBUF_DYNAMIC); return (s); }
/* * Initialize the internals of an vsb. * If buf is non-NULL, it points to a static or already-allocated string * big enough to hold at least length characters. */ static struct vsb * VSB_newbuf(struct vsb *s, char *buf, int length, int flags) { memset(s, 0, sizeof(*s)); s->magic = VSB_MAGIC; s->s_flags = flags; s->s_size = length; s->s_buf = buf; if ((s->s_flags & VSB_AUTOEXTEND) == 0) { KASSERT(s->s_size > 1, ("attempt to create a too small vsb")); } if (s->s_buf != NULL) return (s); if ((flags & VSB_AUTOEXTEND) != 0) s->s_size = VSB_extendsize(s->s_size); s->s_buf = SBMALLOC(s->s_size); if (s->s_buf == NULL) return (NULL); VSB_SETFLAG(s, VSB_DYNAMIC); return (s); }
/* * Initialize the internals of an sbuf. * If buf is non-NULL, it points to a static or already-allocated string * big enough to hold at least length characters. */ static struct sbuf * sbuf_newbuf(struct sbuf *s, char *buf, int length, int flags) { memset(s, 0, sizeof(*s)); s->s_flags = flags; s->s_size = length; s->s_buf = buf; if ((s->s_flags & SBUF_AUTOEXTEND) == 0) { KASSERT(s->s_size >= 0, ("attempt to create a too small sbuf")); } if (s->s_buf != NULL) return (s); if ((flags & SBUF_AUTOEXTEND) != 0) s->s_size = sbuf_extendsize(s->s_size); s->s_buf = SBMALLOC(s->s_size); if (s->s_buf == NULL) return (NULL); SBUF_SETFLAG(s, SBUF_DYNAMIC); return (s); }
/* * Initialize an sbuf. * If buf is non-NULL, it points to a static or already-allocated string * big enough to hold at least length characters. */ struct sbuf * sbuf_new(struct sbuf *s, char *buf, int length, int flags) { KASSERT(length >= 0, ("attempt to create an sbuf of negative length (%d)", length)); KASSERT((flags & ~SBUF_USRFLAGMSK) == 0, ("%s called with invalid flags", __func__)); flags &= SBUF_USRFLAGMSK; if (s == NULL) { s = SBMALLOC(sizeof(*s)); if (s == NULL) return (NULL); bzero(s, sizeof(*s)); s->s_flags = flags; SBUF_SETFLAG(s, SBUF_DYNSTRUCT); } else { bzero(s, sizeof(*s)); s->s_flags = flags; } s->s_size = length; if (buf) { s->s_buf = buf; return (s); } if (flags & SBUF_AUTOEXTEND) s->s_size = sbuf_extendsize(s->s_size); s->s_buf = SBMALLOC(s->s_size); if (s->s_buf == NULL) { if (SBUF_ISDYNSTRUCT(s)) SBFREE(s); return (NULL); } SBUF_SETFLAG(s, SBUF_DYNAMIC); return (s); }
/* * Extend an vsb. */ static int VSB_extend(struct vsb *s, int addlen) { char *newbuf; int newsize; if (!VSB_CANEXTEND(s)) return (-1); newsize = VSB_extendsize(s->s_size + addlen); newbuf = SBMALLOC(newsize); if (newbuf == NULL) return (-1); memcpy(newbuf, s->s_buf, s->s_size); if (VSB_ISDYNAMIC(s)) SBFREE(s->s_buf); else VSB_SETFLAG(s, VSB_DYNAMIC); s->s_buf = newbuf; s->s_size = newsize; return (0); }
/* * Extend an sbuf. */ static int sbuf_extend(struct sbuf *s, int addlen) { char *newbuf; int newsize; if (!SBUF_CANEXTEND(s)) return (-1); newsize = sbuf_extendsize(s->s_size + addlen); newbuf = SBMALLOC(newsize); if (newbuf == NULL) return (-1); memcpy(newbuf, s->s_buf, s->s_size); if (SBUF_ISDYNAMIC(s)) SBFREE(s->s_buf); else SBUF_SETFLAG(s, SBUF_DYNAMIC); s->s_buf = newbuf; s->s_size = newsize; return (0); }
/* * Initialize an vsb. * If buf is non-NULL, it points to a static or already-allocated string * big enough to hold at least length characters. */ struct vsb * VSB_new(struct vsb *s, char *buf, int length, int flags) { KASSERT(length >= 0, ("attempt to create an vsb of negative length (%d)", length)); KASSERT((flags & ~VSB_USRFLAGMSK) == 0, ("%s called with invalid flags", __func__)); flags &= VSB_USRFLAGMSK; if (s != NULL) return (VSB_newbuf(s, buf, length, flags)); s = SBMALLOC(sizeof(*s)); if (s == NULL) return (NULL); if (VSB_newbuf(s, buf, length, flags) == NULL) { SBFREE(s); return (NULL); } VSB_SETFLAG(s, VSB_DYNSTRUCT); return (s); }
/* * Extend an vsb. */ static ssize_t VSB_extend(struct vsb *s, ssize_t addlen) { char *newbuf; ssize_t newsize; if (!VSB_CANEXTEND(s)) return (-1); newsize = VSB_extendsize(s->s_size + addlen); if (VSB_ISDYNAMIC(s)) newbuf = realloc(s->s_buf, newsize); else newbuf = SBMALLOC(newsize); if (newbuf == NULL) return (-1); if (!VSB_ISDYNAMIC(s)) { memcpy(newbuf, s->s_buf, s->s_size); VSB_SETFLAG(s, VSB_DYNAMIC); } s->s_buf = newbuf; s->s_size = newsize; return (0); }