filter_character_array Subroutine

private subroutine filter_character_array(input_array, valid_list, filtered_array)

Arguments

Type IntentOptional Attributes Name
character(len=*), intent(in) :: input_array(:)
character(len=*), intent(in) :: valid_list(:)
character(len=:), intent(inout), allocatable :: filtered_array(:)

Called by

proc~~filter_character_array~~CalledByGraph proc~filter_character_array filter_character_array interface~filter filter interface~filter->proc~filter_character_array proc~configure_output_variables configure_output_variables proc~configure_output_variables->interface~filter proc~read_output_settings_fields read_output_settings_fields proc~read_output_settings_fields->proc~configure_output_variables proc~read_output_settings_history read_output_settings_history proc~read_output_settings_history->proc~configure_output_variables proc~inout_read_output_settings inout_read_output_settings proc~inout_read_output_settings->proc~read_output_settings_fields proc~inout_read_output_settings->proc~read_output_settings_history interface~inout_read_output_settings type_input%inout_read_output_settings interface~inout_read_output_settings->proc~inout_read_output_settings proc~initialize_type_input type_input%initialize_type_input proc~initialize_type_input->interface~inout_read_output_settings

Source Code

    subroutine filter_character_array(input_array, valid_list, filtered_array)
        implicit none
        ! --- 引数 ---
        ! IN: フィルタリング対象の配列
        character(*), intent(in) :: input_array(:)
        ! IN: 有効な文字列のリスト
        character(*), intent(in) :: valid_list(:)
        ! OUT: フィルタリング結果を格納する配列
        character(:), allocatable, intent(inout) :: filtered_array(:)

        ! --- ローカル変数 ---
        integer(int32) :: i
        character(64), allocatable :: packed_array(:)
        logical, allocatable :: mask(:)

        ! --- 処理 ---
        if (size(input_array) == 0) then
            if (allocated(filtered_array)) deallocate (filtered_array)
            allocate (character(len=0) :: filtered_array(0))
            return
        end if

        allocate (mask(size(input_array)))

        ! input_arrayの各要素がvalid_listに存在するかチェックし、マスクを作成
        mask = .false.
        do i = 1, size(input_array)
            mask(i) = any(valid_list(:) == trim(adjustl(input_array(i))))
        end do

        ! マスクを使って有効な要素だけを抽出
        packed_array = pack(input_array, mask)

        ! 結果を出力引数にコピー
        ! (source= を使うことで、文字長も自動で合わせてくれる)
        if (allocated(filtered_array)) deallocate (filtered_array)
        allocate (filtered_array, source=packed_array)

        ! ローカル配列の解放
        deallocate (mask, packed_array)

    end subroutine filter_character_array