sbuf_new(9) now returns a struct sbuf * instead of an int. If the caller

does not provide a struct sbuf, sbuf_new(9) will allocate one and return
a pointer to it.
This commit is contained in:
des 2001-06-10 15:48:04 +00:00
parent add2afe54c
commit 23c38e4e7c
4 changed files with 46 additions and 23 deletions

View File

@ -45,7 +45,7 @@
.Sh SYNOPSIS
.Fd #include <sys/types.h>
.Fd #include <sys/sbuf.h>
.Ft int
.Ft struct sbuf *s
.Fn sbuf_new "struct sbuf *s" "char *buf" "int length" "int flags"
.Ft void
.Fn sbuf_clear "struct sbuf *s"
@ -85,6 +85,13 @@ The
function initializes the
.Fa sbuf
pointed to by its first argument.
If that pointer is
.Dv NULL ,
.Fn sbuf_new
allocates a
.Fa struct sbuf
using
.Xr malloc 9 .
The
.Fa buf
argument is a pointer to a buffer in which to store the actual string;
@ -213,7 +220,10 @@ or it is reinitialized to a sufficiently short string using
.Fn sbuf_cpy .
.Sh RETURN VALUES
.Fn sbuf_new
returns \-1 if it failed to allocate a storage buffer, and zero
returns
.Dv NULL
if it failed to allocate a storage buffer, and a pointer to the new
.Fa sbuf
otherwise.
.Pp
.Fn sbuf_setpos

View File

@ -881,7 +881,7 @@ do_status(int action, struct uio *buf)
case 0: /* open */
if (status_open)
return EBUSY;
if (sbuf_new(&s, NULL, 4096, 0))
if (sbuf_new(&s, NULL, 4096, 0) == NULL)
return ENXIO;
bufptr = 0;
err = (status_init(&s) > 0)? 0 : ENOMEM;

View File

@ -55,6 +55,7 @@ MALLOC_DEFINE(M_SBUF, "sbuf", "string buffers");
* Predicates
*/
#define SBUF_ISDYNAMIC(s) ((s)->s_flags & SBUF_DYNAMIC)
#define SBUF_ISDYNSTRUCT(s) ((s)->s_flags & SBUF_DYNSTRUCT)
#define SBUF_ISFINISHED(s) ((s)->s_flags & SBUF_FINISHED)
#define SBUF_HASOVERFLOWED(s) ((s)->s_flags & SBUF_OVERFLOWED)
#define SBUF_HASROOM(s) ((s)->s_len < (s)->s_size - 1)
@ -99,27 +100,36 @@ _assert_sbuf_state(char *fun, struct sbuf *s, int state)
* If buf is non-NULL, it points to a static or already-allocated string
* big enough to hold at least length characters.
*/
int
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 == 0,
(__FUNCTION__ " called with non-zero flags"));
KASSERT(s != NULL,
(__FUNCTION__ " called with a NULL sbuf pointer"));
bzero(s, sizeof *s);
if (s == NULL) {
s = (struct sbuf *)SBMALLOC(sizeof *s);
if (s == NULL)
return (NULL);
bzero(s, sizeof *s);
SBUF_SETFLAG(s, SBUF_DYNSTRUCT);
} else {
bzero(s, sizeof *s);
}
s->s_size = length;
if (buf) {
s->s_buf = buf;
return (0);
return (s);
}
s->s_buf = (char *)SBMALLOC(s->s_size);
if (s->s_buf == NULL)
return (-1);
if (s->s_buf == NULL) {
if (SBUF_ISDYNSTRUCT(s))
SBFREE(s);
return (NULL);
}
SBUF_SETFLAG(s, SBUF_DYNAMIC);
return (0);
return (s);
}
/*
@ -315,4 +325,6 @@ sbuf_delete(struct sbuf *s)
if (SBUF_ISDYNAMIC(s))
SBFREE(s->s_buf);
bzero(s, sizeof *s);
if (SBUF_ISDYNSTRUCT(s))
SBFREE(s);
}

View File

@ -43,6 +43,7 @@ struct sbuf {
#define SBUF_DYNAMIC 0x00010000 /* s_buf must be freed */
#define SBUF_FINISHED 0x00020000 /* set by sbuf_finish() */
#define SBUF_OVERFLOWED 0x00040000 /* sbuf overflowed */
#define SBUF_DYNSTRUCT 0x00080000 /* sbuf must be freed */
int s_flags; /* flags */
};
@ -50,18 +51,18 @@ __BEGIN_DECLS
/*
* API functions
*/
int sbuf_new(struct sbuf *s, char *buf, int length, int flags);
void sbuf_clear(struct sbuf *s);
int sbuf_setpos(struct sbuf *s, int pos);
int sbuf_cat(struct sbuf *s, const char *str);
int sbuf_cpy(struct sbuf *s, const char *str);
int sbuf_printf(struct sbuf *s, char *fmt, ...);
int sbuf_putc(struct sbuf *s, int c);
int sbuf_overflowed(struct sbuf *s);
void sbuf_finish(struct sbuf *s);
char *sbuf_data(struct sbuf *s);
int sbuf_len(struct sbuf *s);
void sbuf_delete(struct sbuf *s);
struct sbuf *sbuf_new(struct sbuf *s, char *buf, int length, int flags);
void sbuf_clear(struct sbuf *s);
int sbuf_setpos(struct sbuf *s, int pos);
int sbuf_cat(struct sbuf *s, const char *str);
int sbuf_cpy(struct sbuf *s, const char *str);
int sbuf_printf(struct sbuf *s, char *fmt, ...);
int sbuf_putc(struct sbuf *s, int c);
int sbuf_overflowed(struct sbuf *s);
void sbuf_finish(struct sbuf *s);
char *sbuf_data(struct sbuf *s);
int sbuf_len(struct sbuf *s);
void sbuf_delete(struct sbuf *s);
__END_DECLS
#endif