replace Function

private elemental function replace(self, old, new, count) result(replaced)

Type Bound

string

Arguments

Type IntentOptional Attributes Name
class(string), intent(in) :: self
character(kind=CK, len=*), intent(in) :: old
character(kind=CK, len=*), intent(in) :: new
integer, intent(in), optional :: count

Return Value type(string)


Calls

proc~~replace~~CallsGraph proc~replace string%replace proc~replace_one_occurrence string%replace_one_occurrence proc~replace->proc~replace_one_occurrence

Called by

proc~~replace~~CalledByGraph proc~replace string%replace proc~unique string%unique proc~unique->proc~replace program~volatile_doctest~1260 volatile_doctest program~volatile_doctest~1260->proc~replace program~volatile_doctest~2 volatile_doctest program~volatile_doctest~2->proc~replace proc~split string%split proc~split->proc~unique program~volatile_doctest~1448 volatile_doctest program~volatile_doctest~1448->proc~unique program~volatile_doctest~1515 volatile_doctest program~volatile_doctest~1515->proc~unique proc~camelcase string%camelcase proc~camelcase->proc~split proc~glob_string string%glob_string proc~glob_string->proc~split proc~snakecase string%snakecase proc~snakecase->proc~split proc~split_chunked string%split_chunked proc~split_chunked->proc~split proc~startcase string%startcase proc~startcase->proc~split proc~write_lines string%write_lines proc~write_lines->proc~split proc~write_parallel_block_files_string xml_writer_abstract%write_parallel_block_files_string proc~write_parallel_block_files_string->proc~split program~stringifor_test_csv_naive_parser stringifor_test_csv_naive_parser program~stringifor_test_csv_naive_parser->proc~split program~stringifor_test_csv_naive_parser~2 stringifor_test_csv_naive_parser program~stringifor_test_csv_naive_parser~2->proc~split program~stringifor_test_parse_large_csv stringifor_test_parse_large_csv program~stringifor_test_parse_large_csv->proc~split program~stringifor_test_parse_large_csv->proc~split_chunked program~stringifor_test_parse_large_csv~2 stringifor_test_parse_large_csv program~stringifor_test_parse_large_csv~2->proc~split program~stringifor_test_parse_large_csv~2->proc~split_chunked program~volatile_doctest~1067 volatile_doctest program~volatile_doctest~1067->proc~split program~volatile_doctest~1239 volatile_doctest program~volatile_doctest~1239->proc~split program~volatile_doctest~1411 volatile_doctest program~volatile_doctest~1411->proc~split program~volatile_doctest~1418 volatile_doctest program~volatile_doctest~1418->proc~split program~volatile_doctest~1808 volatile_doctest program~volatile_doctest~1808->proc~split program~volatile_doctest~1878 volatile_doctest program~volatile_doctest~1878->proc~split proc~write_file string%write_file program~volatile_doctest~1878->proc~write_file program~volatile_doctest~511 volatile_doctest program~volatile_doctest~511->proc~split program~volatile_doctest~883 volatile_doctest program~volatile_doctest~883->proc~split program~volatile_doctest~926 volatile_doctest program~volatile_doctest~926->proc~split program~volatile_doctest~955 volatile_doctest program~volatile_doctest~955->proc~split program~volatile_doctest~955->proc~write_file interface~glob glob interface~glob->proc~glob_string proc~glob_character string%glob_character interface~glob->proc~glob_character none~glob string%glob none~glob->proc~glob_string none~glob->proc~glob_character none~write_parallel_block_files xml_writer_abstract%write_parallel_block_files none~write_parallel_block_files->proc~write_parallel_block_files_string proc~write_file->proc~write_lines program~volatile_doctest~1041 volatile_doctest program~volatile_doctest~1041->proc~snakecase program~volatile_doctest~1069 volatile_doctest program~volatile_doctest~1069->proc~startcase program~volatile_doctest~1146 volatile_doctest program~volatile_doctest~1146->proc~camelcase program~volatile_doctest~1262 volatile_doctest program~volatile_doctest~1262->proc~camelcase program~volatile_doctest~43 volatile_doctest program~volatile_doctest~43->proc~split_chunked program~volatile_doctest~758 volatile_doctest program~volatile_doctest~758->proc~startcase program~volatile_doctest~807 volatile_doctest program~volatile_doctest~807->proc~split_chunked program~volatile_doctest~893 volatile_doctest program~volatile_doctest~893->proc~snakecase proc~glob_character->none~glob proc~parse_scratch_files vtm_file%parse_scratch_files proc~parse_scratch_files->none~write_parallel_block_files none~write_block vtm_file%write_block proc~parse_scratch_files->none~write_block proc~write_block_array vtm_file%write_block_array proc~write_block_array->none~write_parallel_block_files proc~write_block_string vtm_file%write_block_string proc~write_block_string->none~write_parallel_block_files program~volatile_doctest~1403 volatile_doctest program~volatile_doctest~1403->interface~glob program~volatile_doctest~1623 volatile_doctest program~volatile_doctest~1623->none~glob program~volatile_doctest~1765 volatile_doctest program~volatile_doctest~1765->none~glob program~volatile_doctest~26 volatile_doctest program~volatile_doctest~26->interface~glob program~volatile_doctest~321 volatile_doctest program~volatile_doctest~321->none~glob program~volatile_doctest~464 volatile_doctest program~volatile_doctest~464->none~glob none~write_block->proc~write_block_array none~write_block->proc~write_block_string proc~finalize vtm_file%finalize proc~finalize->proc~parse_scratch_files proc~initialize vtm_file%initialize proc~initialize->proc~finalize program~vtk_fortran_write_vtm vtk_fortran_write_vtm program~vtk_fortran_write_vtm->none~write_block

Source Code

   elemental function replace(self, old, new, count) result(replaced)
   !< Return a string with all occurrences of substring old replaced by new.
   !<
   !<```fortran
   !< type(string) :: astring
   !< logical      :: test_passed(4)
   !< astring = 'When YOU are sad YOU should think to me :-)'
   !< test_passed(1) = (astring%replace(old='YOU', new='THEY')//''=='When THEY are sad THEY should think to me :-)')
   !< test_passed(2) = (astring%replace(old='YOU', new='THEY', count=1)//''=='When THEY are sad YOU should think to me :-)')
   !< astring = repeat(new_line('a')//'abcd', 20)
   !< astring = astring%replace(old=new_line('a'), new='|cr|')
   !< astring = astring%replace(old='|cr|', new=new_line('a')//'    ')
   !< test_passed(3) = (astring//''==repeat(new_line('a')//'    '//'abcd', 20))
   !< astring = 'abcd  efg    hlmn'
   !< astring = astring%replace(old='', new='-')
   !< test_passed(4) = (astring//''=='abcd  efg    hlmn')
   !< print '(L1)', all(test_passed)
   !<```
   !=> T <<<
   class(string),             intent(in)           :: self     !< The string.
   character(kind=CK, len=*), intent(in)           :: old      !< Old substring.
   character(kind=CK, len=*), intent(in)           :: new      !< New substring.
   integer,                   intent(in), optional :: count    !< Number of old occurences to be replaced.
   type(string)                                    :: replaced !< The string with old replaced by new.
   integer                                         :: r        !< Counter.

   if (allocated(self%raw)) then
      replaced = self
      if (len(old)==0) return ! avoid infite loop for null substring replacement
      r = 0
      do
         if (index(replaced%raw, old)>0) then
            replaced = replaced%replace_one_occurrence(old=old, new=new)
            r = r + 1
            if (present(count)) then
               if (r>=count) exit
            endif
         else
            exit
         endif
      enddo
   endif
   endfunction replace