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が紛れ込んでしまいました。
続く。
コメント