Date: Mon, 4 Feb 2013 18:16:55 +0000 (UTC) From: Sean Bruno <sbruno@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r246326 - user/sbruno/pxe_http_head/lib/libstand Message-ID: <201302041816.r14IGtG6035965@svn.freebsd.org>
index | next in thread | raw e-mail
Author: sbruno Date: Mon Feb 4 18:16:54 2013 New Revision: 246326 URL: http://svnweb.freebsd.org/changeset/base/246326 Log: Add snprintf to libstand. Extend kvprintf to have a maxsize argument for sanity. Exten PCHAR(c) to use maxsize, for sanity. This is all courtesy of Alexy Tarasov's 2007 gsoc project: Modified: user/sbruno/pxe_http_head/lib/libstand/printf.c user/sbruno/pxe_http_head/lib/libstand/stand.h Modified: user/sbruno/pxe_http_head/lib/libstand/printf.c ============================================================================== --- user/sbruno/pxe_http_head/lib/libstand/printf.c Mon Feb 4 17:41:17 2013 (r246325) +++ user/sbruno/pxe_http_head/lib/libstand/printf.c Mon Feb 4 18:16:54 2013 (r246326) @@ -57,7 +57,7 @@ __FBSDID("$FreeBSD$"); #define MAXNBUF (sizeof(intmax_t) * CHAR_BIT + 1) static char *ksprintn (char *buf, uintmax_t num, int base, int *len, int upper); -static int kvprintf(char const *fmt, void (*func)(int), void *arg, int radix, va_list ap); +static int kvprintf(char const *fmt, void (*func)(int), void *arg, int radix, size_t size, va_list ap); int printf(const char *fmt, ...) @@ -66,7 +66,7 @@ printf(const char *fmt, ...) int retval; va_start(ap, fmt); - retval = kvprintf(fmt, putchar, NULL, 10, ap); + retval = kvprintf(fmt, putchar, NULL, 10, 0, ap); va_end(ap); return retval; } @@ -75,7 +75,7 @@ void vprintf(const char *fmt, va_list ap) { - kvprintf(fmt, putchar, NULL, 10, ap); + kvprintf(fmt, putchar, NULL, 10, 0, ap); } int @@ -85,18 +85,42 @@ sprintf(char *buf, const char *cfmt, ... va_list ap; va_start(ap, cfmt); - retval = kvprintf(cfmt, NULL, (void *)buf, 10, ap); + retval = kvprintf(cfmt, NULL, (void *)buf, 10, 0, ap); buf[retval] = '\0'; va_end(ap); return retval; } +int +snprintf(char *buf, size_t size, const char *cfmt, ...) +{ + int retval; + va_list ap; + size_t maxsize = (size > 1) ? size - 1 : 0; + + if (maxsize == 0) { + buf[0] = '\0'; + return (0); + } + + va_start(ap, cfmt); + retval = kvprintf(cfmt, NULL, (void *)buf, 10, maxsize, ap); + + if (retval < maxsize) + buf[retval] = '\0'; + else + buf[maxsize] = '\0'; + + va_end(ap); + return retval; +} + void vsprintf(char *buf, const char *cfmt, va_list ap) { int retval; - retval = kvprintf(cfmt, NULL, (void *)buf, 10, ap); + retval = kvprintf(cfmt, NULL, (void *)buf, 10, 0, ap); buf[retval] = '\0'; } @@ -149,9 +173,10 @@ ksprintn(char *nbuf, uintmax_t num, int * ("%*D", len, ptr, " " -> XX XX XX XX ... */ static int -kvprintf(char const *fmt, void (*func)(int), void *arg, int radix, va_list ap) +kvprintf(char const *fmt, void (*func)(int), void *arg, int radix, size_t maxsize, va_list ap) { -#define PCHAR(c) {int cc=(c); if (func) (*func)(cc); else *d++ = cc; retval++; } +#define PCHAR(c) { int cc=(c); if (func) (*func)(cc); else *d++ = cc; retval++; \ + if (maxsize && (retval == maxsize)) return (retval); } char nbuf[MAXNBUF]; char *d; const char *p, *percent, *q; Modified: user/sbruno/pxe_http_head/lib/libstand/stand.h ============================================================================== --- user/sbruno/pxe_http_head/lib/libstand/stand.h Mon Feb 4 17:41:17 2013 (r246325) +++ user/sbruno/pxe_http_head/lib/libstand/stand.h Mon Feb 4 18:16:54 2013 (r246326) @@ -238,6 +238,7 @@ extern void mallocstats(void); extern int printf(const char *fmt, ...) __printflike(1, 2); extern void vprintf(const char *fmt, __va_list); extern int sprintf(char *buf, const char *cfmt, ...) __printflike(2, 3); +extern int snprintf(char *buf, size_t size, const char *cfmt, ...) __printflike(3, 4); extern void vsprintf(char *buf, const char *cfmt, __va_list); extern void twiddle(void);help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201302041816.r14IGtG6035965>
