32#ifndef _RWSTD_NO_PURE_C_HEADERS
33# define _RWSTD_NO_PURE_C_HEADERS
36#ifndef _RWSTD_NO_DEPRECATED_C_HEADERS
37# define _RWSTD_NO_DEPRECATED_C_HEADERS
46#if defined (_WIN32) && !defined (__CYGWIN__)
55# define _BINARY _O_BINARY
68# pragma warning (disable: 4146)
72#if defined (_RWSTD_NO_MKSTEMP) && !defined (_RWSTD_NO_MKSTEMP_IN_LIBC) \
73 || !defined (_RWSTD_NO_PURE_C_HEADERS)
78#define mkstemp _RWSTD_LIBC_SYM (mkstemp)
84# undef _RWSTD_NO_MKSTEMP
89#if defined (_RWSTD_NO_FILENO) && !defined (_RWSTD_NO_FILENO_IN_LIBC) \
90 || !defined (_RWSTD_NO_PURE_C_HEADERS)
97# undef _RWSTD_NO_FILENO
107#if __SUNPRO_CC == 0x530 && defined (__SunOS_5_6)
109# define _RWSTD_FILENO(f) (f)->_file
111# define _RWSTD_FILENO(f) fileno (f)
115static const int __rw_io_modes [] = {
117 _RWSTD_O_CREAT | _RWSTD_O_APPEND | _RWSTD_O_WRONLY,
119 _RWSTD_O_CREAT | _RWSTD_O_APPEND | _RWSTD_O_WRONLY |
_BINARY,
121 _RWSTD_O_RDONLY | _RWSTD_O_APPEND,
123 _RWSTD_O_CREAT | _RWSTD_O_APPEND | _RWSTD_O_RDONLY |
_BINARY,
124 _RWSTD_O_CREAT | _RWSTD_O_TRUNC | _RWSTD_O_WRONLY,
125 _RWSTD_O_CREAT | _RWSTD_O_APPEND | _RWSTD_O_WRONLY,
126 _RWSTD_O_CREAT | _RWSTD_O_TRUNC | _RWSTD_O_WRONLY |
_BINARY,
127 _RWSTD_O_CREAT | _RWSTD_O_APPEND | _RWSTD_O_WRONLY |
_BINARY,
129 _RWSTD_O_CREAT | _RWSTD_O_APPEND | _RWSTD_O_RDWR,
131 _RWSTD_O_CREAT | _RWSTD_O_APPEND | _RWSTD_O_RDWR |
_BINARY,
133 _RWSTD_O_TRUNC | _RWSTD_O_APPEND,
135 _RWSTD_O_TRUNC | _RWSTD_O_APPEND |
_BINARY,
136 _RWSTD_O_TRUNC | _RWSTD_O_RDONLY,
137 _RWSTD_O_TRUNC | _RWSTD_O_APPEND | _RWSTD_O_RDONLY,
138 _RWSTD_O_TRUNC | _RWSTD_O_RDONLY |
_BINARY,
139 _RWSTD_O_TRUNC | _RWSTD_O_APPEND | _RWSTD_O_RDONLY |
_BINARY,
140 _RWSTD_O_CREAT | _RWSTD_O_TRUNC | _RWSTD_O_WRONLY,
141 _RWSTD_O_CREAT | _RWSTD_O_TRUNC | _RWSTD_O_APPEND
143 _RWSTD_O_CREAT | _RWSTD_O_TRUNC | _RWSTD_O_WRONLY |
_BINARY,
144 _RWSTD_O_CREAT | _RWSTD_O_TRUNC | _RWSTD_O_APPEND
146 _RWSTD_O_CREAT | _RWSTD_O_TRUNC | _RWSTD_O_RDWR,
147 _RWSTD_O_CREAT | _RWSTD_O_TRUNC | _RWSTD_O_APPEND | _RWSTD_O_RDWR,
148 _RWSTD_O_CREAT | _RWSTD_O_TRUNC | _RWSTD_O_RDWR |
_BINARY,
149 _RWSTD_O_CREAT | _RWSTD_O_TRUNC | _RWSTD_O_APPEND | _RWSTD_O_RDWR
154static const char __rw_stdio_modes [][4] = {
187#ifdef _RWSTD_METADATA_EXTENSIONS
206__rw_io_mode (
int openmode)
209 const _RWSTD_SIZE_T
inx = openmode & __rw_openmode_mask;
211 if (
sizeof __rw_io_modes /
sizeof *__rw_io_modes <=
inx)
214 int fdmode = __rw_io_modes [
inx];
218 fdmode &= ~_RWSTD_O_CREAT;
223 fdmode |= _RWSTD_O_EXCL;
231static inline const char*
232__rw_stdio_mode (
int openmode)
235 const _RWSTD_SIZE_T
inx = openmode & __rw_openmode_mask;
237 if (
sizeof __rw_stdio_modes /
sizeof *__rw_stdio_modes <=
inx)
243 const char*
const stdio_mode = __rw_stdio_modes [
inx];
253__rw_mkstemp (
int modebits,
long prot)
257#ifndef _RWSTD_NO_MKSTEMP
264# define P_tmpdir "/tmp"
267 char fnamebuf[] =
P_tmpdir "/.rwtmpXXXXXX";
276 modebits |= _RWSTD_O_EXCL | _RWSTD_O_CREAT;
304 char*
const fname = tempnam (
P_tmpdir,
".rwtmp");
311 fd =
open (fname, modebits | _O_TEMPORARY, prot);
320 const char*
const fname = tmpnam (tmpbuf);
325 fd =
open (fname, modebits, prot);
340__rw_fopen (
const char *fname,
int openmode,
long prot)
345 const char*
const fmode = __rw_stdio_mode (openmode);
357 file = fopen (fname, fmode);
375 const int fdmode = __rw_io_mode (openmode);
384 fd =
open (fname, fdmode, prot);
389 fd = __rw_mkstemp (fdmode, prot);
410__rw_fclose (
void *file,
int flags)
425__rw_fileno (
void *file,
int flags)
442 return fd == _RWSTD_STDIN_FILENO
444 : fd == _RWSTD_STDOUT_FILENO || fd == _RWSTD_STDERR_FILENO
449 const int m = fcntl (fd, _RWSTD_F_GETFL);
456 switch (
m & _RWSTD_O_ACCMODE) {
469__rw_fmode (
void *file,
int flags)
479 return __rw_fdmode (fd);
483#if defined (_RWSTD_MSVC) && defined (_WIN64)
485#pragma warning (disable: 4244)
489__rw_fseek (
void *file,
int flags, _RWSTD_PTRDIFF_T
offset,
int origin)
494 const int pos = fseek (fp,
long (
offset), origin);
503 return lseek (fd,
offset, origin);
508__rw_fread (
void *file,
int flags,
void *
buf, _RWSTD_SIZE_T
size)
513 return fread (
buf, 1,
size, fp);
523__rw_fwrite (
void *file,
int flags,
const void *
buf, _RWSTD_SIZE_T
size)
536#if defined (_RWSTD_MSVC) && defined (_WIN64)
538#pragma warning (default: 4244)
546__rw_fflush (
void *file,
int flags)
548 if ( file == __rw_std_streams [1]
549 || file == __rw_std_streams [5] )
552 if ( file == __rw_std_streams [2]
553 || file == __rw_std_streams [3]
554 || file == __rw_std_streams [6]
555 || file == __rw_std_streams [7] )
579#ifdef _RWSTD_EDG_ECCP
589# ifdef _RWSTD_OS_LINUX
598# elif defined (_RWSTD_OS_SUNOS)
601typedef struct _RW_Sun_FILE {
603# if 8 == _RWSTD_LONG_SIZE
619# define stderr (FILE*)(__iob + 0)
620# define stdin (FILE*)(__iob + 1)
621# define stdout (FILE*)(__iob + 2)
623# elif defined (_RWSTD_OS_WINDOWS)
624# error "need stderr, stdin, and stdout"
626# error "need stderr, stdin, and stdout"
#define _RWSTD_IOS_NOREPLACE
#define _RWSTD_REINTERPRET_CAST(T, x)
#define _RWSTD_UNUSED(arg)
#define _RWSTD_STATIC_CAST(T, x)
#define _RWSTD_NAMESPACE(name)
#define _RWSTD_IOS_NOCREATE
#define _RWSTD_ASSERT(ignore)
#define _RWSTD_INVALID_OPENMODE
_RWSTD_DLLIMPORT int() fileno(FILE *) _LIBC_THROWS()