10b57cec5SDimitry Andric// -*- C++ -*- 2349cc55cSDimitry Andric//===----------------------------------------------------------------------===// 30b57cec5SDimitry Andric// 40b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 50b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 60b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 70b57cec5SDimitry Andric// 80b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 90b57cec5SDimitry Andric 100b57cec5SDimitry Andric#ifndef _LIBCPP_IOMANIP 110b57cec5SDimitry Andric#define _LIBCPP_IOMANIP 120b57cec5SDimitry Andric 130b57cec5SDimitry Andric/* 140b57cec5SDimitry Andric iomanip synopsis 150b57cec5SDimitry Andric 160b57cec5SDimitry Andricnamespace std { 170b57cec5SDimitry Andric 180b57cec5SDimitry Andric// types T1, T2, ... are unspecified implementation types 190b57cec5SDimitry AndricT1 resetiosflags(ios_base::fmtflags mask); 200b57cec5SDimitry AndricT2 setiosflags (ios_base::fmtflags mask); 210b57cec5SDimitry AndricT3 setbase(int base); 220b57cec5SDimitry Andrictemplate<charT> T4 setfill(charT c); 230b57cec5SDimitry AndricT5 setprecision(int n); 240b57cec5SDimitry AndricT6 setw(int n); 250b57cec5SDimitry Andrictemplate <class moneyT> T7 get_money(moneyT& mon, bool intl = false); 260b57cec5SDimitry Andrictemplate <class charT, class moneyT> T8 put_money(const moneyT& mon, bool intl = false); 270b57cec5SDimitry Andrictemplate <class charT> T9 get_time(struct tm* tmb, const charT* fmt); 280b57cec5SDimitry Andrictemplate <class charT> T10 put_time(const struct tm* tmb, const charT* fmt); 290b57cec5SDimitry Andric 300b57cec5SDimitry Andrictemplate <class charT> 310b57cec5SDimitry Andric T11 quoted(const charT* s, charT delim=charT('"'), charT escape=charT('\\')); // C++14 320b57cec5SDimitry Andric 330b57cec5SDimitry Andrictemplate <class charT, class traits, class Allocator> 340b57cec5SDimitry Andric T12 quoted(const basic_string<charT, traits, Allocator>& s, 350b57cec5SDimitry Andric charT delim=charT('"'), charT escape=charT('\\')); // C++14 360b57cec5SDimitry Andric 370b57cec5SDimitry Andrictemplate <class charT, class traits, class Allocator> 380b57cec5SDimitry Andric T13 quoted(basic_string<charT, traits, Allocator>& s, 390b57cec5SDimitry Andric charT delim=charT('"'), charT escape=charT('\\')); // C++14 400b57cec5SDimitry Andric 410b57cec5SDimitry Andric} // std 420b57cec5SDimitry Andric 430b57cec5SDimitry Andric*/ 440b57cec5SDimitry Andric 4581ad6265SDimitry Andric#include <__assert> // all public C++ headers provide the assertion handler 460b57cec5SDimitry Andric#include <__config> 470b57cec5SDimitry Andric#include <istream> 480b57cec5SDimitry Andric#include <version> 490b57cec5SDimitry Andric 500b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 510b57cec5SDimitry Andric# pragma GCC system_header 520b57cec5SDimitry Andric#endif 530b57cec5SDimitry Andric 540b57cec5SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD 550b57cec5SDimitry Andric 560b57cec5SDimitry Andric// resetiosflags 570b57cec5SDimitry Andric 58cb14a3feSDimitry Andricclass __iom_t1 { 590b57cec5SDimitry Andric ios_base::fmtflags __mask_; 60cb14a3feSDimitry Andric 610b57cec5SDimitry Andricpublic: 62cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI explicit __iom_t1(ios_base::fmtflags __m) : __mask_(__m) {} 630b57cec5SDimitry Andric 640b57cec5SDimitry Andric template <class _CharT, class _Traits> 65cb14a3feSDimitry Andric friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 66cb14a3feSDimitry Andric operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t1& __x) { 670b57cec5SDimitry Andric __is.unsetf(__x.__mask_); 680b57cec5SDimitry Andric return __is; 690b57cec5SDimitry Andric } 700b57cec5SDimitry Andric 710b57cec5SDimitry Andric template <class _CharT, class _Traits> 72cb14a3feSDimitry Andric friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 73cb14a3feSDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t1& __x) { 740b57cec5SDimitry Andric __os.unsetf(__x.__mask_); 750b57cec5SDimitry Andric return __os; 760b57cec5SDimitry Andric } 770b57cec5SDimitry Andric}; 780b57cec5SDimitry Andric 79cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t1 resetiosflags(ios_base::fmtflags __mask) { return __iom_t1(__mask); } 800b57cec5SDimitry Andric 810b57cec5SDimitry Andric// setiosflags 820b57cec5SDimitry Andric 83cb14a3feSDimitry Andricclass __iom_t2 { 840b57cec5SDimitry Andric ios_base::fmtflags __mask_; 85cb14a3feSDimitry Andric 860b57cec5SDimitry Andricpublic: 87cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI explicit __iom_t2(ios_base::fmtflags __m) : __mask_(__m) {} 880b57cec5SDimitry Andric 890b57cec5SDimitry Andric template <class _CharT, class _Traits> 90cb14a3feSDimitry Andric friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 91cb14a3feSDimitry Andric operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t2& __x) { 920b57cec5SDimitry Andric __is.setf(__x.__mask_); 930b57cec5SDimitry Andric return __is; 940b57cec5SDimitry Andric } 950b57cec5SDimitry Andric 960b57cec5SDimitry Andric template <class _CharT, class _Traits> 97cb14a3feSDimitry Andric friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 98cb14a3feSDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t2& __x) { 990b57cec5SDimitry Andric __os.setf(__x.__mask_); 1000b57cec5SDimitry Andric return __os; 1010b57cec5SDimitry Andric } 1020b57cec5SDimitry Andric}; 1030b57cec5SDimitry Andric 104cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t2 setiosflags(ios_base::fmtflags __mask) { return __iom_t2(__mask); } 1050b57cec5SDimitry Andric 1060b57cec5SDimitry Andric// setbase 1070b57cec5SDimitry Andric 108cb14a3feSDimitry Andricclass __iom_t3 { 1090b57cec5SDimitry Andric int __base_; 110cb14a3feSDimitry Andric 1110b57cec5SDimitry Andricpublic: 112cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI explicit __iom_t3(int __b) : __base_(__b) {} 1130b57cec5SDimitry Andric 1140b57cec5SDimitry Andric template <class _CharT, class _Traits> 115cb14a3feSDimitry Andric friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 116cb14a3feSDimitry Andric operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t3& __x) { 117cb14a3feSDimitry Andric __is.setf(__x.__base_ == 8 ? ios_base::oct 118cb14a3feSDimitry Andric : __x.__base_ == 10 ? ios_base::dec 119cb14a3feSDimitry Andric : __x.__base_ == 16 ? ios_base::hex 120cb14a3feSDimitry Andric : ios_base::fmtflags(0), 121cb14a3feSDimitry Andric ios_base::basefield); 1220b57cec5SDimitry Andric return __is; 1230b57cec5SDimitry Andric } 1240b57cec5SDimitry Andric 1250b57cec5SDimitry Andric template <class _CharT, class _Traits> 126cb14a3feSDimitry Andric friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 127cb14a3feSDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t3& __x) { 128cb14a3feSDimitry Andric __os.setf(__x.__base_ == 8 ? ios_base::oct 129cb14a3feSDimitry Andric : __x.__base_ == 10 ? ios_base::dec 130cb14a3feSDimitry Andric : __x.__base_ == 16 ? ios_base::hex 131cb14a3feSDimitry Andric : ios_base::fmtflags(0), 132cb14a3feSDimitry Andric ios_base::basefield); 1330b57cec5SDimitry Andric return __os; 1340b57cec5SDimitry Andric } 1350b57cec5SDimitry Andric}; 1360b57cec5SDimitry Andric 137cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t3 setbase(int __base) { return __iom_t3(__base); } 1380b57cec5SDimitry Andric 1390b57cec5SDimitry Andric// setfill 1400b57cec5SDimitry Andric 1410b57cec5SDimitry Andrictemplate <class _CharT> 142cb14a3feSDimitry Andricclass __iom_t4 { 1430b57cec5SDimitry Andric _CharT __fill_; 144cb14a3feSDimitry Andric 1450b57cec5SDimitry Andricpublic: 146cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI explicit __iom_t4(_CharT __c) : __fill_(__c) {} 1470b57cec5SDimitry Andric 1480b57cec5SDimitry Andric template <class _Traits> 149cb14a3feSDimitry Andric friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 150cb14a3feSDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t4& __x) { 1510b57cec5SDimitry Andric __os.fill(__x.__fill_); 1520b57cec5SDimitry Andric return __os; 1530b57cec5SDimitry Andric } 1540b57cec5SDimitry Andric}; 1550b57cec5SDimitry Andric 1560b57cec5SDimitry Andrictemplate <class _CharT> 157cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t4<_CharT> setfill(_CharT __c) { 1580b57cec5SDimitry Andric return __iom_t4<_CharT>(__c); 1590b57cec5SDimitry Andric} 1600b57cec5SDimitry Andric 1610b57cec5SDimitry Andric// setprecision 1620b57cec5SDimitry Andric 163cb14a3feSDimitry Andricclass __iom_t5 { 1640b57cec5SDimitry Andric int __n_; 165cb14a3feSDimitry Andric 1660b57cec5SDimitry Andricpublic: 167cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI explicit __iom_t5(int __n) : __n_(__n) {} 1680b57cec5SDimitry Andric 1690b57cec5SDimitry Andric template <class _CharT, class _Traits> 170cb14a3feSDimitry Andric friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 171cb14a3feSDimitry Andric operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t5& __x) { 1720b57cec5SDimitry Andric __is.precision(__x.__n_); 1730b57cec5SDimitry Andric return __is; 1740b57cec5SDimitry Andric } 1750b57cec5SDimitry Andric 1760b57cec5SDimitry Andric template <class _CharT, class _Traits> 177cb14a3feSDimitry Andric friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 178cb14a3feSDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t5& __x) { 1790b57cec5SDimitry Andric __os.precision(__x.__n_); 1800b57cec5SDimitry Andric return __os; 1810b57cec5SDimitry Andric } 1820b57cec5SDimitry Andric}; 1830b57cec5SDimitry Andric 184cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t5 setprecision(int __n) { return __iom_t5(__n); } 1850b57cec5SDimitry Andric 1860b57cec5SDimitry Andric// setw 1870b57cec5SDimitry Andric 188cb14a3feSDimitry Andricclass __iom_t6 { 1890b57cec5SDimitry Andric int __n_; 190cb14a3feSDimitry Andric 1910b57cec5SDimitry Andricpublic: 192cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI explicit __iom_t6(int __n) : __n_(__n) {} 1930b57cec5SDimitry Andric 1940b57cec5SDimitry Andric template <class _CharT, class _Traits> 195cb14a3feSDimitry Andric friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 196cb14a3feSDimitry Andric operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t6& __x) { 1970b57cec5SDimitry Andric __is.width(__x.__n_); 1980b57cec5SDimitry Andric return __is; 1990b57cec5SDimitry Andric } 2000b57cec5SDimitry Andric 2010b57cec5SDimitry Andric template <class _CharT, class _Traits> 202cb14a3feSDimitry Andric friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 203cb14a3feSDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t6& __x) { 2040b57cec5SDimitry Andric __os.width(__x.__n_); 2050b57cec5SDimitry Andric return __os; 2060b57cec5SDimitry Andric } 2070b57cec5SDimitry Andric}; 2080b57cec5SDimitry Andric 209cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t6 setw(int __n) { return __iom_t6(__n); } 2100b57cec5SDimitry Andric 2110b57cec5SDimitry Andric// get_money 2120b57cec5SDimitry Andric 213cb14a3feSDimitry Andrictemplate <class _MoneyT> 214cb14a3feSDimitry Andricclass __iom_t7; 2150b57cec5SDimitry Andric 2160b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _MoneyT> 217bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 2180b57cec5SDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t7<_MoneyT>& __x); 2190b57cec5SDimitry Andric 2200b57cec5SDimitry Andrictemplate <class _MoneyT> 221cb14a3feSDimitry Andricclass __iom_t7 { 2220b57cec5SDimitry Andric _MoneyT& __mon_; 2230b57cec5SDimitry Andric bool __intl_; 224cb14a3feSDimitry Andric 2250b57cec5SDimitry Andricpublic: 226cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI __iom_t7(_MoneyT& __mon, bool __intl) : __mon_(__mon), __intl_(__intl) {} 2270b57cec5SDimitry Andric 2280b57cec5SDimitry Andric template <class _CharT, class _Traits, class _Mp> 229cb14a3feSDimitry Andric friend basic_istream<_CharT, _Traits>& operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t7<_Mp>& __x); 2300b57cec5SDimitry Andric}; 2310b57cec5SDimitry Andric 2320b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _MoneyT> 233bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 234cb14a3feSDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t7<_MoneyT>& __x) { 23506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 236cb14a3feSDimitry Andric try { 23706c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 2380b57cec5SDimitry Andric typename basic_istream<_CharT, _Traits>::sentry __s(__is); 239cb14a3feSDimitry Andric if (__s) { 2400b57cec5SDimitry Andric typedef istreambuf_iterator<_CharT, _Traits> _Ip; 2410b57cec5SDimitry Andric typedef money_get<_CharT, _Ip> _Fp; 2420b57cec5SDimitry Andric ios_base::iostate __err = ios_base::goodbit; 243bdd1243dSDimitry Andric const _Fp& __mf = std::use_facet<_Fp>(__is.getloc()); 2440b57cec5SDimitry Andric __mf.get(_Ip(__is), _Ip(), __x.__intl_, __is, __err, __x.__mon_); 2450b57cec5SDimitry Andric __is.setstate(__err); 2460b57cec5SDimitry Andric } 24706c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 248cb14a3feSDimitry Andric } catch (...) { 2490b57cec5SDimitry Andric __is.__set_badbit_and_consider_rethrow(); 2500b57cec5SDimitry Andric } 25106c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 2520b57cec5SDimitry Andric return __is; 2530b57cec5SDimitry Andric} 2540b57cec5SDimitry Andric 2550b57cec5SDimitry Andrictemplate <class _MoneyT> 256cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t7<_MoneyT> get_money(_MoneyT& __mon, bool __intl = false) { 2570b57cec5SDimitry Andric return __iom_t7<_MoneyT>(__mon, __intl); 2580b57cec5SDimitry Andric} 2590b57cec5SDimitry Andric 2600b57cec5SDimitry Andric// put_money 2610b57cec5SDimitry Andric 262cb14a3feSDimitry Andrictemplate <class _MoneyT> 263cb14a3feSDimitry Andricclass __iom_t8; 2640b57cec5SDimitry Andric 2650b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _MoneyT> 266bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 2670b57cec5SDimitry Andricoperator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_MoneyT>& __x); 2680b57cec5SDimitry Andric 2690b57cec5SDimitry Andrictemplate <class _MoneyT> 270cb14a3feSDimitry Andricclass __iom_t8 { 2710b57cec5SDimitry Andric const _MoneyT& __mon_; 2720b57cec5SDimitry Andric bool __intl_; 273cb14a3feSDimitry Andric 2740b57cec5SDimitry Andricpublic: 275cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI __iom_t8(const _MoneyT& __mon, bool __intl) : __mon_(__mon), __intl_(__intl) {} 2760b57cec5SDimitry Andric 2770b57cec5SDimitry Andric template <class _CharT, class _Traits, class _Mp> 278cb14a3feSDimitry Andric friend basic_ostream<_CharT, _Traits>& operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_Mp>& __x); 2790b57cec5SDimitry Andric}; 2800b57cec5SDimitry Andric 2810b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _MoneyT> 282bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 283cb14a3feSDimitry Andricoperator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_MoneyT>& __x) { 28406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 285cb14a3feSDimitry Andric try { 28606c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 2870b57cec5SDimitry Andric typename basic_ostream<_CharT, _Traits>::sentry __s(__os); 288cb14a3feSDimitry Andric if (__s) { 2890b57cec5SDimitry Andric typedef ostreambuf_iterator<_CharT, _Traits> _Op; 2900b57cec5SDimitry Andric typedef money_put<_CharT, _Op> _Fp; 291bdd1243dSDimitry Andric const _Fp& __mf = std::use_facet<_Fp>(__os.getloc()); 2920b57cec5SDimitry Andric if (__mf.put(_Op(__os), __x.__intl_, __os, __os.fill(), __x.__mon_).failed()) 2930b57cec5SDimitry Andric __os.setstate(ios_base::badbit); 2940b57cec5SDimitry Andric } 29506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 296cb14a3feSDimitry Andric } catch (...) { 2970b57cec5SDimitry Andric __os.__set_badbit_and_consider_rethrow(); 2980b57cec5SDimitry Andric } 29906c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 3000b57cec5SDimitry Andric return __os; 3010b57cec5SDimitry Andric} 3020b57cec5SDimitry Andric 3030b57cec5SDimitry Andrictemplate <class _MoneyT> 304cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t8<_MoneyT> put_money(const _MoneyT& __mon, bool __intl = false) { 3050b57cec5SDimitry Andric return __iom_t8<_MoneyT>(__mon, __intl); 3060b57cec5SDimitry Andric} 3070b57cec5SDimitry Andric 3080b57cec5SDimitry Andric// get_time 3090b57cec5SDimitry Andric 310cb14a3feSDimitry Andrictemplate <class _CharT> 311cb14a3feSDimitry Andricclass __iom_t9; 3120b57cec5SDimitry Andric 3130b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 314bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 3150b57cec5SDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t9<_CharT>& __x); 3160b57cec5SDimitry Andric 3170b57cec5SDimitry Andrictemplate <class _CharT> 318cb14a3feSDimitry Andricclass __iom_t9 { 3190b57cec5SDimitry Andric tm* __tm_; 3200b57cec5SDimitry Andric const _CharT* __fmt_; 321cb14a3feSDimitry Andric 3220b57cec5SDimitry Andricpublic: 323cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI __iom_t9(tm* __tm, const _CharT* __fmt) : __tm_(__tm), __fmt_(__fmt) {} 3240b57cec5SDimitry Andric 3250b57cec5SDimitry Andric template <class _Cp, class _Traits> 326cb14a3feSDimitry Andric friend basic_istream<_Cp, _Traits>& operator>>(basic_istream<_Cp, _Traits>& __is, const __iom_t9<_Cp>& __x); 3270b57cec5SDimitry Andric}; 3280b57cec5SDimitry Andric 3290b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 330bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 331cb14a3feSDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t9<_CharT>& __x) { 33206c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 333cb14a3feSDimitry Andric try { 33406c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 3350b57cec5SDimitry Andric typename basic_istream<_CharT, _Traits>::sentry __s(__is); 336cb14a3feSDimitry Andric if (__s) { 3370b57cec5SDimitry Andric typedef istreambuf_iterator<_CharT, _Traits> _Ip; 3380b57cec5SDimitry Andric typedef time_get<_CharT, _Ip> _Fp; 3390b57cec5SDimitry Andric ios_base::iostate __err = ios_base::goodbit; 340bdd1243dSDimitry Andric const _Fp& __tf = std::use_facet<_Fp>(__is.getloc()); 341cb14a3feSDimitry Andric __tf.get(_Ip(__is), _Ip(), __is, __err, __x.__tm_, __x.__fmt_, __x.__fmt_ + _Traits::length(__x.__fmt_)); 3420b57cec5SDimitry Andric __is.setstate(__err); 3430b57cec5SDimitry Andric } 34406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 345cb14a3feSDimitry Andric } catch (...) { 3460b57cec5SDimitry Andric __is.__set_badbit_and_consider_rethrow(); 3470b57cec5SDimitry Andric } 34806c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 3490b57cec5SDimitry Andric return __is; 3500b57cec5SDimitry Andric} 3510b57cec5SDimitry Andric 3520b57cec5SDimitry Andrictemplate <class _CharT> 353cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t9<_CharT> get_time(tm* __tm, const _CharT* __fmt) { 3540b57cec5SDimitry Andric return __iom_t9<_CharT>(__tm, __fmt); 3550b57cec5SDimitry Andric} 3560b57cec5SDimitry Andric 3570b57cec5SDimitry Andric// put_time 3580b57cec5SDimitry Andric 359cb14a3feSDimitry Andrictemplate <class _CharT> 360cb14a3feSDimitry Andricclass __iom_t10; 3610b57cec5SDimitry Andric 3620b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 363bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 3640b57cec5SDimitry Andricoperator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t10<_CharT>& __x); 3650b57cec5SDimitry Andric 3660b57cec5SDimitry Andrictemplate <class _CharT> 367cb14a3feSDimitry Andricclass __iom_t10 { 3680b57cec5SDimitry Andric const tm* __tm_; 3690b57cec5SDimitry Andric const _CharT* __fmt_; 370cb14a3feSDimitry Andric 3710b57cec5SDimitry Andricpublic: 372cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI __iom_t10(const tm* __tm, const _CharT* __fmt) : __tm_(__tm), __fmt_(__fmt) {} 3730b57cec5SDimitry Andric 3740b57cec5SDimitry Andric template <class _Cp, class _Traits> 375cb14a3feSDimitry Andric friend basic_ostream<_Cp, _Traits>& operator<<(basic_ostream<_Cp, _Traits>& __os, const __iom_t10<_Cp>& __x); 3760b57cec5SDimitry Andric}; 3770b57cec5SDimitry Andric 3780b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 379bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 380cb14a3feSDimitry Andricoperator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t10<_CharT>& __x) { 38106c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 382cb14a3feSDimitry Andric try { 38306c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 3840b57cec5SDimitry Andric typename basic_ostream<_CharT, _Traits>::sentry __s(__os); 385cb14a3feSDimitry Andric if (__s) { 3860b57cec5SDimitry Andric typedef ostreambuf_iterator<_CharT, _Traits> _Op; 3870b57cec5SDimitry Andric typedef time_put<_CharT, _Op> _Fp; 388bdd1243dSDimitry Andric const _Fp& __tf = std::use_facet<_Fp>(__os.getloc()); 389cb14a3feSDimitry Andric if (__tf.put(_Op(__os), __os, __os.fill(), __x.__tm_, __x.__fmt_, __x.__fmt_ + _Traits::length(__x.__fmt_)) 390cb14a3feSDimitry Andric .failed()) 3910b57cec5SDimitry Andric __os.setstate(ios_base::badbit); 3920b57cec5SDimitry Andric } 39306c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 394cb14a3feSDimitry Andric } catch (...) { 3950b57cec5SDimitry Andric __os.__set_badbit_and_consider_rethrow(); 3960b57cec5SDimitry Andric } 39706c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 3980b57cec5SDimitry Andric return __os; 3990b57cec5SDimitry Andric} 4000b57cec5SDimitry Andric 4010b57cec5SDimitry Andrictemplate <class _CharT> 402cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t10<_CharT> put_time(const tm* __tm, const _CharT* __fmt) { 4030b57cec5SDimitry Andric return __iom_t10<_CharT>(__tm, __fmt); 4040b57cec5SDimitry Andric} 4050b57cec5SDimitry Andric 40681ad6265SDimitry Andrictemplate <class _CharT, class _Traits> 407cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& __quoted_output( 408cb14a3feSDimitry Andric basic_ostream<_CharT, _Traits>& __os, 409cb14a3feSDimitry Andric const _CharT* __first, 410cb14a3feSDimitry Andric const _CharT* __last, 411cb14a3feSDimitry Andric _CharT __delim, 412cb14a3feSDimitry Andric _CharT __escape) { 413fe6060f1SDimitry Andric basic_string<_CharT, _Traits> __str; 4140b57cec5SDimitry Andric __str.push_back(__delim); 41581ad6265SDimitry Andric for (; __first != __last; ++__first) { 4160b57cec5SDimitry Andric if (_Traits::eq(*__first, __escape) || _Traits::eq(*__first, __delim)) 4170b57cec5SDimitry Andric __str.push_back(__escape); 4180b57cec5SDimitry Andric __str.push_back(*__first); 4190b57cec5SDimitry Andric } 4200b57cec5SDimitry Andric __str.push_back(__delim); 4215f757f3fSDimitry Andric return std::__put_character_sequence(__os, __str.data(), __str.size()); 4220b57cec5SDimitry Andric} 4230b57cec5SDimitry Andric 4240b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _String> 42581ad6265SDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 426cb14a3feSDimitry Andric__quoted_input(basic_istream<_CharT, _Traits>& __is, _String& __string, _CharT __delim, _CharT __escape) { 4270b57cec5SDimitry Andric __string.clear(); 4280b57cec5SDimitry Andric _CharT __c; 4290b57cec5SDimitry Andric __is >> __c; 4300b57cec5SDimitry Andric if (__is.fail()) 4310b57cec5SDimitry Andric return __is; 4320b57cec5SDimitry Andric 43381ad6265SDimitry Andric if (!_Traits::eq(__c, __delim)) { 43481ad6265SDimitry Andric // no delimiter, read the whole string 4350b57cec5SDimitry Andric __is.unget(); 4360b57cec5SDimitry Andric __is >> __string; 4370b57cec5SDimitry Andric return __is; 4380b57cec5SDimitry Andric } 4390b57cec5SDimitry Andric 44081ad6265SDimitry Andric __save_flags<_CharT, _Traits> __sf(__is); 44181ad6265SDimitry Andric std::noskipws(__is); 44281ad6265SDimitry Andric while (true) { 4430b57cec5SDimitry Andric __is >> __c; 4440b57cec5SDimitry Andric if (__is.fail()) 4450b57cec5SDimitry Andric break; 44681ad6265SDimitry Andric if (_Traits::eq(__c, __escape)) { 4470b57cec5SDimitry Andric __is >> __c; 4480b57cec5SDimitry Andric if (__is.fail()) 4490b57cec5SDimitry Andric break; 45081ad6265SDimitry Andric } else if (_Traits::eq(__c, __delim)) 4510b57cec5SDimitry Andric break; 4520b57cec5SDimitry Andric __string.push_back(__c); 4530b57cec5SDimitry Andric } 4540b57cec5SDimitry Andric return __is; 4550b57cec5SDimitry Andric} 4560b57cec5SDimitry Andric 45781ad6265SDimitry Andrictemplate <class _CharT, class _Traits> 458cb14a3feSDimitry Andricstruct _LIBCPP_HIDDEN __quoted_output_proxy { 45981ad6265SDimitry Andric const _CharT* __first_; 46081ad6265SDimitry Andric const _CharT* __last_; 46181ad6265SDimitry Andric _CharT __delim_; 46281ad6265SDimitry Andric _CharT __escape_; 46381ad6265SDimitry Andric 464cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI explicit __quoted_output_proxy(const _CharT* __f, const _CharT* __l, _CharT __d, _CharT __e) 46581ad6265SDimitry Andric : __first_(__f), __last_(__l), __delim_(__d), __escape_(__e) {} 46681ad6265SDimitry Andric 46781ad6265SDimitry Andric template <class _T2, __enable_if_t<_IsSame<_Traits, void>::value || _IsSame<_Traits, _T2>::value>* = nullptr> 46881ad6265SDimitry Andric friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _T2>& 46981ad6265SDimitry Andric operator<<(basic_ostream<_CharT, _T2>& __os, const __quoted_output_proxy& __p) { 47081ad6265SDimitry Andric return std::__quoted_output(__os, __p.__first_, __p.__last_, __p.__delim_, __p.__escape_); 4710b57cec5SDimitry Andric } 4720b57cec5SDimitry Andric}; 4730b57cec5SDimitry Andric 4740b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 475cb14a3feSDimitry Andricstruct _LIBCPP_HIDDEN __quoted_proxy { 47681ad6265SDimitry Andric basic_string<_CharT, _Traits, _Allocator>& __string_; 47781ad6265SDimitry Andric _CharT __delim_; 47881ad6265SDimitry Andric _CharT __escape_; 47981ad6265SDimitry Andric 480cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI explicit __quoted_proxy(basic_string<_CharT, _Traits, _Allocator>& __s, _CharT __d, _CharT __e) 48181ad6265SDimitry Andric : __string_(__s), __delim_(__d), __escape_(__e) {} 48281ad6265SDimitry Andric 48381ad6265SDimitry Andric friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 48481ad6265SDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const __quoted_proxy& __p) { 485cb14a3feSDimitry Andric return std::__quoted_output( 486cb14a3feSDimitry Andric __os, __p.__string_.data(), __p.__string_.data() + __p.__string_.size(), __p.__delim_, __p.__escape_); 4870b57cec5SDimitry Andric } 4880b57cec5SDimitry Andric 48981ad6265SDimitry Andric friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 49081ad6265SDimitry Andric operator>>(basic_istream<_CharT, _Traits>& __is, const __quoted_proxy& __p) { 49181ad6265SDimitry Andric return std::__quoted_input(__is, __p.__string_, __p.__delim_, __p.__escape_); 4920b57cec5SDimitry Andric } 49381ad6265SDimitry Andric}; 4940b57cec5SDimitry Andric 4950b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 496cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI __quoted_output_proxy<_CharT, _Traits> 497cb14a3feSDimitry Andric__quoted(const basic_string<_CharT, _Traits, _Allocator>& __s, 498cb14a3feSDimitry Andric _CharT __delim = _CharT('"'), 499cb14a3feSDimitry Andric _CharT __escape = _CharT('\\')) { 50081ad6265SDimitry Andric return __quoted_output_proxy<_CharT, _Traits>(__s.data(), __s.data() + __s.size(), __delim, __escape); 5010b57cec5SDimitry Andric} 5020b57cec5SDimitry Andric 5030b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 504cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI __quoted_proxy<_CharT, _Traits, _Allocator> 505cb14a3feSDimitry Andric__quoted(basic_string<_CharT, _Traits, _Allocator>& __s, _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) { 5060b57cec5SDimitry Andric return __quoted_proxy<_CharT, _Traits, _Allocator>(__s, __delim, __escape); 5070b57cec5SDimitry Andric} 5080b57cec5SDimitry Andric 50906c3fb27SDimitry Andric#if _LIBCPP_STD_VER >= 14 5100b57cec5SDimitry Andric 51181ad6265SDimitry Andrictemplate <class _CharT> 512cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI auto quoted(const _CharT* __s, _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) { 51381ad6265SDimitry Andric const _CharT* __end = __s; 514cb14a3feSDimitry Andric while (*__end) 515cb14a3feSDimitry Andric ++__end; 51681ad6265SDimitry Andric return __quoted_output_proxy<_CharT, void>(__s, __end, __delim, __escape); 5170b57cec5SDimitry Andric} 5180b57cec5SDimitry Andric 5190b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 520cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI auto 521cb14a3feSDimitry Andricquoted(const basic_string<_CharT, _Traits, _Allocator>& __s, 522cb14a3feSDimitry Andric _CharT __delim = _CharT('"'), 523cb14a3feSDimitry Andric _CharT __escape = _CharT('\\')) { 52481ad6265SDimitry Andric return __quoted_output_proxy<_CharT, _Traits>(__s.data(), __s.data() + __s.size(), __delim, __escape); 52581ad6265SDimitry Andric} 52681ad6265SDimitry Andric 52781ad6265SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 528cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI auto 529cb14a3feSDimitry Andricquoted(basic_string<_CharT, _Traits, _Allocator>& __s, _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) { 53081ad6265SDimitry Andric return __quoted_proxy<_CharT, _Traits, _Allocator>(__s, __delim, __escape); 5310b57cec5SDimitry Andric} 5320b57cec5SDimitry Andric 5330b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 534cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI auto 535cb14a3feSDimitry Andricquoted(basic_string_view<_CharT, _Traits> __sv, _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) { 53681ad6265SDimitry Andric return __quoted_output_proxy<_CharT, _Traits>(__sv.data(), __sv.data() + __sv.size(), __delim, __escape); 5370b57cec5SDimitry Andric} 53881ad6265SDimitry Andric 53906c3fb27SDimitry Andric#endif // _LIBCPP_STD_VER >= 14 5400b57cec5SDimitry Andric 5410b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_STD 5420b57cec5SDimitry Andric 5430b57cec5SDimitry Andric#endif // _LIBCPP_IOMANIP 544