12fd4084fSMark de Wever //===----------------------------------------------------------------------===// 22fd4084fSMark de Wever // 32fd4084fSMark de Wever // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42fd4084fSMark de Wever // See https://llvm.org/LICENSE.txt for license information. 52fd4084fSMark de Wever // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 62fd4084fSMark de Wever // 72fd4084fSMark de Wever //===----------------------------------------------------------------------===// 82fd4084fSMark de Wever 92fd4084fSMark de Wever #include <__config> 10*c6f3b7bcSNikolas Klauser #if _LIBCPP_HAS_FILESYSTEM 112fd4084fSMark de Wever # include <fstream> 122fd4084fSMark de Wever #endif 132fd4084fSMark de Wever #include <ostream> 142fd4084fSMark de Wever 152fd4084fSMark de Wever #include "std_stream.h" 162fd4084fSMark de Wever 172fd4084fSMark de Wever _LIBCPP_BEGIN_NAMESPACE_STD 182fd4084fSMark de Wever 194a87db6bSMark de Wever _LIBCPP_EXPORTED_FROM_ABI FILE* __get_ostream_file(ostream& __os) { 202fd4084fSMark de Wever // dynamic_cast requires RTTI, this only affects users whose vendor builds 212fd4084fSMark de Wever // the dylib with RTTI disabled. It does not affect users who build with RTTI 222fd4084fSMark de Wever // disabled but use a dylib where the RTTI is enabled. 232fd4084fSMark de Wever // 242fd4084fSMark de Wever // Returning a nullptr means the stream is not considered a terminal and the 252fd4084fSMark de Wever // special terminal handling is not done. The terminal handling is mainly of 262fd4084fSMark de Wever // importance on Windows. 27ba87515fSNikolas Klauser #if _LIBCPP_HAS_RTTI 282fd4084fSMark de Wever auto* __rdbuf = __os.rdbuf(); 29*c6f3b7bcSNikolas Klauser # if _LIBCPP_HAS_FILESYSTEM 302fd4084fSMark de Wever if (auto* __buffer = dynamic_cast<filebuf*>(__rdbuf)) 312fd4084fSMark de Wever return __buffer->__file_; 322fd4084fSMark de Wever # endif 332fd4084fSMark de Wever 342fd4084fSMark de Wever if (auto* __buffer = dynamic_cast<__stdoutbuf<char>*>(__rdbuf)) 352fd4084fSMark de Wever return __buffer->__file_; 36ba87515fSNikolas Klauser #endif // _LIBCPP_HAS_RTTI 372fd4084fSMark de Wever 382fd4084fSMark de Wever return nullptr; 392fd4084fSMark de Wever } 402fd4084fSMark de Wever 412fd4084fSMark de Wever _LIBCPP_END_NAMESPACE_STD 42