1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===// 2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant// The LLVM Compiler Infrastructure 4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details. 7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===// 9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// <fstream> 11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// int_type underflow(); 13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// This test is not entirely portable 15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <fstream> 17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <cassert> 18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 1983e2c4d877fe2d7793868b1c6a5d9525a7c4d431Marshall Clow#include "platform_support.h" // locale name macros 20c0d0cbad9ed434267a7af9531bdeeae52eb6d706Howard Hinnant 21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class CharT> 22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct test_buf 23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant : public std::basic_filebuf<CharT> 24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef std::basic_filebuf<CharT> base; 26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef typename base::char_type char_type; 27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef typename base::int_type int_type; 28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char_type* eback() const {return base::eback();} 30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char_type* gptr() const {return base::gptr();} 31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char_type* egptr() const {return base::egptr();} 32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant void gbump(int n) {base::gbump(n);} 33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant virtual int_type underflow() {return base::underflow();} 35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}; 36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint main() 38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test_buf<char> f; 41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.open("underflow.dat", std::ios_base::in) != 0); 42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.is_open()); 43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback() == 0); 44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.gptr() == 0); 45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.egptr() == 0); 46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.underflow() == '1'); 47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback() != 0); 48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback() == f.gptr()); 49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(*f.gptr() == '1'); 50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.egptr() - f.eback() == 9); 51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test_buf<char> f; 54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.open("underflow.dat", std::ios_base::in) != 0); 55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.pubsetbuf(0, 0)); 56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.is_open()); 57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback() == 0); 58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.gptr() == 0); 59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.egptr() == 0); 60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.underflow() == '1'); 61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback() != 0); 62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback() == f.gptr()); 63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(*f.gptr() == '1'); 64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.egptr() - f.eback() == 8); 65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant f.gbump(8); 66bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.sgetc() == '9'); 67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback()[0] == '5'); 68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback()[1] == '6'); 69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback()[2] == '7'); 70bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback()[3] == '8'); 71bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.gptr() - f.eback() == 4); 72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(*f.gptr() == '9'); 73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.egptr() - f.gptr() == 1); 74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 75bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 76bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test_buf<wchar_t> f; 77bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.open("underflow.dat", std::ios_base::in) != 0); 78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.is_open()); 79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback() == 0); 80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.gptr() == 0); 81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.egptr() == 0); 82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.underflow() == L'1'); 83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback() != 0); 84bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback() == f.gptr()); 85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(*f.gptr() == L'1'); 86bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.egptr() - f.eback() == 9); 87bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 88bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 89bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test_buf<wchar_t> f; 90bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.pubsetbuf(0, 0)); 91bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.open("underflow.dat", std::ios_base::in) != 0); 92bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.is_open()); 93bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback() == 0); 94bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.gptr() == 0); 95bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.egptr() == 0); 96bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.underflow() == L'1'); 97bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback() != 0); 98bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback() == f.gptr()); 99bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(*f.gptr() == L'1'); 100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.egptr() - f.eback() == 8); 101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant f.gbump(8); 102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.sgetc() == L'9'); 103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback()[0] == L'5'); 104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback()[1] == L'6'); 105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback()[2] == L'7'); 106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback()[3] == L'8'); 107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.gptr() - f.eback() == 4); 108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(*f.gptr() == L'9'); 109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.egptr() - f.gptr() == 1); 110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test_buf<wchar_t> f; 113c0d0cbad9ed434267a7af9531bdeeae52eb6d706Howard Hinnant f.pubimbue(std::locale(LOCALE_en_US_UTF_8)); 114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.open("underflow_utf8.dat", std::ios_base::in) != 0); 115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.is_open()); 116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.sbumpc() == 0x4E51); 117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.sbumpc() == 0x4E52); 118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.sbumpc() == 0x4E53); 119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.sbumpc() == -1); 120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 121256813f4e7915d64776a4edd5f4765d893b9f062Howard Hinnant} 122