自作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表示します。



コメント