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 450b57cec5SDimitry Andric#include <__config> 460b57cec5SDimitry Andric#include <istream> 470b57cec5SDimitry Andric#include <version> 480b57cec5SDimitry Andric 490b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 500b57cec5SDimitry Andric# pragma GCC system_header 510b57cec5SDimitry Andric#endif 520b57cec5SDimitry Andric 530b57cec5SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD 540b57cec5SDimitry Andric 550b57cec5SDimitry Andric// resetiosflags 560b57cec5SDimitry Andric 57cb14a3feSDimitry Andricclass __iom_t1 { 580b57cec5SDimitry Andric ios_base::fmtflags __mask_; 59cb14a3feSDimitry Andric 600b57cec5SDimitry Andricpublic: 61cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI explicit __iom_t1(ios_base::fmtflags __m) : __mask_(__m) {} 620b57cec5SDimitry Andric 630b57cec5SDimitry Andric template <class _CharT, class _Traits> 64cb14a3feSDimitry Andric friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 65cb14a3feSDimitry Andric operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t1& __x) { 660b57cec5SDimitry Andric __is.unsetf(__x.__mask_); 670b57cec5SDimitry Andric return __is; 680b57cec5SDimitry Andric } 690b57cec5SDimitry Andric 700b57cec5SDimitry Andric template <class _CharT, class _Traits> 71cb14a3feSDimitry Andric friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 72cb14a3feSDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t1& __x) { 730b57cec5SDimitry Andric __os.unsetf(__x.__mask_); 740b57cec5SDimitry Andric return __os; 750b57cec5SDimitry Andric } 760b57cec5SDimitry Andric}; 770b57cec5SDimitry Andric 78cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t1 resetiosflags(ios_base::fmtflags __mask) { return __iom_t1(__mask); } 790b57cec5SDimitry Andric 800b57cec5SDimitry Andric// setiosflags 810b57cec5SDimitry Andric 82cb14a3feSDimitry Andricclass __iom_t2 { 830b57cec5SDimitry Andric ios_base::fmtflags __mask_; 84cb14a3feSDimitry Andric 850b57cec5SDimitry Andricpublic: 86cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI explicit __iom_t2(ios_base::fmtflags __m) : __mask_(__m) {} 870b57cec5SDimitry Andric 880b57cec5SDimitry Andric template <class _CharT, class _Traits> 89cb14a3feSDimitry Andric friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 90cb14a3feSDimitry Andric operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t2& __x) { 910b57cec5SDimitry Andric __is.setf(__x.__mask_); 920b57cec5SDimitry Andric return __is; 930b57cec5SDimitry Andric } 940b57cec5SDimitry Andric 950b57cec5SDimitry Andric template <class _CharT, class _Traits> 96cb14a3feSDimitry Andric friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 97cb14a3feSDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t2& __x) { 980b57cec5SDimitry Andric __os.setf(__x.__mask_); 990b57cec5SDimitry Andric return __os; 1000b57cec5SDimitry Andric } 1010b57cec5SDimitry Andric}; 1020b57cec5SDimitry Andric 103cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t2 setiosflags(ios_base::fmtflags __mask) { return __iom_t2(__mask); } 1040b57cec5SDimitry Andric 1050b57cec5SDimitry Andric// setbase 1060b57cec5SDimitry Andric 107cb14a3feSDimitry Andricclass __iom_t3 { 1080b57cec5SDimitry Andric int __base_; 109cb14a3feSDimitry Andric 1100b57cec5SDimitry Andricpublic: 111cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI explicit __iom_t3(int __b) : __base_(__b) {} 1120b57cec5SDimitry Andric 1130b57cec5SDimitry Andric template <class _CharT, class _Traits> 114cb14a3feSDimitry Andric friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 115cb14a3feSDimitry Andric operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t3& __x) { 116cb14a3feSDimitry Andric __is.setf(__x.__base_ == 8 ? ios_base::oct 117cb14a3feSDimitry Andric : __x.__base_ == 10 ? ios_base::dec 118cb14a3feSDimitry Andric : __x.__base_ == 16 ? ios_base::hex 119cb14a3feSDimitry Andric : ios_base::fmtflags(0), 120cb14a3feSDimitry Andric ios_base::basefield); 1210b57cec5SDimitry Andric return __is; 1220b57cec5SDimitry Andric } 1230b57cec5SDimitry Andric 1240b57cec5SDimitry Andric template <class _CharT, class _Traits> 125cb14a3feSDimitry Andric friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 126cb14a3feSDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t3& __x) { 127cb14a3feSDimitry Andric __os.setf(__x.__base_ == 8 ? ios_base::oct 128cb14a3feSDimitry Andric : __x.__base_ == 10 ? ios_base::dec 129cb14a3feSDimitry Andric : __x.__base_ == 16 ? ios_base::hex 130cb14a3feSDimitry Andric : ios_base::fmtflags(0), 131cb14a3feSDimitry Andric ios_base::basefield); 1320b57cec5SDimitry Andric return __os; 1330b57cec5SDimitry Andric } 1340b57cec5SDimitry Andric}; 1350b57cec5SDimitry Andric 136cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t3 setbase(int __base) { return __iom_t3(__base); } 1370b57cec5SDimitry Andric 1380b57cec5SDimitry Andric// setfill 1390b57cec5SDimitry Andric 1400b57cec5SDimitry Andrictemplate <class _CharT> 141cb14a3feSDimitry Andricclass __iom_t4 { 1420b57cec5SDimitry Andric _CharT __fill_; 143cb14a3feSDimitry Andric 1440b57cec5SDimitry Andricpublic: 145cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI explicit __iom_t4(_CharT __c) : __fill_(__c) {} 1460b57cec5SDimitry Andric 1470b57cec5SDimitry Andric template <class _Traits> 148cb14a3feSDimitry Andric friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 149cb14a3feSDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t4& __x) { 1500b57cec5SDimitry Andric __os.fill(__x.__fill_); 1510b57cec5SDimitry Andric return __os; 1520b57cec5SDimitry Andric } 1530b57cec5SDimitry Andric}; 1540b57cec5SDimitry Andric 1550b57cec5SDimitry Andrictemplate <class _CharT> 156cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t4<_CharT> setfill(_CharT __c) { 1570b57cec5SDimitry Andric return __iom_t4<_CharT>(__c); 1580b57cec5SDimitry Andric} 1590b57cec5SDimitry Andric 1600b57cec5SDimitry Andric// setprecision 1610b57cec5SDimitry Andric 162cb14a3feSDimitry Andricclass __iom_t5 { 1630b57cec5SDimitry Andric int __n_; 164cb14a3feSDimitry Andric 1650b57cec5SDimitry Andricpublic: 166cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI explicit __iom_t5(int __n) : __n_(__n) {} 1670b57cec5SDimitry Andric 1680b57cec5SDimitry Andric template <class _CharT, class _Traits> 169cb14a3feSDimitry Andric friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 170cb14a3feSDimitry Andric operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t5& __x) { 1710b57cec5SDimitry Andric __is.precision(__x.__n_); 1720b57cec5SDimitry Andric return __is; 1730b57cec5SDimitry Andric } 1740b57cec5SDimitry Andric 1750b57cec5SDimitry Andric template <class _CharT, class _Traits> 176cb14a3feSDimitry Andric friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 177cb14a3feSDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t5& __x) { 1780b57cec5SDimitry Andric __os.precision(__x.__n_); 1790b57cec5SDimitry Andric return __os; 1800b57cec5SDimitry Andric } 1810b57cec5SDimitry Andric}; 1820b57cec5SDimitry Andric 183cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t5 setprecision(int __n) { return __iom_t5(__n); } 1840b57cec5SDimitry Andric 1850b57cec5SDimitry Andric// setw 1860b57cec5SDimitry Andric 187cb14a3feSDimitry Andricclass __iom_t6 { 1880b57cec5SDimitry Andric int __n_; 189cb14a3feSDimitry Andric 1900b57cec5SDimitry Andricpublic: 191cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI explicit __iom_t6(int __n) : __n_(__n) {} 1920b57cec5SDimitry Andric 1930b57cec5SDimitry Andric template <class _CharT, class _Traits> 194cb14a3feSDimitry Andric friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 195cb14a3feSDimitry Andric operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t6& __x) { 1960b57cec5SDimitry Andric __is.width(__x.__n_); 1970b57cec5SDimitry Andric return __is; 1980b57cec5SDimitry Andric } 1990b57cec5SDimitry Andric 2000b57cec5SDimitry Andric template <class _CharT, class _Traits> 201cb14a3feSDimitry Andric friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 202cb14a3feSDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t6& __x) { 2030b57cec5SDimitry Andric __os.width(__x.__n_); 2040b57cec5SDimitry Andric return __os; 2050b57cec5SDimitry Andric } 2060b57cec5SDimitry Andric}; 2070b57cec5SDimitry Andric 208cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t6 setw(int __n) { return __iom_t6(__n); } 2090b57cec5SDimitry Andric 2100b57cec5SDimitry Andric// get_money 2110b57cec5SDimitry Andric 212cb14a3feSDimitry Andrictemplate <class _MoneyT> 213cb14a3feSDimitry Andricclass __iom_t7; 2140b57cec5SDimitry Andric 2150b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _MoneyT> 216bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 2170b57cec5SDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t7<_MoneyT>& __x); 2180b57cec5SDimitry Andric 2190b57cec5SDimitry Andrictemplate <class _MoneyT> 220cb14a3feSDimitry Andricclass __iom_t7 { 2210b57cec5SDimitry Andric _MoneyT& __mon_; 2220b57cec5SDimitry Andric bool __intl_; 223cb14a3feSDimitry Andric 2240b57cec5SDimitry Andricpublic: 225cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI __iom_t7(_MoneyT& __mon, bool __intl) : __mon_(__mon), __intl_(__intl) {} 2260b57cec5SDimitry Andric 2270b57cec5SDimitry Andric template <class _CharT, class _Traits, class _Mp> 228cb14a3feSDimitry Andric friend basic_istream<_CharT, _Traits>& operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t7<_Mp>& __x); 2290b57cec5SDimitry Andric}; 2300b57cec5SDimitry Andric 2310b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _MoneyT> 232bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 233cb14a3feSDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t7<_MoneyT>& __x) { 23406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 235cb14a3feSDimitry Andric try { 23606c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 2370b57cec5SDimitry Andric typename basic_istream<_CharT, _Traits>::sentry __s(__is); 238cb14a3feSDimitry Andric if (__s) { 2390b57cec5SDimitry Andric typedef istreambuf_iterator<_CharT, _Traits> _Ip; 2400b57cec5SDimitry Andric typedef money_get<_CharT, _Ip> _Fp; 2410b57cec5SDimitry Andric ios_base::iostate __err = ios_base::goodbit; 242bdd1243dSDimitry Andric const _Fp& __mf = std::use_facet<_Fp>(__is.getloc()); 2430b57cec5SDimitry Andric __mf.get(_Ip(__is), _Ip(), __x.__intl_, __is, __err, __x.__mon_); 2440b57cec5SDimitry Andric __is.setstate(__err); 2450b57cec5SDimitry Andric } 24606c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 247cb14a3feSDimitry Andric } catch (...) { 2480b57cec5SDimitry Andric __is.__set_badbit_and_consider_rethrow(); 2490b57cec5SDimitry Andric } 25006c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 2510b57cec5SDimitry Andric return __is; 2520b57cec5SDimitry Andric} 2530b57cec5SDimitry Andric 2540b57cec5SDimitry Andrictemplate <class _MoneyT> 255cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t7<_MoneyT> get_money(_MoneyT& __mon, bool __intl = false) { 2560b57cec5SDimitry Andric return __iom_t7<_MoneyT>(__mon, __intl); 2570b57cec5SDimitry Andric} 2580b57cec5SDimitry Andric 2590b57cec5SDimitry Andric// put_money 2600b57cec5SDimitry Andric 261cb14a3feSDimitry Andrictemplate <class _MoneyT> 262cb14a3feSDimitry Andricclass __iom_t8; 2630b57cec5SDimitry Andric 2640b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _MoneyT> 265bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 2660b57cec5SDimitry Andricoperator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_MoneyT>& __x); 2670b57cec5SDimitry Andric 2680b57cec5SDimitry Andrictemplate <class _MoneyT> 269cb14a3feSDimitry Andricclass __iom_t8 { 2700b57cec5SDimitry Andric const _MoneyT& __mon_; 2710b57cec5SDimitry Andric bool __intl_; 272cb14a3feSDimitry Andric 2730b57cec5SDimitry Andricpublic: 274cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI __iom_t8(const _MoneyT& __mon, bool __intl) : __mon_(__mon), __intl_(__intl) {} 2750b57cec5SDimitry Andric 2760b57cec5SDimitry Andric template <class _CharT, class _Traits, class _Mp> 277cb14a3feSDimitry Andric friend basic_ostream<_CharT, _Traits>& operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_Mp>& __x); 2780b57cec5SDimitry Andric}; 2790b57cec5SDimitry Andric 2800b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _MoneyT> 281bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 282cb14a3feSDimitry Andricoperator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_MoneyT>& __x) { 28306c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 284cb14a3feSDimitry Andric try { 28506c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 2860b57cec5SDimitry Andric typename basic_ostream<_CharT, _Traits>::sentry __s(__os); 287cb14a3feSDimitry Andric if (__s) { 2880b57cec5SDimitry Andric typedef ostreambuf_iterator<_CharT, _Traits> _Op; 2890b57cec5SDimitry Andric typedef money_put<_CharT, _Op> _Fp; 290bdd1243dSDimitry Andric const _Fp& __mf = std::use_facet<_Fp>(__os.getloc()); 2910b57cec5SDimitry Andric if (__mf.put(_Op(__os), __x.__intl_, __os, __os.fill(), __x.__mon_).failed()) 2920b57cec5SDimitry Andric __os.setstate(ios_base::badbit); 2930b57cec5SDimitry Andric } 29406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 295cb14a3feSDimitry Andric } catch (...) { 2960b57cec5SDimitry Andric __os.__set_badbit_and_consider_rethrow(); 2970b57cec5SDimitry Andric } 29806c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 2990b57cec5SDimitry Andric return __os; 3000b57cec5SDimitry Andric} 3010b57cec5SDimitry Andric 3020b57cec5SDimitry Andrictemplate <class _MoneyT> 303cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t8<_MoneyT> put_money(const _MoneyT& __mon, bool __intl = false) { 3040b57cec5SDimitry Andric return __iom_t8<_MoneyT>(__mon, __intl); 3050b57cec5SDimitry Andric} 3060b57cec5SDimitry Andric 3070b57cec5SDimitry Andric// get_time 3080b57cec5SDimitry Andric 309cb14a3feSDimitry Andrictemplate <class _CharT> 310cb14a3feSDimitry Andricclass __iom_t9; 3110b57cec5SDimitry Andric 3120b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 313bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 3140b57cec5SDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t9<_CharT>& __x); 3150b57cec5SDimitry Andric 3160b57cec5SDimitry Andrictemplate <class _CharT> 317cb14a3feSDimitry Andricclass __iom_t9 { 3180b57cec5SDimitry Andric tm* __tm_; 3190b57cec5SDimitry Andric const _CharT* __fmt_; 320cb14a3feSDimitry Andric 3210b57cec5SDimitry Andricpublic: 322cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI __iom_t9(tm* __tm, const _CharT* __fmt) : __tm_(__tm), __fmt_(__fmt) {} 3230b57cec5SDimitry Andric 3240b57cec5SDimitry Andric template <class _Cp, class _Traits> 325cb14a3feSDimitry Andric friend basic_istream<_Cp, _Traits>& operator>>(basic_istream<_Cp, _Traits>& __is, const __iom_t9<_Cp>& __x); 3260b57cec5SDimitry Andric}; 3270b57cec5SDimitry Andric 3280b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 329bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 330cb14a3feSDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t9<_CharT>& __x) { 33106c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 332cb14a3feSDimitry Andric try { 33306c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 3340b57cec5SDimitry Andric typename basic_istream<_CharT, _Traits>::sentry __s(__is); 335cb14a3feSDimitry Andric if (__s) { 3360b57cec5SDimitry Andric typedef istreambuf_iterator<_CharT, _Traits> _Ip; 3370b57cec5SDimitry Andric typedef time_get<_CharT, _Ip> _Fp; 3380b57cec5SDimitry Andric ios_base::iostate __err = ios_base::goodbit; 339bdd1243dSDimitry Andric const _Fp& __tf = std::use_facet<_Fp>(__is.getloc()); 340cb14a3feSDimitry Andric __tf.get(_Ip(__is), _Ip(), __is, __err, __x.__tm_, __x.__fmt_, __x.__fmt_ + _Traits::length(__x.__fmt_)); 3410b57cec5SDimitry Andric __is.setstate(__err); 3420b57cec5SDimitry Andric } 34306c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 344cb14a3feSDimitry Andric } catch (...) { 3450b57cec5SDimitry Andric __is.__set_badbit_and_consider_rethrow(); 3460b57cec5SDimitry Andric } 34706c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 3480b57cec5SDimitry Andric return __is; 3490b57cec5SDimitry Andric} 3500b57cec5SDimitry Andric 3510b57cec5SDimitry Andrictemplate <class _CharT> 352cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t9<_CharT> get_time(tm* __tm, const _CharT* __fmt) { 3530b57cec5SDimitry Andric return __iom_t9<_CharT>(__tm, __fmt); 3540b57cec5SDimitry Andric} 3550b57cec5SDimitry Andric 3560b57cec5SDimitry Andric// put_time 3570b57cec5SDimitry Andric 358cb14a3feSDimitry Andrictemplate <class _CharT> 359cb14a3feSDimitry Andricclass __iom_t10; 3600b57cec5SDimitry Andric 3610b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 362bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 3630b57cec5SDimitry Andricoperator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t10<_CharT>& __x); 3640b57cec5SDimitry Andric 3650b57cec5SDimitry Andrictemplate <class _CharT> 366cb14a3feSDimitry Andricclass __iom_t10 { 3670b57cec5SDimitry Andric const tm* __tm_; 3680b57cec5SDimitry Andric const _CharT* __fmt_; 369cb14a3feSDimitry Andric 3700b57cec5SDimitry Andricpublic: 371cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI __iom_t10(const tm* __tm, const _CharT* __fmt) : __tm_(__tm), __fmt_(__fmt) {} 3720b57cec5SDimitry Andric 3730b57cec5SDimitry Andric template <class _Cp, class _Traits> 374cb14a3feSDimitry Andric friend basic_ostream<_Cp, _Traits>& operator<<(basic_ostream<_Cp, _Traits>& __os, const __iom_t10<_Cp>& __x); 3750b57cec5SDimitry Andric}; 3760b57cec5SDimitry Andric 3770b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 378bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 379cb14a3feSDimitry Andricoperator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t10<_CharT>& __x) { 38006c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 381cb14a3feSDimitry Andric try { 38206c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 3830b57cec5SDimitry Andric typename basic_ostream<_CharT, _Traits>::sentry __s(__os); 384cb14a3feSDimitry Andric if (__s) { 3850b57cec5SDimitry Andric typedef ostreambuf_iterator<_CharT, _Traits> _Op; 3860b57cec5SDimitry Andric typedef time_put<_CharT, _Op> _Fp; 387bdd1243dSDimitry Andric const _Fp& __tf = std::use_facet<_Fp>(__os.getloc()); 388cb14a3feSDimitry Andric if (__tf.put(_Op(__os), __os, __os.fill(), __x.__tm_, __x.__fmt_, __x.__fmt_ + _Traits::length(__x.__fmt_)) 389cb14a3feSDimitry Andric .failed()) 3900b57cec5SDimitry Andric __os.setstate(ios_base::badbit); 3910b57cec5SDimitry Andric } 39206c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 393cb14a3feSDimitry Andric } catch (...) { 3940b57cec5SDimitry Andric __os.__set_badbit_and_consider_rethrow(); 3950b57cec5SDimitry Andric } 39606c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 3970b57cec5SDimitry Andric return __os; 3980b57cec5SDimitry Andric} 3990b57cec5SDimitry Andric 4000b57cec5SDimitry Andrictemplate <class _CharT> 401cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __iom_t10<_CharT> put_time(const tm* __tm, const _CharT* __fmt) { 4020b57cec5SDimitry Andric return __iom_t10<_CharT>(__tm, __fmt); 4030b57cec5SDimitry Andric} 4040b57cec5SDimitry Andric 40581ad6265SDimitry Andrictemplate <class _CharT, class _Traits> 406cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& __quoted_output( 407cb14a3feSDimitry Andric basic_ostream<_CharT, _Traits>& __os, 408cb14a3feSDimitry Andric const _CharT* __first, 409cb14a3feSDimitry Andric const _CharT* __last, 410cb14a3feSDimitry Andric _CharT __delim, 411cb14a3feSDimitry Andric _CharT __escape) { 412fe6060f1SDimitry Andric basic_string<_CharT, _Traits> __str; 4130b57cec5SDimitry Andric __str.push_back(__delim); 41481ad6265SDimitry Andric for (; __first != __last; ++__first) { 4150b57cec5SDimitry Andric if (_Traits::eq(*__first, __escape) || _Traits::eq(*__first, __delim)) 4160b57cec5SDimitry Andric __str.push_back(__escape); 4170b57cec5SDimitry Andric __str.push_back(*__first); 4180b57cec5SDimitry Andric } 4190b57cec5SDimitry Andric __str.push_back(__delim); 4205f757f3fSDimitry Andric return std::__put_character_sequence(__os, __str.data(), __str.size()); 4210b57cec5SDimitry Andric} 4220b57cec5SDimitry Andric 4230b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _String> 42481ad6265SDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 425cb14a3feSDimitry Andric__quoted_input(basic_istream<_CharT, _Traits>& __is, _String& __string, _CharT __delim, _CharT __escape) { 4260b57cec5SDimitry Andric __string.clear(); 4270b57cec5SDimitry Andric _CharT __c; 4280b57cec5SDimitry Andric __is >> __c; 4290b57cec5SDimitry Andric if (__is.fail()) 4300b57cec5SDimitry Andric return __is; 4310b57cec5SDimitry Andric 43281ad6265SDimitry Andric if (!_Traits::eq(__c, __delim)) { 43381ad6265SDimitry Andric // no delimiter, read the whole string 4340b57cec5SDimitry Andric __is.unget(); 4350b57cec5SDimitry Andric __is >> __string; 4360b57cec5SDimitry Andric return __is; 4370b57cec5SDimitry Andric } 4380b57cec5SDimitry Andric 43981ad6265SDimitry Andric __save_flags<_CharT, _Traits> __sf(__is); 44081ad6265SDimitry Andric std::noskipws(__is); 44181ad6265SDimitry Andric while (true) { 4420b57cec5SDimitry Andric __is >> __c; 4430b57cec5SDimitry Andric if (__is.fail()) 4440b57cec5SDimitry Andric break; 44581ad6265SDimitry Andric if (_Traits::eq(__c, __escape)) { 4460b57cec5SDimitry Andric __is >> __c; 4470b57cec5SDimitry Andric if (__is.fail()) 4480b57cec5SDimitry Andric break; 44981ad6265SDimitry Andric } else if (_Traits::eq(__c, __delim)) 4500b57cec5SDimitry Andric break; 4510b57cec5SDimitry Andric __string.push_back(__c); 4520b57cec5SDimitry Andric } 4530b57cec5SDimitry Andric return __is; 4540b57cec5SDimitry Andric} 4550b57cec5SDimitry Andric 45681ad6265SDimitry Andrictemplate <class _CharT, class _Traits> 457cb14a3feSDimitry Andricstruct _LIBCPP_HIDDEN __quoted_output_proxy { 45881ad6265SDimitry Andric const _CharT* __first_; 45981ad6265SDimitry Andric const _CharT* __last_; 46081ad6265SDimitry Andric _CharT __delim_; 46181ad6265SDimitry Andric _CharT __escape_; 46281ad6265SDimitry Andric 463cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI explicit __quoted_output_proxy(const _CharT* __f, const _CharT* __l, _CharT __d, _CharT __e) 46481ad6265SDimitry Andric : __first_(__f), __last_(__l), __delim_(__d), __escape_(__e) {} 46581ad6265SDimitry Andric 466*0fca6ea1SDimitry Andric template <class _T2, __enable_if_t<_IsSame<_Traits, void>::value || _IsSame<_Traits, _T2>::value, int> = 0> 46781ad6265SDimitry Andric friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _T2>& 46881ad6265SDimitry Andric operator<<(basic_ostream<_CharT, _T2>& __os, const __quoted_output_proxy& __p) { 46981ad6265SDimitry Andric return std::__quoted_output(__os, __p.__first_, __p.__last_, __p.__delim_, __p.__escape_); 4700b57cec5SDimitry Andric } 4710b57cec5SDimitry Andric}; 4720b57cec5SDimitry Andric 4730b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 474cb14a3feSDimitry Andricstruct _LIBCPP_HIDDEN __quoted_proxy { 47581ad6265SDimitry Andric basic_string<_CharT, _Traits, _Allocator>& __string_; 47681ad6265SDimitry Andric _CharT __delim_; 47781ad6265SDimitry Andric _CharT __escape_; 47881ad6265SDimitry Andric 479cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI explicit __quoted_proxy(basic_string<_CharT, _Traits, _Allocator>& __s, _CharT __d, _CharT __e) 48081ad6265SDimitry Andric : __string_(__s), __delim_(__d), __escape_(__e) {} 48181ad6265SDimitry Andric 48281ad6265SDimitry Andric friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& 48381ad6265SDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os, const __quoted_proxy& __p) { 484cb14a3feSDimitry Andric return std::__quoted_output( 485cb14a3feSDimitry Andric __os, __p.__string_.data(), __p.__string_.data() + __p.__string_.size(), __p.__delim_, __p.__escape_); 4860b57cec5SDimitry Andric } 4870b57cec5SDimitry Andric 48881ad6265SDimitry Andric friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 48981ad6265SDimitry Andric operator>>(basic_istream<_CharT, _Traits>& __is, const __quoted_proxy& __p) { 49081ad6265SDimitry Andric return std::__quoted_input(__is, __p.__string_, __p.__delim_, __p.__escape_); 4910b57cec5SDimitry Andric } 49281ad6265SDimitry Andric}; 4930b57cec5SDimitry Andric 4940b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 495cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI __quoted_output_proxy<_CharT, _Traits> 496cb14a3feSDimitry Andric__quoted(const basic_string<_CharT, _Traits, _Allocator>& __s, 497cb14a3feSDimitry Andric _CharT __delim = _CharT('"'), 498cb14a3feSDimitry Andric _CharT __escape = _CharT('\\')) { 49981ad6265SDimitry Andric return __quoted_output_proxy<_CharT, _Traits>(__s.data(), __s.data() + __s.size(), __delim, __escape); 5000b57cec5SDimitry Andric} 5010b57cec5SDimitry Andric 5020b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 503cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI __quoted_proxy<_CharT, _Traits, _Allocator> 504cb14a3feSDimitry Andric__quoted(basic_string<_CharT, _Traits, _Allocator>& __s, _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) { 5050b57cec5SDimitry Andric return __quoted_proxy<_CharT, _Traits, _Allocator>(__s, __delim, __escape); 5060b57cec5SDimitry Andric} 5070b57cec5SDimitry Andric 50806c3fb27SDimitry Andric#if _LIBCPP_STD_VER >= 14 5090b57cec5SDimitry Andric 51081ad6265SDimitry Andrictemplate <class _CharT> 511cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI auto quoted(const _CharT* __s, _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) { 51281ad6265SDimitry Andric const _CharT* __end = __s; 513cb14a3feSDimitry Andric while (*__end) 514cb14a3feSDimitry Andric ++__end; 51581ad6265SDimitry Andric return __quoted_output_proxy<_CharT, void>(__s, __end, __delim, __escape); 5160b57cec5SDimitry Andric} 5170b57cec5SDimitry Andric 5180b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 519cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI auto 520cb14a3feSDimitry Andricquoted(const basic_string<_CharT, _Traits, _Allocator>& __s, 521cb14a3feSDimitry Andric _CharT __delim = _CharT('"'), 522cb14a3feSDimitry Andric _CharT __escape = _CharT('\\')) { 52381ad6265SDimitry Andric return __quoted_output_proxy<_CharT, _Traits>(__s.data(), __s.data() + __s.size(), __delim, __escape); 52481ad6265SDimitry Andric} 52581ad6265SDimitry Andric 52681ad6265SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 527cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI auto 528cb14a3feSDimitry Andricquoted(basic_string<_CharT, _Traits, _Allocator>& __s, _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) { 52981ad6265SDimitry Andric return __quoted_proxy<_CharT, _Traits, _Allocator>(__s, __delim, __escape); 5300b57cec5SDimitry Andric} 5310b57cec5SDimitry Andric 5320b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 533cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI auto 534cb14a3feSDimitry Andricquoted(basic_string_view<_CharT, _Traits> __sv, _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) { 53581ad6265SDimitry Andric return __quoted_output_proxy<_CharT, _Traits>(__sv.data(), __sv.data() + __sv.size(), __delim, __escape); 5360b57cec5SDimitry Andric} 53781ad6265SDimitry Andric 53806c3fb27SDimitry Andric#endif // _LIBCPP_STD_VER >= 14 5390b57cec5SDimitry Andric 5400b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_STD 5410b57cec5SDimitry Andric 5420b57cec5SDimitry Andric#endif // _LIBCPP_IOMANIP 543