Module Name:    src
Committed By:   christos
Date:           Mon Sep  6 14:52:55 UTC 2010

Modified Files:
        src/lib/libc/stdio: Makefile.inc findfp.c local.h printf.3
Added Files:
        src/lib/libc/stdio: dprintf.c vdprintf.c

Log Message:
add dprintf and vdprintf


To generate a diff of this commit:
cvs rdiff -u -r1.36 -r1.37 src/lib/libc/stdio/Makefile.inc
cvs rdiff -u -r0 -r1.1 src/lib/libc/stdio/dprintf.c \
    src/lib/libc/stdio/vdprintf.c
cvs rdiff -u -r1.24 -r1.25 src/lib/libc/stdio/findfp.c \
    src/lib/libc/stdio/local.h
cvs rdiff -u -r1.52 -r1.53 src/lib/libc/stdio/printf.3

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libc/stdio/Makefile.inc
diff -u src/lib/libc/stdio/Makefile.inc:1.36 src/lib/libc/stdio/Makefile.inc:1.37
--- src/lib/libc/stdio/Makefile.inc:1.36	Mon Jul 13 18:19:25 2009
+++ src/lib/libc/stdio/Makefile.inc	Mon Sep  6 10:52:55 2010
@@ -1,25 +1,25 @@
 #	from: @(#)Makefile.inc	5.7 (Berkeley) 6/27/91
-#	$NetBSD: Makefile.inc,v 1.36 2009/07/13 22:19:25 roy Exp $
+#	$NetBSD: Makefile.inc,v 1.37 2010/09/06 14:52:55 christos Exp $
 
 # stdio sources
 .PATH: ${.CURDIR}/stdio
 
 CPPFLAGS+=-DWIDE_DOUBLE
 
-SRCS+=	asprintf.c clrerr.c fclose.c fdopen.c feof.c ferror.c fflush.c \
-	fgetc.c fgetln.c fgetpos.c fgets.c fgetstr.c fgetwc.c fgetwln.c \
-	fgetws.c fileno.c findfp.c flags.c flockfile.c fopen.c fparseln.c \
-	fprintf.c fpurge.c fputc.c fputs.c fputwc.c fputws.c fread.c \
-	freopen.c fscanf.c fseek.c fseeko.c fsetpos.c ftell.c ftello.c \
+SRCS+=	asprintf.c clrerr.c dprintf.c fclose.c fdopen.c feof.c ferror.c \
+	fflush.c fgetc.c fgetln.c fgetpos.c fgets.c fgetstr.c fgetwc.c \
+	fgetwln.c fgetws.c fileno.c findfp.c flags.c flockfile.c fopen.c \
+	fparseln.c fprintf.c fpurge.c fputc.c fputs.c fputwc.c fputws.c \
+	fread.c freopen.c fscanf.c fseek.c fseeko.c fsetpos.c ftell.c ftello.c \
 	funopen.c fvwrite.c fwalk.c fwide.c fwprintf.c fwrite.c fwscanf.c \
 	getc.c getchar.c getdelim.c getline.c gettemp.c getw.c getwc.c \
 	getwchar.c makebuf.c mkdtemp.c mkstemp.c perror.c printf.c putc.c \
 	putchar.c puts.c putw.c putwc.c putwchar.c refill.c remove.c rewind.c \
 	rget.c scanf.c setbuf.c setbuffer.c setvbuf.c snprintf.c snprintf_ss.c \
 	sscanf.c stdio.c swprintf.c swscanf.c tmpfile.c ungetc.c ungetwc.c \
-	vasprintf.c vfprintf.c vfscanf.c vfwprintf.c vfwscanf.c vprintf.c \
-	vscanf.c vsnprintf.c vsnprintf_ss.c vsscanf.c vswprintf.c vswscanf.c \
-	vwprintf.c vwscanf.c wbuf.c wprintf.c wscanf.c wsetup.c
+	vasprintf.c vdprintf.c vfprintf.c vfscanf.c vfwprintf.c vfwscanf.c \
+	vprintf.c vscanf.c vsnprintf.c vsnprintf_ss.c vsscanf.c vswprintf.c \
+	vswscanf.c vwprintf.c vwscanf.c wbuf.c wprintf.c wscanf.c wsetup.c
 
 .if !defined(AUDIT)
 SRCS+=	gets.c sprintf.c vsprintf.c tempnam.c tmpnam.c mktemp.c
@@ -50,7 +50,8 @@
 MLINKS+=mktemp.3 mkdtemp.3 mktemp.3 mkstemp.3
 MLINKS+=printf.3 asprintf.3 printf.3 fprintf.3 printf.3 snprintf.3 \
 	printf.3 sprintf.3 printf.3 vasprintf.3 printf.3 vfprintf.3 \
-	printf.3 vprintf.3 printf.3 vsnprintf.3 printf.3 vsprintf.3 
+	printf.3 vprintf.3 printf.3 vsnprintf.3 printf.3 vsprintf.3 \
+	printf.3 dprintf.3 printf.3 vdprintf.3
 MLINKS+=putc.3 fputc.3 putc.3 putc_unlocked.3 putc.3 putchar.3 \
 	putc.3 putchar_unlocked.3 putc.3 putw.3
 MLINKS+=scanf.3 fscanf.3 scanf.3 sscanf.3 scanf.3 vfscanf.3 scanf.3 vscanf.3 \

Index: src/lib/libc/stdio/findfp.c
diff -u src/lib/libc/stdio/findfp.c:1.24 src/lib/libc/stdio/findfp.c:1.25
--- src/lib/libc/stdio/findfp.c:1.24	Mon Jan 11 15:39:29 2010
+++ src/lib/libc/stdio/findfp.c	Mon Sep  6 10:52:55 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: findfp.c,v 1.24 2010/01/11 20:39:29 joerg Exp $	*/
+/*	$NetBSD: findfp.c,v 1.25 2010/09/06 14:52:55 christos Exp $	*/
 
 /*-
  * Copyright (c) 1990, 1993
@@ -37,7 +37,7 @@
 #if 0
 static char sccsid[] = "@(#)findfp.c	8.2 (Berkeley) 1/4/94";
 #else
-__RCSID("$NetBSD: findfp.c,v 1.24 2010/01/11 20:39:29 joerg Exp $");
+__RCSID("$NetBSD: findfp.c,v 1.25 2010/09/06 14:52:55 christos Exp $");
 #endif
 #endif /* LIBC_SCCS and not lint */
 
@@ -119,6 +119,23 @@
 	return (g);
 }
 
+void
+__sfpinit(FILE *fp)
+{
+	fp->_flags = 1;		/* reserve this slot; caller sets real flags */
+	fp->_p = NULL;		/* no current pointer */
+	fp->_w = 0;		/* nothing to read or write */
+	fp->_r = 0;
+	fp->_bf._base = NULL;	/* no buffer */
+	fp->_bf._size = 0;
+	fp->_lbfsize = 0;	/* not line buffered */
+	fp->_file = -1;		/* no file */
+/*	fp->_cookie = <any>; */	/* caller sets cookie, _read/_write etc */
+	_UB(fp)._base = NULL;	/* no ungetc buffer */
+	_UB(fp)._size = 0;
+	memset(WCIO_GET(fp), 0, sizeof(struct wchar_io_data));
+}
+
 /*
  * Find a free FILE for fopen et al.
  */
@@ -143,18 +160,7 @@
 	rwlock_unlock(&__sfp_lock);
 	return (NULL);
 found:
-	fp->_flags = 1;		/* reserve this slot; caller sets real flags */
-	fp->_p = NULL;		/* no current pointer */
-	fp->_w = 0;		/* nothing to read or write */
-	fp->_r = 0;
-	fp->_bf._base = NULL;	/* no buffer */
-	fp->_bf._size = 0;
-	fp->_lbfsize = 0;	/* not line buffered */
-	fp->_file = -1;		/* no file */
-/*	fp->_cookie = <any>; */	/* caller sets cookie, _read/_write etc */
-	_UB(fp)._base = NULL;	/* no ungetc buffer */
-	_UB(fp)._size = 0;
-	memset(WCIO_GET(fp), 0, sizeof(struct wchar_io_data));
+	__sfpinit(fp);
 	rwlock_unlock(&__sfp_lock);
 	return (fp);
 }
Index: src/lib/libc/stdio/local.h
diff -u src/lib/libc/stdio/local.h:1.24 src/lib/libc/stdio/local.h:1.25
--- src/lib/libc/stdio/local.h:1.24	Mon Jan 11 15:39:29 2010
+++ src/lib/libc/stdio/local.h	Mon Sep  6 10:52:55 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: local.h,v 1.24 2010/01/11 20:39:29 joerg Exp $	*/
+/*	$NetBSD: local.h,v 1.25 2010/09/06 14:52:55 christos Exp $	*/
 
 /*-
  * Copyright (c) 1990, 1993
@@ -44,6 +44,7 @@
 
 extern int	__sflush __P((FILE *));
 extern FILE	*__sfp __P((void));
+extern void	__sfpinit __P((FILE *));
 extern int	__srefill __P((FILE *));
 extern int	__sread __P((void *, char *, int));
 extern int	__swrite __P((void *, char const *, int));

Index: src/lib/libc/stdio/printf.3
diff -u src/lib/libc/stdio/printf.3:1.52 src/lib/libc/stdio/printf.3:1.53
--- src/lib/libc/stdio/printf.3:1.52	Thu May 13 17:52:43 2010
+++ src/lib/libc/stdio/printf.3	Mon Sep  6 10:52:55 2010
@@ -1,4 +1,4 @@
-.\"	$NetBSD: printf.3,v 1.52 2010/05/13 21:52:43 joerg Exp $
+.\"	$NetBSD: printf.3,v 1.53 2010/09/06 14:52:55 christos Exp $
 .\"
 .\" Copyright (c) 1990, 1991, 1993
 .\"	The Regents of the University of California.  All rights reserved.
@@ -33,18 +33,20 @@
 .\"
 .\"     @(#)printf.3	8.1 (Berkeley) 6/4/93
 .\"
-.Dd March 21, 2010
+.Dd August 28, 2010
 .Dt PRINTF 3
 .Os
 .Sh NAME
 .Nm printf ,
 .Nm fprintf ,
+.Nm dprintf
 .Nm sprintf ,
 .Nm snprintf ,
 .Nm asprintf ,
 .Nm vprintf ,
 .Nm vfprintf ,
 .Nm vsprintf ,
+.Nm vdprintf ,
 .Nm vsnprintf ,
 .Nm vasprintf
 .Nd formatted output conversion
@@ -57,6 +59,8 @@
 .Ft int
 .Fn fprintf "FILE * restrict stream" "const char * restrict format" ...
 .Ft int
+.Fn dprintf "int fd" "const char * restrict format" ...
+.Ft int
 .Fn sprintf "char * restrict str" "const char * restrict format" ...
 .Ft int
 .Fn snprintf "char * restrict str" "size_t size" "const char * restrict format" ...
@@ -70,6 +74,8 @@
 .Ft int
 .Fn vsprintf "char * restrict str" "const char * restrict format" "va_list ap"
 .Ft int
+.Fn vdprintf "int fd" "const char * restrict format" "va_list ap"
+.Ft int
 .Fn vsnprintf "char * restrict str" "size_t size" "const char * restrict format" "va_list ap"
 .Ft int
 .Fn vasprintf "char ** restrict ret" "const char * restrict format" "va_list ap"
@@ -92,6 +98,11 @@
 .Fn vfprintf
 write output to the given output
 .Fa stream ;
+.Fn dprintf
+and
+.Fn vdprintf
+write output to the give file descriptor
+.Fa fd ;
 .Fn sprintf ,
 .Fn snprintf ,
 .Fn vsprintf ,
@@ -814,6 +825,12 @@
 and
 .Fn vasprintf
 are modeled on the ones that first appeared in the GNU C library.
+The functions
+.Fn dprintf
+and
+.Fn vdprintf
+are parts of POSIX 200805 and appeared in
+.Nx 6.0 .
 .Sh CAVEATS
 Because
 .Fn sprintf

Added files:

Index: src/lib/libc/stdio/dprintf.c
diff -u /dev/null src/lib/libc/stdio/dprintf.c:1.1
--- /dev/null	Mon Sep  6 10:52:55 2010
+++ src/lib/libc/stdio/dprintf.c	Mon Sep  6 10:52:55 2010
@@ -0,0 +1,59 @@
+/*	$NetBSD: dprintf.c,v 1.1 2010/09/06 14:52:55 christos Exp $	*/
+
+/*-
+ * Copyright (c) 1990, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBC_SCCS) && !defined(lint)
+__RCSID("$NetBSD: dprintf.c,v 1.1 2010/09/06 14:52:55 christos Exp $");
+#endif /* LIBC_SCCS and not lint */
+
+#include "namespace.h"
+#include <sys/types.h>
+
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "reentrant.h"
+#include "local.h"
+
+int
+dprintf(int fd, const char * __restrict fmt, ...)
+{
+	va_list ap;
+	int ret;
+
+	va_start(ap, fmt);
+	ret = vdprintf(fd, fmt, ap);
+	va_end(ap);
+	return ret;
+}
Index: src/lib/libc/stdio/vdprintf.c
diff -u /dev/null src/lib/libc/stdio/vdprintf.c:1.1
--- /dev/null	Mon Sep  6 10:52:55 2010
+++ src/lib/libc/stdio/vdprintf.c	Mon Sep  6 10:52:55 2010
@@ -0,0 +1,116 @@
+/*	$NetBSD: vdprintf.c,v 1.1 2010/09/06 14:52:55 christos Exp $	*/
+
+/*-
+ * Copyright (c) 1990, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBC_SCCS) && !defined(lint)
+__RCSID("$NetBSD: vdprintf.c,v 1.1 2010/09/06 14:52:55 christos Exp $");
+#endif /* LIBC_SCCS and not lint */
+
+#include "namespace.h"
+#include <sys/types.h>
+
+#include <assert.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <limits.h>
+
+#include "reentrant.h"
+#include "local.h"
+
+#ifdef __weak_alias
+__weak_alias(vdprintf,_vdprintf)
+#endif
+
+int
+vdprintf(int fd, const char * __restrict fmt, _BSD_VA_LIST_ ap)
+{
+	FILE f;
+	struct __sfileext fext;
+	unsigned char buf[BUFSIZ];
+	int ret, fdflags, tmp;
+
+	_DIAGASSERT(fd != -1);
+
+	/*
+	 * File descriptors are a full int, but _file is only a short.
+	 * If we get a valid file descriptor that is greater or equal to
+	 * USHRT_MAX, then the fd will get sign-extended into an
+	 * invalid file descriptor.  Handle this case by failing the
+	 * open. (We treat the short as unsigned, and special-case -1).
+	 */
+	if (fd >= USHRT_MAX) {
+		errno = EMFILE;
+		return EOF;
+	}
+
+	if ((fdflags = fcntl(fd, F_GETFL, 0)) == -1)
+		return EOF;
+
+	tmp = fdflags & O_ACCMODE;
+	if (tmp != O_RDWR && tmp != O_WRONLY) {
+		errno = EINVAL;
+		return EOF;
+	}
+
+	if (fdflags & O_NONBLOCK) {
+		struct stat st;
+		if (fstat(fd, &st) == -1)
+			return -1;
+		if (!S_ISREG(st.st_mode)) {
+			errno = EFTYPE;
+			return EOF;
+		}
+	}
+
+	_FILEEXT_SETUP(&f, &fext);
+	__sfpinit(&f);
+	f._p = buf;
+	f._w = sizeof(buf);
+	f._flags = __SWR;
+	f._file = fd;
+	f._bf._base = buf;
+	f._bf._size = sizeof(buf);
+	f._cookie = &f;
+	f._read = NULL;
+	f._write = __swrite;
+	f._seek = NULL;
+	f._close = NULL;
+
+	if ((ret = vfprintf(&f, fmt, ap)) < 0)
+		return ret;
+
+	return fflush(&f) ? EOF : ret;
+}

Reply via email to