IDENTIFICATION DIVISION.
PROGRAM-ID. XCALLSUB.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT JCL-FILE
ASSIGN TO 'JCLINPUT'
ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD JCL-FILE
RECORD CONTAINS 80 CHARACTERS
RECORDING MODE IS F.
01 JCL-RECORD PIC X(80).
WORKING-STORAGE SECTION.
01 WS-EOF PIC X VALUE 'N'.
88 EOF VALUE 'Y'.
01 WS-COUNTERS.
05 WS-LINE-COUNT PIC 9(4) VALUE 0.
05 WS-JOB-NUM PIC 9(4) VALUE 0.
01 WS-FLAGS.
05 WS-JOB-FOUND PIC X VALUE 'N'.
05 WS-NEW-JOB PIC X VALUE 'N'.
01 WS-WORK-AREAS.
05 WS-CURR-JOB-NAME PIC X(8) VALUE SPACES.
05 WS-SEARCH-POS PIC 9(2) VALUE 1.
05 WS-TEMP-POS PIC 9(2) VALUE 0.
* 単一ジョブ用の内部テーブル(最大2000行)
01 WS-JOB-TABLE.
05 WS-JCL-LINES OCCURS 2000 TIMES.
10 WS-LINE PIC X(80).
LINKAGE SECTION.
* サブルーチンへの引数をJCLデータのみに簡素化
01 LS-JCL-LINES OCCURS 2000 TIMES.
05 LS-LINE PIC X(80).
PROCEDURE DIVISION USING LS-JCL-LINES.
MAIN-LOGIC.
PERFORM INITIALIZATION
PERFORM UNTIL EOF
PERFORM READ-AND-CHECK-JOB
IF WS-NEW-JOB = 'Y' AND WS-LINE-COUNT > 0
PERFORM PROCESS-CURRENT-JOB
END-IF
IF NOT EOF
PERFORM STORE-JCL-LINE
END-IF
END-PERFORM
IF WS-LINE-COUNT > 0
PERFORM PROCESS-CURRENT-JOB
END-IF
PERFORM CLEANUP
GOBACK.
INITIALIZATION.
OPEN INPUT JCL-FILE
INITIALIZE WS-JOB-TABLE
PERFORM READ-JCL-FILE.
READ-AND-CHECK-JOB.
MOVE 'N' TO WS-NEW-JOB
MOVE 'N' TO WS-JOB-FOUND
* JOBキーワードの検索
PERFORM VARYING WS-SEARCH-POS FROM 1 BY 1
UNTIL WS-SEARCH-POS > 73
IF JCL-RECORD(WS-SEARCH-POS:3) = 'JOB'
MOVE 'Y' TO WS-JOB-FOUND
MOVE WS-SEARCH-POS TO WS-TEMP-POS
EXIT PERFORM
END-IF
END-PERFORM
IF WS-JOB-FOUND = 'Y'
* ジョブ名の抽出(参照用)
SUBTRACT 1 FROM WS-TEMP-POS GIVING WS-SEARCH-POS
PERFORM UNTIL WS-SEARCH-POS = 0 OR
JCL-RECORD(WS-SEARCH-POS:1) = SPACE
SUBTRACT 1 FROM WS-SEARCH-POS
END-PERFORM
ADD 1 TO WS-SEARCH-POS
MOVE JCL-RECORD(WS-SEARCH-POS:8) TO WS-CURR-JOB-NAME
* 新しいジョブの開始
MOVE 'Y' TO WS-NEW-JOB
ADD 1 TO WS-JOB-NUM
END-IF.
STORE-JCL-LINE.
IF WS-NEW-JOB = 'Y'
PERFORM INIT-NEW-JOB
END-IF
ADD 1 TO WS-LINE-COUNT
IF WS-LINE-COUNT > 2000
DISPLAY 'エラー:ジョブのライン数が2000を超えています'
PERFORM CLEANUP
STOP RUN
END-IF
MOVE JCL-RECORD TO WS-LINE(WS-LINE-COUNT).
INIT-NEW-JOB.
MOVE 0 TO WS-LINE-COUNT.
PROCESS-CURRENT-JOB.
* 現在のジョブデータをサブルーチンの引数にコピー
PERFORM VARYING WS-SEARCH-POS FROM 1 BY 1
UNTIL WS-SEARCH-POS > WS-LINE-COUNT
MOVE WS-LINE(WS-SEARCH-POS) TO
LS-LINE(WS-SEARCH-POS)
END-PERFORM
* サブルーチン呼び出し
CALL 'A8BFLCNV' USING LS-JCL-LINES.
READ-JCL-FILE.
READ JCL-FILE
AT END MOVE 'Y' TO WS-EOF
END-READ.
CLEANUP.
CLOSE JCL-FILE.