svn commit: r246326 - user/sbruno/pxe_http_head/lib/libstand
Sean Bruno
sbruno at FreeBSD.org
Mon Feb 4 18:16:55 UTC 2013
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);
More information about the svn-src-user
mailing list