aboutsummaryrefslogtreecommitdiff
path: root/libcxx/src
diff options
context:
space:
mode:
authorMark de Wever <koraq@xs4all.nl>2023-12-19 19:32:17 +0100
committerGitHub <noreply@github.com>2023-12-19 19:32:17 +0100
commit2fd4084fca0c474c2232533263182945bd1ebe17 (patch)
treecb155415404588adf4f15562e511c00913459f76 /libcxx/src
parentdcd7c8b7c98fafa7c77e0d9f0d1efc5747afee30 (diff)
downloadllvm-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.txt1
-rw-r--r--libcxx/src/ostream.cpp42
-rw-r--r--libcxx/src/std_stream.h2
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>