Skip to content
This repository was archived by the owner on Oct 12, 2022. It is now read-only.
/ druntime Public archive
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
1 change: 0 additions & 1 deletion mak/SRCS
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,6 @@ SRCS=\
src\core\sys\windows\threadaux.d \
src\core\sys\windows\windows.d \
src\core\sys\windows\winsock2.d \
src\core\sys\windows\stdio_msvc12.d \
\
src\gc\bits.d \
src\gc\config.d \
Expand Down
103 changes: 0 additions & 103 deletions src/core/sys/windows/stdio_msvc12.d

This file was deleted.

38 changes: 0 additions & 38 deletions src/core/sys/windows/stdio_msvc14.d

This file was deleted.

154 changes: 154 additions & 0 deletions src/rt/stdio_msvc.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
/**
* This module provides MS VC runtime helper function that
* wrap differences between different versions of the MS C runtime
*
* Copyright: Copyright Digital Mars 2015.
* License: Distributed under the
* $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0).
* (See accompanying file LICENSE)
* Source: $(DRUNTIMESRC rt/_stdio_msvc.d)
* Authors: Rainer Schuetze
*/

struct _iobuf
{
char* _ptr;
int _cnt; // _cnt and _base exchanged for VS2015
char* _base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char* _tmpfname;
// additional members in VS2015
};

typedef struct _iobuf FILE;
extern FILE* stdin;
extern FILE* stdout;
extern FILE* stderr;

FILE* __acrt_iob_func(int hnd); // VS2015+
FILE* __iob_func(); // VS2013-

int _set_output_format(int format); // VS2013-

//extern const char* __acrt_iob_func;
extern const char* _nullfunc = 0;

#pragma comment(linker, "/alternatename:__acrt_iob_func=_nullfunc")
#pragma comment(linker, "/alternatename:__iob_func=_nullfunc")
#pragma comment(linker, "/alternatename:_set_output_format=_nullfunc")

void init_msvc()
{
if (&__acrt_iob_func != (void*) &_nullfunc)
{
stdin = __acrt_iob_func(0);
stdout = __acrt_iob_func(1);
stderr = __acrt_iob_func(2);
}
else if (&__iob_func != (void*) &_nullfunc)
{
FILE* fp = __iob_func();
stdin = fp;
stdout = fp + 1;
stderr = fp + 1;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

stderr = fp + 2;

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Already fixed by #1361, i.e., in master too.

}
if (&_set_output_format != (void*) &_nullfunc)
_set_output_format(1);
}

// VS2013- implements these functions as macros, VS2015+ provides symbols

#pragma comment(linker, "/alternatename:_fputc_nolock=_msvc_fputc_nolock")
#pragma comment(linker, "/alternatename:_fgetc_nolock=_msvc_fgetc_nolock")
#pragma comment(linker, "/alternatename:rewind=_msvc_rewind")
#pragma comment(linker, "/alternatename:clearerr=_msvc_clearerr")
#pragma comment(linker, "/alternatename:feof=_msvc_feof")
#pragma comment(linker, "/alternatename:ferror=_msvc_ferror")
#pragma comment(linker, "/alternatename:fileno=_msvc_fileno")

// VS2013- helper functions
int _filbuf(FILE *fp);
int _flsbuf(int c, FILE *fp);

#pragma comment(linker, "/alternatename:_filbuf=_nullfunc")
#pragma comment(linker, "/alternatename:_flsbuf=_nullfunc")

int _msvc_fputc_nolock(int c, FILE *fp)
{
fp->_cnt = fp->_cnt - 1;
if (fp->_cnt >= 0)
{
*(fp->_ptr) = (char)c;
fp->_ptr = fp->_ptr + 1;
return (char)c;
}
else
return _flsbuf(c, fp);
}

int _msvc_fgetc_nolock(FILE *fp)
{
fp->_cnt = fp->_cnt - 1;
if (fp->_cnt >= 0)
{
char c = *(fp->_ptr);
fp->_ptr = fp->_ptr + 1;
return c;
}
else
return _filbuf(fp);
}

enum
{
_IOFBF = 0,
_IOLBF = 0x40,
_IONBF = 4,
_IOREAD = 1, // non-standard
_IOWRT = 2, // non-standard
_IOMYBUF = 8, // non-standard
_IOEOF = 0x10, // non-standard
_IOERR = 0x20, // non-standard
_IOSTRG = 0x40, // non-standard
_IORW = 0x80, // non-standard
_IOAPP = 0x200, // non-standard
_IOAPPEND = 0x200, // non-standard
};

enum
{
SEEK_SET,
SEEK_CUR,
SEEK_END
};

int fseek(FILE *fp, long off, int whence);

void _msvc_rewind(FILE* stream)
{
fseek(stream, 0L, SEEK_SET);
stream->_flag = stream->_flag & ~_IOERR;
}
///
void _msvc_clearerr(FILE* stream)
{
stream->_flag = stream->_flag & ~(_IOERR|_IOEOF);
}

int _msvc_feof(FILE* stream)
{
return stream->_flag & _IOEOF;
}

int _msvc_ferror(FILE* stream)
{
return stream->_flag & _IOERR;
}

int _msvc_fileno(FILE* stream)
{
return stream->_file;
}
21 changes: 7 additions & 14 deletions win64.mak
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,10 @@ CFLAGS=/Z7 /I"$(VCDIR)"\INCLUDE /I"$(SDKDIR)"\Include
DRUNTIME_BASE=druntime$(MODEL)
DRUNTIME=lib\$(DRUNTIME_BASE).lib
GCSTUB=lib\gcstub$(MODEL).obj
STDIO_VS12=lib\stdio_msvc12_$(MODEL).obj
STDIO_VS14=lib\stdio_msvc14_$(MODEL).obj

DOCFMT=

target : import copydir copy $(DRUNTIME) $(GCSTUB) stdio_vs
target : import copydir copy $(DRUNTIME) $(GCSTUB)

$(mak\COPY)
$(mak\DOCS)
Expand All @@ -45,8 +43,8 @@ $(mak\SRCS)
# NOTE: a pre-compiled minit.obj has been provided in dmd for Win32 and
# minit.asm is not used by dmd for Linux

OBJS= errno_c.obj
OBJS_TO_DELETE= errno_c.obj
OBJS= errno_c.obj stdio_msvc_$(MODEL).obj
OBJS_TO_DELETE= errno_c.obj stdio_msvc_$(MODEL).obj

######################## Doc .html file generation ##############################

Expand Down Expand Up @@ -657,6 +655,10 @@ $(IMPDIR)\etc\linux\memoryerror.d : src\etc\linux\memoryerror.d
errno_c.obj : src\core\stdc\errno.c
$(CC) -c $(CFLAGS) src\core\stdc\errno.c -Foerrno_c.obj

stdio_msvc_$(MODEL).obj : src\rt\stdio_msvc.c win64.mak
$(CC) -c -Fo$@ $(CFLAGS) src\rt\stdio_msvc.c


src\rt\minit.obj : src\rt\minit.asm
$(CC) -c $(CFLAGS) src\rt\minit.asm

Expand All @@ -665,15 +667,6 @@ src\rt\minit.obj : src\rt\minit.asm
$(GCSTUB) : src\gcstub\gc.d win64.mak
$(DMD) -c -of$(GCSTUB) src\gcstub\gc.d $(DFLAGS)

################### VS 2015 init code #########################

stdio_vs: $(STDIO_VS14) $(STDIO_VS12)

$(STDIO_VS12) : src\core\sys\windows\stdio_msvc12.d win64.mak
$(DMD) -c -of$(STDIO_VS12) src\core\sys\windows\stdio_msvc12.d $(DFLAGS)

$(STDIO_VS14) : src\core\sys\windows\stdio_msvc14.d win64.mak
$(DMD) -c -of$(STDIO_VS14) src\core\sys\windows\stdio_msvc14.d $(DFLAGS)

################### Library generation #########################

Expand Down