前へ | 目次へ | 次へ

ツールのプログラム解説

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

前へ | 目次へ | 次へ