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.