Skip to content
This repository was archived by the owner on Feb 8, 2024. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
210 changes: 72 additions & 138 deletions src/core/stdc/stdio.d
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ version( CRuntime_DigitalMars )
///
enum int L_tmpnam = _P_tmpdir.length + 12;
}
else version( CRuntime_Microsoft )
else version( Windows )
{
enum
{
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -556,7 +573,7 @@ version( CRuntime_DigitalMars )
///
shared stdprn = &_iob[4];
}
else version( CRuntime_Microsoft )
else version( Windows )
{
enum
{
Expand Down Expand Up @@ -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 )
{
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -954,7 +887,7 @@ else version( CRuntime_DigitalMars )
///
alias _vsnprintf vsnprintf;
}
else version( CRuntime_Microsoft )
else version( Windows )
{
// No unsafe pointer manipulation.
@trusted
Expand Down Expand Up @@ -1232,14 +1165,15 @@ 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, ...); ///
int _sopen(const char* filename, int oflag, int shflag, ...); ///
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); ///
}

Expand Down
4 changes: 3 additions & 1 deletion src/rt/sections.d
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down
27 changes: 22 additions & 5 deletions src/rt/sections_ldc.d
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -379,7 +396,7 @@ void initSections()
pushRange(_bss_start__, _bss_end__);
}
}
else version (Windows)
else version (MinGW)
{
pushRange(&_data_start__, &_bss_end__);
}
Expand Down