@@ -834,13 +834,7 @@ struct LineChunkWriter<'a> {
834834impl < ' a > LineChunkWriter < ' a > {
835835 fn new ( chunk_size : u64 , settings : & ' a Settings ) -> UResult < Self > {
836836 let mut filename_iterator = FilenameIterator :: new ( & settings. prefix , & settings. suffix ) ?;
837- let filename = filename_iterator
838- . next ( )
839- . ok_or_else ( || USimpleError :: new ( 1 , "output file suffixes exhausted" ) ) ?;
840- if settings. verbose {
841- println ! ( "creating file {}" , filename. quote( ) ) ;
842- }
843- let inner = settings. instantiate_current_writer ( & filename, true ) ?;
837+ let inner = Self :: start_new_chunk ( settings, & mut filename_iterator) ?;
844838 Ok ( LineChunkWriter {
845839 settings,
846840 chunk_size,
@@ -850,6 +844,19 @@ impl<'a> LineChunkWriter<'a> {
850844 filename_iterator,
851845 } )
852846 }
847+
848+ fn start_new_chunk (
849+ settings : & Settings ,
850+ filename_iterator : & mut FilenameIterator ,
851+ ) -> io:: Result < BufWriter < Box < dyn Write > > > {
852+ let filename = filename_iterator
853+ . next ( )
854+ . ok_or_else ( || io:: Error :: other ( "output file suffixes exhausted" ) ) ?;
855+ if settings. verbose {
856+ println ! ( "creating file {}" , filename. quote( ) ) ;
857+ }
858+ settings. instantiate_current_writer ( & filename, true )
859+ }
853860}
854861
855862impl Write for LineChunkWriter < ' _ > {
@@ -869,14 +876,7 @@ impl Write for LineChunkWriter<'_> {
869876 // corresponding writer.
870877 if self . num_lines_remaining_in_current_chunk == 0 {
871878 self . num_chunks_written += 1 ;
872- let filename = self
873- . filename_iterator
874- . next ( )
875- . ok_or_else ( || io:: Error :: other ( "output file suffixes exhausted" ) ) ?;
876- if self . settings . verbose {
877- println ! ( "creating file {}" , filename. quote( ) ) ;
878- }
879- self . inner = self . settings . instantiate_current_writer ( & filename, true ) ?;
879+ self . inner = Self :: start_new_chunk ( self . settings , & mut self . filename_iterator ) ?;
880880 self . num_lines_remaining_in_current_chunk = self . chunk_size ;
881881 }
882882
@@ -889,9 +889,19 @@ impl Write for LineChunkWriter<'_> {
889889 self . num_lines_remaining_in_current_chunk -= 1 ;
890890 }
891891
892- let num_bytes_written =
893- custom_write ( & buf[ prev..buf. len ( ) ] , & mut self . inner , self . settings ) ?;
894- total_bytes_written += num_bytes_written;
892+ // There might be bytes remaining in the buffer, and we write
893+ // them to the current chunk. But first, we may need to rotate
894+ // the current chunk in case it has already reached its line
895+ // limit.
896+ if prev < buf. len ( ) {
897+ if self . num_lines_remaining_in_current_chunk == 0 {
898+ self . inner = Self :: start_new_chunk ( self . settings , & mut self . filename_iterator ) ?;
899+ self . num_lines_remaining_in_current_chunk = self . chunk_size ;
900+ }
901+ let num_bytes_written =
902+ custom_write ( & buf[ prev..buf. len ( ) ] , & mut self . inner , self . settings ) ?;
903+ total_bytes_written += num_bytes_written;
904+ }
895905 Ok ( total_bytes_written)
896906 }
897907
0 commit comments