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
210 lines
5.5 KiB
C++
210 lines
5.5 KiB
C++
// -*- C++ -*-
|
|
//===---------------------------- cstdio ----------------------------------===//
|
|
//
|
|
// 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_CSTDIO
|
|
#define _LIBCPP_CSTDIO
|
|
|
|
/*
|
|
cstdio synopsis
|
|
|
|
Macros:
|
|
|
|
BUFSIZ
|
|
EOF
|
|
FILENAME_MAX
|
|
FOPEN_MAX
|
|
L_tmpnam
|
|
NULL
|
|
SEEK_CUR
|
|
SEEK_END
|
|
SEEK_SET
|
|
TMP_MAX
|
|
_IOFBF
|
|
_IOLBF
|
|
_IONBF
|
|
stderr
|
|
stdin
|
|
stdout
|
|
|
|
namespace std
|
|
{
|
|
|
|
Types:
|
|
|
|
FILE
|
|
fpos_t
|
|
size_t
|
|
|
|
int remove(const char* filename);
|
|
int rename(const char* old, const char* new);
|
|
FILE* tmpfile(void);
|
|
char* tmpnam(char* s);
|
|
int fclose(FILE* stream);
|
|
int fflush(FILE* stream);
|
|
FILE* fopen(const char* restrict filename, const char* restrict mode);
|
|
FILE* freopen(const char* restrict filename, const char * restrict mode,
|
|
FILE * restrict stream);
|
|
void setbuf(FILE* restrict stream, char* restrict buf);
|
|
int setvbuf(FILE* restrict stream, char* restrict buf, int mode, size_t size);
|
|
int fprintf(FILE* restrict stream, const char* restrict format, ...);
|
|
int fscanf(FILE* restrict stream, const char * restrict format, ...);
|
|
int printf(const char* restrict format, ...);
|
|
int scanf(const char* restrict format, ...);
|
|
int snprintf(char* restrict s, size_t n, const char* restrict format, ...); // C99
|
|
int sprintf(char* restrict s, const char* restrict format, ...);
|
|
int sscanf(const char* restrict s, const char* restrict format, ...);
|
|
int vfprintf(FILE* restrict stream, const char* restrict format, va_list arg);
|
|
int vfscanf(FILE* restrict stream, const char* restrict format, va_list arg); // C99
|
|
int vprintf(const char* restrict format, va_list arg);
|
|
int vscanf(const char* restrict format, va_list arg); // C99
|
|
int vsnprintf(char* restrict s, size_t n, const char* restrict format, // C99
|
|
va_list arg);
|
|
int vsprintf(char* restrict s, const char* restrict format, va_list arg);
|
|
int vsscanf(const char* restrict s, const char* restrict format, va_list arg); // C99
|
|
int fgetc(FILE* stream);
|
|
char* fgets(char* restrict s, int n, FILE* restrict stream);
|
|
int fputc(int c, FILE* stream);
|
|
int fputs(const char* restrict s, FILE* restrict stream);
|
|
int getc(FILE* stream);
|
|
int getchar(void);
|
|
char* gets(char* s); // removed in C++14
|
|
int putc(int c, FILE* stream);
|
|
int putchar(int c);
|
|
int puts(const char* s);
|
|
int ungetc(int c, FILE* stream);
|
|
size_t fread(void* restrict ptr, size_t size, size_t nmemb,
|
|
FILE* restrict stream);
|
|
size_t fwrite(const void* restrict ptr, size_t size, size_t nmemb,
|
|
FILE* restrict stream);
|
|
int fgetpos(FILE* restrict stream, fpos_t* restrict pos);
|
|
int fseek(FILE* stream, long offset, int whence);
|
|
int fsetpos(FILE*stream, const fpos_t* pos);
|
|
long ftell(FILE* stream);
|
|
void rewind(FILE* stream);
|
|
void clearerr(FILE* stream);
|
|
int feof(FILE* stream);
|
|
int ferror(FILE* stream);
|
|
void perror(const char* s);
|
|
|
|
} // std
|
|
*/
|
|
|
|
#include <__config>
|
|
#include <stdio.h>
|
|
|
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
|
#pragma GCC system_header
|
|
#endif
|
|
|
|
// snprintf
|
|
#if defined(_LIBCPP_MSVCRT)
|
|
#include "support/win32/support.h"
|
|
#endif
|
|
|
|
#ifdef getc
|
|
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_getc(FILE* __stream) {return getc(__stream);}
|
|
#undef getc
|
|
inline _LIBCPP_INLINE_VISIBILITY int getc(FILE* __stream) {return __libcpp_getc(__stream);}
|
|
#endif // getc
|
|
|
|
#ifdef putc
|
|
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_putc(int __c, FILE* __stream) {return putc(__c, __stream);}
|
|
#undef putc
|
|
inline _LIBCPP_INLINE_VISIBILITY int putc(int __c, FILE* __stream) {return __libcpp_putc(__c, __stream);}
|
|
#endif // putc
|
|
|
|
#ifdef clearerr
|
|
inline _LIBCPP_INLINE_VISIBILITY void __libcpp_clearerr(FILE* __stream) { return clearerr(__stream); }
|
|
#undef clearerr
|
|
inline _LIBCPP_INLINE_VISIBILITY void clearerr(FILE* __stream) { return __libcpp_clearerr(__stream); }
|
|
#endif // clearerr
|
|
|
|
#ifdef feof
|
|
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_feof(FILE* __stream) { return feof(__stream); }
|
|
#undef feof
|
|
inline _LIBCPP_INLINE_VISIBILITY int feof(FILE* __stream) { return __libcpp_feof(__stream); }
|
|
#endif // feof
|
|
|
|
#ifdef ferror
|
|
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_ferror(FILE* __stream) { return ferror(__stream); }
|
|
#undef ferror
|
|
inline _LIBCPP_INLINE_VISIBILITY int ferror(FILE* __stream) { return __libcpp_ferror(__stream); }
|
|
#endif // ferror
|
|
|
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
|
|
|
using ::FILE;
|
|
using ::fpos_t;
|
|
using ::size_t;
|
|
|
|
using ::fclose;
|
|
using ::fflush;
|
|
using ::setbuf;
|
|
using ::setvbuf;
|
|
using ::fprintf;
|
|
using ::fscanf;
|
|
using ::snprintf;
|
|
using ::sprintf;
|
|
using ::sscanf;
|
|
#ifndef _LIBCPP_MSVCRT
|
|
using ::vfprintf;
|
|
using ::vfscanf;
|
|
using ::vsscanf;
|
|
#endif // _LIBCPP_MSVCRT
|
|
using ::vsnprintf;
|
|
using ::vsprintf;
|
|
using ::fgetc;
|
|
using ::fgets;
|
|
using ::fputc;
|
|
using ::fputs;
|
|
using ::getc;
|
|
using ::putc;
|
|
using ::ungetc;
|
|
using ::fread;
|
|
using ::fwrite;
|
|
using ::fgetpos;
|
|
using ::fseek;
|
|
using ::fsetpos;
|
|
using ::ftell;
|
|
using ::rewind;
|
|
using ::clearerr;
|
|
using ::feof;
|
|
using ::ferror;
|
|
using ::perror;
|
|
|
|
#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
|
|
using ::fopen;
|
|
using ::freopen;
|
|
using ::remove;
|
|
using ::rename;
|
|
using ::tmpfile;
|
|
using ::tmpnam;
|
|
#endif
|
|
|
|
#ifndef _LIBCPP_HAS_NO_STDIN
|
|
using ::getchar;
|
|
#if _LIBCPP_STD_VER <= 11
|
|
using ::gets;
|
|
#endif
|
|
using ::scanf;
|
|
using ::vscanf;
|
|
#endif
|
|
|
|
#ifndef _LIBCPP_HAS_NO_STDOUT
|
|
using ::printf;
|
|
using ::putchar;
|
|
using ::puts;
|
|
using ::vprintf;
|
|
#endif
|
|
|
|
_LIBCPP_END_NAMESPACE_STD
|
|
|
|
#endif // _LIBCPP_CSTDIO
|