| ... | ... | @@ -821,6 +821,14 @@ typename basic_filebuf<_CharT, _Traits>::int_type basic_filebuf<_CharT, _Traits> |
| 821 | 821 | |
| 822 | 822 | template <class _CharT, class _Traits> |
| 823 | 823 | typename basic_filebuf<_CharT, _Traits>::int_type basic_filebuf<_CharT, _Traits>::overflow(int_type __c) { |
| 824 | auto __failed = [this]() { |
| 825 | if (this->pptr() == this->epptr() + 1) { |
| 826 | this->pbump(-1); // lose the character we overflowed above -- we don't really have a |
| 827 | // choice since we couldn't commit the contents of the put area |
| 828 | } |
| 829 | return traits_type::eof(); |
| 830 | }; |
| 831 | |
| 824 | 832 | if (__file_ == nullptr) |
| 825 | 833 | return traits_type::eof(); |
| 826 | 834 | __write_mode(); |
| ... | ... | @@ -841,8 +849,9 @@ typename basic_filebuf<_CharT, _Traits>::int_type basic_filebuf<_CharT, _Traits> |
| 841 | 849 | |
| 842 | 850 | if (__always_noconv_) { |
| 843 | 851 | size_t __n = static_cast<size_t>(this->pptr() - this->pbase()); |
| 844 | | if (std::fwrite(this->pbase(), sizeof(char_type), __n, __file_) != __n) |
| 845 | | return traits_type::eof(); |
| 852 | if (std::fwrite(this->pbase(), sizeof(char_type), __n, __file_) != __n) { |
| 853 | return __failed(); |
| 854 | } |
| 846 | 855 | } else { |
| 847 | 856 | if (!__cv_) |
| 848 | 857 | std::__throw_bad_cast(); |
| ... | ... | @@ -854,34 +863,38 @@ typename basic_filebuf<_CharT, _Traits>::int_type basic_filebuf<_CharT, _Traits> |
| 854 | 863 | char* __extbuf_end = __extbuf_; |
| 855 | 864 | do { |
| 856 | 865 | codecvt_base::result __r = __cv_->out(__st_, __b, __p, __end, __extbuf_, __extbuf_ + __ebs_, __extbuf_end); |
| 857 | | if (__end == __b) |
| 858 | | return traits_type::eof(); |
| 866 | if (__end == __b) { |
| 867 | return __failed(); |
| 868 | } |
| 859 | 869 | |
| 860 | 870 | // No conversion needed: output characters directly to the file, done. |
| 861 | 871 | if (__r == codecvt_base::noconv) { |
| 862 | 872 | size_t __n = static_cast<size_t>(__p - __b); |
| 863 | | if (std::fwrite(__b, 1, __n, __file_) != __n) |
| 864 | | return traits_type::eof(); |
| 873 | if (std::fwrite(__b, 1, __n, __file_) != __n) { |
| 874 | return __failed(); |
| 875 | } |
| 865 | 876 | break; |
| 866 | 877 | |
| 867 | 878 | // Conversion successful: output the converted characters to the file, done. |
| 868 | 879 | } else if (__r == codecvt_base::ok) { |
| 869 | 880 | size_t __n = static_cast<size_t>(__extbuf_end - __extbuf_); |
| 870 | | if (std::fwrite(__extbuf_, 1, __n, __file_) != __n) |
| 871 | | return traits_type::eof(); |
| 881 | if (std::fwrite(__extbuf_, 1, __n, __file_) != __n) { |
| 882 | return __failed(); |
| 883 | } |
| 872 | 884 | break; |
| 873 | 885 | |
| 874 | 886 | // Conversion partially successful: output converted characters to the file and repeat with the |
| 875 | 887 | // remaining characters. |
| 876 | 888 | } else if (__r == codecvt_base::partial) { |
| 877 | 889 | size_t __n = static_cast<size_t>(__extbuf_end - __extbuf_); |
| 878 | | if (std::fwrite(__extbuf_, 1, __n, __file_) != __n) |
| 879 | | return traits_type::eof(); |
| 890 | if (std::fwrite(__extbuf_, 1, __n, __file_) != __n) { |
| 891 | return __failed(); |
| 892 | } |
| 880 | 893 | __b = const_cast<char_type*>(__end); |
| 881 | 894 | continue; |
| 882 | 895 | |
| 883 | 896 | } else { |
| 884 | | return traits_type::eof(); |
| 897 | return __failed(); |
| 885 | 898 | } |
| 886 | 899 | } while (true); |
| 887 | 900 | } |