summaryrefslogtreecommitdiffstats
path: root/libc/stdio
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2014-04-29 16:28:56 -0700
committerElliott Hughes <enh@google.com>2014-04-29 16:28:56 -0700
commit01ae00f3170ad0e36c1657f6ff8c89dfa730fd37 (patch)
treead9cd6e6b1ee5b01dcc03f09495ee786ea0a12ec /libc/stdio
parentc6e563c87a7d8329607bccbc5c4a61c4e1180507 (diff)
downloadbionic-01ae00f3170ad0e36c1657f6ff8c89dfa730fd37.tar.gz
bionic-01ae00f3170ad0e36c1657f6ff8c89dfa730fd37.tar.bz2
bionic-01ae00f3170ad0e36c1657f6ff8c89dfa730fd37.zip
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
Diffstat (limited to 'libc/stdio')
-rw-r--r--libc/stdio/fileext.h1
-rw-r--r--libc/stdio/findfp.c6
-rw-r--r--libc/stdio/local.h13
-rw-r--r--libc/stdio/wcio.h80
4 files changed, 62 insertions, 38 deletions
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 <pthread.h>
-#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 <wchar.h>
+#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_*/