diff --git a/src/core/stdc/stdio.d b/src/core/stdc/stdio.d index 7ce585c70f..3ffca8c089 100644 --- a/src/core/stdc/stdio.d +++ b/src/core/stdc/stdio.d @@ -59,7 +59,7 @@ version( CRuntime_DigitalMars ) /// enum int L_tmpnam = _P_tmpdir.length + 12; } -else version( CRuntime_Microsoft ) +else version( Windows ) { enum { @@ -265,6 +265,23 @@ else version( CRuntime_Microsoft ) /// alias shared(_iobuf) FILE; } +else version( MinGW ) +{ + alias long fpos_t; + + struct _iobuf { + char *_ptr; + int _cnt; + char *_base; + int _flag; + int _file; + int _charbuf; + int _bufsiz; + char *_tmpfname; + }; + + alias shared(_iobuf) FILE; +} else version( CRuntime_Glibc ) { import core.stdc.wchar_ : mbstate_t; @@ -556,7 +573,7 @@ version( CRuntime_DigitalMars ) /// shared stdprn = &_iob[4]; } -else version( CRuntime_Microsoft ) +else version( Windows ) { enum { @@ -586,14 +603,32 @@ else version( CRuntime_Microsoft ) _IOAPPEND = 0x200, // non-standard } - extern shared void function() _fcloseallp; + version (CRuntime_Microsoft) + { + extern shared void function() _fcloseallp; - /// - shared FILE* stdin; // = &__iob_func()[0]; - /// - shared FILE* stdout; // = &__iob_func()[1]; - /// - shared FILE* stderr; // = &__iob_func()[2]; + /// + shared FILE* stdin; // = &__iob_func()[0]; + /// + shared FILE* stdout; // = &__iob_func()[1]; + /// + shared FILE* stderr; // = &__iob_func()[2]; + } + else version (MinGW) + { + private extern shared FILE[_NFILE] _iob; + + /// + shared FILE* stdin = &_iob[0]; + /// + shared FILE* stdout = &_iob[1]; + /// + shared FILE* stderr = &_iob[2]; + } + else + { + static assert(false, "Unsupported platform"); + } } else version( CRuntime_Glibc ) { @@ -748,98 +783,30 @@ FILE* freopen(in char* filename, in char* mode, FILE* stream); void setbuf(FILE* stream, char* buf); /// int setvbuf(FILE* stream, char* buf, int mode, size_t size); - -version (MinGW) -{ - // Prefer the MinGW versions over the MSVC ones, as the latter don't handle - // reals at all. - /// - int __mingw_fprintf(FILE* stream, in char* format, ...); - /// - alias __mingw_fprintf fprintf; - - /// - int __mingw_fscanf(FILE* stream, in char* format, ...); - /// - alias __mingw_fscanf fscanf; - - /// - int __mingw_sprintf(char* s, in char* format, ...); - /// - alias __mingw_sprintf sprintf; - - /// - int __mingw_sscanf(in char* s, in char* format, ...); - /// - alias __mingw_sscanf sscanf; - - /// - int __mingw_vfprintf(FILE* stream, in char* format, va_list arg); - /// - alias __mingw_vfprintf vfprintf; - - /// - int __mingw_vfscanf(FILE* stream, in char* format, va_list arg); - /// - alias __mingw_vfscanf vfscanf; - - /// - int __mingw_vsprintf(char* s, in char* format, va_list arg); - /// - alias __mingw_vsprintf vsprintf; - - /// - int __mingw_vsscanf(in char* s, in char* format, va_list arg); - /// - alias __mingw_vsscanf vsscanf; - - /// - int __mingw_vprintf(in char* format, va_list arg); - /// - alias __mingw_vprintf vprintf; - - /// - int __mingw_vscanf(in char* format, va_list arg); - /// - alias __mingw_vscanf vscanf; - - /// - int __mingw_printf(in char* format, ...); - /// - alias __mingw_printf printf; - - /// - int __mingw_scanf(in char* format, ...); - /// - alias __mingw_scanf scanf; -} -else -{ - /// - int fprintf(FILE* stream, in char* format, ...); - /// - int fscanf(FILE* stream, in char* format, ...); - /// - int sprintf(char* s, in char* format, ...); - /// - int sscanf(in char* s, in char* format, ...); - /// - int vfprintf(FILE* stream, in char* format, va_list arg); - /// - int vfscanf(FILE* stream, in char* format, va_list arg); - /// - int vsprintf(char* s, in char* format, va_list arg); - /// - int vsscanf(in char* s, in char* format, va_list arg); - /// - int vprintf(in char* format, va_list arg); - /// - int vscanf(in char* format, va_list arg); - /// - int printf(in char* format, ...); - /// - int scanf(in char* format, ...); -} +/// +int fprintf(FILE* stream, in char* format, ...); +/// +int fscanf(FILE* stream, in char* format, ...); +/// +int sprintf(char* s, in char* format, ...); +/// +int sscanf(in char* s, in char* format, ...); +/// +int vfprintf(FILE* stream, in char* format, va_list arg); +/// +int vfscanf(FILE* stream, in char* format, va_list arg); +/// +int vsprintf(char* s, in char* format, va_list arg); +/// +int vsscanf(in char* s, in char* format, va_list arg); +/// +int vprintf(in char* format, va_list arg); +/// +int vscanf(in char* format, va_list arg); +/// +int printf(in char* format, ...); +/// +int scanf(in char* format, ...); // No unsafe pointer manipulation. @trusted @@ -894,41 +861,7 @@ size_t fwrite(in void* ptr, size_t size, size_t nmemb, FILE* stream); c_long ftell(FILE* stream); } -version( MinGW ) -{ - // No unsafe pointer manipulation. - extern (D) @trusted - { - /// - void rewind(FILE* stream) { fseek(stream,0L,SEEK_SET); stream._flag = stream._flag & ~_IOERR; } - /// - pure void clearerr(FILE* stream) { stream._flag = stream._flag & ~(_IOERR|_IOEOF); } - /// - pure int feof(FILE* stream) { return stream._flag&_IOEOF; } - /// - pure int ferror(FILE* stream) { return stream._flag&_IOERR; } - } - /// - int __mingw_snprintf(char* s, size_t n, in char* fmt, ...); - /// - alias __mingw_snprintf _snprintf; - /// - alias __mingw_snprintf snprintf; - - /// - int __mingw_vsnprintf(char* s, size_t n, in char* format, va_list arg); - /// - alias __mingw_vsnprintf _vsnprintf; - /// - alias __mingw_vsnprintf vsnprintf; - - uint _set_output_format(uint format); - enum _TWO_DIGIT_EXPONENT = 1; - - intptr_t _get_osfhandle(int fd); - int _open_osfhandle(intptr_t osfhandle, int flags); -} -else version( CRuntime_DigitalMars ) +version( CRuntime_DigitalMars ) { // No unsafe pointer manipulation. extern (D) @trusted @@ -954,7 +887,7 @@ else version( CRuntime_DigitalMars ) /// alias _vsnprintf vsnprintf; } -else version( CRuntime_Microsoft ) +else version( Windows ) { // No unsafe pointer manipulation. @trusted @@ -1232,7 +1165,7 @@ version(CRuntime_DigitalMars) FILE *_wfdopen(int fd, const(wchar)* flags); /// } -else version (CRuntime_Microsoft) +else version (Windows) { int _open(const char* filename, int oflag, ...); /// int _wopen(const wchar* filename, int oflag, ...); /// @@ -1240,6 +1173,7 @@ else version (CRuntime_Microsoft) int _wsopen(const wchar* filename, int oflag, int shflag, ...); /// int _close(int fd); /// FILE *_fdopen(int fd, const(char)* flags); /// + alias fdopen = _fdopen; /// FILE *_wfdopen(int fd, const(wchar)* flags); /// } diff --git a/src/rt/sections.d b/src/rt/sections.d index 3e93392b11..c0e6decca4 100644 --- a/src/rt/sections.d +++ b/src/rt/sections.d @@ -24,7 +24,9 @@ else version (CRuntime_DigitalMars) public import rt.sections_win32; else version (CRuntime_Microsoft) public import rt.sections_win64; -else version (CRuntime_Bionic) +else version (MinGW) { + // handled by rt.sections_ldc +} else version (CRuntime_Bionic) public import rt.sections_android; else static assert(0, "unimplemented"); diff --git a/src/rt/sections_ldc.d b/src/rt/sections_ldc.d index f423af950f..8500a6b67c 100644 --- a/src/rt/sections_ldc.d +++ b/src/rt/sections_ldc.d @@ -106,12 +106,29 @@ private void* _bss_end__; } } - else version (Windows) + else version (MinGW) { - extern extern (C) __gshared + version (Win32) + { + extern extern (C) __gshared + { + int _data_start__; + int _bss_end__; + } + } + else version (Win64) { - int _data_start__; - int _bss_end__; + extern extern (C) __gshared + { + int __data_start__; + int __bss_end__; + } + alias _data_start__ = __data_start__; + alias _bss_end__ = __bss_end__; + } + else + { + static assert(false, "Unsupported platform"); } } else version (UseELF) @@ -379,7 +396,7 @@ void initSections() pushRange(_bss_start__, _bss_end__); } } - else version (Windows) + else version (MinGW) { pushRange(&_data_start__, &_bss_end__); }