Date: Sun, 25 Feb 2001 23:49:16 -0800 (PST) From: Matt Dillon <dillon@earth.backplane.com> To: "Kenneth D. Merry" <ken@kdm.org> Cc: arch@FreeBSD.ORG Subject: Re: sbufs in userland Message-ID: <200102260749.f1Q7nGZ30306@earth.backplane.com> References: <20010226003319.A19994@panzer.kdm.org>
next in thread | previous in thread | raw e-mail | index | archive | help
:As part of a re-write of the CAM error recovery code that Justin and I have
:been working on, I have been re-doing the CAM error printing code.
:
:One of the things I'm working on is making the error printing code in the
:kernel and in userland as similar as possible.
:
:I would like to use the sbuf(9) interface to do the string formatting,
:since it is fairly superior to my current string formatting method (see
:scsi_sense_string() in sys/cam/scsi/scsi_all.c).
Well, I'm on record as really hating the sbuf concept.
For userland, why not simply use asprintf()? I use asprintf() for
just about everything, though I give it a nifty little wrapper.
char *
safe_replacef(char **pptr, const char *ctl, ...)
{
va_list va;
char *optr = *pptr;
if (ctl) {
va_start(va, ctl);
if (vasprintf(pptr, ctl, va) < 0)
fatalmem();
va_end(va);
}
safe_free(&optr);
return(*pptr);
}
void
safe_free(char **ptr)
{
if (*ptr) {
free(*ptr);
*ptr = NULL;
}
}
So you can do this:
char *tmpstr = NULL; /* preinitialization to NULL necessary */
safe_replacef(&tmpstr, "bah bah %s", "bah");
use tmpstr locally
...
safe_replacef(&tmpstr, "black black %s", "black");
use tmpstr locally
..
for ( ...) {
safe_replacef(&tmpstr, "sheep sheep %s", "sheep");
use tmpstr locally
...
}
...
safe_free(&tmpstr);
In anycase, I'd just use an appropriately wrapped asprintf() for
userland. I used to be paranoid about malloc()'ing and free()ing
temporary strings for performance reasons but I got over it, and it
turns out not to be a performance issue. Now I use a safe_replacef()
or a safe_asprintf() type of wrapper almost exclusively for just
about all my string formatting.
-Matt
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-arch" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200102260749.f1Q7nGZ30306>
