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