abd06b4c9b
The idea behind Nuxi CloudABI is that it is targeted at (but not limited to) running networked services in a sandboxed environment. The model behind stdin, stdout and stderr is strongly focused on interactive tools in a command shell. CloudABI does not support the notion of stdin and stdout, as 'standard input/output' does not apply to services. The concept of stderr does makes sense though, as services do need some mechanism to log error messages in a uniform way. This patch extends libc++ in such a way that std::cin and std::cout and the associated <cstdio>/<cwchar> functions can be disabled through the flags _LIBCPP_HAS_NO_STDIN and _LIBCPP_HAS_NO_STDOUT, respectively. At the same time it attempts to clean up src/iostream.cpp a bit. Instead of using a single array of mbstate_t objects and hardcoding the array indices, it creates separate objects that declared next to the iostream objects and their buffers. The code is also restructured by interleaving the construction and setup of c* and wc* objects. That way it is more obvious that this is done identically. The c* and wc* objects already have separate unit tests. Make use of this fact by adding XFAILs in case libcpp-has-no-std* is set. That way the tests work in both directions. If stdin or stdout is disabled, these tests will therefore test for the absence of c* and wc*. Differential Revision: http://reviews.llvm.org/D8340 git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@233275 91177308-0d34-0410-b5e6-96231b3b80d8
226 lines
7.7 KiB
C++
226 lines
7.7 KiB
C++
// -*- C++ -*-
|
|
//===--------------------------- cwchar -----------------------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is dual licensed under the MIT and the University of Illinois Open
|
|
// Source Licenses. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef _LIBCPP_CWCHAR
|
|
#define _LIBCPP_CWCHAR
|
|
|
|
/*
|
|
cwchar synopsis
|
|
|
|
Macros:
|
|
|
|
NULL
|
|
WCHAR_MAX
|
|
WCHAR_MIN
|
|
WEOF
|
|
|
|
namespace std
|
|
{
|
|
|
|
Types:
|
|
|
|
mbstate_t
|
|
size_t
|
|
tm
|
|
wint_t
|
|
|
|
int fwprintf(FILE* restrict stream, const wchar_t* restrict format, ...);
|
|
int fwscanf(FILE* restrict stream, const wchar_t* restrict format, ...);
|
|
int swprintf(wchar_t* restrict s, size_t n, const wchar_t* restrict format, ...);
|
|
int swscanf(const wchar_t* restrict s, const wchar_t* restrict format, ...);
|
|
int vfwprintf(FILE* restrict stream, const wchar_t* restrict format, va_list arg);
|
|
int vfwscanf(FILE* restrict stream, const wchar_t* restrict format, va_list arg); // C99
|
|
int vswprintf(wchar_t* restrict s, size_t n, const wchar_t* restrict format, va_list arg);
|
|
int vswscanf(const wchar_t* restrict s, const wchar_t* restrict format, va_list arg); // C99
|
|
int vwprintf(const wchar_t* restrict format, va_list arg);
|
|
int vwscanf(const wchar_t* restrict format, va_list arg); // C99
|
|
int wprintf(const wchar_t* restrict format, ...);
|
|
int wscanf(const wchar_t* restrict format, ...);
|
|
wint_t fgetwc(FILE* stream);
|
|
wchar_t* fgetws(wchar_t* restrict s, int n, FILE* restrict stream);
|
|
wint_t fputwc(wchar_t c, FILE* stream);
|
|
int fputws(const wchar_t* restrict s, FILE* restrict stream);
|
|
int fwide(FILE* stream, int mode);
|
|
wint_t getwc(FILE* stream);
|
|
wint_t getwchar();
|
|
wint_t putwc(wchar_t c, FILE* stream);
|
|
wint_t putwchar(wchar_t c);
|
|
wint_t ungetwc(wint_t c, FILE* stream);
|
|
double wcstod(const wchar_t* restrict nptr, wchar_t** restrict endptr);
|
|
float wcstof(const wchar_t* restrict nptr, wchar_t** restrict endptr); // C99
|
|
long double wcstold(const wchar_t* restrict nptr, wchar_t** restrict endptr); // C99
|
|
long wcstol(const wchar_t* restrict nptr, wchar_t** restrict endptr, int base);
|
|
long long wcstoll(const wchar_t* restrict nptr, wchar_t** restrict endptr, int base); // C99
|
|
unsigned long wcstoul(const wchar_t* restrict nptr, wchar_t** restrict endptr, int base);
|
|
unsigned long long wcstoull(const wchar_t* restrict nptr, wchar_t** restrict endptr, int base); // C99
|
|
wchar_t* wcscpy(wchar_t* restrict s1, const wchar_t* restrict s2);
|
|
wchar_t* wcsncpy(wchar_t* restrict s1, const wchar_t* restrict s2, size_t n);
|
|
wchar_t* wcscat(wchar_t* restrict s1, const wchar_t* restrict s2);
|
|
wchar_t* wcsncat(wchar_t* restrict s1, const wchar_t* restrict s2, size_t n);
|
|
int wcscmp(const wchar_t* s1, const wchar_t* s2);
|
|
int wcscoll(const wchar_t* s1, const wchar_t* s2);
|
|
int wcsncmp(const wchar_t* s1, const wchar_t* s2, size_t n);
|
|
size_t wcsxfrm(wchar_t* restrict s1, const wchar_t* restrict s2, size_t n);
|
|
const wchar_t* wcschr(const wchar_t* s, wchar_t c);
|
|
wchar_t* wcschr( wchar_t* s, wchar_t c);
|
|
size_t wcscspn(const wchar_t* s1, const wchar_t* s2);
|
|
size_t wcslen(const wchar_t* s);
|
|
const wchar_t* wcspbrk(const wchar_t* s1, const wchar_t* s2);
|
|
wchar_t* wcspbrk( wchar_t* s1, const wchar_t* s2);
|
|
const wchar_t* wcsrchr(const wchar_t* s, wchar_t c);
|
|
wchar_t* wcsrchr( wchar_t* s, wchar_t c);
|
|
size_t wcsspn(const wchar_t* s1, const wchar_t* s2);
|
|
const wchar_t* wcsstr(const wchar_t* s1, const wchar_t* s2);
|
|
wchar_t* wcsstr( wchar_t* s1, const wchar_t* s2);
|
|
wchar_t* wcstok(wchar_t* restrict s1, const wchar_t* restrict s2, wchar_t** restrict ptr);
|
|
const wchar_t* wmemchr(const wchar_t* s, wchar_t c, size_t n);
|
|
wchar_t* wmemchr( wchar_t* s, wchar_t c, size_t n);
|
|
int wmemcmp(wchar_t* restrict s1, const wchar_t* restrict s2, size_t n);
|
|
wchar_t* wmemcpy(wchar_t* restrict s1, const wchar_t* restrict s2, size_t n);
|
|
wchar_t* wmemmove(wchar_t* s1, const wchar_t* s2, size_t n);
|
|
wchar_t* wmemset(wchar_t* s, wchar_t c, size_t n);
|
|
size_t wcsftime(wchar_t* restrict s, size_t maxsize, const wchar_t* restrict format,
|
|
const tm* restrict timeptr);
|
|
wint_t btowc(int c);
|
|
int wctob(wint_t c);
|
|
int mbsinit(const mbstate_t* ps);
|
|
size_t mbrlen(const char* restrict s, size_t n, mbstate_t* restrict ps);
|
|
size_t mbrtowc(wchar_t* restrict pwc, const char* restrict s, size_t n, mbstate_t* restrict ps);
|
|
size_t wcrtomb(char* restrict s, wchar_t wc, mbstate_t* restrict ps);
|
|
size_t mbsrtowcs(wchar_t* restrict dst, const char** restrict src, size_t len,
|
|
mbstate_t* restrict ps);
|
|
size_t wcsrtombs(char* restrict dst, const wchar_t** restrict src, size_t len,
|
|
mbstate_t* restrict ps);
|
|
|
|
} // std
|
|
|
|
*/
|
|
|
|
#include <__config>
|
|
#include <cwctype>
|
|
#include <wchar.h>
|
|
#if defined(_LIBCPP_MSVCRT) || defined(__MINGW32__)
|
|
#include <support/win32/support.h> // pull in *swprintf defines
|
|
#endif // _LIBCPP_MSVCRT
|
|
|
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
|
#pragma GCC system_header
|
|
#endif
|
|
|
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
|
|
|
using ::mbstate_t;
|
|
using ::size_t;
|
|
using ::tm;
|
|
using ::wint_t;
|
|
using ::FILE;
|
|
using ::fwprintf;
|
|
using ::fwscanf;
|
|
using ::swprintf;
|
|
using ::vfwprintf;
|
|
using ::vswprintf;
|
|
#ifndef _LIBCPP_MSVCRT
|
|
using ::swscanf;
|
|
using ::vfwscanf;
|
|
using ::vswscanf;
|
|
#endif // _LIBCPP_MSVCRT
|
|
using ::fgetwc;
|
|
using ::fgetws;
|
|
using ::fputwc;
|
|
using ::fputws;
|
|
using ::fwide;
|
|
using ::getwc;
|
|
using ::putwc;
|
|
using ::ungetwc;
|
|
using ::wcstod;
|
|
#ifndef _LIBCPP_MSVCRT
|
|
using ::wcstof;
|
|
using ::wcstold;
|
|
#endif // _LIBCPP_MSVCRT
|
|
using ::wcstol;
|
|
#ifndef _LIBCPP_HAS_NO_LONG_LONG
|
|
using ::wcstoll;
|
|
#endif // _LIBCPP_HAS_NO_LONG_LONG
|
|
using ::wcstoul;
|
|
#ifndef _LIBCPP_HAS_NO_LONG_LONG
|
|
using ::wcstoull;
|
|
#endif // _LIBCPP_HAS_NO_LONG_LONG
|
|
using ::wcscpy;
|
|
using ::wcsncpy;
|
|
using ::wcscat;
|
|
using ::wcsncat;
|
|
using ::wcscmp;
|
|
using ::wcscoll;
|
|
using ::wcsncmp;
|
|
using ::wcsxfrm;
|
|
|
|
#if defined(_WCHAR_H_CPLUSPLUS_98_CONFORMANCE_)
|
|
|
|
using ::wcschr;
|
|
using ::wcspbrk;
|
|
using ::wcsrchr;
|
|
using ::wcsstr;
|
|
using ::wmemchr;
|
|
|
|
#else
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY const wchar_t* wcschr(const wchar_t* __s, wchar_t __c) {return ::wcschr(__s, __c);}
|
|
inline _LIBCPP_INLINE_VISIBILITY wchar_t* wcschr( wchar_t* __s, wchar_t __c) {return ::wcschr(__s, __c);}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY const wchar_t* wcspbrk(const wchar_t* __s1, const wchar_t* __s2) {return ::wcspbrk(__s1, __s2);}
|
|
inline _LIBCPP_INLINE_VISIBILITY wchar_t* wcspbrk( wchar_t* __s1, const wchar_t* __s2) {return ::wcspbrk(__s1, __s2);}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY const wchar_t* wcsrchr(const wchar_t* __s, wchar_t __c) {return ::wcsrchr(__s, __c);}
|
|
inline _LIBCPP_INLINE_VISIBILITY wchar_t* wcsrchr( wchar_t* __s, wchar_t __c) {return ::wcsrchr(__s, __c);}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY const wchar_t* wcsstr(const wchar_t* __s1, const wchar_t* __s2) {return ::wcsstr(__s1, __s2);}
|
|
inline _LIBCPP_INLINE_VISIBILITY wchar_t* wcsstr( wchar_t* __s1, const wchar_t* __s2) {return ::wcsstr(__s1, __s2);}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY const wchar_t* wmemchr(const wchar_t* __s, wchar_t __c, size_t __n) {return ::wmemchr(__s, __c, __n);}
|
|
inline _LIBCPP_INLINE_VISIBILITY wchar_t* wmemchr( wchar_t* __s, wchar_t __c, size_t __n) {return ::wmemchr(__s, __c, __n);}
|
|
|
|
#endif
|
|
|
|
using ::wcscspn;
|
|
using ::wcslen;
|
|
using ::wcsspn;
|
|
using ::wcstok;
|
|
using ::wmemcmp;
|
|
using ::wmemcpy;
|
|
using ::wmemmove;
|
|
using ::wmemset;
|
|
using ::wcsftime;
|
|
using ::btowc;
|
|
using ::wctob;
|
|
using ::mbsinit;
|
|
using ::mbrlen;
|
|
using ::mbrtowc;
|
|
using ::wcrtomb;
|
|
using ::mbsrtowcs;
|
|
using ::wcsrtombs;
|
|
|
|
#ifndef _LIBCPP_HAS_NO_STDIN
|
|
using ::getwchar;
|
|
#ifndef _LIBCPP_MSVCRT
|
|
using ::vwscanf;
|
|
#endif // _LIBCPP_MSVCRT
|
|
using ::wscanf;
|
|
#endif
|
|
|
|
#ifndef _LIBCPP_HAS_NO_STDOUT
|
|
using ::putwchar;
|
|
using ::vwprintf;
|
|
using ::wprintf;
|
|
#endif
|
|
|
|
_LIBCPP_END_NAMESPACE_STD
|
|
|
|
#endif // _LIBCPP_CWCHAR
|