Add most parts of the wide char stdio support. This is not hooked up
authorJoerg Sonnenberger <joerg@dragonflybsd.org>
Mon, 25 Jul 2005 00:37:41 +0000 (00:37 +0000)
committerJoerg Sonnenberger <joerg@dragonflybsd.org>
Mon, 25 Jul 2005 00:37:41 +0000 (00:37 +0000)
yet.

Obtained-from: NetBSD, mostly derived from FreeBSD

32 files changed:
lib/libc/stdio/fgetwc.c [new file with mode: 0644]
lib/libc/stdio/fgetwln.3 [new file with mode: 0644]
lib/libc/stdio/fgetwln.c [new file with mode: 0644]
lib/libc/stdio/fgetws.3 [new file with mode: 0644]
lib/libc/stdio/fgetws.c [new file with mode: 0644]
lib/libc/stdio/fputwc.c [new file with mode: 0644]
lib/libc/stdio/fputws.3 [new file with mode: 0644]
lib/libc/stdio/fputws.c [new file with mode: 0644]
lib/libc/stdio/fwide.3 [new file with mode: 0644]
lib/libc/stdio/fwide.c [new file with mode: 0644]
lib/libc/stdio/fwprintf.c [new file with mode: 0644]
lib/libc/stdio/fwscanf.c [new file with mode: 0644]
lib/libc/stdio/getwc.3 [new file with mode: 0644]
lib/libc/stdio/getwc.c [new file with mode: 0644]
lib/libc/stdio/getwchar.c [new file with mode: 0644]
lib/libc/stdio/putwc.3 [new file with mode: 0644]
lib/libc/stdio/putwc.c [new file with mode: 0644]
lib/libc/stdio/putwchar.c [new file with mode: 0644]
lib/libc/stdio/swprintf.c [new file with mode: 0644]
lib/libc/stdio/swscanf.c [new file with mode: 0644]
lib/libc/stdio/ungetwc.3 [new file with mode: 0644]
lib/libc/stdio/ungetwc.c [new file with mode: 0644]
lib/libc/stdio/vfwscanf.c [new file with mode: 0644]
lib/libc/stdio/vswprintf.c [new file with mode: 0644]
lib/libc/stdio/vswscanf.c [new file with mode: 0644]
lib/libc/stdio/vwprintf.c [new file with mode: 0644]
lib/libc/stdio/vwscanf.c [new file with mode: 0644]
lib/libc/stdio/wcio.h [new file with mode: 0644]
lib/libc/stdio/wprintf.3 [new file with mode: 0644]
lib/libc/stdio/wprintf.c [new file with mode: 0644]
lib/libc/stdio/wscanf.3 [new file with mode: 0644]
lib/libc/stdio/wscanf.c [new file with mode: 0644]

diff --git a/lib/libc/stdio/fgetwc.c b/lib/libc/stdio/fgetwc.c
new file mode 100644 (file)
index 0000000..8b5084b
--- /dev/null
@@ -0,0 +1,103 @@
+/* $NetBSD: fgetwc.c,v 1.4 2005/06/12 05:21:27 lukem Exp $ */
+/* $DragonFly: src/lib/libc/stdio/fgetwc.c,v 1.1 2005/07/25 00:37:41 joerg Exp $ */
+
+/*-
+ * Copyright (c)2001 Citrus Project,
+ * All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
+ *
+ * $Citrus$
+ */
+
+#include "namespace.h"
+#include <assert.h>
+#include <errno.h>
+#include <stdio.h>
+#include <wchar.h>
+#include "un-namespace.h"
+
+#include "libc_private.h"
+#include "local.h"
+#include "priv_stdio.h"
+
+wint_t
+__fgetwc_unlock(FILE *fp)
+{
+       struct wchar_io_data *wcio;
+       mbstate_t *st;
+       wchar_t wc;
+       size_t size;
+
+       _DIAGASSERT(fp != NULL);
+
+       _SET_ORIENTATION(fp, 1);
+       wcio = WCIO_GET(fp);
+       if (wcio == 0) {
+               errno = ENOMEM;
+               return WEOF;
+       }
+
+       /* if there're ungetwc'ed wchars, use them */
+       if (wcio->wcio_ungetwc_inbuf) {
+               wc = wcio->wcio_ungetwc_buf[--wcio->wcio_ungetwc_inbuf];
+
+               return wc;
+       }
+
+       st = &wcio->wcio_mbstate_in;
+
+       do {
+               char c;
+               int ch = __sgetc(fp);
+
+               if (ch == EOF) {
+                       return WEOF;
+               }
+
+               c = ch;
+               size = mbrtowc(&wc, &c, 1, st);
+               if (size == (size_t)-1) {
+                       errno = EILSEQ;
+                       return WEOF;
+               }
+       } while (size == (size_t)-2);
+
+       _DIAGASSERT(size == 1);
+
+       return wc;
+}
+
+wint_t
+fgetwc(FILE *fp)
+{
+       wint_t r;
+
+       _DIAGASSERT(fp != NULL);
+
+       FLOCKFILE(fp);
+       r = __fgetwc_unlock(fp);
+       FUNLOCKFILE(fp);
+
+       return (r);
+}
+
diff --git a/lib/libc/stdio/fgetwln.3 b/lib/libc/stdio/fgetwln.3
new file mode 100644 (file)
index 0000000..4e547df
--- /dev/null
@@ -0,0 +1,122 @@
+.\"    $NetBSD: fgetwln.3,v 1.1 2005/05/14 23:51:02 christos Exp $
+.\"    $DragonFly: src/lib/libc/stdio/fgetwln.3,v 1.1 2005/07/25 00:37:41 joerg Exp $
+.\" Copyright (c) 1990, 1991, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" 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. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. 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.
+.\"
+.\"     @(#)fgetln.3   8.3 (Berkeley) 4/19/94
+.\" $FreeBSD: src/lib/libc/stdio/fgetwln.3,v 1.1 2004/07/16 06:06:09 tjr Exp $
+.\"
+.Dd July 16, 2004
+.Dt FGETWLN 3
+.Os
+.Sh NAME
+.Nm fgetwln
+.Nd get a line of wide characters from a stream
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In stdio.h
+.In wchar.h
+.Ft wchar_t *
+.Fn fgetwln "FILE * restrict stream" "size_t * restrict len"
+.Sh DESCRIPTION
+The
+.Fn fgetwln
+function
+returns a pointer to the next line from the stream referenced by
+.Fa stream .
+This line is
+.Em not
+a standard wide character string as it does not end with a terminating
+null wide character.
+The length of the line, including the final newline,
+is stored in the memory location to which
+.Fa len
+points.
+(Note, however, that if the line is the last
+in a file that does not end in a newline,
+the returned text will not contain a newline.)
+.Sh RETURN VALUES
+Upon successful completion a pointer is returned;
+this pointer becomes invalid after the next
+.Tn I/O
+operation on
+.Fa stream
+(whether successful or not)
+or as soon as the stream is closed.
+Otherwise,
+.Dv NULL
+is returned.
+The
+.Fn fgetwln
+function
+does not distinguish between end-of-file and error; the routines
+.Xr feof 3
+and
+.Xr ferror 3
+must be used
+to determine which occurred.
+If an error occurs, the global variable
+.Va errno
+is set to indicate the error.
+The end-of-file condition is remembered, even on a terminal, and all
+subsequent attempts to read will return
+.Dv NULL
+until the condition is
+cleared with
+.Xr clearerr 3 .
+.Pp
+The text to which the returned pointer points may be modified,
+provided that no changes are made beyond the returned size.
+These changes are lost as soon as the pointer becomes invalid.
+.Sh ERRORS
+.Bl -tag -width Er
+.It Bq Er EBADF
+The argument
+.Fa stream
+is not a stream open for reading.
+.El
+.Pp
+The
+.Fn fgetwln
+function
+may also fail and set
+.Va errno
+for any of the errors specified for the routines
+.Xr mbrtowc 3 ,
+.Xr realloc 3 ,
+or
+.Xr read 2 .
+.Sh SEE ALSO
+.Xr ferror 3 ,
+.Xr fgetln 3 ,
+.Xr fgetws 3 ,
+.Xr fopen 3
diff --git a/lib/libc/stdio/fgetwln.c b/lib/libc/stdio/fgetwln.c
new file mode 100644 (file)
index 0000000..9f64d32
--- /dev/null
@@ -0,0 +1,69 @@
+/*     $NetBSD: fgetwln.c,v 1.1 2005/05/14 23:51:02 christos Exp $     */
+/*     $DragonFly: src/lib/libc/stdio/fgetwln.c,v 1.1 2005/07/25 00:37:41 joerg Exp $ */
+
+/*-
+ * Copyright (c) 2002-2004 Tim J. Robbins.
+ * All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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 "namespace.h"
+#include <stdio.h>
+#include <wchar.h>
+#include "un-namespace.h"
+
+#include "libc_private.h"
+#include "local.h"
+#include "priv_stdio.h"
+
+wchar_t *
+fgetwln(FILE * __restrict fp, size_t *lenp)
+{
+       wint_t wc;
+       size_t len;
+
+       FLOCKFILE(fp);
+       _SET_ORIENTATION(fp, 1);
+
+       len = 0;
+       while ((wc = __fgetwc_unlock(fp)) != WEOF) {
+#define        GROW    512
+               if (len * sizeof(wchar_t) >= fp->_lb._size &&
+                   __slbexpand(fp, (len + GROW) * sizeof(wchar_t)))
+                       goto error;
+               *((wchar_t *)(void *)fp->_lb._base + len++) = wc;
+               if (wc == L'\n')
+                       break;
+       }
+       if (len == 0)
+               goto error;
+
+       FUNLOCKFILE(fp);
+       *lenp = len;
+       return ((wchar_t *)(void *)fp->_lb._base);
+
+error:
+       FUNLOCKFILE(fp);
+       *lenp = 0;
+       return (NULL);
+}
diff --git a/lib/libc/stdio/fgetws.3 b/lib/libc/stdio/fgetws.3
new file mode 100644 (file)
index 0000000..61be01b
--- /dev/null
@@ -0,0 +1,123 @@
+.\" $NetBSD: fgetws.3,v 1.2 2003/08/07 16:43:23 agc Exp $
+.\" $DragonFly: src/lib/libc/stdio/fgetws.3,v 1.1 2005/07/25 00:37:41 joerg Exp $
+.\"
+.\" Copyright (c) 1990, 1991, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" Chris Torek and the American National Standards Committee X3,
+.\" on Information Processing Systems.
+.\"
+.\" 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.
+.\"
+.\"     @(#)fgets.3    8.1 (Berkeley) 6/4/93
+.\"
+.\" Original version ID:
+.\" FreeBSD: src/lib/libc/stdio/fgets.3,v 1.16 2002/05/31 05:01:17 archie Exp
+.\" FreeBSD: src/lib/libc/stdio/fgetws.3,v 1.2 2002/09/06 11:23:55 tjr Exp
+.\"
+.Dd August 6, 2002
+.Dt FGETWS 3
+.Os
+.Sh NAME
+.Nm fgetws
+.Nd get a line of wide characters from a stream
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In stdio.h
+.In wchar.h
+.Ft "wchar_t *"
+.Fn fgetws "wchar_t * restrict ws" "int n" "FILE * restrict fp"
+.Sh DESCRIPTION
+The
+.Fn fgetws
+function
+reads at most one less than the number of characters specified by
+.Fa n
+from the given
+.Fa fp
+and stores them in the wide character string
+.Fa ws .
+Reading stops when a newline character is found,
+at end-of-file or error.
+The newline, if any, is retained.
+If any characters are read and there is no error, a
+.Ql \e0
+character is appended to end the string.
+.Sh RETURN VALUES
+Upon successful completion,
+.Fn fgetws
+returns
+.Fa ws .
+If end-of-file occurs before any characters are read,
+.Fn fgetws
+returns
+.Dv NULL
+and the buffer contents remain unchanged.
+If an error occurs,
+.Fn fgetws
+returns
+.Dv NULL
+and the buffer contents are indeterminate.
+The
+.Fn fgetws
+function
+does not distinguish between end-of-file and error, and callers must use
+.Xr feof 3
+and
+.Xr ferror 3
+to determine which occurred.
+.Sh ERRORS
+.Bl -tag -width Er
+.It Bq Er EBADF
+The given
+.Fa fp
+argument is not a readable stream.
+.It Bq Er EILSEQ
+The data obtained from the input stream does not form a valid
+multibyte character.
+.El
+.Pp
+The function
+.Fn fgetws
+may also fail and set
+.Va errno
+for any of the errors specified for the routines
+.Xr fflush 3 ,
+.Xr fstat 2 ,
+.Xr read 2 ,
+or
+.Xr malloc 3 .
+.Sh SEE ALSO
+.Xr feof 3 ,
+.Xr ferror 3 ,
+.Xr fgets 3
+.Sh STANDARDS
+The
+.Fn fgetws
+function
+conforms to
+.St -p1003.1-2001 .
diff --git a/lib/libc/stdio/fgetws.c b/lib/libc/stdio/fgetws.c
new file mode 100644 (file)
index 0000000..95a8560
--- /dev/null
@@ -0,0 +1,88 @@
+/* $NetBSD: fgetws.c,v 1.1 2003/03/07 07:11:37 tshiozak Exp $ */
+/* $DragonFly: src/lib/libc/stdio/fgetws.c,v 1.1 2005/07/25 00:37:41 joerg Exp $ */
+
+/*-
+ * Copyright (c) 2002 Tim J. Robbins.
+ * All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
+ *
+ * Original version ID:
+ * FreeBSD: src/lib/libc/stdio/fgetws.c,v 1.4 2002/09/20 13:25:40 tjr Exp
+ *
+ */
+
+#include "namespace.h"
+#include <assert.h>
+#include <errno.h>
+#include <stdio.h>
+#include <wchar.h>
+#include "un-namespace.h"
+
+#include "libc_private.h"
+#include "local.h"
+#include "priv_stdio.h"
+
+wchar_t *
+fgetws(wchar_t * __restrict ws, int n, FILE * __restrict fp)
+{
+       wchar_t *wsp;
+       wint_t wc;
+
+       _DIAGASSERT(fp != NULL);
+       _DIAGASSERT(ws != NULL);
+
+       FLOCKFILE(fp);
+       _SET_ORIENTATION(fp, 1);
+
+       if (n <= 0) {
+               errno = EINVAL;
+               goto error;
+       }
+
+       wsp = ws;
+       while (n-- > 1) {
+               if ((wc = __fgetwc_unlock(fp)) == WEOF && errno == EILSEQ) {
+                       goto error;
+               }
+               if (wc == WEOF) {
+                       if (wsp == ws) {
+                               /* EOF/error, no characters read yet. */
+                               goto error;
+                       }
+                       break;
+               }
+               *wsp++ = (wchar_t)wc;
+               if (wc == L'\n') {
+                       break;
+               }
+       }
+
+       *wsp++ = L'\0';
+       FUNLOCKFILE(fp);
+
+       return (ws);
+
+error:
+       FUNLOCKFILE(fp);
+       return (NULL);
+}
diff --git a/lib/libc/stdio/fputwc.c b/lib/libc/stdio/fputwc.c
new file mode 100644 (file)
index 0000000..7d39732
--- /dev/null
@@ -0,0 +1,99 @@
+/* $NetBSD: fputwc.c,v 1.4 2005/06/12 05:21:27 lukem Exp $ */
+/* $DragonFly: src/lib/libc/stdio/fputwc.c,v 1.1 2005/07/25 00:37:41 joerg Exp $ */
+
+/*-
+ * Copyright (c)2001 Citrus Project,
+ * All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
+ *
+ * $Citrus$
+ */
+
+#include "namespace.h"
+#include <assert.h>
+#include <errno.h>
+#include <limits.h>
+#include <stdio.h>
+#include <wchar.h>
+#include "un-namespace.h"
+
+#include "libc_private.h"
+#include "local.h"
+#include "priv_stdio.h"
+
+wint_t
+__fputwc_unlock(wchar_t wc, FILE *fp)
+{
+       struct wchar_io_data *wcio;
+       mbstate_t *st;
+       size_t size;
+       char buf[MB_LEN_MAX];
+       struct __suio uio;
+       struct __siov iov;
+
+       _DIAGASSERT(fp != NULL);
+       
+       /* LINTED we don't play with buf */
+       iov.iov_base = (void *)buf;
+       uio.uio_iov = &iov;
+       uio.uio_iovcnt = 1;
+
+       _SET_ORIENTATION(fp, 1);
+       wcio = WCIO_GET(fp);
+       if (wcio == 0) {
+               errno = ENOMEM;
+               return WEOF;
+       }
+
+       wcio->wcio_ungetwc_inbuf = 0;
+       st = &wcio->wcio_mbstate_out;
+
+       size = wcrtomb(buf, wc, st);
+       if (size == (size_t)-1) {
+               errno = EILSEQ;
+               return WEOF;
+       }
+
+       _DIAGASSERT(size != 0);
+
+       uio.uio_resid = iov.iov_len = size;
+       if (__sfvwrite(fp, &uio)) {
+               return WEOF;
+       }
+
+       return (wint_t)wc;
+}
+
+wint_t
+fputwc(wchar_t wc, FILE *fp)
+{
+       wint_t r;
+
+       _DIAGASSERT(fp != NULL);
+
+       FLOCKFILE(fp);
+       r = __fputwc_unlock(wc, fp);
+       FUNLOCKFILE(fp);
+
+       return (r);
+}
diff --git a/lib/libc/stdio/fputws.3 b/lib/libc/stdio/fputws.3
new file mode 100644 (file)
index 0000000..826a297
--- /dev/null
@@ -0,0 +1,90 @@
+.\" $NetBSD: fputws.3,v 1.2 2003/08/07 16:43:24 agc Exp $
+.\" $DragonFly: src/lib/libc/stdio/fputws.3,v 1.1 2005/07/25 00:37:41 joerg Exp $
+.\"
+.\" Copyright (c) 1990, 1991, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" Chris Torek and the American National Standards Committee X3,
+.\" on Information Processing Systems.
+.\"
+.\" 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.
+.\"
+.\"     @(#)fputs.3    8.1 (Berkeley) 6/4/93
+.\"
+.\" Original version ID:
+.\" FreeBSD: src/lib/libc/stdio/fputs.3,v 1.8 2001/10/01 16:08:59 ru Exp
+.\" FreeBSD: src/lib/libc/stdio/fputws.c,v 1.4 2002/09/20 13:25:40 tjr Exp
+.\"
+.Dd August 6, 2002
+.Dt FPUTWS 3
+.Os
+.Sh NAME
+.Nm fputws
+.Nd output a line of wide characters to a stream
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In stdio.h
+.In wchar.h
+.Ft int
+.Fn fputws "const wchar_t * restrict ws" "FILE * restrict fp"
+.Sh DESCRIPTION
+The
+.Fn fputws
+function writes the wide character string pointed to by
+.Fa ws
+to the stream pointed to by
+.Fa fp .
+.Sh RETURN VALUES
+The
+.Fn fputws
+function
+returns 0 on success and \-1 on error.
+.Sh ERRORS
+.Bl -tag -width Er
+.It Bq Er EBADF
+The
+.Fa fp
+argument supplied
+is not a writable stream.
+.El
+.Pp
+The
+.Fn fputws
+function may also fail and set
+.Va errno
+for any of the errors specified for the routine
+.Xr write 2 .
+.Sh SEE ALSO
+.Xr ferror 3 ,
+.Xr fputs 3 ,
+.Xr putwc 3 ,
+.Xr stdio 3
+.Sh STANDARDS
+The
+.Fn fputws
+function conforms to
+.St -p1003.1-2001 .
diff --git a/lib/libc/stdio/fputws.c b/lib/libc/stdio/fputws.c
new file mode 100644 (file)
index 0000000..76bdf61
--- /dev/null
@@ -0,0 +1,63 @@
+/* $NetBSD: fputws.c,v 1.1 2003/03/07 07:11:37 tshiozak Exp $ */
+/* $DragonFly: src/lib/libc/stdio/fputws.c,v 1.1 2005/07/25 00:37:41 joerg Exp $ */
+
+/*-
+ * Copyright (c) 2002 Tim J. Robbins.
+ * All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
+ *
+ * Original version ID:
+ * FreeBSD: src/lib/libc/stdio/fputws.c,v 1.4 2002/09/20 13:25:40 tjr Exp
+ */
+
+#include "namespace.h"
+#include <assert.h>
+#include <errno.h>
+#include <stdio.h>
+#include <wchar.h>
+#include "un-namespace.h"
+
+#include "libc_private.h"
+#include "local.h"
+#include "priv_stdio.h"
+
+int
+fputws(const wchar_t * __restrict ws, FILE * __restrict fp)
+{
+       _DIAGASSERT(fp != NULL);
+       _DIAGASSERT(ws != NULL);
+
+       FLOCKFILE(fp);
+       _SET_ORIENTATION(fp, 1);
+
+       while (*ws != '\0') {
+               if (__fputwc_unlock(*ws++, fp) == WEOF) {
+                       FUNLOCKFILE(fp);
+                       return (-1);
+               }
+       }
+
+       FUNLOCKFILE(fp);
+
+       return (0);
+}
diff --git a/lib/libc/stdio/fwide.3 b/lib/libc/stdio/fwide.3
new file mode 100644 (file)
index 0000000..592cece
--- /dev/null
@@ -0,0 +1,95 @@
+.\"    $NetBSD: fwide.3,v 1.6 2003/09/08 17:54:32 wiz Exp $
+.\"    $DragonFly: src/lib/libc/stdio/fwide.3,v 1.1 2005/07/25 00:37:41 joerg Exp $
+.\"
+.\" Copyright (c)2001 Citrus Project,
+.\" All rights reserved.
+.\"
+.\" 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.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
+.\"
+.\" $Citrus: xpg4dl/FreeBSD/lib/libc/stdio/fwide.3,v 1.2 2001/12/07 04:47:08 yamt Exp $
+.\"
+.Dd October 24, 2001
+.Dt FWIDE 3
+.Os
+.Sh NAME
+.Nm fwide
+.Nd get/set orientation of a stream
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In stdio.h
+.In wchar.h
+.Ft int
+.Fn fwide "FILE *stream" "int mode"
+.Sh DESCRIPTION
+The
+.Fn fwide
+function
+determines the orientation of the stream pointed at by
+.Fa stream .
+.Pp
+If the orientation of
+.Fa stream
+has already been determined,
+.Fn fwide
+leaves it unchanged.
+Otherwise,
+.Fn fwide
+sets the orientation of
+.Fa stream
+according to
+.Fa mode .
+.Pp
+If
+.Fa mode
+is less than zero,
+.Fa stream
+is set to byte-oriented.
+If it is greater than zero,
+.Fa stream
+is set to wide-oriented.
+Otherwise,
+.Fa mode
+is zero, and
+.Fa stream
+is unchanged.
+.Sh RETURN VALUES
+.Fn fwide
+returns a value according to orientation after the call of
+.Fn fwide ;
+a value less than zero if byte-oriented, a value greater than zero
+if wide-oriented, and zero if the stream has no orientation.
+.Sh SEE ALSO
+.Xr ferror 3 ,
+.Xr fgetc 3 ,
+.Xr fgetwc 3 ,
+.Xr fopen 3 ,
+.Xr fputc 3 ,
+.Xr fputwc 3 ,
+.Xr freopen 3 ,
+.Xr stdio 3
+.Sh STANDARDS
+The
+.Fn fwide
+function
+conforms to
+.St -isoC-99 .
diff --git a/lib/libc/stdio/fwide.c b/lib/libc/stdio/fwide.c
new file mode 100644 (file)
index 0000000..48a1777
--- /dev/null
@@ -0,0 +1,72 @@
+/* $NetBSD: fwide.c,v 1.3 2005/06/12 05:21:27 lukem Exp $ */
+/* $DragonFly: src/lib/libc/stdio/fwide.c,v 1.1 2005/07/25 00:37:41 joerg Exp $ */
+
+/*-
+ * Copyright (c)2001 Citrus Project,
+ * All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
+ *
+ * $Citrus$
+ */
+
+#include "namespace.h"
+#include <assert.h>
+#include <stdio.h>
+#include <wchar.h>
+#include "un-namespace.h"
+
+#include "libc_private.h"
+#include "local.h"
+#include "priv_stdio.h"
+
+int
+fwide(FILE *fp, int mode)
+{
+       struct wchar_io_data *wcio;
+
+       _DIAGASSERT(fp != NULL);
+
+       /*
+        * this implementation use only -1, 0, 1
+        * for mode value.
+        * (we don't need to do this, but
+        *  this can make things simpler.)
+        */
+       if (mode > 0)
+               mode = 1;
+       else if (mode < 0)
+               mode = -1;
+
+       FLOCKFILE(fp);
+       wcio = WCIO_GET(fp);
+       if (!wcio)
+               return 0; /* XXX */
+
+       if (wcio->wcio_mode == 0 && mode != 0)
+               wcio->wcio_mode = mode;
+       else
+               mode = wcio->wcio_mode;
+       FUNLOCKFILE(fp);
+
+       return mode;
+}
diff --git a/lib/libc/stdio/fwprintf.c b/lib/libc/stdio/fwprintf.c
new file mode 100644 (file)
index 0000000..27b43b6
--- /dev/null
@@ -0,0 +1,45 @@
+/*     $NetBSD: fwprintf.c,v 1.1 2005/05/14 23:51:02 christos Exp $    */
+/*     $DragonFly: src/lib/libc/stdio/fwprintf.c,v 1.1 2005/07/25 00:37:41 joerg Exp $ */
+
+/*-
+ * Copyright (c) 2002 Tim J. Robbins
+ * All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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 <stdarg.h>
+#include <stdio.h>
+#include <wchar.h>
+
+int
+fwprintf(FILE * __restrict fp, const wchar_t * __restrict fmt, ...)
+{
+       int ret;
+       va_list ap;
+
+       va_start(ap, fmt);
+       ret = vfwprintf(fp, fmt, ap);
+       va_end(ap);
+
+       return (ret);
+}
diff --git a/lib/libc/stdio/fwscanf.c b/lib/libc/stdio/fwscanf.c
new file mode 100644 (file)
index 0000000..71f4244
--- /dev/null
@@ -0,0 +1,47 @@
+/*     $NetBSD: fwscanf.c,v 1.1 2005/05/14 23:51:02 christos Exp $     */
+/*     $DragonFly: src/lib/libc/stdio/fwscanf.c,v 1.1 2005/07/25 00:37:41 joerg Exp $ */
+
+/*-
+ * Copyright (c) 2002 Tim J. Robbins
+ * All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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 <stdarg.h>
+#include <stdio.h>
+#include <wchar.h>
+
+#include "local.h"
+
+int
+fwscanf(FILE * __restrict fp, const wchar_t * __restrict fmt, ...)
+{
+       va_list ap;
+       int r;
+
+       va_start(ap, fmt);
+       r = vfwscanf(fp, fmt, ap);
+       va_end(ap);
+
+       return (r);
+}
diff --git a/lib/libc/stdio/getwc.3 b/lib/libc/stdio/getwc.3
new file mode 100644 (file)
index 0000000..2118b19
--- /dev/null
@@ -0,0 +1,113 @@
+.\"    $NetBSD: getwc.3,v 1.7 2003/09/08 17:54:32 wiz Exp $
+.\"    $DragonFly: src/lib/libc/stdio/getwc.3,v 1.1 2005/07/25 00:37:41 joerg Exp $
+.\"
+.\" Copyright (c) 1990, 1991, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" Chris Torek and the American National Standards Committee X3,
+.\" on Information Processing Systems.
+.\"
+.\" 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.
+.\"
+.\"     @(#)getc.3     8.1 (Berkeley) 6/4/93
+.\"
+.Dd October 24, 2001
+.Dt GETWC 3
+.Os
+.Sh NAME
+.Nm fgetwc ,
+.Nm getwc ,
+.Nm getwchar ,
+.Nd get next wide-character from input stream
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In stdio.h
+.In wchar.h
+.Ft wint_t
+.Fn fgetwc "FILE *stream"
+.Ft wint_t
+.Fn getwc "FILE *stream"
+.Ft wint_t
+.Fn getwchar
+.Sh DESCRIPTION
+The
+.Fn fgetwc
+function
+obtains the next input wide-character (if present) from the stream pointed at by
+.Fa stream ,
+or the next character pushed back on the stream via
+.Xr ungetwc 3 .
+.Pp
+The
+.Fn getwc
+function
+acts essentially identically to
+.Fn fgetwc ,
+but is a macro that expands in-line.
+.Pp
+The
+.Fn getwchar
+function
+is equivalent to
+.Fn getwc
+with the argument stdin.
+.Sh RETURN VALUES
+If successful, these routines return the next wide-character
+from the
+.Fa stream .
+If the stream is at end-of-file or a read error occurs,
+the routines return
+.Dv WEOF .
+The routines
+.Xr feof 3
+and
+.Xr ferror 3
+must be used to distinguish between end-of-file and error.
+If an error occurs, the global variable
+.Va errno
+is set to indicate the error.
+The end-of-file condition is remembered, even on a terminal, and all
+subsequent attempts to read will return
+.Dv WEOF
+until the condition is cleared with
+.Xr clearerr 3 .
+.Sh SEE ALSO
+.Xr ferror 3 ,
+.Xr fopen 3 ,
+.Xr fread 3 ,
+.Xr putwc 3 ,
+.Xr stdio 3 ,
+.Xr ungetwc 3
+.Sh STANDARDS
+The
+.Fn fgetwc ,
+.Fn getwc
+and
+.Fn getwchar
+functions
+conform to
+.St -isoC-99 .
diff --git a/lib/libc/stdio/getwc.c b/lib/libc/stdio/getwc.c
new file mode 100644 (file)
index 0000000..5ef66b5
--- /dev/null
@@ -0,0 +1,45 @@
+/* $NetBSD: getwc.c,v 1.3 2005/06/12 05:21:27 lukem Exp $ */
+/* $DragonFly: src/lib/libc/stdio/getwc.c,v 1.1 2005/07/25 00:37:41 joerg Exp $ */
+
+/*-
+ * Copyright (c)2001 Citrus Project,
+ * All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
+ *
+ * $Citrus$
+ */
+
+#include <stdio.h>
+#include <wchar.h>
+
+/*
+ * A subroutine version of the macro getwc.
+ */
+#undef getwc
+
+wint_t
+getwc(FILE *fp)
+{
+
+       return fgetwc(fp);
+}
diff --git a/lib/libc/stdio/getwchar.c b/lib/libc/stdio/getwchar.c
new file mode 100644 (file)
index 0000000..6749ed0
--- /dev/null
@@ -0,0 +1,45 @@
+/* $NetBSD: getwchar.c,v 1.3 2005/06/12 05:21:27 lukem Exp $ */
+/* $DragonFly: src/lib/libc/stdio/getwchar.c,v 1.1 2005/07/25 00:37:41 joerg Exp $ */
+
+/*-
+ * Copyright (c)2001 Citrus Project,
+ * All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
+ *
+ * $Citrus$
+ */
+
+#include <stdio.h>
+#include <wchar.h>
+
+/*
+ * A subroutine version of the macro getwchar.
+ */
+#undef getwchar
+
+wint_t
+getwchar()
+{
+
+       return fgetwc(stdin);
+}
diff --git a/lib/libc/stdio/putwc.3 b/lib/libc/stdio/putwc.3
new file mode 100644 (file)
index 0000000..94e9e6f
--- /dev/null
@@ -0,0 +1,102 @@
+.\"    $NetBSD: putwc.3,v 1.8 2004/01/24 16:59:30 wiz Exp $
+.\"    $DragonFly: src/lib/libc/stdio/putwc.3,v 1.1 2005/07/25 00:37:41 joerg Exp $
+.\"
+.\" Copyright (c) 1990, 1991, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" Chris Torek and the American National Standards Committee X3,
+.\" on Information Processing Systems.
+.\"
+.\" 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.
+.\"
+.\"     @(#)putc.3     8.1 (Berkeley) 6/4/93
+.\"
+.Dd October 20, 2001
+.Dt PUTWC 3
+.Os
+.Sh NAME
+.Nm fputwc ,
+.Nm putwc ,
+.Nm putwchar ,
+.Nd output a wide-character to a stream
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In stdio.h
+.In wchar.h
+.Ft wint_t
+.Fn fputwc "wchar_t wc" "FILE *stream"
+.Ft wint_t
+.Fn putwc "wchar_t wc" "FILE *stream"
+.Ft wint_t
+.Fn putwchar "wchar_t wc"
+.Sh DESCRIPTION
+The
+.Fn fputwc
+function
+writes the wide-character
+.Fa wc
+to the output stream pointed to by
+.Fa stream .
+.Pp
+.Fn putwc
+acts essentially identically to
+.Fn fputwc ,
+but is a macro that expands in-line.
+It may evaluate
+.Fa stream
+more than once, so arguments given to
+.Fn putwc
+should not be expressions with potential side effects.
+.Pp
+.Fn putwchar
+is identical to
+.Fn putwc
+with an output stream of
+.Em stdout .
+.Sh RETURN VALUES
+The functions
+.Fn fputwc ,
+.Fn putwc ,
+and
+.Fn putwchar
+return the wide-character written.
+If an error occurs, the value
+.Dv WEOF
+is returned.
+.Sh SEE ALSO
+.Xr ferror 3 ,
+.Xr fopen 3 ,
+.Xr getwc 3 ,
+.Xr stdio 3
+.Sh STANDARDS
+The functions
+.Fn fputwc ,
+.Fn putwc ,
+and
+.Fn putwchar ,
+conform to
+.St -isoC-99 .
diff --git a/lib/libc/stdio/putwc.c b/lib/libc/stdio/putwc.c
new file mode 100644 (file)
index 0000000..06e262c
--- /dev/null
@@ -0,0 +1,45 @@
+/* $NetBSD: putwc.c,v 1.4 2005/06/12 05:21:27 lukem Exp $ */
+/* $DragonFly: src/lib/libc/stdio/putwc.c,v 1.1 2005/07/25 00:37:41 joerg Exp $ */
+
+/*-
+ * Copyright (c)2001 Citrus Project,
+ * All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
+ *
+ * $Citrus$
+ */
+
+#include <stdio.h>
+#include <wchar.h>
+
+/*
+ * A subroutine version of the macro putwc.
+ */
+#undef putwc
+
+wint_t
+putwc(wchar_t wc, FILE *fp)
+{
+
+       return fputwc(wc, fp);
+}
diff --git a/lib/libc/stdio/putwchar.c b/lib/libc/stdio/putwchar.c
new file mode 100644 (file)
index 0000000..6f2f2d4
--- /dev/null
@@ -0,0 +1,45 @@
+/* $NetBSD: putwchar.c,v 1.4 2005/06/12 05:21:27 lukem Exp $ */
+/* $DragonFly: src/lib/libc/stdio/putwchar.c,v 1.1 2005/07/25 00:37:41 joerg Exp $ */
+
+/*-
+ * Copyright (c)2001 Citrus Project,
+ * All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
+ *
+ * $Citrus$
+ */
+
+#include <stdio.h>
+#include <wchar.h>
+
+/*
+ * A subroutine version of the macro putwchar.
+ */
+#undef putwchar
+
+wint_t
+putwchar(wchar_t wc)
+{
+
+       return fputwc(wc, stdout);
+}
diff --git a/lib/libc/stdio/swprintf.c b/lib/libc/stdio/swprintf.c
new file mode 100644 (file)
index 0000000..3bd844c
--- /dev/null
@@ -0,0 +1,45 @@
+/*     $NetBSD: swprintf.c,v 1.1 2005/05/14 23:51:02 christos Exp $    */
+/*     $DragonFly: src/lib/libc/stdio/swprintf.c,v 1.1 2005/07/25 00:37:41 joerg Exp $ */
+
+/*-
+ * Copyright (c) 2002 Tim J. Robbins
+ * All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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 <stdarg.h>
+#include <stdio.h>
+#include <wchar.h>
+
+int
+swprintf(wchar_t * __restrict s, size_t n, const wchar_t * __restrict fmt, ...)
+{
+       int ret;
+       va_list ap;
+
+       va_start(ap, fmt);
+       ret = vswprintf(s, n, fmt, ap);
+       va_end(ap);
+
+       return (ret);
+}
diff --git a/lib/libc/stdio/swscanf.c b/lib/libc/stdio/swscanf.c
new file mode 100644 (file)
index 0000000..be8d5c4
--- /dev/null
@@ -0,0 +1,45 @@
+/*     $NetBSD: swscanf.c,v 1.1 2005/05/14 23:51:02 christos Exp $     */
+/*     $DragonFly: src/lib/libc/stdio/swscanf.c,v 1.1 2005/07/25 00:37:41 joerg Exp $ */
+
+/*-
+ * Copyright (c) 2002 Tim J. Robbins
+ * All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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 <stdarg.h>
+#include <stdio.h>
+#include <wchar.h>
+
+int
+swscanf(const wchar_t * __restrict str, const wchar_t * __restrict fmt, ...)
+{
+       va_list ap;
+       int r;
+
+       va_start(ap, fmt);
+       r = vswscanf(str, fmt, ap);
+       va_end(ap);
+
+       return (r);
+}
diff --git a/lib/libc/stdio/ungetwc.3 b/lib/libc/stdio/ungetwc.3
new file mode 100644 (file)
index 0000000..afcc277
--- /dev/null
@@ -0,0 +1,96 @@
+.\"    $NetBSD: ungetwc.3,v 1.7 2003/09/08 17:54:32 wiz Exp $
+.\"    $DragonFly: src/lib/libc/stdio/ungetwc.3,v 1.1 2005/07/25 00:37:41 joerg Exp $
+.\"
+.\" Copyright (c) 1990, 1991, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" Chris Torek and the American National Standards Committee X3,
+.\" on Information Processing Systems.
+.\"
+.\" 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.
+.\"
+.\"     @(#)ungetc.3   8.1 (Berkeley) 6/4/93
+.\"
+.Dd October 24, 2001
+.Dt UNGETWC 3
+.Os
+.Sh NAME
+.Nm ungetwc
+.Nd un-get wide-character from input stream
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In stdio.h
+.In wchar.h
+.Ft wint_t
+.Fn ungetwc "wint_t wc" "FILE *stream"
+.Sh DESCRIPTION
+The
+.Fn ungetwc
+function pushes the wide-character
+.Fa wc
+(converted to an wchar_t)
+back onto the input stream pointed to by
+.Fa stream .
+The pushed-backed wide-characters will be returned by subsequent reads on the
+stream (in reverse order).
+A successful intervening call, using the same stream, to one of the file
+positioning functions
+.Xr fseek 3 ,
+.Xr fsetpos 3 ,
+or
+.Xr rewind 3
+will discard the pushed back wide-characters.
+.Pp
+One wide-character of push-back is guaranteed,
+but as long as there is
+sufficient memory, an effectively infinite amount of pushback is allowed.
+.Pp
+If a character is successfully pushed-back,
+the end-of-file indicator for the stream is cleared.
+.Sh RETURN VALUES
+The
+.Fn ungetwc
+function
+returns
+the wide-character pushed-back after the conversion, or
+.Dv WEOF
+if the operation fails.
+If the value of the argument
+.Fa c
+character equals
+.Dv WEOF ,
+the operation will fail and the stream will remain unchanged.
+.Sh SEE ALSO
+.Xr fseek 3 ,
+.Xr getwc 3
+.Sh STANDARDS
+The
+.Fn ungetwc
+function conforms to
+.St -isoC-99 .
+.Sh BUGS
+The current implementation uses a fixed sized ungetwc-buffer.
diff --git a/lib/libc/stdio/ungetwc.c b/lib/libc/stdio/ungetwc.c
new file mode 100644 (file)
index 0000000..bb1e5f4
--- /dev/null
@@ -0,0 +1,78 @@
+/* $NetBSD: ungetwc.c,v 1.3 2005/06/12 05:21:27 lukem Exp $ */
+/* $DragonFly: src/lib/libc/stdio/ungetwc.c,v 1.1 2005/07/25 00:37:41 joerg Exp $ */
+
+/*-
+ * Copyright (c)2001 Citrus Project,
+ * All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
+ *
+ * $Citrus$
+ */
+
+#include "namespace.h"
+#include <assert.h>
+#include <errno.h>
+#include <stdio.h>
+#include <wchar.h>
+#include "un-namespace.h"
+
+#include "libc_private.h"
+#include "local.h"
+#include "priv_stdio.h"
+
+wint_t
+ungetwc(wint_t wc, FILE *fp)
+{
+       struct wchar_io_data *wcio;
+
+       _DIAGASSERT(fp);
+
+       if (wc == WEOF)
+               return WEOF;
+
+       FLOCKFILE(fp);
+       _SET_ORIENTATION(fp, 1);
+       /*
+        * XXX since we have no way to transform a wchar string to
+        * a char string in reverse order, we can't use ungetc.
+        */
+       /* XXX should we flush ungetc buffer? */
+
+       wcio = WCIO_GET(fp);
+       if (wcio == 0) {
+               FUNLOCKFILE(fp);
+               errno = ENOMEM; /* XXX */
+               return WEOF;
+       }
+
+       if (wcio->wcio_ungetwc_inbuf >= WCIO_UNGETWC_BUFSIZE) {
+               FUNLOCKFILE(fp);
+               return WEOF;
+       }
+
+       wcio->wcio_ungetwc_buf[wcio->wcio_ungetwc_inbuf++] = wc;
+       __sclearerr(fp);
+       FUNLOCKFILE(fp);
+
+       return wc;
+}
diff --git a/lib/libc/stdio/vfwscanf.c b/lib/libc/stdio/vfwscanf.c
new file mode 100644 (file)
index 0000000..7e23c2e
--- /dev/null
@@ -0,0 +1,882 @@
+/*     $NetBSD: vfwscanf.c,v 1.2 2005/06/12 05:48:41 lukem Exp $       */
+/*     $DragonFly: src/lib/libc/stdio/vfwscanf.c,v 1.1 2005/07/25 00:37:41 joerg 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. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. 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 "namespace.h"
+#include <ctype.h>
+#include <inttypes.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <stdarg.h>
+#include <string.h>
+#include <limits.h>
+#include <wchar.h>
+#include <wctype.h>
+#include "un-namespace.h"
+
+#include "libc_private.h"
+#include "local.h"
+#include "priv_stdio.h"
+
+#ifndef NO_FLOATING_POINT
+#include <locale.h>
+#endif
+
+#define        BUF             513     /* Maximum length of numeric string. */
+
+/*
+ * Flags used during conversion.
+ */
+#define        LONG            0x01    /* l: long or double */
+#define        LONGDBL         0x02    /* L: long double */
+#define        SHORT           0x04    /* h: short */
+#define        SUPPRESS        0x08    /* *: suppress assignment */
+#define        POINTER         0x10    /* p: void * (as hex) */
+#define        NOSKIP          0x20    /* [ or c: do not skip blanks */
+#define        LONGLONG        0x400   /* ll: quad_t (+ deprecated q: quad) */
+#define        INTMAXT         0x800   /* j: intmax_t */
+#define        PTRDIFFT        0x1000  /* t: ptrdiff_t */
+#define        SIZET           0x2000  /* z: size_t */
+#define        SHORTSHORT      0x4000  /* hh: char */
+#define        UNSIGNED        0x8000  /* %[oupxX] conversions */
+
+/*
+ * The following are used in integral conversions only:
+ * SIGNOK, NDIGITS, PFXOK, and NZDIGITS
+ */
+#define        SIGNOK          0x40    /* +/- is (still) legal */
+#define        NDIGITS         0x80    /* no digits detected */
+#define        PFXOK           0x100   /* 0x prefix is (still) legal */
+#define        NZDIGITS        0x200   /* no zero digits detected */
+#define        HAVESIGN        0x10000 /* sign detected */
+
+/*
+ * Conversion types.
+ */
+#define        CT_CHAR         0       /* %c conversion */
+#define        CT_CCL          1       /* %[...] conversion */
+#define        CT_STRING       2       /* %s conversion */
+#define        CT_INT          3       /* %[dioupxX] conversion */
+#define        CT_FLOAT        4       /* %[efgEFG] conversion */
+
+static int parsefloat(FILE *, wchar_t *, wchar_t *);
+
+#define        INCCL(_c)       \
+       (cclcompl ? (wmemchr(ccls, (_c), (size_t)(ccle - ccls)) == NULL) : \
+       (wmemchr(ccls, (_c), (size_t)(ccle - ccls)) != NULL))
+
+/*
+ * MT-safe version.
+ */
+int
+vfwscanf(FILE * __restrict fp, const wchar_t * __restrict fmt, va_list ap)
+{
+       int ret;
+
+       FLOCKFILE(fp);
+       _SET_ORIENTATION(fp, 1);
+       ret = __vfwscanf_unlocked(fp, fmt, ap);
+       FUNLOCKFILE(fp);
+       return (ret);
+}
+
+/*
+ * Non-MT-safe version.
+ */
+int
+__vfwscanf_unlocked(FILE * __restrict fp, const wchar_t * __restrict fmt, va_list ap)
+{
+       wint_t c;               /* character from format, or conversion */
+       size_t width;           /* field width, or 0 */
+       wchar_t *p;             /* points into all kinds of strings */
+       int n;                  /* handy integer */
+       int flags;              /* flags as defined above */
+       wchar_t *p0;            /* saves original value of p when necessary */
+       int nassigned;          /* number of fields assigned */
+       int nconversions;       /* number of conversions */
+       int nread;              /* number of characters consumed from fp */
+       int base;               /* base argument to conversion function */
+       wchar_t buf[BUF];       /* buffer for numeric conversions */
+       const wchar_t *ccls;    /* character class start */
+       const wchar_t *ccle;    /* character class end */
+       int cclcompl;           /* ccl is complemented? */
+       wint_t wi;              /* handy wint_t */
+       char *mbp;              /* multibyte string pointer for %c %s %[ */
+       size_t nconv;           /* number of bytes in mb. conversion */
+       char mbbuf[MB_LEN_MAX]; /* temporary mb. character buffer */
+       static const mbstate_t initial;
+       mbstate_t mbs;
+
+       /* `basefix' is used to avoid `if' tests in the integer scanner */
+       static short basefix[17] =
+               { 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
+
+       nassigned = 0;
+       nconversions = 0;
+       nread = 0;
+       ccls = ccle = NULL;
+       base = 0;
+       cclcompl = 0;
+       mbp = NULL;
+       for (;;) {
+               c = *fmt++;
+               if (c == 0)
+                       return (nassigned);
+               if (iswspace(c)) {
+                       while ((c = __fgetwc_unlock(fp)) != WEOF &&
+                           iswspace(c))
+                               ;
+                       if (c != WEOF)
+                               ungetwc(c, fp);
+                       continue;
+               }
+               if (c != '%')
+                       goto literal;
+               width = 0;
+               flags = 0;
+               /*
+                * switch on the format.  continue if done;
+                * break once format type is derived.
+                */
+again:         c = *fmt++;
+               switch (c) {
+               case '%':
+literal:
+                       if ((wi = __fgetwc_unlock(fp)) == WEOF)
+                               goto input_failure;
+                       if (wi != c) {
+                               ungetwc(wi, fp);
+                               goto input_failure;
+                       }
+                       nread++;
+                       continue;
+
+               case '*':
+                       flags |= SUPPRESS;
+                       goto again;
+               case 'j':
+                       flags |= INTMAXT;
+                       goto again;
+               case 'l':
+                       if (flags & LONG) {
+                               flags &= ~LONG;
+                               flags |= LONGLONG;
+                       } else
+                               flags |= LONG;
+                       goto again;
+               case 'q':
+                       flags |= LONGLONG;      /* not quite */
+                       goto again;
+               case 't':
+                       flags |= PTRDIFFT;
+                       goto again;
+               case 'z':
+                       flags |= SIZET;
+                       goto again;
+               case 'L':
+                       flags |= LONGDBL;
+                       goto again;
+               case 'h':
+                       if (flags & SHORT) {
+                               flags &= ~SHORT;
+                               flags |= SHORTSHORT;
+                       } else
+                               flags |= SHORT;
+                       goto again;
+
+               case '0': case '1': case '2': case '3': case '4':
+               case '5': case '6': case '7': case '8': case '9':
+                       width = width * 10 + c - '0';
+                       goto again;
+
+               /*
+                * Conversions.
+                */
+               case 'd':
+                       c = CT_INT;
+                       base = 10;
+                       break;
+
+               case 'i':
+                       c = CT_INT;
+                       base = 0;
+                       break;
+
+               case 'o':
+                       c = CT_INT;
+                       flags |= UNSIGNED;
+                       base = 8;
+                       break;
+
+               case 'u':
+                       c = CT_INT;
+                       flags |= UNSIGNED;
+                       base = 10;
+                       break;
+
+               case 'X':
+               case 'x':
+                       flags |= PFXOK; /* enable 0x prefixing */
+                       c = CT_INT;
+                       flags |= UNSIGNED;
+                       base = 16;
+                       break;
+
+#ifndef NO_FLOATING_POINT
+               case 'A': case 'E': case 'F': case 'G':
+               case 'a': case 'e': case 'f': case 'g':
+                       c = CT_FLOAT;
+                       break;
+#endif
+
+               case 'S':
+                       flags |= LONG;
+                       /* FALLTHROUGH */
+               case 's':
+                       c = CT_STRING;
+                       break;
+
+               case '[':
+                       ccls = fmt;
+                       if (*fmt == '^') {
+                               cclcompl = 1;
+                               fmt++;
+                       } else
+                               cclcompl = 0;
+                       if (*fmt == ']')
+                               fmt++;
+                       while (*fmt != '\0' && *fmt != ']')
+                               fmt++;
+                       ccle = fmt;
+                       fmt++;
+                       flags |= NOSKIP;
+                       c = CT_CCL;
+                       break;
+
+               case 'C':
+                       flags |= LONG;
+                       /* FALLTHROUGH */
+               case 'c':
+                       flags |= NOSKIP;
+                       c = CT_CHAR;
+                       break;
+
+               case 'p':       /* pointer format is like hex */
+                       flags |= POINTER | PFXOK;
+                       c = CT_INT;             /* assumes sizeof(uintmax_t) */
+                       flags |= UNSIGNED;      /*      >= sizeof(uintptr_t) */
+                       base = 16;
+                       break;
+
+               case 'n':
+                       nconversions++;
+                       if (flags & SUPPRESS)   /* ??? */
+                               continue;
+                       if (flags & SHORTSHORT)
+                               *va_arg(ap, char *) = nread;
+                       else if (flags & SHORT)
+                               *va_arg(ap, short *) = nread;
+                       else if (flags & LONG)
+                               *va_arg(ap, long *) = nread;
+                       else if (flags & LONGLONG)
+                               *va_arg(ap, quad_t *) = nread;
+                       else if (flags & INTMAXT)
+                               *va_arg(ap, intmax_t *) = nread;
+                       else if (flags & SIZET)
+                               *va_arg(ap, size_t *) = nread;
+                       else if (flags & PTRDIFFT)
+                               *va_arg(ap, ptrdiff_t *) = nread;
+                       else
+                               *va_arg(ap, int *) = nread;
+                       continue;
+
+               default:
+                       goto match_failure;
+
+               /*
+                * Disgusting backwards compatibility hack.     XXX
+                */
+               case '\0':      /* compat */
+                       return (EOF);
+               }
+
+               /*
+                * Consume leading white space, except for formats
+                * that suppress this.
+                */
+               if ((flags & NOSKIP) == 0) {
+                       while ((wi = __fgetwc_unlock(fp)) != WEOF && iswspace(wi))
+                               nread++;
+                       if (wi == WEOF)
+                               goto input_failure;
+                       ungetwc(wi, fp);
+               }
+
+               /*
+                * Do the conversion.
+                */
+               switch (c) {
+
+               case CT_CHAR:
+                       /* scan arbitrary characters (sets NOSKIP) */
+                       if (width == 0)
+                               width = 1;
+                       if (flags & LONG) {
+                               if (!(flags & SUPPRESS))
+                                       p = va_arg(ap, wchar_t *);
+                               n = 0;
+                               while (width-- != 0 &&
+                                   (wi = __fgetwc_unlock(fp)) != WEOF) {
+                                       if (!(flags & SUPPRESS))
+                                               *p++ = (wchar_t)wi;
+                                       n++;
+                               }
+                               if (n == 0)
+                                       goto input_failure;
+                               nread += n;
+                               if (!(flags & SUPPRESS))
+                                       nassigned++;
+                       } else {
+                               if (!(flags & SUPPRESS))
+                                       mbp = va_arg(ap, char *);
+                               n = 0;
+                               mbs = initial;
+                               while (width != 0 &&
+                                   (wi = __fgetwc_unlock(fp)) != WEOF) {
+                                       if (width >= MB_CUR_MAX &&
+                                           !(flags & SUPPRESS)) {
+                                               nconv = wcrtomb(mbp, wi, &mbs);
+                                               if (nconv == (size_t)-1)
+                                                       goto input_failure;
+                                       } else {
+                                               nconv = wcrtomb(mbbuf, wi,
+                                                   &mbs);
+                                               if (nconv == (size_t)-1)
+                                                       goto input_failure;
+                                               if (nconv > width) {
+                                                       ungetwc(wi, fp);
+                                                       break;
+                                               }
+                                               if (!(flags & SUPPRESS))
+                                                       memcpy(mbp, mbbuf,
+                                                           nconv);
+                                       }
+                                       if (!(flags & SUPPRESS))
+                                               mbp += nconv;
+                                       width -= nconv;
+                                       n++;
+                               }
+                               if (n == 0)
+                                       goto input_failure;
+                               nread += n;
+                               if (!(flags & SUPPRESS))
+                                       nassigned++;
+                       }
+                       nconversions++;
+                       break;
+
+               case CT_CCL:
+                       /* scan a (nonempty) character class (sets NOSKIP) */
+                       if (width == 0)
+                               width = (size_t)~0;     /* `infinity' */
+                       /* take only those things in the class */
+                       if ((flags & SUPPRESS) && (flags & LONG)) {
+                               n = 0;
+                               while ((wi = __fgetwc_unlock(fp)) != WEOF &&
+                                   width-- != 0 && INCCL(wi))
+                                       n++;
+                               if (wi != WEOF)
+                                       ungetwc(wi, fp);
+                               if (n == 0)
+                                       goto match_failure;
+                       } else if (flags & LONG) {
+                               p0 = p = va_arg(ap, wchar_t *);
+                               while ((wi = __fgetwc_unlock(fp)) != WEOF &&
+                                   width-- != 0 && INCCL(wi))
+                                       *p++ = (wchar_t)wi;
+                               if (wi != WEOF)
+                                       ungetwc(wi, fp);
+                               n = p - p0;
+                               if (n == 0)
+                                       goto match_failure;
+                               *p = 0;
+                               nassigned++;
+                       } else {
+                               if (!(flags & SUPPRESS))
+                                       mbp = va_arg(ap, char *);
+                               n = 0;
+                               mbs = initial;
+                               while ((wi = __fgetwc_unlock(fp)) != WEOF &&
+                                   width != 0 && INCCL(wi)) {
+                                       if (width >= MB_CUR_MAX &&
+                                          !(flags & SUPPRESS)) {
+                                               nconv = wcrtomb(mbp, wi, &mbs);
+                                               if (nconv == (size_t)-1)
+                                                       goto input_failure;
+                                       } else {
+                                               nconv = wcrtomb(mbbuf, wi,
+                                                   &mbs);
+                                               if (nconv == (size_t)-1)
+                                                       goto input_failure;
+                                               if (nconv > width)
+                                                       break;
+                                               if (!(flags & SUPPRESS))
+                                                       memcpy(mbp, mbbuf,
+                                                           nconv);
+                                       }
+                                       if (!(flags & SUPPRESS))
+                                               mbp += nconv;
+                                       width -= nconv;
+                                       n++;
+                               }
+                               if (wi != WEOF)
+                                       ungetwc(wi, fp);
+                               if (!(flags & SUPPRESS)) {
+                                       *mbp = 0;
+                                       nassigned++;
+                               }
+                       }
+                       nread += n;
+                       nconversions++;
+                       break;
+
+               case CT_STRING:
+                       /* like CCL, but zero-length string OK, & no NOSKIP */
+                       if (width == 0)
+                               width = (size_t)~0;
+                       if ((flags & SUPPRESS) && (flags & LONG)) {
+                               while ((wi = __fgetwc_unlock(fp)) != WEOF &&
+                                   width-- != 0 &&
+                                   !iswspace(wi))
+                                       nread++;
+                               if (wi != WEOF)
+                                       ungetwc(wi, fp);
+                       } else if (flags & LONG) {
+                               p0 = p = va_arg(ap, wchar_t *);
+                               while ((wi = __fgetwc_unlock(fp)) != WEOF &&
+                                   width-- != 0 &&
+                                   !iswspace(wi)) {
+                                       *p++ = (wchar_t)wi;
+                                       nread++;
+                               }
+                               if (wi != WEOF)
+                                       ungetwc(wi, fp);
+                               *p = '\0';
+                               nassigned++;
+                       } else {
+                               if (!(flags & SUPPRESS))
+                                       mbp = va_arg(ap, char *);
+                               mbs = initial;
+                               while ((wi = __fgetwc_unlock(fp)) != WEOF &&
+                                   width != 0 &&
+                                   !iswspace(wi)) {
+                                       if (width >= MB_CUR_MAX &&
+                                           !(flags & SUPPRESS)) {
+                                               nconv = wcrtomb(mbp, wi, &mbs);
+                                               if (nconv == (size_t)-1)
+                                                       goto input_failure;
+                                       } else {
+                                               nconv = wcrtomb(mbbuf, wi,
+                                                   &mbs);
+                                               if (nconv == (size_t)-1)
+                                                       goto input_failure;
+                                               if (nconv > width)
+                                                       break;
+                                               if (!(flags & SUPPRESS))
+                                                       memcpy(mbp, mbbuf,
+                                                           nconv);
+                                       }
+                                       if (!(flags & SUPPRESS))
+                                               mbp += nconv;
+                                       width -= nconv;
+                                       nread++;
+                               }
+                               if (wi != WEOF)
+                                       ungetwc(wi, fp);
+                               if (!(flags & SUPPRESS)) {
+                                       *mbp = 0;
+                                       nassigned++;
+                               }
+                       }
+                       nconversions++;
+                       continue;
+
+               case CT_INT:
+                       /* scan an integer as if by the conversion function */
+                       if (width == 0 || width > sizeof(buf) /
+                           sizeof(*buf) - 1)
+                               width = sizeof(buf) / sizeof(*buf) - 1;
+                       flags |= SIGNOK | NDIGITS | NZDIGITS;
+                       for (p = buf; width; width--) {
+                               c = __fgetwc_unlock(fp);
+                               /*
+                                * Switch on the character; `goto ok'
+                                * if we accept it as a part of number.
+                                */
+                               switch (c) {
+
+                               /*
+                                * The digit 0 is always legal, but is
+                                * special.  For %i conversions, if no
+                                * digits (zero or nonzero) have been
+                                * scanned (only signs), we will have
+                                * base==0.  In that case, we should set
+                                * it to 8 and enable 0x prefixing.
+                                * Also, if we have not scanned zero digits
+                                * before this, do not turn off prefixing
+                                * (someone else will turn it off if we
+                                * have scanned any nonzero digits).
+                                */
+                               case '0':
+                                       if (base == 0) {
+                                               base = 8;
+                                               flags |= PFXOK;
+                                       }
+                                       if (flags & NZDIGITS)
+                                           flags &= ~(SIGNOK|NZDIGITS|NDIGITS);
+                                       else
+                                           flags &= ~(SIGNOK|PFXOK|NDIGITS);
+                                       goto ok;
+
+                               /* 1 through 7 always legal */
+                               case '1': case '2': case '3':
+                               case '4': case '5': case '6': case '7':
+                                       base = basefix[base];
+                                       flags &= ~(SIGNOK | PFXOK | NDIGITS);
+                                       goto ok;
+
+                               /* digits 8 and 9 ok iff decimal or hex */
+                               case '8': case '9':
+                                       base = basefix[base];
+                                       if (base <= 8)
+                                               break;  /* not legal here */
+                                       flags &= ~(SIGNOK | PFXOK | NDIGITS);
+                                       goto ok;
+
+                               /* letters ok iff hex */
+                               case 'A': case 'B': case 'C':
+                               case 'D': case 'E': case 'F':
+                               case 'a': case 'b': case 'c':
+                               case 'd': case 'e': case 'f':
+                                       /* no need to fix base here */
+                                       if (base <= 10)
+                                               break;  /* not legal here */
+                                       flags &= ~(SIGNOK | PFXOK | NDIGITS);
+                                       goto ok;
+
+                               /* sign ok only as first character */
+                               case '+': case '-':
+                                       if (flags & SIGNOK) {
+                                               flags &= ~SIGNOK;
+                                               flags |= HAVESIGN;
+                                               goto ok;
+                                       }
+                                       break;
+                                       
+                               /*
+                                * x ok iff flag still set & 2nd char (or
+                                * 3rd char if we have a sign).
+                                */
+                               case 'x': case 'X':
+                                       if (flags & PFXOK && p ==
+                                           buf + 1 + !!(flags & HAVESIGN)) {
+                                               base = 16;      /* if %i */
+                                               flags &= ~PFXOK;
+                                               goto ok;
+                                       }
+                                       break;
+                               }
+
+                               /*
+                                * If we got here, c is not a legal character
+                                * for a number.  Stop accumulating digits.
+                                */
+                               if (c != WEOF)
+                                       ungetwc(c, fp);
+                               break;
+               ok:
+                               /*
+                                * c is legal: store it and look at the next.
+                                */
+                               *p++ = (wchar_t)c;
+                       }
+                       /*
+                        * If we had only a sign, it is no good; push
+                        * back the sign.  If the number ends in `x',
+                        * it was [sign] '0' 'x', so push back the x
+                        * and treat it as [sign] '0'.
+                        */
+                       if (flags & NDIGITS) {
+                               if (p > buf)
+                                       ungetwc(*--p, fp);
+                               goto match_failure;
+                       }
+                       c = p[-1];
+                       if (c == 'x' || c == 'X') {
+                               --p;
+                               ungetwc(c, fp);
+                       }
+                       if ((flags & SUPPRESS) == 0) {
+                               uintmax_t res;
+
+                               *p = 0;
+                               if ((flags & UNSIGNED) == 0)
+                                   res = wcstoimax(buf, NULL, base);
+                               else
+                                   res = wcstoumax(buf, NULL, base);
+                               if (flags & POINTER)
+                                       *va_arg(ap, void **) =
+                                                       (void *)(uintptr_t)res;
+                               else if (flags & SHORTSHORT)
+                                       *va_arg(ap, char *) = (char)res;
+                               else if (flags & SHORT)
+                                       *va_arg(ap, short *) = (short)res;
+                               else if (flags & LONG)
+                                       *va_arg(ap, long *) = (long)res;
+                               else if (flags & LONGLONG)
+                                       *va_arg(ap, quad_t *) = res;
+                               else if (flags & INTMAXT)
+                                       *va_arg(ap, intmax_t *) = res;
+                               else if (flags & PTRDIFFT)
+                                       *va_arg(ap, ptrdiff_t *) = (ptrdiff_t)res;
+                               else if (flags & SIZET)
+                                       *va_arg(ap, size_t *) = (size_t)res;
+                               else
+                                       *va_arg(ap, int *) = (int)res;
+                               nassigned++;
+                       }
+                       nread += p - buf;
+                       nconversions++;
+                       break;
+
+#ifndef NO_FLOATING_POINT
+               case CT_FLOAT:
+                       /* scan a floating point number as if by strtod */
+                       if (width == 0 || width > sizeof(buf) /
+                           sizeof(*buf) - 1)
+                               width = sizeof(buf) / sizeof(*buf) - 1;
+                       if ((width = parsefloat(fp, buf, buf + width)) == 0)
+                               goto match_failure;
+                       if ((flags & SUPPRESS) == 0) {
+#ifdef notyet
+                               if (flags & LONGDBL) {
+                                       long double res = wcstold(buf, &p);
+                                       *va_arg(ap, long double *) = res;
+                               } else
+#endif
+                               if (flags & LONG) {
+                                       double res = wcstod(buf, &p);
+                                       *va_arg(ap, double *) = res;
+#ifdef notyet
+                               } else {
+                                       float res = wcstof(buf, &p);
+                                       *va_arg(ap, float *) = res;
+#endif
+                               }
+#ifdef DEBUG
+                               if (p - buf != width)
+                                       abort();
+#endif
+                               nassigned++;
+                       }
+                       nread += width;
+                       nconversions++;
+                       break;
+#endif /* !NO_FLOATING_POINT */
+               }
+       }
+input_failure:
+       return (nconversions != 0 ? nassigned : EOF);
+match_failure:
+       return (nassigned);
+}
+
+#ifndef NO_FLOATING_POINT
+static int
+parsefloat(FILE *fp, wchar_t *buf, wchar_t *end)
+{
+       wchar_t *commit, *p;
+       int infnanpos = 0;
+       enum {
+               S_START, S_GOTSIGN, S_INF, S_NAN, S_MAYBEHEX,
+               S_DIGITS, S_FRAC, S_EXP, S_EXPDIGITS
+       } state = S_START;
+       wchar_t c;
+       wchar_t decpt = (wchar_t)(unsigned char)*localeconv()->decimal_point;
+       int gotmantdig = 0, ishex = 0;
+
+       /*
+        * We set commit = p whenever the string we have read so far
+        * constitutes a valid representation of a floating point
+        * number by itself.  At some point, the parse will complete
+        * or fail, and we will ungetc() back to the last commit point.
+        * To ensure that the file offset gets updated properly, it is
+        * always necessary to read at least one character that doesn't
+        * match; thus, we can't short-circuit "infinity" or "nan(...)".
+        */
+       commit = buf - 1;
+       c = WEOF;
+       for (p = buf; p < end; ) {
+               if ((c = __fgetwc_unlock(fp)) == WEOF)
+                       break;
+reswitch:
+               switch (state) {
+               case S_START:
+                       state = S_GOTSIGN;
+                       if (c == '-' || c == '+')
+                               break;
+                       else
+                               goto reswitch;
+               case S_GOTSIGN:
+                       switch (c) {
+                       case '0':
+                               state = S_MAYBEHEX;
+                               commit = p;
+                               break;
+                       case 'I':
+                       case 'i':
+                               state = S_INF;
+                               break;
+                       case 'N':
+                       case 'n':
+                               state = S_NAN;
+                               break;
+                       default:
+                               state = S_DIGITS;
+                               goto reswitch;
+                       }
+                       break;
+               case S_INF:
+                       if (infnanpos > 6 ||
+                           (c != "nfinity"[infnanpos] &&
+                            c != "NFINITY"[infnanpos]))
+                               goto parsedone;
+                       if (infnanpos == 1 || infnanpos == 6)
+                               commit = p;     /* inf or infinity */
+                       infnanpos++;
+                       break;
+               case S_NAN:
+                       switch (infnanpos) {
+                       case -1:        /* XXX kludge to deal with nan(...) */
+                               goto parsedone;
+                       case 0:
+                               if (c != 'A' && c != 'a')
+                                       goto parsedone;
+                               break;
+                       case 1:
+                               if (c != 'N' && c != 'n')
+                                       goto parsedone;
+                               else
+                                       commit = p;
+                               break;
+                       case 2:
+                               if (c != '(')
+                                       goto parsedone;
+                               break;
+                       default:
+                               if (c == ')') {
+                                       commit = p;
+                                       infnanpos = -2;
+                               } else if (!iswalnum(c) && c != '_')
+                                       goto parsedone;
+                               break;
+                       }
+                       infnanpos++;
+                       break;
+               case S_MAYBEHEX:
+                       state = S_DIGITS;
+                       if (c == 'X' || c == 'x') {
+                               ishex = 1;
+                               break;
+                       } else {        /* we saw a '0', but no 'x' */
+                               gotmantdig = 1;
+                               goto reswitch;
+                       }
+               case S_DIGITS:
+                       if ((ishex && iswxdigit(c)) || iswdigit(c))
+                               gotmantdig = 1;
+                       else {
+                               state = S_FRAC;
+                               if (c != decpt)
+                                       goto reswitch;
+                       }
+                       if (gotmantdig)
+                               commit = p;
+                       break;
+               case S_FRAC:
+                       if (((c == 'E' || c == 'e') && !ishex) ||
+                           ((c == 'P' || c == 'p') && ishex)) {
+                               if (!gotmantdig)
+                                       goto parsedone;
+                               else
+                                       state = S_EXP;
+                       } else if ((ishex && iswxdigit(c)) || iswdigit(c)) {
+                               commit = p;
+                               gotmantdig = 1;
+                       } else
+                               goto parsedone;
+                       break;
+               case S_EXP:
+                       state = S_EXPDIGITS;
+                       if (c == '-' || c == '+')
+                               break;
+                       else
+                               goto reswitch;
+               case S_EXPDIGITS:
+                       if (iswdigit(c))
+                               commit = p;
+                       else
+                               goto parsedone;
+                       break;
+               default:
+                       abort();
+               }
+               *p++ = c;
+               c = WEOF;
+       }
+
+parsedone:
+       if (c != WEOF)
+               ungetwc(c, fp);
+       while (commit < --p)
+               ungetwc(*p, fp);
+       *++commit = '\0';
+       return (commit - buf);
+}
+#endif
diff --git a/lib/libc/stdio/vswprintf.c b/lib/libc/stdio/vswprintf.c
new file mode 100644 (file)
index 0000000..860c8cb
--- /dev/null
@@ -0,0 +1,97 @@
+/*     $NetBSD: vswprintf.c,v 1.1 2005/05/14 23:51:02 christos Exp $   */
+/*     $DragonFly: src/lib/libc/stdio/vswprintf.c,v 1.1 2005/07/25 00:37:41 joerg Exp $ */
+
+/*
+ * Copyright (c) 1997 Todd C. Miller <Todd.Miller@courtesan.com>
+ * All rights reserved.
+ *
+ * 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. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED ``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 AUTHOR 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 <errno.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+#include <wchar.h>
+
+#include "local.h"
+#include "priv_stdio.h"
+
+int
+vswprintf(wchar_t * __restrict s, size_t n, const wchar_t * __restrict fmt,
+    va_list ap)
+{
+       static const mbstate_t initial;
+       mbstate_t mbs;
+       FILE f;
+       char *mbp;
+       int ret, sverrno;
+       size_t nwc;
+
+       if (n == 0) {
+               errno = EINVAL;
+               return (-1);
+       }
+
+       f.pub._fileno = -1;
+       f.pub._flags = __SWR | __SSTR | __SALC;
+       f._bf._base = f.pub._p = (unsigned char *)malloc(128);
+       if (f._bf._base == NULL) {
+               errno = ENOMEM;
+               return (-1);
+       }
+       f._bf._size = f.pub._w = 127;           /* Leave room for the NUL */
+       f._up = NULL;
+       f.fl_mutex = PTHREAD_MUTEX_INITIALIZER;
+       f.fl_owner = NULL;
+       f.fl_count = 0;
+       memset(&f._wcio, 0, sizeof(f._wcio));
+       ret = __vfwprintf_unlocked(&f, fmt, ap);
+       if (ret < 0) {
+               sverrno = errno;
+               free(f._bf._base);
+               errno = sverrno;
+               return (-1);
+       }
+       *f.pub._p = '\0';
+       mbp = (char *)f._bf._base;
+       /*
+        * XXX Undo the conversion from wide characters to multibyte that
+        * fputwc() did in __vfwprintf().
+        */
+       mbs = initial;
+       nwc = mbsrtowcs(s, (const char **)&mbp, n, &mbs);
+       free(f._bf._base);
+       if (nwc == (size_t)-1) {
+               errno = EILSEQ;
+               return (-1);
+       }
+       if (nwc == n) {
+               s[n - 1] = L'\0';
+               errno = EOVERFLOW;
+               return (-1);
+       }
+
+       return (ret);
+}
diff --git a/lib/libc/stdio/vswscanf.c b/lib/libc/stdio/vswscanf.c
new file mode 100644 (file)
index 0000000..925d196
--- /dev/null
@@ -0,0 +1,99 @@
+/*     $NetBSD: vswscanf.c,v 1.1 2005/05/14 23:51:02 christos Exp $    */
+/*     $DragonFly: src/lib/libc/stdio/vswscanf.c,v 1.1 2005/07/25 00:37:41 joerg 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
+ * Donn Seeley at UUNET Technologies, Inc.
+ *
+ * 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. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. 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 <limits.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <wchar.h>
+
+#include "local.h"
+#include "priv_stdio.h"
+
+static int     eofread(void *, char *, int);
+
+static int
+/*ARGSUSED*/
+eofread(void *cookie, char *buf, int len)
+{
+
+       return (0);
+}
+
+int
+vswscanf(const wchar_t * __restrict str, const wchar_t * __restrict fmt,
+    va_list ap)
+{
+       static const mbstate_t initial;
+       mbstate_t mbs;
+       FILE f;
+       char *mbstr;
+       size_t mlen;
+       int r;
+
+       /*
+        * XXX Convert the wide character string to multibyte, which
+        * __vfwscanf() will convert back to wide characters.
+        */
+       if ((mbstr = malloc(wcslen(str) * MB_CUR_MAX + 1)) == NULL)
+               return (EOF);
+       mbs = initial;
+       if ((mlen = wcsrtombs(mbstr, (const wchar_t ** __restrict)&str,
+           SIZE_T_MAX, &mbs)) == (size_t)-1) {
+               free(mbstr);
+               return (EOF);
+       }
+       f.pub._fileno = -1;
+       f.pub._flags = __SRD;
+       f._bf._base = f.pub._p = (unsigned char *)mbstr;
+       f._bf._size = f.pub._r = mlen;
+       f._read = eofread;
+       f._ub._base = NULL;
+       f._lb._base = NULL;
+       f._up = NULL;
+       f.fl_mutex = PTHREAD_MUTEX_INITIALIZER;
+       f.fl_owner = NULL;
+       f.fl_count = 0;
+       memset(&f._wcio, 0, sizeof(f._wcio));
+       r = __vfwscanf_unlocked(&f, fmt, ap);
+       free(mbstr);
+
+       return (r);
+}
diff --git a/lib/libc/stdio/vwprintf.c b/lib/libc/stdio/vwprintf.c
new file mode 100644 (file)
index 0000000..e22d09c
--- /dev/null
@@ -0,0 +1,39 @@
+/*     $NetBSD: vwprintf.c,v 1.1 2005/05/14 23:51:02 christos Exp $    */
+/*     $DragonFly: src/lib/libc/stdio/vwprintf.c,v 1.1 2005/07/25 00:37:41 joerg Exp $ */
+
+/*-
+ * Copyright (c) 2002 Tim J. Robbins
+ * All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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 <stdarg.h>
+#include <stdio.h>
+#include <wchar.h>
+
+int
+vwprintf(const wchar_t * __restrict fmt, va_list ap)
+{
+
+       return (vfwprintf(stdout, fmt, ap));
+}
diff --git a/lib/libc/stdio/vwscanf.c b/lib/libc/stdio/vwscanf.c
new file mode 100644 (file)
index 0000000..e1d2529
--- /dev/null
@@ -0,0 +1,39 @@
+/*     $NetBSD: vwscanf.c,v 1.1 2005/05/14 23:51:02 christos Exp $     */
+/*     $DragonFly: src/lib/libc/stdio/vwscanf.c,v 1.1 2005/07/25 00:37:41 joerg Exp $ */
+
+/*-
+ * Copyright (c) 2002 Tim J. Robbins
+ * All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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 <stdarg.h>
+#include <stdio.h>
+#include <wchar.h>
+
+int
+vwscanf(const wchar_t * __restrict fmt, va_list ap)
+{
+
+       return (vfwscanf(stdin, fmt, ap));
+}
diff --git a/lib/libc/stdio/wcio.h b/lib/libc/stdio/wcio.h
new file mode 100644 (file)
index 0000000..16bf455
--- /dev/null
@@ -0,0 +1,71 @@
+/* $NetBSD: wcio.h,v 1.3 2003/01/18 11:30:00 thorpej Exp $ */
+/* $DragonFly: src/lib/libc/stdio/wcio.h,v 1.1 2005/07/25 00:37:41 joerg Exp $ */
+
+/*-
+ * Copyright (c)2001 Citrus Project,
+ * All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
+ *
+ * $Citrus$
+ */
+
+#ifndef _WCIO_H_
+#define _WCIO_H_
+
+#include <wchar.h> /* for mbstate_t and wchar_t */
+
+/* minimal requirement of SUSv2 */
+#define WCIO_UNGETWC_BUFSIZE 1
+
+struct wchar_io_data {
+       mbstate_t wcio_mbstate_in;
+       mbstate_t wcio_mbstate_out;
+
+       wchar_t wcio_ungetwc_buf[WCIO_UNGETWC_BUFSIZE];
+       size_t wcio_ungetwc_inbuf;
+
+       int wcio_mode; /* orientation */
+};
+
+#define _SET_ORIENTATION(fp, mode) \
+do {\
+       struct wchar_io_data *_wcio = WCIO_GET(fp);\
+       if (_wcio && _wcio->wcio_mode == 0)\
+               _wcio->wcio_mode = (mode);\
+} while (/*CONSTCOND*/0)
+
+/*
+ * WCIO_FREE should be called by fclose
+ */
+#define WCIO_GET(fp) (&(fp)->_wcio)
+#define WCIO_FREE(fp) \
+do {\
+       (fp)->_wcio.wcio_mode = 0;\
+       WCIO_FREEUB(fp);\
+} while (/*CONSTCOND*/0)
+#define WCIO_FREEUB(fp) \
+do {\
+       (fp)->_wcio.wcio_ungetwc_inbuf = 0;\
+} while (/*CONSTCOND*/0)
+
+#endif /*_WCIO_H_*/
diff --git a/lib/libc/stdio/wprintf.3 b/lib/libc/stdio/wprintf.3
new file mode 100644 (file)
index 0000000..06766b3
--- /dev/null
@@ -0,0 +1,624 @@
+.\" $NetBSD: wprintf.3,v 1.2 2005/06/03 20:32:20 wiz Exp $
+.\" $DragonFly: src/lib/libc/stdio/wprintf.3,v 1.1 2005/07/25 00:37:41 joerg Exp $
+.\" Copyright (c) 1990, 1991, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" Chris Torek and the American National Standards Committee X3,
+.\" on Information Processing Systems.
+.\"
+.\" 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. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. 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.
+.\"
+.\"     @(#)printf.3   8.1 (Berkeley) 6/4/93
+.\" FreeBSD: src/lib/libc/stdio/printf.3,v 1.47 2002/09/06 11:23:55 tjr Exp
+.\" $FreeBSD: src/lib/libc/stdio/wprintf.3,v 1.5 2003/07/05 07:55:34 tjr Exp $
+.\"
+.Dd July 5, 2003
+.Dt WPRINTF 3
+.Os
+.Sh NAME
+.Nm wprintf , fwprintf , swprintf ,
+.Nm vwprintf , vfwprintf , vswprintf
+.Nd formatted wide character output conversion
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In stdio.h
+.In wchar.h
+.Ft int
+.Fn fwprintf "FILE * restrict stream" "const wchar_t * restrict format" ...
+.Ft int
+.Fn swprintf "wchar_t * restrict ws" "size_t n" "const wchar_t * restrict format" ...
+.Ft int
+.Fn wprintf "const wchar_t * restrict format" ...
+.In stdarg.h
+.Ft int
+.Fn vfwprintf "FILE * restrict stream" "const wchar_t * restrict" "va_list ap"
+.Ft int
+.Fn vswprintf "wchar_t * restrict ws" "size_t n" "const wchar_t *restrict format" "va_list ap"
+.Ft int
+.Fn vwprintf "const wchar_t * restrict format" "va_list ap"
+.Sh DESCRIPTION
+The
+.Fn wprintf
+family of functions produces output according to a
+.Fa format
+as described below.
+The
+.Fn wprintf
+and
+.Fn vwprintf
+functions
+write output to
+.Dv stdout ,
+the standard output stream;
+.Fn fwprintf
+and
+.Fn vfwprintf
+write output to the given output
+.Fa stream ;
+.Fn swprintf
+and
+.Fn vswprintf
+write to the wide character string
+.Fa ws .
+.Pp
+These functions write the output under the control of a
+.Fa format
+string that specifies how subsequent arguments
+(or arguments accessed via the variable-length argument facilities of
+.Xr stdarg 3 )
+are converted for output.
+.Pp
+These functions return the number of characters printed
+(not including the trailing
+.Ql \e0
+used to end output to strings).
+.Pp
+The
+.Fn swprintf
+and
+.Fn vswprintf
+functions will fail if
+.Fa n
+or more wide characters were requested to be written,
+.Pp
+The format string is composed of zero or more directives:
+ordinary
+characters (not
+.Cm % ) ,
+which are copied unchanged to the output stream;
+and conversion specifications, each of which results
+in fetching zero or more subsequent arguments.
+Each conversion specification is introduced by
+the
+.Cm %
+character.
+The arguments must correspond properly (after type promotion)
+with the conversion specifier.
+After the
+.Cm % ,
+the following appear in sequence:
+.Bl -bullet
+.It
+An optional field, consisting of a decimal digit string followed by a
+.Cm $ ,
+specifying the next argument to access.
+If this field is not provided, the argument following the last
+argument accessed will be used.
+Arguments are numbered starting at
+.Cm 1 .
+If unaccessed arguments in the format string are interspersed with ones that
+are accessed the results will be indeterminate.
+.It
+Zero or more of the following flags:
+.Bl -tag -width ".So \  Sc (space)"
+.It Sq Cm #
+The value should be converted to an
+.Dq alternate form .
+For
+.Cm c , d , i , n , p , s ,
+and
+.Cm u
+conversions, this option has no effect.
+For
+.Cm o
+conversions, the precision of the number is increased to force the first
+character of the output string to a zero (except if a zero value is printed
+with an explicit precision of zero).
+For
+.Cm x
+and
+.Cm X
+conversions, a non-zero result has the string
+.Ql 0x
+(or
+.Ql 0X
+for
+.Cm X
+conversions) prepended to it.
+For
+.Cm a , A , e , E , f , F , g ,
+and
+.Cm G
+conversions, the result will always contain a decimal point, even if no
+digits follow it (normally, a decimal point appears in the results of
+those conversions only if a digit follows).
+For
+.Cm g
+and
+.Cm G
+conversions, trailing zeros are not removed from the result as they
+would otherwise be.
+.It So Cm 0 Sc (zero)
+Zero padding.
+For all conversions except
+.Cm n ,
+the converted value is padded on the left with zeros rather than blanks.
+If a precision is given with a numeric conversion
+.Cm ( d , i , o , u , i , x ,
+and
+.Cm X ) ,
+the
+.Cm 0
+flag is ignored.
+.It Sq Cm \-
+A negative field width flag;
+the converted value is to be left adjusted on the field boundary.
+Except for
+.Cm n
+conversions, the converted value is padded on the right with blanks,
+rather than on the left with blanks or zeros.
+A
+.Cm \-
+overrides a
+.Cm 0
+if both are given.
+.It So "\ " Sc (space)
+A blank should be left before a positive number
+produced by a signed conversion
+.Cm ( a , A , d , e , E , f , F , g , G ,
+or
+.Cm i ) .
+.It Sq Cm +
+A sign must always be placed before a
+number produced by a signed conversion.
+A
+.Cm +
+overrides a space if both are used.
+.It Sq Cm '
+Decimal conversions
+.Cm ( d , u ,
+or
+.Cm i )
+or the integral portion of a floating point conversion
+.Cm ( f
+or
+.Cm F )
+should be grouped and separated by thousands using
+the non-monetary separator returned by
+.Xr localeconv 3 .
+.El
+.It
+An optional decimal digit string specifying a minimum field width.
+If the converted value has fewer characters than the field width, it will
+be padded with spaces on the left (or right, if the left-adjustment
+flag has been given) to fill out
+the field width.
+.It
+An optional precision, in the form of a period
+.Cm \&.
+followed by an
+optional digit string.
+If the digit string is omitted, the precision is taken as zero.
+This gives the minimum number of digits to appear for
+.Cm d , i , o , u , x ,
+and
+.Cm X
+conversions, the number of digits to appear after the decimal-point for
+.Cm a , A , e , E , f ,
+and
+.Cm F
+conversions, the maximum number of significant digits for
+.Cm g
+and
+.Cm G
+conversions, or the maximum number of characters to be printed from a
+string for
+.Cm s
+conversions.
+.It
+An optional length modifier, that specifies the size of the argument.
+The following length modifiers are valid for the
+.Cm d , i , n , o , u , x ,
+or
+.Cm X
+conversion:
+.Bl -column ".Cm q Em (deprecated)" ".Vt signed char" ".Vt unsigned long long" ".Vt long long *"
+.It Sy Modifier Ta Cm d , i Ta Cm o , u , x , X Ta Cm n
+.It Cm hh Ta Vt "signed char" Ta Vt "unsigned char" Ta Vt "signed char *"
+.It Cm h Ta Vt short Ta Vt "unsigned short" Ta Vt "short *"
+.It Cm l No (ell) Ta Vt long Ta Vt "unsigned long" Ta Vt "long *"
+.It Cm ll No (ell ell) Ta Vt "long long" Ta Vt "unsigned long long" Ta Vt "long long *"
+.It Cm j Ta Vt intmax_t Ta Vt uintmax_t Ta Vt "intmax_t *"
+.It Cm t Ta Vt ptrdiff_t Ta (see note) Ta Vt "ptrdiff_t *"
+.It Cm z Ta (see note) Ta Vt size_t Ta (see note)
+.It Cm q Em (deprecated) Ta Vt quad_t Ta Vt u_quad_t Ta Vt "quad_t *"
+.El
+.Pp
+Note:
+the
+.Cm t
+modifier, when applied to a
+.Cm o , u , x ,
+or
+.Cm X
+conversion, indicates that the argument is of an unsigned type
+equivalent in size to a
+.Vt ptrdiff_t .
+The
+.Cm z
+modifier, when applied to a
+.Cm d
+or
+.Cm i
+conversion, indicates that the argument is of a signed type equivalent in
+size to a
+.Vt size_t .
+Similarly, when applied to an
+.Cm n
+conversion, it indicates that the argument is a pointer to a signed type
+equivalent in size to a
+.Vt size_t .
+.Pp
+The following length modifier is valid for the
+.Cm a , A , e , E , f , F , g ,
+or
+.Cm G
+conversion:
+.Bl -column ".Sy Modifier" ".Cm a , A , e , E , f , F , g , G"
+.It Sy Modifier Ta Cm a , A , e , E , f , F , g , G
+.It Cm L Ta Vt "long double"
+.El
+.Pp
+The following length modifier is valid for the
+.Cm c
+or
+.Cm s
+conversion:
+.Bl -column ".Sy Modifier" ".Vt wint_t" ".Vt wchar_t *"
+.It Sy Modifier Ta Cm c Ta Cm s
+.It Cm l No (ell) Ta Vt wint_t Ta Vt "wchar_t *"
+.El
+.It
+A character that specifies the type of conversion to be applied.
+.El
+.Pp
+A field width or precision, or both, may be indicated by
+an asterisk
+.Ql *
+or an asterisk followed by one or more decimal digits and a
+.Ql $
+instead of a
+digit string.
+In this case, an
+.Vt int
+argument supplies the field width or precision.
+A negative field width is treated as a left adjustment flag followed by a
+positive field width; a negative precision is treated as though it were
+missing.
+If a single format directive mixes positional
+.Pq Li nn$
+and non-positional arguments, the results are undefined.
+.Pp
+The conversion specifiers and their meanings are:
+.Bl -tag -width ".Cm diouxX"
+.It Cm diouxX
+The
+.Vt int
+(or appropriate variant) argument is converted to signed decimal
+.Cm ( d
+and
+.Cm i ) ,
+unsigned octal
+.Pq Cm o ,
+unsigned decimal
+.Pq Cm u ,
+or unsigned hexadecimal
+.Cm ( x
+and
+.Cm X )
+notation.
+The letters
+.Dq Li abcdef
+are used for
+.Cm x
+conversions; the letters
+.Dq Li ABCDEF
+are used for
+.Cm X
+conversions.
+The precision, if any, gives the minimum number of digits that must
+appear; if the converted value requires fewer digits, it is padded on
+the left with zeros.
+.It Cm DOU
+The
+.Vt "long int"
+argument is converted to signed decimal, unsigned octal, or unsigned
+decimal, as if the format had been
+.Cm ld , lo ,
+or
+.Cm lu
+respectively.
+These conversion characters are deprecated, and will eventually disappear.
+.It Cm eE
+The
+.Vt double
+argument is rounded and converted in the style
+.Sm off
+.Oo \- Oc Ar d Li \&. Ar ddd Li e \\*[Pm] Ar dd
+.Sm on
+where there is one digit before the
+decimal-point character
+and the number of digits after it is equal to the precision;
+if the precision is missing,
+it is taken as 6; if the precision is
+zero, no decimal-point character appears.
+An
+.Cm E
+conversion uses the letter
+.Ql E
+(rather than
+.Ql e )
+to introduce the exponent.
+The exponent always contains at least two digits; if the value is zero,
+the exponent is 00.
+.Pp
+For
+.Cm a , A , e , E , f , F , g ,
+and
+.Cm G
+conversions, positive and negative infinity are represented as
+.Li inf
+and
+.Li -inf
+respectively when using the lowercase conversion character, and
+.Li INF
+and
+.Li -INF
+respectively when using the uppercase conversion character.
+Similarly, NaN is represented as
+.Li nan
+when using the lowercase conversion, and
+.Li NAN
+when using the uppercase conversion.
+.It Cm fF
+The
+.Vt double
+argument is rounded and converted to decimal notation in the style
+.Sm off
+.Oo \- Oc Ar ddd Li \&. Ar ddd ,
+.Sm on
+where the number of digits after the decimal-point character
+is equal to the precision specification.
+If the precision is missing, it is taken as 6; if the precision is
+explicitly zero, no decimal-point character appears.
+If a decimal point appears, at least one digit appears before it.
+.It Cm gG
+The
+.Vt double
+argument is converted in style
+.Cm f
+or
+.Cm e
+(or
+.Cm F
+or
+.Cm E
+for
+.Cm G
+conversions).
+The precision specifies the number of significant digits.
+If the precision is missing, 6 digits are given; if the precision is zero,
+it is treated as 1.
+Style
+.Cm e
+is used if the exponent from its conversion is less than \-4 or greater than
+or equal to the precision.
+Trailing zeros are removed from the fractional part of the result; a
+decimal point appears only if it is followed by at least one digit.
+.It Cm aA
+The
+.Vt double
+argument is converted to hexadecimal notation in the style
+.Sm off
+.Oo \- Oc Li 0x Ar h Li \&. Ar hhhp Oo \\*[Pm] Oc Ar d ,
+.Sm on
+where the number of digits after the hexadecimal-point character
+is equal to the precision specification.
+If the precision is missing, it is taken as enough to exactly
+represent the floating-point number; if the precision is
+explicitly zero, no hexadecimal-point character appears.
+This is an exact conversion of the mantissa+exponent internal
+floating point representation; the
+.Sm off
+.Oo \- Oc Li 0x Ar h Li \&. Ar hhh
+.Sm on
+portion represents exactly the mantissa; only denormalized
+mantissas have a zero value to the left of the hexadecimal
+point.
+The
+.Cm p
+is a literal character
+.Ql p ;
+the exponent is preceded by a positive or negative sign
+and is represented in decimal, using only enough characters
+to represent the exponent.
+The
+.Cm A
+conversion uses the prefix
+.Dq Li 0X
+(rather than
+.Dq Li 0x ) ,
+the letters
+.Dq Li ABCDEF
+(rather than
+.Dq Li abcdef )
+to represent the hex digits, and the letter
+.Ql P
+(rather than
+.Ql p )
+to separate the mantissa and exponent.
+.It Cm C
+Treated as
+.Cm c
+with the
+.Cm l
+(ell) modifier.
+.It Cm c
+The
+.Vt int
+argument is converted to an
+.Vt "unsigned char" ,
+then to a
+.Vt wchar_t
+as if by
+.Xr btowc 3 ,
+and the resulting character is written.
+.Pp
+If the
+.Cm l
+(ell) modifier is used, the
+.Vt wint_t
+argument is converted to a
+.Vt wchar_t
+and written.
+.It Cm S
+Treated as
+.Cm s
+with the
+.Cm l
+(ell) modifier.
+.It Cm s
+The
+.Vt "char *"
+argument is expected to be a pointer to an array of character type (pointer
+to a string) containing a multibyte sequence.
+Characters from the array are converted to wide characters and written up to
+(but not including)
+a terminating
+.Dv NUL
+character;
+if a precision is specified, no more than the number specified are
+written.
+If a precision is given, no null character
+need be present; if the precision is not specified, or is greater than
+the size of the array, the array must contain a terminating
+.Dv NUL
+character.
+.Pp
+If the
+.Cm l
+(ell) modifier is used, the
+.Vt "wchar_t *"
+argument is expected to be a pointer to an array of wide characters
+(pointer to a wide string).
+Each wide character in the string
+is written.
+Wide characters from the array are written up to (but not including)
+a terminating wide
+.Dv NUL
+character;
+if a precision is specified, no more than the number specified are
+written (including shift sequences).
+If a precision is given, no null character
+need be present; if the precision is not specified, or is greater than
+the number of characters in
+the string, the array must contain a terminating wide
+.Dv NUL
+character.
+.It Cm p
+The
+.Vt "void *"
+pointer argument is printed in hexadecimal (as if by
+.Ql %#x
+or
+.Ql %#lx ) .
+.It Cm n
+The number of characters written so far is stored into the
+integer indicated by the
+.Vt "int *"
+(or variant) pointer argument.
+No argument is converted.
+.It Cm %
+A
+.Ql %
+is written.
+No argument is converted.
+The complete conversion specification
+is
+.Ql %% .
+.El
+.Pp
+The decimal point
+character is defined in the program's locale (category
+.Dv LC_NUMERIC ) .
+.Pp
+In no case does a non-existent or small field width cause truncation of
+a numeric field; if the result of a conversion is wider than the field
+width, the
+field is expanded to contain the conversion result.
+.Sh SEE ALSO
+.Xr btowc 3 ,
+.Xr fputws 3 ,
+.Xr printf 3 ,
+.Xr putwc 3 ,
+.Xr setlocale 3 ,
+.Xr wcsrtombs 3 ,
+.Xr wscanf 3
+.Sh STANDARDS
+Subject to the caveats noted in the
+.Sh SECURITY CONSIDERATIONS
+Refer to
+.Xr printf 3 .
+.Sx BUGS
+section
+of
+.Xr printf 3 ,
+the
+.Fn wprintf ,
+.Fn fwprintf ,
+.Fn swprintf ,
+.Fn vwprintf ,
+.Fn vfwprintf
+and
+.Fn vswprintf
+functions
+conform to
+.St -isoC-99 .
diff --git a/lib/libc/stdio/wprintf.c b/lib/libc/stdio/wprintf.c
new file mode 100644 (file)
index 0000000..7441ab2
--- /dev/null
@@ -0,0 +1,45 @@
+/*     $NetBSD: wprintf.c,v 1.1 2005/05/14 23:51:02 christos Exp $     */
+/*     $DragonFly: src/lib/libc/stdio/wprintf.c,v 1.1 2005/07/25 00:37:41 joerg Exp $ */
+
+/*-
+ * Copyright (c) 2002 Tim J. Robbins
+ * All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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 <stdarg.h>
+#include <stdio.h>
+#include <wchar.h>
+
+int
+wprintf(const wchar_t * __restrict fmt, ...)
+{
+       int ret;
+       va_list ap;
+
+       va_start(ap, fmt);
+       ret = vfwprintf(stdout, fmt, ap);
+       va_end(ap);
+
+       return (ret);
+}
diff --git a/lib/libc/stdio/wscanf.3 b/lib/libc/stdio/wscanf.3
new file mode 100644 (file)
index 0000000..ed0f5b3
--- /dev/null
@@ -0,0 +1,485 @@
+.\" $NetBSD: wscanf.3,v 1.1 2005/05/14 23:51:02 christos Exp $
+.\" $DragonFly: src/lib/libc/stdio/wscanf.3,v 1.1 2005/07/25 00:37:41 joerg Exp $
+.\" Copyright (c) 1990, 1991, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" Chris Torek and the American National Standards Committee X3,
+.\" on Information Processing Systems.
+.\"
+.\" 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. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. 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.
+.\"
+.\"     @(#)scanf.3    8.2 (Berkeley) 12/11/93
+.\" FreeBSD: src/lib/libc/stdio/scanf.3,v 1.24 2003/06/28 09:03:25 das Exp
+.\" $FreeBSD: src/lib/libc/stdio/wscanf.3,v 1.6 2003/07/05 07:47:55 tjr Exp $
+.\"
+.Dd July 5, 2003
+.Dt WSCANF 3
+.Os
+.Sh NAME
+.Nm wscanf ,
+.Nm fwscanf ,
+.Nm swscanf ,
+.Nm vwscanf ,
+.Nm vswscanf ,
+.Nm vfwscanf
+.Nd wide character input format conversion
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In stdio.h
+.In wchar.h
+.Ft int
+.Fn wscanf "const wchar_t * restrict format" ...
+.Ft int
+.Fn fwscanf "FILE * restrict stream" "const wchar_t * restrict format" ...
+.Ft int
+.Fn swscanf "const wchar_t * restrict str" "const wchar_t * restrict format" ...
+.In stdarg.h
+.Ft int
+.Fn vwscanf "const wchar_t * restrict format" "va_list ap"
+.Ft int
+.Fn vswscanf "const wchar_t * restrict str" "const wchar_t * restrict format" "va_list ap"
+.Ft int
+.Fn vfwscanf "FILE * restrict stream" "const wchar_t * restrict format" "va_list ap"
+.Sh DESCRIPTION
+The
+.Fn wscanf
+family of functions scans input according to a
+.Fa format
+as described below.
+This format may contain
+.Em conversion specifiers ;
+the results from such conversions, if any,
+are stored through the
+.Em pointer
+arguments.
+The
+.Fn wscanf
+function
+reads input from the standard input stream
+.Dv stdin ,
+.Fn fwscanf
+reads input from the stream pointer
+.Fa stream ,
+and
+.Fn swscanf
+reads its input from the wide character string pointed to by
+.Fa str .
+The
+.Fn vfwscanf
+function
+is analogous to
+.Xr vfwprintf 3
+and reads input from the stream pointer
+.Fa stream
+using a variable argument list of pointers (see
+.Xr stdarg 3 ) .
+The
+.Fn vwscanf
+function scans a variable argument list from the standard input and
+the
+.Fn vswscanf
+function scans it from a wide character string;
+these are analogous to
+the
+.Fn vwprintf
+and
+.Fn vswprintf
+functions respectively.
+Each successive
+.Em pointer
+argument must correspond properly with
+each successive conversion specifier
+(but see the
+.Cm *
+conversion below).
+All conversions are introduced by the
+.Cm %
+(percent sign) character.
+The
+.Fa format
+string
+may also contain other characters.
+White space (such as blanks, tabs, or newlines) in the
+.Fa format
+string match any amount of white space, including none, in the input.
+Everything else
+matches only itself.
+Scanning stops
+when an input character does not match such a format character.
+Scanning also stops
+when an input conversion cannot be made (see below).
+.Sh CONVERSIONS
+Following the
+.Cm %
+character introducing a conversion
+there may be a number of
+.Em flag
+characters, as follows:
+.Bl -tag -width ".Cm l No (ell)"
+.It Cm *
+Suppresses assignment.
+The conversion that follows occurs as usual, but no pointer is used;
+the result of the conversion is simply discarded.
+.It Cm hh
+Indicates that the conversion will be one of
+.Cm dioux
+or
+.Cm n
+and the next pointer is a pointer to a
+.Vt char
+(rather than
+.Vt int ) .
+.It Cm h
+Indicates that the conversion will be one of
+.Cm dioux
+or
+.Cm n
+and the next pointer is a pointer to a
+.Vt "short int"
+(rather than
+.Vt int ) .
+.It Cm l No (ell)
+Indicates that the conversion will be one of
+.Cm dioux
+or
+.Cm n
+and the next pointer is a pointer to a
+.Vt "long int"
+(rather than
+.Vt int ) ,
+that the conversion will be one of
+.Cm a , e , f ,
+or
+.Cm g
+and the next pointer is a pointer to
+.Vt double
+(rather than
+.Vt float ) ,
+or that the conversion will be one of
+.Cm c
+or
+.Cm s
+and the next pointer is a pointer to an array of
+.Vt wchar_t
+(rather than
+.Vt char ) .
+.It Cm ll No (ell ell)
+Indicates that the conversion will be one of
+.Cm dioux
+or
+.Cm n
+and the next pointer is a pointer to a
+.Vt "long long int"
+(rather than
+.Vt int ) .
+.It Cm L
+Indicates that the conversion will be one of
+.Cm a , e , f ,
+or
+.Cm g
+and the next pointer is a pointer to
+.Vt "long double" .
+.It Cm j
+Indicates that the conversion will be one of
+.Cm dioux
+or
+.Cm n
+and the next pointer is a pointer to a
+.Vt intmax_t
+(rather than
+.Vt int ) .
+.It Cm t
+Indicates that the conversion will be one of
+.Cm dioux
+or
+.Cm n
+and the next pointer is a pointer to a
+.Vt ptrdiff_t
+(rather than
+.Vt int ) .
+.It Cm z
+Indicates that the conversion will be one of
+.Cm dioux
+or
+.Cm n
+and the next pointer is a pointer to a
+.Vt size_t
+(rather than
+.Vt int ) .
+.It Cm q
+(deprecated.)
+Indicates that the conversion will be one of
+.Cm dioux
+or
+.Cm n
+and the next pointer is a pointer to a
+.Vt "long long int"
+(rather than
+.Vt int ) .
+.El
+.Pp
+In addition to these flags,
+there may be an optional maximum field width,
+expressed as a decimal integer,
+between the
+.Cm %
+and the conversion.
+If no width is given,
+a default of
+.Dq infinity
+is used (with one exception, below);
+otherwise at most this many characters are scanned
+in processing the conversion.
+Before conversion begins,
+most conversions skip white space;
+this white space is not counted against the field width.
+.Pp
+The following conversions are available:
+.Bl -tag -width XXXX
+.It Cm %
+Matches a literal
+.Ql % .
+That is,
+.Dq Li %%
+in the format string
+matches a single input
+.Ql %
+character.
+No conversion is done, and assignment does not occur.
+.It Cm d
+Matches an optionally signed decimal integer;
+the next pointer must be a pointer to
+.Vt int .
+.It Cm i
+Matches an optionally signed integer;
+the next pointer must be a pointer to
+.Vt int .
+The integer is read in base 16 if it begins
+with
+.Ql 0x
+or
+.Ql 0X ,
+in base 8 if it begins with
+.Ql 0 ,
+and in base 10 otherwise.
+Only characters that correspond to the base are used.
+.It Cm o
+Matches an octal integer;
+the next pointer must be a pointer to
+.Vt "unsigned int" .
+.It Cm u
+Matches an optionally signed decimal integer;
+the next pointer must be a pointer to
+.Vt "unsigned int" .
+.It Cm x , X
+Matches an optionally signed hexadecimal integer;
+the next pointer must be a pointer to
+.Vt "unsigned int" .
+.It Cm a , A , e , E , f , F , g , G
+Matches a floating-point number in the style of
+.Xr wcstod 3 .
+The next pointer must be a pointer to
+.Vt float
+(unless
+.Cm l
+or
+.Cm L
+is specified.)
+.It Cm s
+Matches a sequence of non-white-space wide characters;
+the next pointer must be a pointer to
+.Vt char ,
+and the array must be large enough to accept the multibyte representation
+of all the sequence and the
+terminating
+.Dv NUL
+character.
+The input string stops at white space
+or at the maximum field width, whichever occurs first.
+.Pp
+If an
+.Cm l
+qualifier is present, the next pointer must be a pointer to
+.Vt wchar_t ,
+into which the input will be placed.
+.It Cm S
+The same as
+.Cm ls .
+.It Cm c
+Matches a sequence of
+.Em width
+count
+wide characters (default 1);
+the next pointer must be a pointer to
+.Vt char ,
+and there must be enough room for the multibyte representation
+of all the characters
+(no terminating
+.Dv NUL
+is added).
+The usual skip of leading white space is suppressed.
+To skip white space first, use an explicit space in the format.
+.Pp
+If an
+.Cm l
+qualifier is present, the next pointer must be a pointer to
+.Vt wchar_t ,
+into which the input will be placed.
+.It Cm C
+The same as
+.Cm lc .
+.It Cm \&[
+Matches a nonempty sequence of characters from the specified set
+of accepted characters;
+the next pointer must be a pointer to
+.Vt char ,
+and there must be enough room for the multibyte representation of
+all the characters in the string,
+plus a terminating
+.Dv NUL
+character.
+The usual skip of leading white space is suppressed.
+The string is to be made up of characters in
+(or not in)
+a particular set;
+the set is defined by the characters between the open bracket
+.Cm [
+character
+and a close bracket
+.Cm ]
+character.
+The set
+.Em excludes
+those characters
+if the first character after the open bracket is a circumflex
+.Cm ^ .
+To include a close bracket in the set,
+make it the first character after the open bracket
+or the circumflex;
+any other position will end the set.
+To include a hyphen in the set,
+make it the last character before the final close bracket;
+some implementations of
+.Fn wscanf
+use
+.Dq Li A-Z
+to represent the range of characters between
+.Ql A
+and
+.Ql Z .
+The string ends with the appearance of a character not in the
+(or, with a circumflex, in) set
+or when the field width runs out.
+.Pp
+If an
+.Cm l
+qualifier is present, the next pointer must be a pointer to
+.Vt wchar_t ,
+into which the input will be placed.
+.It Cm p
+Matches a pointer value (as printed by
+.Ql %p
+in
+.Xr wprintf 3 ) ;
+the next pointer must be a pointer to
+.Vt void .
+.It Cm n
+Nothing is expected;
+instead, the number of characters consumed thus far from the input
+is stored through the next pointer,
+which must be a pointer to
+.Vt int .
+This is
+.Em not
+a conversion, although it can be suppressed with the
+.Cm *
+flag.
+.El
+.Pp
+The decimal point
+character is defined in the program's locale (category
+.Dv LC_NUMERIC ) .
+.Pp
+For backwards compatibility, a
+.Dq conversion
+of
+.Ql %\e0
+causes an immediate return of
+.Dv EOF .
+.Sh RETURN VALUES
+These
+functions
+return
+the number of input items assigned, which can be fewer than provided
+for, or even zero, in the event of a matching failure.
+Zero
+indicates that, while there was input available,
+no conversions were assigned;
+typically this is due to an invalid input character,
+such as an alphabetic character for a
+.Ql %d
+conversion.
+The value
+.Dv EOF
+is returned if an input failure occurs before any conversion such as an
+end-of-file occurs.
+If an error or end-of-file occurs after conversion
+has begun,
+the number of conversions which were successfully completed is returned.
+.Sh SEE ALSO
+.Xr fgetwc 3 ,
+.Xr scanf 3 ,
+.Xr wcrtomb 3 ,
+.Xr wcstod 3 ,
+.Xr wcstol 3 ,
+.Xr wcstoul 3 ,
+.Xr wprintf 3
+.Sh STANDARDS
+The
+.Fn fwscanf ,
+.Fn wscanf ,
+.Fn swscanf ,
+.Fn vfwscanf ,
+.Fn vwscanf
+and
+.Fn vswscanf
+functions
+conform to
+.St -isoC-99 .
+.Sh BUGS
+In addition to the bugs documented in
+.Xr scanf 3 ,
+.Fn wscanf
+does not support the
+.Dq Li A-Z
+notation for specifying character ranges with the character
+class conversion
+.Pq Sq Cm %[ .
diff --git a/lib/libc/stdio/wscanf.c b/lib/libc/stdio/wscanf.c
new file mode 100644 (file)
index 0000000..a7cf22e
--- /dev/null
@@ -0,0 +1,45 @@
+/*     $NetBSD: wscanf.c,v 1.1 2005/05/14 23:51:02 christos Exp $      */
+/*     $DragonFly: src/lib/libc/stdio/wscanf.c,v 1.1 2005/07/25 00:37:41 joerg Exp $ */
+
+/*-
+ * Copyright (c) 2002 Tim J. Robbins
+ * All rights reserved.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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 <stdarg.h>
+#include <stdio.h>
+#include <wchar.h>
+
+int
+wscanf(const wchar_t * __restrict fmt, ...)
+{
+       va_list ap;
+       int r;
+
+       va_start(ap, fmt);
+       r = vfwscanf(stdin, fmt, ap);
+       va_end(ap);
+
+       return (r);
+}