Skip to content
This repository has been archived by the owner on Oct 12, 2022. It is now read-only.

Commit

Permalink
Merge pull request #1360 from rainers/vs2015_weak
Browse files Browse the repository at this point in the history
Alternative support for VS2015 C runtime
  • Loading branch information
WalterBright committed Aug 27, 2015
2 parents 64cceb1 + 2c1112c commit cb699a7
Show file tree
Hide file tree
Showing 5 changed files with 161 additions and 156 deletions.
1 change: 0 additions & 1 deletion mak/SRCS
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
@@ -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;
}
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
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

0 comments on commit cb699a7

Please sign in to comment.