@@ -49,24 +49,26 @@ namespace kanzi {
4949 char _buffer[BUF_SIZE];
5050
5151 virtual int_type underflow () {
52- if (gptr () < egptr ())
53- return traits_type::to_int_type (*gptr ());
52+ if (gptr () < egptr ())
53+ return traits_type::to_int_type (*gptr ());
5454
55- // Preserve up to 4 bytes of putback
56- const int putback = std::min< int > (gptr () - eback (), 4 );
55+ // Number of characters to preserve ( putback)
56+ int putback = int (gptr () - eback ());
5757
58- // Move putback bytes to the front
59- std::memmove (_buffer + (4 - putback), gptr () - putback, putback);
58+ if (putback > 4 ) putback = 4 ;
6059
61- // Read new bytes after putback
62- const int n = READ (_fd, _buffer + 4 , BUF_SIZE - 4 );
63- if (n <= 0 )
64- return traits_type::eof ();
60+ // Move putback characters to start of buffer
61+ std::memmove (_buffer + (4 - putback), gptr () - putback, putback);
6562
66- // Set new buffer pointers
67- setg (_buffer + (4 - putback), _buffer + 4 , _buffer + 4 + n);
68- return traits_type::to_int_type (*gptr ());
69- }
63+ // Read new characters into buffer
64+ const int n = int (READ (_fd, _buffer + 4 , BUF_SIZE - 4 ));
65+
66+ if (n <= 0 )
67+ return EOF;
68+
69+ setg (_buffer + (4 - putback), _buffer + 4 , _buffer + 4 + n);
70+ return traits_type::to_int_type (*gptr ());
71+ }
7072 };
7173
7274 class FileInputStream FINAL : public istream
0 commit comments