| Class | dc_string | 
| In: | dc_string.f90 | 
character/string type support routines
dc_string は文字列を操作するためのサブルーチン群を持つモジュールです。
手続き群の要約
| StoI : | 文字型を整数型に変換 | 
| StoD : | 文字型を倍精度実数型に変換 | 
| StoA : | 文字型を文字型配列に変換 | 
| Get_Array : | 文字型を整数型配列、単精度実数型配列、倍精度実数型配列に変換 | 
| Str_to_Logical : | 文字型を論理型に変換 | 
| toChar : | 数値型、論理型を文字型に変換 | 
| JoinChar : | 文字型配列の連結 | 
| Index_Ofs : | オフセットした文字列の重複探査 (Index 関数の拡張版) | 
| Replace : | 文字列置換 | 
| toUpper : | 文字列を大文字へ変換 (サブルーチン) | 
| UChar : | 文字列を大文字へ変換 (関数) | 
| toLower : | 文字列を小文字へ変換 (サブルーチン) | 
| LChar : | 文字列を小文字へ変換 (関数) | 
| StriEq : | 文字列の比較 (大文字小文字を無視) | 
| StrHead : | 文字列の比較 (先頭部分のみの比較) | 
| CPrintf : | データを整形して文字列として返す | 
| Printf : | データを整形して出力 | 
| Function : | |
| result : | character(len = STRING) | 
| fmt : | character(*), intent(in) | 
| i(:) : | integer, intent(in), optional | 
| r(:) : | real, intent(in), optional | 
| d(:) : | real(DP), intent(in), optional | 
| L(:) : | logical, intent(in), optional | 
| s(:) : | type(VSTRING), intent(in), optional | 
| n(:) : | integer, intent(in), optional | 
| c1 : | character(*), intent(in), optional | 
| c2 : | character(*), intent(in), optional | 
| c3 : | character(*), intent(in), optional | 
| ca(:) : | character(*), intent(in), optional | 
フォーマット文字列 fmt に従って変換された文字列を返します。 第1引数 fmt には指示子を含む文字列を与えます。 指示子には「%」を用います。 % を用いたい場合は 「%%」と記述します。 指示子に関しての詳細や用例に関しては dcstringsprintf.f90 を参照ください。
The entity is dcstringcprintf.f90#DCStringCPrintf
| Constant : | |||
| DP = kind(0.0d0) : | integer, parameter 
 | 
The entity is dc_types#DP
| Function : | |
| result : | integer | 
| string : | character(len = *), intent(in) | 
| start : | integer, intent(in) | 
| substr : | character(len = *), intent(in) | 
文字列 string の start 文字目以降の文字列の中に substr の文字列が含まれている時、その開始文字位置を返します。 含まれない場合は 0 を返します。 返される開始文字位置は文字列 string の先頭から数えます。
  integer function Index_Ofs(string, start, substr) result(result)
    !
    ! 文字列 string の start 文字目以降の文字列の中に substr
    ! の文字列が含まれている時、その開始文字位置を返します。
    ! 含まれない場合は 0 を返します。
    ! 返される開始文字位置は文字列 string の先頭から数えます。
    !
    character(len = *), intent(in):: string
    integer, intent(in):: start
    character(len = *), intent(in):: substr
    intrinsic index
    if (start < 1) then
      result = 0
      return
    endif
    result = index(string(start: ), substr)
    if (result == 0) return
    result = start + result - 1
  end function Index_Ofs
          | Function : | |
| result : | character(STRING) | 
| carray(:) : | character(*) , intent(in) | 
| expr : | character(*) , intent(in), optional | 
文字型配列 carray に与えた複数の文字列をカンマと空白 「, 」 で区切った1つの文字列にして返します。 expr に文字列を与えると、その文字列を区切り文字として用います。
  character(STRING) function JoinChar(carray, expr) result(result)
    !
    ! 文字型配列 carray に与えた複数の文字列をカンマと空白
    ! 「<tt>, </tt>」 で区切った1つの文字列にして返します。
    ! expr に文字列を与えると、その文字列を区切り文字として用います。
    !
    character(*)     , intent(in)           :: carray(:)
    character(*)     , intent(in), optional :: expr
    character(2)     ,parameter :: default = ', '
    character(STRING)           :: delimiter
    integer                     :: dellen, i
  continue
    if ( present(expr) ) then
      delimiter = expr
      dellen = len(expr)
    else
      delimiter = default
      dellen = len(default)
    endif
    if (size(carray) <= 0) then
      result = ""
      return
    endif
    result = trim(carray(1))
    do, i = 2, size(carray)
      result = trim(result) // delimiter(1:dellen) // trim(carray(i))
    enddo
  end function JoinChar
          | Function : | |
| result : | character(STRING) | 
| ch : | character(len = *), intent(in) | 
文字列 ch に英字が含まれる場合、その英字を小文字に変換して返します。 英字でない文字や既に小文字になっている文字はそのまま返します。
  character(STRING) function LChar(ch) result(result)
    !
    ! 文字列 ch に英字が含まれる場合、その英字を小文字に変換して返します。
    ! 英字でない文字や既に小文字になっている文字はそのまま返します。
    !
    character(len = *), intent(in):: ch
  continue
    result = ch
    call toLower(result)
  end function LChar
          | Subroutine : | |
| unit : | integer, intent(in), optional | 
| fmt : | character(*), intent(in) | 
| i(:) : | integer, intent(in), optional | 
| r(:) : | real, intent(in), optional | 
| d(:) : | real(DP), intent(in), optional | 
| L(:) : | logical, intent(in), optional | 
| s(:) : | type(VSTRING), intent(in), optional | 
| n(:) : | integer, intent(in), optional | 
| c1 : | character(*), intent(in), optional | 
| c2 : | character(*), intent(in), optional | 
| c3 : | character(*), intent(in), optional | 
| ca(:) : | character(*), intent(in), optional | 
フォーマット文字列 fmt に従って変換された文字列を 装置番号 unit に返します。unit を省略する場合には標準出力に返します。 第2引数 fmt には指示子を含む文字列を与えます。 指示子には「%」を用います。 % を用いたい場合は 「%%」と記述します。 指示子および用例に関しての詳細は dcstringsprintf.f90 を参照ください。
The entity is dcstringfprintf.f90#DCStringFPrintf
| Subroutine : | |
| unit : | character(*), intent(out) | 
| fmt : | character(*), intent(in) | 
| i(:) : | integer, intent(in), optional | 
| r(:) : | real, intent(in), optional | 
| d(:) : | real(DP), intent(in), optional | 
| L(:) : | logical, intent(in), optional | 
| s(:) : | type(VSTRING), intent(in), optional | 
| n(:) : | integer, intent(in), optional | 
| c1 : | character(*), intent(in), optional | 
| c2 : | character(*), intent(in), optional | 
| c3 : | character(*), intent(in), optional | 
| ca(:) : | character(*), intent(in), optional | 
フォーマット文字列 fmt に従って変換された文字列を unit に返します。 第2引数 fmt には指示子を含む文字列を与えます。 指示子には「%」を用います。 % を用いたい場合は 「%%」と記述します。 指示子および用例に関しての詳細は dcstringsprintf.f90 を参照ください。
The entity is dcstringsprintf.f90#DCStringSPrintf
| Function : | |
| result : | character(len = STRLEN) | 
| string : | character(len = *), intent(in) | 
| from : | character(len = *), intent(in) | 
| to : | character(len = *), intent(in) | 
文字列 string に文字列 from が含まれる場合、その部分を文字列 to に置換して返します。文字列 from が含まれない場合は string をそのまま返します。 from が複数含まれる場合、先頭の from のみが置換されます。
  function Replace(string, from, to) result(result)
    !
    ! 文字列 string に文字列 from が含まれる場合、その部分を文字列 to
    ! に置換して返します。文字列 from が含まれない場合は string
    ! をそのまま返します。 from が複数含まれる場合、先頭の from
    ! のみが置換されます。
    !
    use dc_types, only: STRLEN => STRING
    implicit none
    character(len = STRLEN):: result
    character(len = *), intent(in):: string, from, to
    integer:: i, isa, isb, iea, ieb
  continue
    result = string
    i = index(result, from)
    if (i == 0) return
    isa = i + len(from)
    isb = i + len(to)
    if (len(to) < len(from)) then
      iea = len(result)
      ieb = len(result) + len(to) - len(from)
    else
      iea = len(result) + len(from) - len(to)
      ieb = len(result)
    endif
    if (len(to) /= len(from)) result(isb:ieb) = result(isa:iea)
    result(i:i+len(to)-1) = to
  end function Replace
          | Constant : | |||
| STRING = 500 : | integer, parameter 
 | 
The entity is dc_types#STRING
| Subroutine : | |||
| str : | character(*), intent(in) | ||
| carray(:) : | character(*), pointer 
 | ||
| sep : | character(*), intent(in) | ||
| limit : | integer, intent(in), optional | 
str で与えられた文字列を sep で分解し, ポインタ配列 carray に返す. carray が割り付けられている 場合, エラーを返す. limit に正の数を与えた場合, 最大 limit 個のフィールドに分割する. 負の数や 0 の場合は省略した場合と同じ. str の末尾の空白は除去される. sep に空文字を代入する場合, 空白文字で分割される.
  subroutine Split_CC(str, carray, sep, limit)
    !
    ! str で与えられた文字列を sep で分解し,
    ! ポインタ配列 carray に返す. carray が割り付けられている
    ! 場合, エラーを返す. limit に正の数を与えた場合,
    ! 最大 limit 個のフィールドに分割する.
    ! 負の数や 0 の場合は省略した場合と同じ.
    ! str の末尾の空白は除去される.
    ! sep に空文字を代入する場合, 空白文字で分割される.
    !
    use dc_types, only: STRING
    implicit none
    character(*), intent(in):: str
    character(*), pointer:: carray(:) !(out)
    character(*), intent(in):: sep
    integer, intent(in), optional:: limit
    integer :: num, cur, i, limitnum
    character(STRING) :: substr
    logical :: end_flag
  continue
    if (present(limit)) then
      if (limit > 0) then
        limitnum = limit
      else
        limitnum = 0
      end if
    else
      limitnum = 0
    end if
    if (len(trim(sep)) == 0) then
      num = 1
      substr = str
      ! 重複して無駄だが carray を allocate するため, 何分割するか
      ! 調べ, num に格納する.
      do
        cur = index(trim(substr), ' ')
        if (cur == 0) exit
        num = num + 1
        substr = adjustl(substr(cur + len(sep) :len(substr)))
      end do
      if (limitnum /= 0 .and. num > limitnum) num = limitnum
      allocate(carray(num))
      substr = str
      end_flag = .false.
      do i = 1, num
        cur = index(trim(substr), ' ')
        if (cur == 0 .or. i == num) end_flag = .true.
        if (end_flag) then
          carray(i) = substr
          exit
        else
          carray(i) = substr(1:cur - 1)
        end if
        substr = adjustl(substr(cur + len(sep) :len(substr)))
      end do
    else
      num = 1
      substr = str
      ! 重複して無駄だが carray を allocate するため, 何分割するか
      ! 調べ, num に格納する.
      do
        cur = index(substr, trim(sep))
        if (cur == 0) exit
        num = num + 1
        substr = substr(cur + len(sep) :len(substr))
      end do
      if (limitnum /= 0 .and. num > limitnum) num = limitnum
      allocate(carray(num))
      substr = str
      end_flag = .false.
      do i = 1, num
        cur = index(substr, trim(sep))
        if (cur == 0 .or. i == num) end_flag = .true.
        if (end_flag) then
          carray(i) = substr
          exit
        else
          carray(i) = substr(1:cur - 1)
        end if
        substr = substr(cur + len(sep) :len(substr))
      end do
    end if
    return
  end subroutine Split_CC
          | Function : | |
| result(1) : | character(STRING) | 
| c1 : | character(*), intent(in) | 
異なる長さの複数の文字型変数を 1 つの文字型配列に変換します。
1 から 12 個までの引数を与えることが可能です。
  function Str_to_Array1(c1) result(result)
    !
    ! 異なる長さの複数の文字型変数を 1 つの文字型配列に変換します。
    !
    ! 1 から 12 個までの引数を与えることが可能です。
    !
    character(*), intent(in) :: c1
    character(STRING) :: result(1)
  continue
    result(1) = c1
  end function Str_to_Array1
          | Function : | |
| result(2) : | character(STRING) | 
| c1 : | character(*), intent(in) | 
| c2 : | character(*), intent(in) | 
異なる長さの複数の文字型変数を 1 つの文字型配列に変換します。
1 から 12 個までの引数を与えることが可能です。
  function Str_to_Array2(c1, c2) result(result)
    !
    ! 異なる長さの複数の文字型変数を 1 つの文字型配列に変換します。
    !
    ! 1 から 12 個までの引数を与えることが可能です。
    !
    character(*), intent(in) :: c1, c2
    character(STRING) :: result(2)
  continue
    result(1) = c1
    result(2) = c2
  end function Str_to_Array2
          | Function : | |
| result(3) : | character(STRING) | 
| c1 : | character(*), intent(in) | 
| c2 : | character(*), intent(in) | 
| c3 : | character(*), intent(in) | 
異なる長さの複数の文字型変数を 1 つの文字型配列に変換します。
1 から 12 個までの引数を与えることが可能です。
  function Str_to_Array3(c1, c2, c3) result(result)
    !
    ! 異なる長さの複数の文字型変数を 1 つの文字型配列に変換します。
    !
    ! 1 から 12 個までの引数を与えることが可能です。
    !
    character(*), intent(in) :: c1, c2, c3
    character(STRING) :: result(3)
  continue
    result(1) = c1
    result(2) = c2
    result(3) = c3
  end function Str_to_Array3
          | Function : | |
| result(4) : | character(STRING) | 
| c1 : | character(*), intent(in) | 
| c2 : | character(*), intent(in) | 
| c3 : | character(*), intent(in) | 
| c4 : | character(*), intent(in) | 
異なる長さの複数の文字型変数を 1 つの文字型配列に変換します。
1 から 12 個までの引数を与えることが可能です。
  function Str_to_Array4(c1, c2, c3, c4) result(result)
    !
    ! 異なる長さの複数の文字型変数を 1 つの文字型配列に変換します。
    !
    ! 1 から 12 個までの引数を与えることが可能です。
    !
    character(*), intent(in) :: c1, c2, c3, c4
    character(STRING) :: result(4)
  continue
    result(1) = c1
    result(2) = c2
    result(3) = c3
    result(4) = c4
  end function Str_to_Array4
          | Function : | |
| result(5) : | character(STRING) | 
| c1 : | character(*), intent(in) | 
| c2 : | character(*), intent(in) | 
| c3 : | character(*), intent(in) | 
| c4 : | character(*), intent(in) | 
| c5 : | character(*), intent(in) | 
異なる長さの複数の文字型変数を 1 つの文字型配列に変換します。
1 から 12 個までの引数を与えることが可能です。
  function Str_to_Array5(c1, c2, c3, c4, c5) result(result)
    !
    ! 異なる長さの複数の文字型変数を 1 つの文字型配列に変換します。
    !
    ! 1 から 12 個までの引数を与えることが可能です。
    !
    character(*), intent(in) :: c1, c2, c3, c4, c5
    character(STRING) :: result(5)
  continue
    result(1) = c1
    result(2) = c2
    result(3) = c3
    result(4) = c4
    result(5) = c5
  end function Str_to_Array5
          | Function : | |
| result(6) : | character(STRING) | 
| c1 : | character(*), intent(in) | 
| c2 : | character(*), intent(in) | 
| c3 : | character(*), intent(in) | 
| c4 : | character(*), intent(in) | 
| c5 : | character(*), intent(in) | 
| c6 : | character(*), intent(in) | 
異なる長さの複数の文字型変数を 1 つの文字型配列に変換します。
1 から 12 個までの引数を与えることが可能です。
  function Str_to_Array6(c1, c2, c3, c4, c5, c6) result(result)
    !
    ! 異なる長さの複数の文字型変数を 1 つの文字型配列に変換します。
    !
    ! 1 から 12 個までの引数を与えることが可能です。
    !
    character(*), intent(in) :: c1, c2, c3, c4, c5, c6
    character(STRING) :: result(6)
  continue
    result(1) = c1
    result(2) = c2
    result(3) = c3
    result(4) = c4
    result(5) = c5
    result(6) = c6
  end function Str_to_Array6
          | Function : | |
| result(7) : | character(STRING) | 
| c1 : | character(*), intent(in) | 
| c2 : | character(*), intent(in) | 
| c3 : | character(*), intent(in) | 
| c4 : | character(*), intent(in) | 
| c5 : | character(*), intent(in) | 
| c6 : | character(*), intent(in) | 
| c7 : | character(*), intent(in) | 
異なる長さの複数の文字型変数を 1 つの文字型配列に変換します。
1 から 12 個までの引数を与えることが可能です。
  function Str_to_Array7(c1, c2, c3, c4, c5, c6, c7) result(result)
    !
    ! 異なる長さの複数の文字型変数を 1 つの文字型配列に変換します。
    !
    ! 1 から 12 個までの引数を与えることが可能です。
    !
    character(*), intent(in) :: c1, c2, c3, c4, c5, c6, c7
    character(STRING) :: result(7)
  continue
    result(1) = c1
    result(2) = c2
    result(3) = c3
    result(4) = c4
    result(5) = c5
    result(6) = c6
    result(7) = c7
  end function Str_to_Array7
          | Function : | |
| result(8) : | character(STRING) | 
| c1 : | character(*), intent(in) | 
| c2 : | character(*), intent(in) | 
| c3 : | character(*), intent(in) | 
| c4 : | character(*), intent(in) | 
| c5 : | character(*), intent(in) | 
| c6 : | character(*), intent(in) | 
| c7 : | character(*), intent(in) | 
| c8 : | character(*), intent(in) | 
異なる長さの複数の文字型変数を 1 つの文字型配列に変換します。
1 から 12 個までの引数を与えることが可能です。
  function Str_to_Array8(c1, c2, c3, c4, c5, c6, c7, c8) result(result)
    !
    ! 異なる長さの複数の文字型変数を 1 つの文字型配列に変換します。
    !
    ! 1 から 12 個までの引数を与えることが可能です。
    !
    character(*), intent(in) :: c1, c2, c3, c4, c5, c6, c7, c8
    character(STRING) :: result(8)
  continue
    result(1) = c1
    result(2) = c2
    result(3) = c3
    result(4) = c4
    result(5) = c5
    result(6) = c6
    result(7) = c7
    result(8) = c8
  end function Str_to_Array8
          | Function : | |
| result(9) : | character(STRING) | 
| c1 : | character(*), intent(in) | 
| c2 : | character(*), intent(in) | 
| c3 : | character(*), intent(in) | 
| c4 : | character(*), intent(in) | 
| c5 : | character(*), intent(in) | 
| c6 : | character(*), intent(in) | 
| c7 : | character(*), intent(in) | 
| c8 : | character(*), intent(in) | 
| c9 : | character(*), intent(in) | 
異なる長さの複数の文字型変数を 1 つの文字型配列に変換します。
1 から 12 個までの引数を与えることが可能です。
  function Str_to_Array9(c1, c2, c3, c4, c5, c6, c7, c8, c9) result(result)
    !
    ! 異なる長さの複数の文字型変数を 1 つの文字型配列に変換します。
    !
    ! 1 から 12 個までの引数を与えることが可能です。
    !
    character(*), intent(in) :: c1, c2, c3, c4, c5, c6, c7, c8, c9
    character(STRING) :: result(9)
  continue
    result(1) = c1
    result(2) = c2
    result(3) = c3
    result(4) = c4
    result(5) = c5
    result(6) = c6
    result(7) = c7
    result(8) = c8
    result(9) = c9
  end function Str_to_Array9
          | Function : | |
| result(10) : | character(STRING) | 
| c1 : | character(*), intent(in) | 
| c2 : | character(*), intent(in) | 
| c3 : | character(*), intent(in) | 
| c4 : | character(*), intent(in) | 
| c5 : | character(*), intent(in) | 
| c6 : | character(*), intent(in) | 
| c7 : | character(*), intent(in) | 
| c8 : | character(*), intent(in) | 
| c9 : | character(*), intent(in) | 
| c10 : | character(*), intent(in) | 
異なる長さの複数の文字型変数を 1 つの文字型配列に変換します。
1 から 12 個までの引数を与えることが可能です。
  function Str_to_Array10(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10) result(result)
    !
    ! 異なる長さの複数の文字型変数を 1 つの文字型配列に変換します。
    !
    ! 1 から 12 個までの引数を与えることが可能です。
    !
    character(*), intent(in) :: c1, c2, c3, c4, c5, c6, c7, c8, c9, c10
    character(STRING) :: result(10)
  continue
    result(1) = c1
    result(2) = c2
    result(3) = c3
    result(4) = c4
    result(5) = c5
    result(6) = c6
    result(7) = c7
    result(8) = c8
    result(9) = c9
    result(10) = c10
  end function Str_to_Array10
          | Function : | |
| result(11) : | character(STRING) | 
| c1 : | character(*), intent(in) | 
| c2 : | character(*), intent(in) | 
| c3 : | character(*), intent(in) | 
| c4 : | character(*), intent(in) | 
| c5 : | character(*), intent(in) | 
| c6 : | character(*), intent(in) | 
| c7 : | character(*), intent(in) | 
| c8 : | character(*), intent(in) | 
| c9 : | character(*), intent(in) | 
| c10 : | character(*), intent(in) | 
| c11 : | character(*), intent(in) | 
異なる長さの複数の文字型変数を 1 つの文字型配列に変換します。
1 から 12 個までの引数を与えることが可能です。
  function Str_to_Array11(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11) result(result)
    !
    ! 異なる長さの複数の文字型変数を 1 つの文字型配列に変換します。
    !
    ! 1 から 12 個までの引数を与えることが可能です。
    !
    character(*), intent(in) :: c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11
    character(STRING) :: result(11)
  continue
    result(1) = c1
    result(2) = c2
    result(3) = c3
    result(4) = c4
    result(5) = c5
    result(6) = c6
    result(7) = c7
    result(8) = c8
    result(9) = c9
    result(10) = c10
    result(11) = c11
  end function Str_to_Array11
          | Function : | |
| result(12) : | character(STRING) | 
| c1 : | character(*), intent(in) | 
| c2 : | character(*), intent(in) | 
| c3 : | character(*), intent(in) | 
| c4 : | character(*), intent(in) | 
| c5 : | character(*), intent(in) | 
| c6 : | character(*), intent(in) | 
| c7 : | character(*), intent(in) | 
| c8 : | character(*), intent(in) | 
| c9 : | character(*), intent(in) | 
| c10 : | character(*), intent(in) | 
| c11 : | character(*), intent(in) | 
| c12 : | character(*), intent(in) | 
異なる長さの複数の文字型変数を 1 つの文字型配列に変換します。
1 から 12 個までの引数を与えることが可能です。
  function Str_to_Array12(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12) result(result)
    !
    ! 異なる長さの複数の文字型変数を 1 つの文字型配列に変換します。
    !
    ! 1 から 12 個までの引数を与えることが可能です。
    !
    character(*), intent(in) :: c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12
    character(STRING) :: result(12)
  continue
    result(1) = c1
    result(2) = c2
    result(3) = c3
    result(4) = c4
    result(5) = c5
    result(6) = c6
    result(7) = c7
    result(8) = c8
    result(9) = c9
    result(10) = c10
    result(11) = c11
    result(12) = c12
  end function Str_to_Array12
          | Function : | |
| result : | real(DP) | 
| string : | character(len = *), intent(in) | 
string で与えられる文字型変数を、倍精度実数型変数にして返します。 もしも string が数値に変換できない場合、0.0 が返ります。
  real(DP) function atod_scalar(string) result(result)
    !
    ! string で与えられる文字型変数を、倍精度実数型変数にして返します。
    ! もしも string が数値に変換できない場合、0.0 が返ります。
    !
    character(len = *), intent(in):: string
    integer:: ios
    character(len = 80):: buffer
    integer:: ipoint, iexp
    intrinsic scan
  continue
    buffer = string
    ! もし整定数をいれてしまった場合は小数点を附加
    if (index(buffer, '.') == 0) then
      iexp = scan(buffer, "eEdD")
      if (iexp /= 0) then
        buffer(iexp+1: len(buffer)) = buffer(iexp: len(buffer)-1)
        ipoint = iexp
      else
        ipoint = len_trim(buffer) + 1
      endif
      buffer(ipoint: ipoint) = '.'
    endif
    read(unit=buffer, fmt="(g80.10)", iostat=ios) result
    if (ios /= 0) result = 0.0
  end function atod_scalar
          | Function : | |
| result : | integer | 
| string : | character(len = *), intent(in) | 
| default : | integer, intent(in), optional | 
string で与えられる文字型変数を、整数型変数にして返します。 もしも string が数値に変換できない場合、default が返ります。 default を指定しない場合は 0 が返ります。
  integer function atoi_scalar(string, default) result(result)
    !
    ! string で与えられる文字型変数を、整数型変数にして返します。
    ! もしも string が数値に変換できない場合、default が返ります。
    ! default を指定しない場合は 0 が返ります。
    !
    character(len = *), intent(in):: string
    integer, intent(in), optional:: default
    integer:: ios
  continue
    read(unit=string, fmt="(i80)", iostat=ios) result
    if (ios /= 0) then
      if (present(default)) then
        result = default
      else
        result = 0
      endif
    endif
  end function atoi_scalar
          | Function : | |
| result : | logical | 
| whole : | character(len = *), intent(in) | 
| head : | character(len = *), intent(in) | 
文字列 head と文字列 whole の先頭部分 (head と同じ文字列長) とを比較し、同じものならば .true. を、異なる場合には .false. を返します。 whole の文字列長が head の文字列長よりも短い場合には .false. を返します。
  logical function StrHead_CC(whole, head) result(result)
    !
    ! 文字列 head と文字列 whole の先頭部分 (head と同じ文字列長)
    ! とを比較し、同じものならば .true. を、異なる場合には .false.
    ! を返します。 whole の文字列長が head の文字列長よりも短い場合には
    ! .false. を返します。
    !
    character(len = *), intent(in):: whole
    character(len = *), intent(in):: head
  continue
    result = (len(whole) >= len(head))
    if (.not. result) return
    result = (whole(1:len(head)) == head)
  end function StrHead_CC
          | Function : | |
| result : | logical | 
| string : | character(len = *), intent(in) | 
string で与えられる文字型変数を論理型にして返します。 string が空、 または 0、 0.0、 0.0D0、 0.0d0、 .false.、 .FALSE.、 f、 F、 false、 FALSE の場合には .false. が返ります。 それ以外の場合には .true. が返ります。
  logical function str2bool(string) result(result)
    !
    ! string で与えられる文字型変数を論理型にして返します。 string 
    ! が空、 または 0、 0.0、 0.0D0、 0.0d0、 .false.、 .FALSE.、 f、
    ! F、 false、 FALSE の場合には <tt>.false.</tt> が返ります。
    ! それ以外の場合には <tt>.true.</tt> が返ります。
    !
    character(len = *), intent(in):: string
  continue
    select case(string)
    case ("", "0", "0.0", "0.0D0", "0.0d0", ".false.", ".FALSE.",  "f", "F", "false", "FALSE")
      result = .false.
    case default
      result = .true.
    end select
  end function str2bool
          | Function : | |
| result : | logical | 
| string_a : | character(len = *), intent(in) | 
| string_b : | character(len = *), intent(in) | 
大文字・小文字を無視して文字列の比較を行います。 文字列 string_a と文字列 string_b を比較し、同じものならば .true. を、異なる場合には .false. を返します。
  logical function StriEq_cc(string_a, string_b) result(result)
    !
    ! 大文字・小文字を無視して文字列の比較を行います。
    ! 文字列 string_a と文字列 string_b を比較し、同じものならば
    ! .true. を、異なる場合には .false. を返します。
    !
    !
    character(len = *), intent(in):: string_a
    character(len = *), intent(in):: string_b
    character(len = STRING):: abuf
    character(len = STRING):: bbuf
!!$        character(len = len(string_a)):: abuf
!!$        character(len = len(string_b)):: bbuf
    abuf = string_a
    bbuf = string_b
    call toUpper(abuf)
    call toUpper(bbuf)
    result = (abuf == bbuf)
  end function StriEq_cc
          | Constant : | |||
| TOKEN = 32 : | integer, parameter 
 | 
The entity is dc_types#TOKEN
| Function : | |
| result : | character(STRING) | 
| ch : | character(len = *), intent(in) | 
文字列 ch に英字が含まれる場合、その英字を大文字に変換して返します。 英字でない文字や既に大文字になっている文字はそのまま返します。
  character(STRING) function UChar(ch) result(result)
    !
    ! 文字列 ch に英字が含まれる場合、その英字を大文字に変換して返します。
    ! 英字でない文字や既に大文字になっている文字はそのまま返します。
    !
    character(len = *), intent(in):: ch
  continue
    result = ch
    call toUpper(result)
  end function UChar
          | Subroutine : | |||
| int_ptr(:) : | integer, pointer 
 | ||
| string : | character(len = *), intent(in) | 
string で与えられる文字型変数をカンマ「,」で区切り、 整数型配列ポインタ int_ptr(:) にして返します。 int_ptr(:) の配列サイズは string の内容に応じて自動的に決まります。
ただし、int_ptr(:) は必ず空状態または不定状態で与えてください。 既に割り付けられている場合、メモリリークを起こします。
  subroutine str2ip(int_ptr, string)
    !
    ! string で与えられる文字型変数をカンマ「,」で区切り、
    ! 整数型配列ポインタ int_ptr(:) にして返します。 int_ptr(:)
    ! の配列サイズは string の内容に応じて自動的に決まります。
    !
    ! ただし、int_ptr(:) は必ず空状態または不定状態で与えてください。
    ! 既に割り付けられている場合、メモリリークを起こします。
    !
    integer, pointer:: int_ptr(:) !(out)
    character(len = *), intent(in):: string
    integer:: i, j, idx, nvalues
  continue
    nvalues = 1
    i = 1
    do
      idx = index(string(i: ), ',')
      if (idx == 0) exit
      i = i + idx - 1 + 1 
      nvalues = nvalues + 1
    enddo
    allocate(int_ptr(nvalues))
    i = 1
    j = 1
    do
      idx = index(string(i: ), ',')
      if (idx == 0) then
        int_ptr(j) = stoi(string(i: ))
        exit
      endif
      int_ptr(j) = stod(string(i: i+idx-2))
      i = i + idx - 1 + 1 
      j = j + 1
    enddo
  end subroutine str2ip
          | Subroutine : | |||
| real_ptr(:) : | real(DP), pointer 
 | ||
| string : | character(len = *), intent(in) | 
string で与えられる文字型変数をカンマ「,」で区切り、 倍精度実数型配列ポインタ real_ptr(:) にして返します。 real_ptr(:) の配列サイズは string の内容に応じて自動的に決まります。
ただし、real_ptr(:) は必ず空状態または不定状態で与えてください。 既に割り付けられている場合、メモリリークを起こします。
  subroutine str2dp(real_ptr, string)
    !
    ! string で与えられる文字型変数をカンマ「,」で区切り、
    ! 倍精度実数型配列ポインタ real_ptr(:) にして返します。
    ! real_ptr(:) の配列サイズは string の内容に応じて自動的に決まります。
    !
    ! ただし、real_ptr(:) は必ず空状態または不定状態で与えてください。
    ! 既に割り付けられている場合、メモリリークを起こします。
    !
    real(DP), pointer:: real_ptr(:) !(out)
    character(len = *), intent(in):: string
    integer:: i, j, idx, nvalues
  continue
    nvalues = 1
    i = 1
    do
      idx = index(string(i: ), ',')
      if (idx == 0) exit
      i = i + idx - 1 + 1 
      nvalues = nvalues + 1
    enddo
    allocate(real_ptr(nvalues))
    i = 1
    j = 1
    do
      idx = index(string(i: ), ',')
      if (idx == 0) then
        real_ptr(j) = stod(string(i: ))
        exit
      endif
      real_ptr(j) = stod(string(i: i+idx-2))
      i = i + idx - 1 + 1 
      j = j + 1
    enddo
  end subroutine str2dp
          | Subroutine : | |||
| real_ptr(:) : | real, pointer 
 | ||
| string : | character(len = *), intent(in) | 
string で与えられる文字型変数をカンマ「,」で区切り、 単精度実数型配列ポインタ real_ptr(:) にして返します。 real_ptr(:) の配列サイズは string の内容に応じて自動的に決まります。
ただし、real_ptr(:) は必ず空状態または不定状態で与えてください。 既に割り付けられている場合、メモリリークを起こします。
  subroutine str2rp(real_ptr, string)
    !
    ! string で与えられる文字型変数をカンマ「,」で区切り、
    ! 単精度実数型配列ポインタ real_ptr(:) にして返します。
    ! real_ptr(:) の配列サイズは string の内容に応じて自動的に決まります。
    !
    ! ただし、real_ptr(:) は必ず空状態または不定状態で与えてください。
    ! 既に割り付けられている場合、メモリリークを起こします。
    !
    real, pointer:: real_ptr(:) !(out)
    character(len = *), intent(in):: string
    integer:: i, j, idx, nvalues
  continue
    nvalues = 1
    i = 1
    do
      idx = index(string(i: ), ',')
      if (idx == 0) exit
      i = i + idx - 1 + 1 
      nvalues = nvalues + 1
    enddo
    allocate(real_ptr(nvalues))
    i = 1
    j = 1
    do
      idx = index(string(i: ), ',')
      if (idx == 0) then
        real_ptr(j) = stod(string(i: ))
        exit
      endif
      real_ptr(j) = stod(string(i: i+idx-2))
      i = i + idx - 1 + 1 
      j = j + 1
    enddo
  end subroutine str2rp
          | Function : | |
| result : | character(TOKEN) | 
| d : | real(DP), intent(in) | 
倍精度実数型変数 d で与えられる数値を文字型変数にして返します。 配列が与えられる場合、各要素をカンマと空白「, 」 で区切って返します。
  character(TOKEN) function dtoa_scalar(d) result(result)
    !
    ! 倍精度実数型変数 d で与えられる数値を文字型変数にして返します。
    ! 配列が与えられる場合、各要素をカンマと空白「<tt>, </tt>」
    ! で区切って返します。
    !
    real(DP), intent(in):: d
    character(len = 32):: buffer
  continue
    write(unit=buffer, fmt="(g32.24)") d
    result = adjustl(buffer)
  end function dtoa_scalar
          | Function : | |
| result : | character(STRING) | 
| dbuf(:) : | real(DP), intent(in) | 
倍精度実数型配列 dbuf(:) で与えられる数値を文字型変数にして返します。 配列が与えられる場合、各要素をカンマと空白「, 」 で区切って返します。
  character(STRING) function dtoa_array(dbuf) result(result)
    !
    ! 倍精度実数型配列 dbuf(:) で与えられる数値を文字型変数にして返します。
    ! 配列が与えられる場合、各要素をカンマと空白「<tt>, </tt>」
    ! で区切って返します。
    !
    real(DP), intent(in):: dbuf(:)
    integer:: i
  continue
    if (size(dbuf) <= 0) then
      result = ""
      return
    endif
    result = toChar(dbuf(1))
    do, i = 2, size(dbuf)
      result = trim(result) // ", " // trim(toChar(dbuf(i)))
    enddo
  end function dtoa_array
          | Function : | |
| result : | character(TOKEN) | 
| i : | integer, intent(in) | 
整数型変数 i で与えられる数値を文字型変数にして返します。 配列が与えられる場合、各要素をカンマと空白「, 」 で区切って返します。
  character(TOKEN) function itoa_scalar(i) result(result)
    !
    ! 整数型変数 i で与えられる数値を文字型変数にして返します。
    ! 配列が与えられる場合、各要素をカンマと空白「<tt>, </tt>」
    ! で区切って返します。
    !
    integer, intent(in):: i
    character(len = 32):: buffer
  continue
    write(unit=buffer, fmt="(i20)") i
    result = adjustl(buffer)
  end function itoa_scalar
          | Function : | |
| result : | character(STRING) | 
| ibuf(:) : | integer, intent(in) | 
整数型配列変数 ibuf(:) で与えられる数値を文字型変数にして返します。 配列が与えられる場合、各要素をカンマと空白「, 」 で区切って返します。
  character(STRING) function itoa_array(ibuf) result(result)
    !
    ! 整数型配列変数 ibuf(:) で与えられる数値を文字型変数にして返します。
    ! 配列が与えられる場合、各要素をカンマと空白「<tt>, </tt>」
    ! で区切って返します。
    !
    integer, intent(in):: ibuf(:)
    integer:: i
  continue
    if (size(ibuf) <= 0) then
      result = ""
      return
    endif
    result = toChar(ibuf(1))
    do, i = 2, size(ibuf)
      result = trim(result) // ", " // trim(toChar(ibuf(i)))
    enddo
  end function itoa_array
          | Function : | |
| result : | character(TOKEN) | 
| l : | logical, intent(in) | 
論理型変数 l で与えられる数値を文字型変数にして返します。 配列が与えられる場合、各要素をカンマと空白「, 」 で区切って返します。
  character(TOKEN) function ltoa_scalar(l) result(result)
    !
    ! 論理型変数 l で与えられる数値を文字型変数にして返します。
    ! 配列が与えられる場合、各要素をカンマと空白「<tt>, </tt>」
    ! で区切って返します。
    !
    logical, intent(in):: l
  continue
    if (l) then
      result = ".true."
    else
      result = ".false."
    end if
  end function ltoa_scalar
          | Function : | |
| result : | character(STRING) | 
| lbuf(:) : | logical, intent(in) | 
論理型配列 lbuf(:) で与えられる数値を文字型変数にして返します。 配列が与えられる場合、各要素をカンマと空白「, 」 で区切って返します。
  character(STRING) function ltoa_array(lbuf) result(result)
    !
    ! 論理型配列 lbuf(:) で与えられる数値を文字型変数にして返します。
    ! 配列が与えられる場合、各要素をカンマと空白「<tt>, </tt>」
    ! で区切って返します。
    !
    logical, intent(in):: lbuf(:)
    integer:: i
  continue
    if (size(lbuf) <= 0) then
      result = ""
      return
    endif
    result = toChar(lbuf(1))
    do, i = 2, size(lbuf)
      result = trim(result) // ", " // trim(toChar(lbuf(i)))
    enddo
  end function ltoa_array
          | Function : | |
| result : | character(STRING) | 
| rbuf(:) : | real, intent(in) | 
単精度実数型配列 rbuf(:)、で与えられる数値を文字型変数にして返します。 配列が与えられる場合、各要素をカンマと空白「, 」 で区切って返します。
  character(STRING) function rtoa_array(rbuf) result(result)
    !
    ! 単精度実数型配列 rbuf(:)、で与えられる数値を文字型変数にして返します。
    ! 配列が与えられる場合、各要素をカンマと空白「<tt>, </tt>」
    ! で区切って返します。
    !
    real, intent(in):: rbuf(:)
    integer:: i
  continue
    if (size(rbuf) <= 0) then
      result = ""
      return
    endif
    result = toChar(rbuf(1))
    do, i = 2, size(rbuf)
      result = trim(result) // ", " // trim(toChar(rbuf(i)))
    enddo
  end function rtoa_array
          | Function : | |
| result : | character(TOKEN) | 
| x : | real, intent(in) | 
単精度実数型変数 x で与えられる数値を文字型変数にして返します。 配列が与えられる場合、各要素をカンマと空白「, 」 で区切って返します。
  character(TOKEN) function rtoa_scalar(x) result(result)
    !
    ! 単精度実数型変数 x で与えられる数値を文字型変数にして返します。
    ! 配列が与えられる場合、各要素をカンマと空白「<tt>, </tt>」
    ! で区切って返します。
    !
    real, intent(in):: x
    character(len = 16):: buffer
  continue
    write(unit=buffer, fmt="(g16.8)") x
    result = adjustl(buffer)
  end function rtoa_scalar
          | Subroutine : | |
| ch : | character(len = *), intent(inout) | 
文字列 ch に英字が含まれる場合、その英字を小文字に変換して ch に返します。 英字でない文字や既に小文字になっている文字は そのまま返します。
  subroutine clower(ch)
    !
    ! 文字列 ch に英字が含まれる場合、その英字を小文字に変換して ch
    ! に返します。 英字でない文字や既に小文字になっている文字は
    ! そのまま返します。
    !
    character(len = *), intent(inout):: ch
    integer:: i, lch, idx
  continue
    lch = len(ch)
    do, i = 1, lch
      idx = ichar(ch(i:i))
      if (65 <= idx .and. idx <= 90) then
        ch(i:i)=char(idx + 32)
      end if
    end do
  end subroutine clower
          | Subroutine : | |
| ch : | character(len = *), intent(inout) | 
文字列 ch に英字が含まれる場合、その英字を大文字に変換して ch に返します。 英字でない文字や既に大文字になっている文字は そのまま返します。
  subroutine cupper(ch)
    !
    ! 文字列 ch に英字が含まれる場合、その英字を大文字に変換して ch
    ! に返します。 英字でない文字や既に大文字になっている文字は
    ! そのまま返します。
    !
    character(len = *), intent(inout):: ch
    integer:: i, lch, idx
  continue
    lch = len(ch)
    do, i = 1, lch
      idx = ichar(ch(i:i))
      if (97 <= idx .and. idx <= 122) then
        ch(i:i)=char(idx - 32)
      end if
    end do
  end subroutine cupper