xref: /llvm-project/libcxx/src/ostream.cpp (revision c6f3b7bcd0596d30f8dabecdfb9e44f9a07b6e4c)
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