FORTRAN(cutコマンドを作るその5)

旧2-5. Fortran毎日学習

自作split関数もできたので、cutコマンド作成の続きをします。
-bオプションを解析して、抽出したい列番号を配列に格納する処理を作ります。

できたのがこれです。

takk@deb9:~$ cat -n cut5.f
     1        PROGRAM MAIN
     2          INTEGER DISP_LOC(100)
     3          CHARACTER*100 ARGS
     4          CALL GETARG(1,ARGS)
     5
     6          IF(ARGS(1:2).EQ.'-b') THEN
     7            CALL B_OPT(ARGS(3:),DISP_LOC)
     8          END IF
     9          STOP
    10        END
    11
    12        SUBROUTINE B_OPT(B_OPT_STRING,DISP_LOC)
    13          CHARACTER*100 B_OPT_STRING
    14          CHARACTER*100 SSTRING1(10),SSTRING2(10)
    15          INTEGER I,SSIZE1,SSIZE2,K,L,M
    16          INTEGER DISP_LOC(100)
    17          DO 10000 I=1,100
    18            DISP_LOC(I) = 0
    19  10000   CONTINUE
    20
    21          CALL SPLIT(B_OPT_STRING,',', SSTRING1,SSIZE1)
    22          DO 10200 I=1,SSIZE1
    23            CALL SPLIT(SSTRING1(I),'-', SSTRING2,SSIZE2)
    24            IF(SSIZE2.EQ.1) THEN
    25              READ(SSTRING1(I),*) L
    26              DISP_LOC(L) = 1
    27            ELSE
    28              READ(SSTRING2(1),*) L
    29              READ(SSTRING2(2),*) M
    30              DO 10100 K=L,M
    31                DISP_LOC(K) = 1
    32  10100       CONTINUE
    33            END IF
    34
    35  10200   CONTINUE
    36        END
    37

2行目のDISP_LOC配列は、-bで指定した配列番号に目印をつけるための変数です。
B_OPT関数内の17~19行目で初期化します。
24行目で、SSIZE2が1かどうか判定してますが、ハイフン入りかどうかをチェックし、ハイフン入りなら範囲と捉えて該当するDISP_LOCの配列に1を立てます。

ではかるくGDBで確認してみます。使うGDBスクリプトはこれです。

takk@deb9:~$ cat test5
break 9
set args -b1,2,3,4,5
run
p args
p DISP_LOC

set args -b1-3,5-8
run
p args
p DISP_LOC

set args -b3,5,7-9
run
p args
p DISP_LOC

set args -b2-10
run
p args
p DISP_LOC
takk@deb9:~$

スクリプトを指定してGDB起動します。

takk@deb9:~$ gdb a.out -x test5

~

Breakpoint 1, MAIN__ () at cut5.f:9
9               STOP
$1 = '-b1,2,3,4,5', ' ' <repeats 89 times>
$2 = (1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, ~

Breakpoint 1, MAIN__ () at cut5.f:9
9               STOP
$3 = '-b1-3,5-8', ' ' <repeats 91 times>
$4 = (1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, ~

Breakpoint 1, MAIN__ () at cut5.f:9
9               STOP
$5 = '-b3,5,7-9', ' ' <repeats 91 times>
$6 = (0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, ~

Breakpoint 1, MAIN__ () at cut5.f:9
9               STOP
$7 = '-b2-10', ' ' <repeats 94 times>
$8 = (0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, ~
(gdb)

うまく配列に値が設定されました。次回はファイルから読み込んでcut表示します。

コメント

タイトルとURLをコピーしました