@@ -77,9 +77,7 @@ module stdlib_logger
7777 private
7878
7979 logical :: add_blank_line = .false.
80- character (:), allocatable :: buffer
8180 logical :: indent_lines = .true.
82- integer :: len_buffer = 0
8381 integer , allocatable :: log_units(:)
8482 integer :: max_width = 0
8583 logical :: time_stamp = .true.
@@ -517,22 +515,24 @@ subroutine final_logger( self )
517515 end subroutine final_logger
518516
519517
520- subroutine format_output_string ( self , string , col_indent )
518+ subroutine format_output_string ( self , string , col_indent , len_buffer , buffer )
521519! ! version: experimental
522520
523521! ! Writes the STRING to UNIT ensuring that the number of characters
524522! ! does not exceed MAX_WIDTH and that the lines after the first
525523! ! one are indented four characters.
526- class(logger_type), intent (inout ) :: self
527- character (* ), intent (in ) :: string
528- character (* ), intent (in ) :: col_indent
524+ class(logger_type), intent (inout ) :: self
525+ integer , intent (out ) :: len_buffer
526+ character (* ), intent (in ) :: string
527+ character (* ), intent (in ) :: col_indent
528+ character (len= :), allocatable , intent (out ) :: buffer
529529
530530 integer :: count, indent_len, index_, length, remain
531531 integer , parameter :: new_len = len (new_line(' a' ))
532532
533533 length = len_trim (string)
534- allocate ( character (2 * length) :: self % buffer )
535- self % len_buffer = 0
534+ allocate ( character (2 * length) :: buffer )
535+ len_buffer = 0
536536 indent_len = len (col_indent)
537537 call format_first_line()
538538
@@ -553,8 +553,8 @@ subroutine format_first_line()
553553 if ( self % max_width == 0 .or. &
554554 ( length <= self % max_width .and. &
555555 index ( string (1 :length), new_line(' a' )) == 0 ) ) then
556- self % buffer(1 :length) = string (1 :length)
557- self % len_buffer = length
556+ buffer(1 :length) = string (1 :length)
557+ len_buffer = length
558558 remain = 0
559559 return
560560 else
@@ -568,15 +568,15 @@ subroutine format_first_line()
568568 end if
569569
570570 if ( index_ == 0 ) then
571- self % buffer(1 :self % max_width) = &
571+ buffer(1 :self % max_width) = &
572572 string (1 :self % max_width)
573- self % len_buffer = self % max_width
573+ len_buffer = self % max_width
574574 count = self % max_width
575575 remain = length - count
576576 return
577577 else
578- self % buffer(1 :index_-1 ) = string (1 :index_-1 )
579- self % len_buffer = index_-1
578+ buffer(1 :index_-1 ) = string (1 :index_-1 )
579+ len_buffer = index_-1
580580 count = index_
581581 remain = length - count
582582 return
@@ -591,15 +591,15 @@ subroutine format_subsequent_line()
591591 character (:), allocatable :: dummy
592592
593593 if ( remain <= self % max_width ) then
594- new_len_buffer = self % len_buffer + length - count + new_len
595- if ( new_len_buffer > len ( self % buffer ) ) then
596- allocate ( character ( 2 * len ( self % buffer ) ) :: dummy )
597- dummy = self % buffer
598- call move_alloc( dummy, self % buffer )
594+ new_len_buffer = len_buffer + length - count + new_len
595+ if ( new_len_buffer > len ( buffer ) ) then
596+ allocate ( character ( 2 * len ( buffer ) ) :: dummy )
597+ dummy = buffer
598+ call move_alloc( dummy, buffer )
599599 end if
600- self % buffer( self % len_buffer+1 :new_len_buffer ) = &
600+ buffer( len_buffer+1 :new_len_buffer ) = &
601601 new_line(' a' ) // string (count+1 :length)
602- self % len_buffer = new_len_buffer
602+ len_buffer = new_len_buffer
603603 count = length
604604 remain = 0
605605 return
@@ -614,30 +614,30 @@ subroutine format_subsequent_line()
614614 end if
615615
616616 if ( index_ == count ) then
617- new_len_buffer = self % len_buffer + self % max_width + &
617+ new_len_buffer = len_buffer + self % max_width + &
618618 new_len
619- if ( new_len_buffer > len ( self % buffer ) ) then
620- allocate ( character ( 2 * len ( self % buffer ) ) :: dummy )
621- dummy = self % buffer
622- call move_alloc( dummy, self % buffer )
619+ if ( new_len_buffer > len ( buffer ) ) then
620+ allocate ( character ( 2 * len ( buffer ) ) :: dummy )
621+ dummy = buffer
622+ call move_alloc( dummy, buffer )
623623 end if
624- self % buffer( self % len_buffer+1 :new_len_buffer ) = &
624+ buffer( len_buffer+1 :new_len_buffer ) = &
625625 new_line(' a' ) // string (count+1 :count+ self % max_width)
626- self % len_buffer = new_len_buffer
626+ len_buffer = new_len_buffer
627627 count = count + self % max_width
628628 remain = length - count
629629 return
630630 else
631- new_len_buffer = self % len_buffer + index_ - 1 &
631+ new_len_buffer = len_buffer + index_ - 1 &
632632 - count + new_len
633- if ( new_len_buffer > len ( self % buffer ) ) then
634- allocate ( character ( 2 * len ( self % buffer ) ) :: dummy )
635- dummy = self % buffer
636- call move_alloc( dummy, self % buffer )
633+ if ( new_len_buffer > len ( buffer ) ) then
634+ allocate ( character ( 2 * len ( buffer ) ) :: dummy )
635+ dummy = buffer
636+ call move_alloc( dummy, buffer )
637637 end if
638- self % buffer( self % len_buffer+1 :new_len_buffer ) = &
638+ buffer( len_buffer+1 :new_len_buffer ) = &
639639 new_line(' a' ) // string (count+1 :index_-1 )
640- self % len_buffer = new_len_buffer
640+ len_buffer = new_len_buffer
641641 count = index_
642642 remain = length - count
643643 return
@@ -653,16 +653,16 @@ subroutine indent_format_subsequent_line()
653653
654654 if ( index ( string (count+1 :length), new_line(' a' )) == 0 .and. &
655655 remain <= self % max_width - indent_len ) then
656- new_len_buffer = self % len_buffer + length &
656+ new_len_buffer = len_buffer + length &
657657 - count + new_len + indent_len
658- if ( new_len_buffer > len ( self % buffer ) ) then
659- allocate ( character ( 2 * len ( self % buffer ) ) :: dummy )
660- dummy = self % buffer
661- call move_alloc( dummy, self % buffer )
658+ if ( new_len_buffer > len ( buffer ) ) then
659+ allocate ( character ( 2 * len ( buffer ) ) :: dummy )
660+ dummy = buffer
661+ call move_alloc( dummy, buffer )
662662 end if
663- self % buffer( self % len_buffer+1 :new_len_buffer ) = &
663+ buffer( len_buffer+1 :new_len_buffer ) = &
664664 new_line(' a' ) // col_indent // string (count+1 :length)
665- self % len_buffer = new_len_buffer
665+ len_buffer = new_len_buffer
666666 count = length
667667 remain = 0
668668 return
@@ -678,31 +678,31 @@ subroutine indent_format_subsequent_line()
678678 end if
679679
680680 if ( index_ == count ) then
681- new_len_buffer = self % len_buffer + self % max_width &
681+ new_len_buffer = len_buffer + self % max_width &
682682 + new_len
683- if ( new_len_buffer > len ( self % buffer ) ) then
684- allocate ( character ( 2 * len ( self % buffer ) ) :: dummy )
685- dummy = self % buffer
686- call move_alloc( dummy, self % buffer )
683+ if ( new_len_buffer > len ( buffer ) ) then
684+ allocate ( character ( 2 * len ( buffer ) ) :: dummy )
685+ dummy = buffer
686+ call move_alloc( dummy, buffer )
687687 end if
688- self % buffer( self % len_buffer+1 : new_len_buffer ) = &
688+ buffer( len_buffer+1 : new_len_buffer ) = &
689689 new_line(' a' ) // col_indent // &
690690 string (count+1 :count+ self % max_width- indent_len)
691- self % len_buffer = new_len_buffer
691+ len_buffer = new_len_buffer
692692 count = count + self % max_width - indent_len
693693 remain = length - count
694694 return
695695 else
696- new_len_buffer = self % len_buffer + index_ - count - 1 &
696+ new_len_buffer = len_buffer + index_ - count - 1 &
697697 + new_len + indent_len
698- if ( new_len_buffer > len ( self % buffer ) ) then
699- allocate ( character ( 2 * len ( self % buffer ) ) :: dummy )
700- dummy = self % buffer
701- call move_alloc( dummy, self % buffer )
698+ if ( new_len_buffer > len ( buffer ) ) then
699+ allocate ( character ( 2 * len ( buffer ) ) :: dummy )
700+ dummy = buffer
701+ call move_alloc( dummy, buffer )
702702 end if
703- self % buffer( self % len_buffer+1 : new_len_buffer ) = &
703+ buffer( len_buffer+1 : new_len_buffer ) = &
704704 new_line(' a' ) // col_indent // string (count+1 :index_-1 )
705- self % len_buffer = new_len_buffer
705+ len_buffer = new_len_buffer
706706 count = index_
707707 remain = length - count
708708 return
@@ -1040,9 +1040,11 @@ subroutine log_message( self, message, module, procedure, prefix )
10401040
10411041 integer :: unit
10421042 integer :: iostat
1043+ integer :: len_buffer
10431044 character (* ), parameter :: procedure_name = ' log_message'
10441045 character (256 ) :: iomsg
10451046 character (:), allocatable :: d_and_t, m_and_p, pref
1047+ character (:), allocatable :: buffer
10461048
10471049 if ( present (prefix) ) then
10481050 pref = prefix // ' : '
@@ -1071,36 +1073,38 @@ subroutine log_message( self, message, module, procedure, prefix )
10711073 call format_output_string( self, &
10721074 d_and_t // m_and_p // pref // &
10731075 trim ( message ), &
1074- ' ' )
1076+ ' ' , &
1077+ len_buffer, &
1078+ buffer)
10751079
10761080 if ( self % units == 0 ) then
10771081 if ( self % add_blank_line ) then
10781082 write ( output_unit, ' (a)' , err= 999 , iostat= iostat, &
10791083 iomsg= iomsg) &
1080- new_line(' a' ) // self % buffer(1 :self % len_buffer)
1084+ new_line(' a' ) // buffer(1 :len_buffer)
10811085 else
10821086 write ( output_unit, ' (a)' , err= 999 , iostat= iostat, &
10831087 iomsg= iomsg ) &
1084- self % buffer(1 :self % len_buffer)
1088+ buffer(1 :len_buffer)
10851089 end if
10861090 else
10871091 if ( self % add_blank_line ) then
10881092 do unit= 1 , self % units
10891093 write ( self % log_units(unit), ' (a)' , err= 999 , iostat= iostat, &
10901094 iomsg= iomsg ) new_line(' a' ) // &
1091- self % buffer(1 :self % len_buffer)
1095+ buffer(1 :len_buffer)
10921096 end do
10931097 else
10941098 do unit= 1 , self % units
10951099 write ( self % log_units(unit), ' (a)' , err= 999 , iostat= iostat, &
10961100 iomsg= iomsg ) &
1097- self % buffer(1 :self % len_buffer)
1101+ buffer(1 :len_buffer)
10981102 end do
10991103 end if
11001104 end if
11011105
1102- deallocate ( self % buffer )
1103- self % len_buffer = 0
1106+ deallocate ( buffer )
1107+ len_buffer = 0
11041108
11051109 return
11061110
@@ -1169,11 +1173,12 @@ subroutine log_text_error( self, line, column, summary, filename, &
11691173! ! greater than `len(line)`, and `write_failure` if any of the `write`
11701174! ! statements has failed.
11711175
1172- character (1 ) :: acaret
1173- character (128 ) :: iomsg
1174- integer :: iostat
1175- integer :: lun
1176- character (* ), parameter :: procedure_name = ' LOG_TEXT_ERROR'
1176+ character (1 ) :: acaret
1177+ character (128 ) :: iomsg
1178+ integer :: iostat
1179+ integer :: lun
1180+ character (* ), parameter :: procedure_name = ' LOG_TEXT_ERROR'
1181+ character (len= :), allocatable :: buffer
11771182
11781183 acaret = optval(caret, ' ^' )
11791184
@@ -1192,14 +1197,13 @@ subroutine log_text_error( self, line, column, summary, filename, &
11921197
11931198 call write_log_text_error_buffer( )
11941199 if ( self % units == 0 ) then
1195- write ( output_unit, ' (a)' ) self % buffer
1200+ write ( output_unit, ' (a)' ) buffer
11961201 else
11971202 do lun= 1 , self % units
1198- write ( self % log_units(lun), ' (a)' ) self % buffer
1203+ write ( self % log_units(lun), ' (a)' ) buffer
11991204 end do
12001205 end if
1201- deallocate ( self % buffer )
1202- self % len_buffer = 0
1206+ deallocate ( buffer )
12031207
12041208 contains
12051209
@@ -1243,26 +1247,26 @@ subroutine write_log_text_error_buffer( )
12431247 marker(column:column) = acaret
12441248 if ( self % add_blank_line ) then
12451249 if ( self % time_stamp ) then
1246- self % buffer = new_line(' a' ) // time_stamp() // &
1250+ buffer = new_line(' a' ) // time_stamp() // &
12471251 new_line(' a' ) // trim (location) // &
12481252 new_line(' a' ) // new_line(' a' ) // trim (line) // &
12491253 new_line(' a' ) // marker // &
12501254 new_line(' a' ) // ' Error: ' // trim (summary)
12511255 else
1252- self % buffer = new_line(' a' ) // trim (location) // &
1256+ buffer = new_line(' a' ) // trim (location) // &
12531257 new_line(' a' ) // new_line(' a' ) // trim (line) // &
12541258 new_line(' a' ) // marker // &
12551259 new_line(' a' ) // ' Error: ' // trim (summary)
12561260 end if
12571261 else
12581262 if ( self % time_stamp ) then
1259- self % buffer = time_stamp() // &
1263+ buffer = time_stamp() // &
12601264 new_line(' a' ) // trim (location) // &
12611265 new_line(' a' ) // new_line(' a' ) // trim (line) // &
12621266 new_line(' a' ) // marker // &
12631267 new_line(' a' ) // ' Error: ' // trim (summary)
12641268 else
1265- self % buffer = trim (location) // &
1269+ buffer = trim (location) // &
12661270 new_line(' a' ) // new_line(' a' ) // trim (line) // &
12671271 new_line(' a' ) // marker // &
12681272 new_line(' a' ) // ' Error: ' // trim (summary)
0 commit comments