15a83710eSEric Fiselier //===----------------------------------------------------------------------===// 25a83710eSEric Fiselier // 357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 65a83710eSEric Fiselier // 75a83710eSEric Fiselier //===----------------------------------------------------------------------===// 85a83710eSEric Fiselier 961c115f3SDaniel Sanders // REQUIRES: locale.en_US.UTF-8 1061c115f3SDaniel Sanders 115a83710eSEric Fiselier // <iomanip> 125a83710eSEric Fiselier 135a83710eSEric Fiselier // template <class charT> T9 get_time(struct tm* tmb, const charT* fmt); 145a83710eSEric Fiselier 155a83710eSEric Fiselier #include <iomanip> 165a127cdcSMarshall Clow #include <istream> 175a83710eSEric Fiselier #include <cassert> 185a83710eSEric Fiselier 197fc6a556SMarshall Clow #include "test_macros.h" 205a83710eSEric Fiselier #include "platform_support.h" // locale name macros 215a83710eSEric Fiselier 225a83710eSEric Fiselier template <class CharT> 235a83710eSEric Fiselier struct testbuf 245a83710eSEric Fiselier : public std::basic_streambuf<CharT> 255a83710eSEric Fiselier { 265a83710eSEric Fiselier typedef std::basic_string<CharT> string_type; 275a83710eSEric Fiselier typedef std::basic_streambuf<CharT> base; 285a83710eSEric Fiselier private: 295a83710eSEric Fiselier string_type str_; 305a83710eSEric Fiselier public: 315a83710eSEric Fiselier testbuftestbuf325a83710eSEric Fiselier testbuf() {} testbuftestbuf335a83710eSEric Fiselier testbuf(const string_type& str) 345a83710eSEric Fiselier : str_(str) 355a83710eSEric Fiselier { 365a83710eSEric Fiselier base::setg(const_cast<CharT*>(str_.data()), 375a83710eSEric Fiselier const_cast<CharT*>(str_.data()), 385a83710eSEric Fiselier const_cast<CharT*>(str_.data()) + str_.size()); 395a83710eSEric Fiselier } 405a83710eSEric Fiselier }; 415a83710eSEric Fiselier main(int,char **)422df59c50SJF Bastienint main(int, char**) 435a83710eSEric Fiselier { 445a83710eSEric Fiselier { 455a83710eSEric Fiselier testbuf<char> sb(" Sat Dec 31 23:55:59 2061"); 465a83710eSEric Fiselier std::istream is(&sb); 475a83710eSEric Fiselier is.imbue(std::locale(LOCALE_en_US_UTF_8)); 483245e1f3SEric Fiselier std::tm t = {}; 495a83710eSEric Fiselier is >> std::get_time(&t, "%a %b %d %H:%M:%S %Y"); 505a83710eSEric Fiselier assert(t.tm_sec == 59); 515a83710eSEric Fiselier assert(t.tm_min == 55); 525a83710eSEric Fiselier assert(t.tm_hour == 23); 535a83710eSEric Fiselier assert(t.tm_mday == 31); 545a83710eSEric Fiselier assert(t.tm_mon == 11); 555a83710eSEric Fiselier assert(t.tm_year == 161); 565a83710eSEric Fiselier assert(t.tm_wday == 6); 575a83710eSEric Fiselier assert(is.eof()); 585a83710eSEric Fiselier assert(!is.fail()); 595a83710eSEric Fiselier } 60*f4c1258dSLouis Dionne #ifndef TEST_HAS_NO_WIDE_CHARACTERS 615a83710eSEric Fiselier { 625a83710eSEric Fiselier testbuf<wchar_t> sb(L" Sat Dec 31 23:55:59 2061"); 635a83710eSEric Fiselier std::wistream is(&sb); 645a83710eSEric Fiselier is.imbue(std::locale(LOCALE_en_US_UTF_8)); 653245e1f3SEric Fiselier std::tm t = {}; 665a83710eSEric Fiselier is >> std::get_time(&t, L"%a %b %d %H:%M:%S %Y"); 675a83710eSEric Fiselier assert(t.tm_sec == 59); 685a83710eSEric Fiselier assert(t.tm_min == 55); 695a83710eSEric Fiselier assert(t.tm_hour == 23); 705a83710eSEric Fiselier assert(t.tm_mday == 31); 715a83710eSEric Fiselier assert(t.tm_mon == 11); 725a83710eSEric Fiselier assert(t.tm_year == 161); 735a83710eSEric Fiselier assert(t.tm_wday == 6); 745a83710eSEric Fiselier assert(is.eof()); 755a83710eSEric Fiselier assert(!is.fail()); 765a83710eSEric Fiselier } 77*f4c1258dSLouis Dionne #endif 782df59c50SJF Bastien 792df59c50SJF Bastien return 0; 805a83710eSEric Fiselier } 81