center_with_fill Function

public function center_with_fill(text, width, fill_char) result(centered_text)

Arguments

Type IntentOptional Attributes Name
character(len=*), intent(in) :: text
integer, intent(in) :: width
character(len=1), intent(in), optional :: fill_char

Return Value character(kind=ucs4, len=width)


Source Code

    function center_with_fill(text, width, fill_char) result(centered_text)
        character(LEN=*), intent(in) :: text
        integer, intent(in) :: width
        character(LEN=1), optional, intent(in) :: fill_char
        character(LEN=1) :: fill
        character(KIND=ucs4, LEN=width) :: centered_text
        integer :: text_len, padding, left_padding, right_padding, i

        if (present(fill_char)) then
            fill = fill_char
        else
            fill = " "
        end if

        text_len = len_trim(text)
        if (text_len >= width) then
            centered_text = text(1:width)
            return
        end if

        ! Calculate the total padding required
        padding = width - text_len
        if (trim(text) == "") then
            left_padding = padding / 2
            right_padding = padding - left_padding - mod(padding, 2)
        else
            text_len = text_len + 1
            left_padding = padding / 2 - 1
            right_padding = padding - left_padding - mod(padding, 2)
        end if

        ! Initialize the result
        centered_text = repeat(' ', width)

        ! Fill with fill on the left
        do i = 1, left_padding
            centered_text(i:i) = fill
        end do

        ! Place the text in the center
        if (trim(text) == "") then
            centered_text(left_padding + 1:left_padding + text_len) = trim(text)
        else
            centered_text(left_padding + 1:left_padding + text_len) = " "//trim(text)//" "
        end if

        ! Fill with fill on the right
        do i = right_padding + text_len, width
            centered_text(i:i) = fill
        end do

    end function center_with_fill