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