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 |