| /* Windows support code to wrap differences between different |
| versions of the Microsoft C libaries. |
| Copyright (C) 2021 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 |
| <http://www.gnu.org/licenses/>. */ |
| |
| #ifdef __MINGW32__ |
| #include <_mingw.h> |
| #endif |
| #include <stdio.h> |
| |
| /* 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 |
| msvcUsedUCRT = 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*/ |