/* Windows support code to wrap differences between different versions of the Microsoft C libaries. Copyright (C) 2021-2022 Free Software Foundation, Inc. This file is part of GCC. GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GCC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. Under Section 7 of GPL version 3, you are granted additional permissions described in the GCC Runtime Library Exception, version 3.1, as published by the Free Software Foundation. You should have received a copy of the GNU General Public License and a copy of the GCC Runtime Library Exception along with this program; see the files COPYING3 and COPYING.RUNTIME respectively. If not, see . */ #ifdef __MINGW32__ #include <_mingw.h> #endif #include /* The D runtime library defines stdin, stdout, and stderr as extern(C) symbols in the core.stdc.stdio module, and require initializing at start-up. */ __attribute__((weakref ("stdin"))) static FILE *core_stdc_stdin; __attribute__((weakref ("stdout"))) static FILE *core_stdc_stdout; __attribute__((weakref ("stderr"))) static FILE *core_stdc_stderr; /* Set to 1 if runtime is using libucrt.dll. */ unsigned char msvcUsesUCRT; void init_msvc (void) { core_stdc_stdin = stdin; core_stdc_stdout = stdout; core_stdc_stderr = stderr; #if __MSVCRT_VERSION__ >= 0xE00 msvcUsesUCRT = 1; #endif } /* Phobos std.stdio module assumes these functions are present at link time, and not absent or macros. */ #ifdef _fgetc_nolock #undef _fgetc_nolock int _fgetc_nolock (FILE *fp) { fp->_cnt--; if (fp->_cnt >= 0) { const int c = *fp->_ptr; fp->_ptr++; return c & 0xff; } else return _filbuf (fp); } #endif /* _fgetc_nolock */ #ifdef _fputc_nolock #undef _fputc_nolock int _fputc_nolock (int c, FILE *fp) { fp->_cnt--; if (fp->_cnt >= 0) { *fp->_ptr = (char) c; fp->_ptr++; return c & 0xff; } else return _flsbuf (c, fp); } #endif /* _fputc_nolock */ #ifdef rewind #undef rewind void rewind (FILE *fp) { fseek (fp, 0, SEEK_SET); fp->_flag &= ~_IOERR; } #endif /* rewind */ #ifdef clearerr #undef clearerr void clearerr (FILE *fp) { fp->_flag &= ~(_IOERR | _IOEOF); } #endif /* clearerr */ #ifdef feof #undef feof int feof (FILE *fp) { return fp->_flag & _IOEOF; } #endif /* feof */ #ifdef ferror #undef ferror int ferror (FILE *fp) { return fp->_flag & _IOERR; } #endif /* ferror */ #ifdef fileno #undef fileno int fileno (FILE *fp) { return fp->_file; } #endif /* fileno */ /* Phobos std.stdio module has a dependency on the UCRT library, so provide stubs that forward to the nearest equivalent. */ #if __MSVCRT_VERSION__ < 0x800 wint_t _fgetwc_nolock (FILE *fp) { return fgetwc (fp); } wint_t _fputwc_nolock (wchar_t c, FILE *fp) { return fputwc(c, fp); } #endif /* __MSVCRT_VERSION__ < 0x800*/