FORTRAN(echoコマンドを作るその2)

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

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA