diff options
author | Mark de Wever <koraq@xs4all.nl> | 2023-12-19 19:32:17 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-12-19 19:32:17 +0100 |
commit | 2fd4084fca0c474c2232533263182945bd1ebe17 (patch) | |
tree | cb155415404588adf4f15562e511c00913459f76 /libcxx/src | |
parent | dcd7c8b7c98fafa7c77e0d9f0d1efc5747afee30 (diff) | |
download | llvm-2fd4084fca0c474c2232533263182945bd1ebe17.zip llvm-2fd4084fca0c474c2232533263182945bd1ebe17.tar.gz llvm-2fd4084fca0c474c2232533263182945bd1ebe17.tar.bz2 |
[libc++][print] Adds ostream overloads. (#73262)
Finishes implementation of
- P2093R14 Formatted output
- P2539R4 Should the output of std::print to a terminal be synchronized
with the underlying stream?
Differential Revision: https://reviews.llvm.org/D156609
Diffstat (limited to 'libcxx/src')
-rw-r--r-- | libcxx/src/CMakeLists.txt | 1 | ||||
-rw-r--r-- | libcxx/src/ostream.cpp | 42 | ||||
-rw-r--r-- | libcxx/src/std_stream.h | 2 |
3 files changed, 45 insertions, 0 deletions
diff --git a/libcxx/src/CMakeLists.txt b/libcxx/src/CMakeLists.txt index be0113e..329964a 100644 --- a/libcxx/src/CMakeLists.txt +++ b/libcxx/src/CMakeLists.txt @@ -89,6 +89,7 @@ if (LIBCXX_ENABLE_LOCALIZATION) ios.instantiations.cpp iostream.cpp locale.cpp + ostream.cpp regex.cpp strstream.cpp ) diff --git a/libcxx/src/ostream.cpp b/libcxx/src/ostream.cpp new file mode 100644 index 0000000..bba8e65 --- /dev/null +++ b/libcxx/src/ostream.cpp @@ -0,0 +1,42 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include <__availability> +#include <__config> +#ifndef _LIBCPP_HAS_NO_FILESYSTEM +# include <fstream> +#endif +#include <ostream> + +#include "std_stream.h" + +_LIBCPP_BEGIN_NAMESPACE_STD + +_LIBCPP_AVAILABILITY_PRINT _LIBCPP_EXPORTED_FROM_ABI FILE* __get_ostream_file(ostream& __os) { + // dynamic_cast requires RTTI, this only affects users whose vendor builds + // the dylib with RTTI disabled. It does not affect users who build with RTTI + // disabled but use a dylib where the RTTI is enabled. + // + // Returning a nullptr means the stream is not considered a terminal and the + // special terminal handling is not done. The terminal handling is mainly of + // importance on Windows. +#ifndef _LIBCPP_HAS_NO_RTTI + auto* __rdbuf = __os.rdbuf(); +# ifndef _LIBCPP_HAS_NO_FILESYSTEM + if (auto* __buffer = dynamic_cast<filebuf*>(__rdbuf)) + return __buffer->__file_; +# endif + + if (auto* __buffer = dynamic_cast<__stdoutbuf<char>*>(__rdbuf)) + return __buffer->__file_; +#endif // _LIBCPP_HAS_NO_RTTI + + return nullptr; +} + +_LIBCPP_END_NAMESPACE_STD diff --git a/libcxx/src/std_stream.h b/libcxx/src/std_stream.h index c4e9733..e55cd0b 100644 --- a/libcxx/src/std_stream.h +++ b/libcxx/src/std_stream.h @@ -269,6 +269,8 @@ private: __stdoutbuf(const __stdoutbuf&); __stdoutbuf& operator=(const __stdoutbuf&); + + _LIBCPP_EXPORTED_FROM_ABI friend FILE* __get_ostream_file(ostream&); }; template <class _CharT> |