From 01ae00f3170ad0e36c1657f6ff8c89dfa730fd37 Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Tue, 29 Apr 2014 16:28:56 -0700 Subject: Switch to the OpenBSD implementations of the wide scanf functions. This also gets us the C99 wcstoimax and wcstoumax, and a working fgetwc and ungetwc, all of which are needed in the implementation. This also brings several other files closer to upstream. Change-Id: I23b025a8237a6dbb9aa50d2a96765ea729a85579 --- libc/stdio/fileext.h | 1 - libc/stdio/findfp.c | 6 +--- libc/stdio/local.h | 13 ++++++--- libc/stdio/wcio.h | 80 ++++++++++++++++++++++++++++++++++------------------ 4 files changed, 62 insertions(+), 38 deletions(-) (limited to 'libc/stdio') diff --git a/libc/stdio/fileext.h b/libc/stdio/fileext.h index 864192408..fa6fed671 100644 --- a/libc/stdio/fileext.h +++ b/libc/stdio/fileext.h @@ -30,7 +30,6 @@ */ #include -#include "wcio.h" /* * file extension diff --git a/libc/stdio/findfp.c b/libc/stdio/findfp.c index 926e5a18d..2dd32c974 100644 --- a/libc/stdio/findfp.c +++ b/libc/stdio/findfp.c @@ -61,11 +61,7 @@ static struct glue uglue = { 0, FOPEN_MAX - 3, usual }; static struct glue *lastglue = &uglue; _THREAD_PRIVATE_MUTEX(__sfp_mutex); -static struct __sfileext __sFext[3] = { - _FILEEXT_INITIALIZER, - _FILEEXT_INITIALIZER, - _FILEEXT_INITIALIZER, -}; +static struct __sfileext __sFext[3]; FILE __sF[3] = { std(__SRD, STDIN_FILENO), /* stdin */ diff --git a/libc/stdio/local.h b/libc/stdio/local.h index eecfeef9c..5fb22924c 100644 --- a/libc/stdio/local.h +++ b/libc/stdio/local.h @@ -32,15 +32,15 @@ * SUCH DAMAGE. */ -#include "wcio.h" -#include "fileext.h" - - /* * Information local to this implementation of stdio, * in particular, macros and private variables. */ +#include +#include "wcio.h" +#include "fileext.h" + int __sflush(FILE *); int __sflush_locked(FILE *); FILE *__sfp(void); @@ -56,7 +56,12 @@ int __swhatbuf(FILE *, size_t *, int *); int _fwalk(int (*)(FILE *)); int __swsetup(FILE *); int __sflags(const char *, int *); +wint_t __fgetwc_unlock(FILE *); +wint_t __ungetwc(wint_t, FILE *); int __vfprintf(FILE *, const char *, __va_list); +int __svfscanf(FILE * __restrict, const char * __restrict, __va_list); +int __vfwprintf(FILE * __restrict, const wchar_t * __restrict, __va_list); +int __vfwscanf(FILE * __restrict, const wchar_t * __restrict, __va_list); /* * Function to clean up streams, called from abort() and exit(). diff --git a/libc/stdio/wcio.h b/libc/stdio/wcio.h index dd6db21a0..584a3f209 100644 --- a/libc/stdio/wcio.h +++ b/libc/stdio/wcio.h @@ -1,34 +1,34 @@ -/* - * Copyright (C) 2008 The Android Open Source Project +/* $OpenBSD: wcio.h,v 1.2 2013/04/17 17:40:35 tedu Exp $ */ +/* $NetBSD: wcio.h,v 1.3 2003/01/18 11:30:00 thorpej 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: - * * Redistributions of source code must retain the above copyright + * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. - * * 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. + * 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 COPYRIGHT HOLDERS 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 - * COPYRIGHT OWNER 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 + * 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$ */ -/* this file is only used to quiet the BSD stdio implementation - * since we don't implement wchar support at all - */ #ifndef _WCIO_H_ #define _WCIO_H_ @@ -36,22 +36,46 @@ #define WCIO_UNGETWC_BUFSIZE 1 struct wchar_io_data { - int dummy; + 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 */ }; -/* BIONIC: disable wchar support */ #define WCIO_GET(fp) \ - ((struct wchar_io_data*) 0) + (_EXT(fp) ? &(_EXT(fp)->_wcio) : (struct wchar_io_data *)0) -#define _SET_ORIENTATION(fp, mode) ((void)0) +#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 (0) /* * WCIO_FREE should be called by fclose */ -#define WCIO_FREE(fp) ((void)(0)) +#define WCIO_FREE(fp) \ +do {\ + struct wchar_io_data *_wcio = WCIO_GET(fp); \ + if (_wcio) { \ + _wcio->wcio_mode = 0;\ + _wcio->wcio_ungetwc_inbuf = 0;\ + } \ +} while (0) -#define WCIO_FREEUB(fp) ((void)0) +#define WCIO_FREEUB(fp) \ +do {\ + struct wchar_io_data *_wcio = WCIO_GET(fp); \ + if (_wcio) { \ + _wcio->wcio_ungetwc_inbuf = 0;\ + } \ +} while (0) -#define WCIO_INIT(fp) ((void)0) +#define WCIO_INIT(fp) \ + memset(&(_EXT(fp)->_wcio), 0, sizeof(struct wchar_io_data)) #endif /*_WCIO_H_*/ -- cgit v1.2.3