FORTRAN続きです。
最後のパラメータの場合、改行するFORMATを指定するように改造しました。
takk@deb9:~$ cat echo4.f
PROGRAM echo
CHARACTER*100 ARGS
INTEGER N
N = IARGC()
DO 11111 I=1,N
CALL GETARG(I,ARGS)
IF(I.EQ.N) THEN
WRITE(*,33333) ARGS(1:INDEX(ARGS,' ')-1)
ELSE
WRITE(*,22222) ARGS(1:INDEX(ARGS,' '))
END IF
11111 CONTINUE
22222 FORMAT(A$)
33333 FORMAT(A)
STOP
END
takk@deb9:~$
実行してみます。
takk@deb9:~$ gfortran echo4.f -fdollar-ok takk@deb9:~$ ./a.out aaa bbb ccc aaa bbb ccc takk@deb9:~$
echoコマンドらしくなりました。次はオプションも指定できるように改造しましょう。
簡単なところから攻めていきたいので-nオプションぐらいにしておきます。echoで表示する文字列の改行をしないオプションです。パラメータに’-n’がある場合のみ有効にします。ちょうど最後のパラメータかどうかで、改行するしないを決めているので、分岐の条件を少しだけいじればいけそうです。
と思ったものの、FORTRANで文字列の比較ってどうやればよいのでしょう。IFで判定してみます。
takk@deb9:~$ cat strcmp.f
PROGRAM echo
CHARACTER*100 A,B,C
A='ABCDE'
B='ABCDE'
C='ABCDEF'
IF((A.EQ.B)) THEN
WRITE(*,*) 'TRUE'
ELSE
WRITE(*,*) 'FALSE'
END IF
IF((A.EQ.C)) THEN
WRITE(*,*) 'TRUE'
ELSE
WRITE(*,*) 'FALSE'
END IF
STOP
END
takk@deb9:~$
実行すると、
takk@deb9:~$ gfortran strcmp.f takk@deb9:~$ ./a.out TRUE FALSE takk@deb9:~$
AとBは一致しますので、TRUEと表示され、AとCは不一致なので、FALSEと表示されました。古い言語なのに、感で動くってすごいです。
ということで、-nオプションの判定も簡単そうなので、作ってみます。文字列の中から-nを見つけたら、改行しないフラグをONにするようにします。
このようなプログラムになりました。
takk@deb9:~$ cat echo5.f
PROGRAM echo
CHARACTER*100 ARGS
INTEGER N,NFLAG
NFLAG=0
N = IARGC()
DO 11111 I=1,N
CALL GETARG(I,ARGS)
IF((ARGS.EQ.'-n')) THEN
NFLAG = 1
END IF
IF((I.EQ.N) .AND. (NFLAG.EQ.0) ) THEN
WRITE(*,33333) ARGS(1:INDEX(ARGS,' ')-1)
ELSE
WRITE(*,22222) ARGS(1:INDEX(ARGS,' '))
END IF
11111 CONTINUE
22222 FORMAT(A$)
33333 FORMAT(A)
STOP
END
takk@deb9:~$
実行します。
takk@deb9:~$ gfortran echo5.f -fdollar-ok takk@deb9:~$ ./a.out aaa bbb ccc aaa bbb ccc takk@deb9:~$ ./a.out -n aaa bbb ccc -n aaa bbb ccc takk@deb9:~$
動いたように見えましたが、表示される文字列に-nが紛れ込んでしまいました。
続く。


コメント