gtool4/Fortran 90 document

gtool4/Fortran 90 チュートリアル

## ツールのプログラム解説

2001年10月10日 豊田英司

## はじめに

gtool4 のツールを改造したり、新しい処理をするツールを追加するための参考として、既存のツールのメインプログラムで行っている処理を解説します。なお、以下のような事情で実際のプログラムと異なることがあります。ご了承ください。

- ツールが少々旧弊な書き方をしている場合

- ツールの動作が親切すぎる場合

- 例を簡明にするためエラー処理を省いた場合

## 共通事項

### コマンドライン引数取得

すべてのツールはコマンドライン引数を使って処理を分岐しています。C ではすべてのコマンドライン引数に対するループを例1のように書きます。

例1
    main(int argc, char **argv)
    {
        int    i;

        for (i = 1; i < argc; i++) {
            /* argv[i] の処理 */
        }
    }

おなじ内容を gtool4 的 Fortran 90 プログラムでは例2のように書きます。

例2
    PROGRAM ARGLOOP
      USE GTOOL
      IMPLICIT NONE
      INTEGER:: I, ARGC
      CHARACTER(LEN = STRING):: ARG

      ARGC = GTArgCount()
      DO, I = 1, ARGC
        CALL GTArgGet(I, ARG)
        ! ARG の処理
      ENDDO
    END PROGRAM

なお、コマンドライン引数取得ルーチンには文字型を取得するもののほかに TYPE(VSTRING) 型を取得するものがありますが、本質的動作は変わりません。TYPE(VSTRING) 型は開発初期に用いられたもので、今はなるべく使わないようにするという方針ですので、もし用例を見かけてもそのまま真似しないでやってください。

### コマンドラインオプション

GTOOL3 ではコマンドライン引数はすべて形態と型の対応が決められており、ツール群ではコマンドライン引数を「名前=値」の形式の NAMELIST に変換してから READ 文で読み取る、というスタイルを用いることになっていました。このスタイルではすべての引数がオプションといえるでしょう。これに対し、UNIX コマンドは普通、省略可能なオプション引数と省略不可な引数の区別があるのが普通です。

gtool4 は現在のところ、UNIX コマンドの系譜上にあります。コマンドライン引数を順に取得して、オプションかどうか判定して処理する、というようなことをしています。この方式ではメインプログラムがやや長くなるのですが、利点として無限個の引数をとるプログラムが書けるということが挙げられます。

gtool4 では「-名前」「-名前=値」「名前=値」のような文字列をオプションとみなしています。オプションでない引数にも「=」が現れるため、オプションかどうかの判定は少し面倒です。そこで GTOptionForm サブルーチンを使っています（例3）。この論理型関数が真を返したときオプションとみなすことができます。

例3
    PROGRAM OPTLOOP
      USE GTOOL
      IMPLICIT NONE
      INTEGER:: I, ARGC
      CHARACTER(LEN = STRING):: ARG, OPTNAME, OPTVALUE

      ARGC = GTArgCount()
      DO, I = 1, ARGC
        CALL GTArgGet(I, ARG)
    　　IF (GTOptionForm(ARG, OPTNAME, OPTVALUE)) THEN
          IF (OPTNAME == '-debug') THEN
          ELSE IF ...
          ENDIF
        ELSE
        ! ARG の処理
        ENDIF
      ENDDO
    END PROGRAM

続き