FORTRAN(自作splitのデバッグその3)

SPLIT関数が直ったかどうか、コマンドにして確認してみます。

takk@deb9:~$ cat split3.f
      PROGRAM MAIN
        CHARACTER*100 ARGS
        CALL GETARG(1,ARGS)
        IF(ARGS(1:2).EQ.'-b') THEN
          CALL B_OPT(ARGS(3:))
        END IF
        STOP
      END

      SUBROUTINE B_OPT(B_OPT_STRING)
        CHARACTER*100 B_OPT_STRING
        CHARACTER*100 SSTRING1(10),SSTRING2(10)
        INTEGER I,SSIZE1,SSIZE2

        WRITE(*,*) B_OPT_STRING

        CALL SPLIT(B_OPT_STRING,',', SSTRING1,SSIZE1)
        WRITE(*,11100) SSIZE1
        DO 10100 I=1,SSIZE1
          WRITE(*,11300) SSTRING1(I)
          CALL SPLIT(SSTRING1(I),'-', SSTRING2,SSIZE2)
          WRITE(*,11200) SSIZE2
10100   CONTINUE
11100   FORMAT('SSIZE1=',I3)
11200   FORMAT('  SSIZE2=',I3)
11300   FORMAT('   STRING:',A)

        STOP
      END

      SUBROUTINE SPLIT(SRC,SEP,DEST,SPLIT_SIZE)
        CHARACTER*100 SRC
        CHARACTER*1 SEP
        CHARACTER*100 DEST(10)
        INTEGER IND,S1,S2,RSLT,SPLIT_SIZE
        IND = 0
        S2=-1
        I = 1
20100   RSLT = INDEX(SRC(IND+1:),SEP)
        IF(RSLT.NE.0) THEN
          S1 = IND+1
          IND = IND + RSLT
          S2 = IND-1
          DEST(I) = SRC(S1:S2)
          I = I + 1
          GOTO 20100
        END IF
        DEST(I) = SRC(S2+2:)
        SPLIT_SIZE = I
        RETURN
      END
takk@deb9:~$

使い方は、cutコマンドの-bオプションを指定するように./a.out -bの後に文字列を指定すればよいです。
テスト用のスクリプトを組みます。テスト内容は適当です。

takk@deb9:~$ cat split3-test.f
cmd=./a.out

$cmd -b1
echo

$cmd -b5
echo

$cmd -b1,2
echo

$cmd -b1,3,5
echo

$cmd -b2,4,5
echo


$cmd -b1-2
echo

$cmd -b2-5
echo

$cmd -b1-2,3
echo

$cmd -b1,2-4,5
echo

$cmd -b1-3,4-5
echo
takk@deb9:~$

スクリプト実行の結果に文字列のサイズ分空白で出てしまって見にくいので、空白はすべてtrでカットして実行しました。

takk@deb9:~$ . split3-test.sh | tr -d ' '
1
SSIZE1=1
STRING:1
SSIZE2=1

5
SSIZE1=1
STRING:5
SSIZE2=1

1,2
SSIZE1=2
STRING:1
SSIZE2=1
STRING:2
SSIZE2=1

1,3,5
SSIZE1=3
STRING:1
SSIZE2=1
STRING:3
SSIZE2=1
STRING:5
SSIZE2=1

2,4,5
SSIZE1=3
STRING:2
SSIZE2=1
STRING:4
SSIZE2=1
STRING:5
SSIZE2=1

1-2
SSIZE1=1
STRING:1-2
SSIZE2=2

2-5
SSIZE1=1
STRING:2-5
SSIZE2=2

1-2,3
SSIZE1=2
STRING:1-2
SSIZE2=2
STRING:3
SSIZE2=1

1,2-4,5
SSIZE1=3
STRING:1
SSIZE2=1
STRING:2-4
SSIZE2=2
STRING:5
SSIZE2=1

1-3,4-5
SSIZE1=2
STRING:1-3
SSIZE2=2
STRING:4-5
SSIZE2=2

takk@deb9:~$

いわゆるprintfデバッグというものでしょう。 結果も見にくいですが、一応合ってそうです。

Leave a Reply

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

CAPTCHA