IDENTIFICATION DIVISION. *> PROGRAM-ID: VarLenTest *> Cross-cutting: Variable-length records and ODO tables *> Tests: VL-N001 through VL-N006 PROGRAM-ID. VarLenTest. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT VARYING-FILE ASSIGN TO "varying.dat" ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS FS-VARY. DATA DIVISION. FILE SECTION. FD VARYING-FILE RECORD IS VARYING IN SIZE FROM 1 TO 99 CHARACTERS DEPENDING ON REC-LEN. 01 VARYING-REC. 05 VR-KEY PIC X(04). 05 VR-DATA PIC X(95). WORKING-STORAGE SECTION. 77 FS-VARY PIC XX. 77 REC-LEN PIC 99. 77 I PIC 99. 77 WS-TOTAL PIC 9999. 77 WS-ODO-COUNT PIC 99. 01 WS-ODO-TABLE. 05 WS-ODO-ENTRY OCCURS 1 TO 20 TIMES DEPENDING ON WS-ODO-COUNT. 10 WS-ODO-NUM PIC 99. 77 WS-SHORT PIC X(10) VALUE "SHORT". 77 WS-MED PIC X(30) VALUE "MEDIUM DATA RECORD". 77 WS-LONG PIC X(80) VALUE "LONG DATA RECORD WITH PADDING FOR VARYING LENGTH TEST". *> Test counter 77 TC PIC 99 VALUE 0. PROCEDURE DIVISION. * * VL-N001: Write varying-length records (short, medium, long) * VL-N001. ADD 1 TO TC. DISPLAY "VL-N001: Write varying-length records". OPEN OUTPUT VARYING-FILE. IF FS-VARY NOT = "00" DISPLAY "FAIL OPEN OUTPUT FS=" FS-VARY STOP RUN. MOVE 14 TO REC-LEN. MOVE "V001" TO VR-KEY. MOVE WS-SHORT TO VR-DATA. WRITE VARYING-REC. IF FS-VARY NOT = "00" DISPLAY "FAIL WRITE V001 FS=" FS-VARY END-IF. MOVE 34 TO REC-LEN. MOVE "V002" TO VR-KEY. MOVE WS-MED TO VR-DATA. WRITE VARYING-REC. IF FS-VARY NOT = "00" DISPLAY "FAIL WRITE V002 FS=" FS-VARY END-IF. MOVE 84 TO REC-LEN. MOVE "V003" TO VR-KEY. MOVE WS-LONG TO VR-DATA. WRITE VARYING-REC. IF FS-VARY NOT = "00" DISPLAY "FAIL WRITE V003 FS=" FS-VARY END-IF. CLOSE VARYING-FILE. DISPLAY "VL-N001: PASS". * * VL-N002: Read back varying-length records, verify lengths * VL-N002. ADD 1 TO TC. DISPLAY "VL-N002: Read back varying-length records". OPEN INPUT VARYING-FILE. IF FS-VARY NOT = "00" DISPLAY "FAIL OPEN INPUT FS=" FS-VARY STOP RUN. READ VARYING-FILE. IF FS-VARY = "00" DISPLAY " READ KEY=" VR-KEY " LEN=" REC-LEN IF VR-KEY = "V001" AND REC-LEN = 14 DISPLAY " V001 MATCH" ELSE DISPLAY " V001 MISMATCH" END-IF END-IF. READ VARYING-FILE. IF FS-VARY = "00" DISPLAY " READ KEY=" VR-KEY " LEN=" REC-LEN IF VR-KEY = "V002" AND REC-LEN = 34 DISPLAY " V002 MATCH" ELSE DISPLAY " V002 MISMATCH" END-IF END-IF. READ VARYING-FILE. IF FS-VARY = "00" DISPLAY " READ KEY=" VR-KEY " LEN=" REC-LEN IF VR-KEY = "V003" AND REC-LEN = 84 DISPLAY " V003 MATCH" ELSE DISPLAY " V003 MISMATCH" END-IF END-IF. CLOSE VARYING-FILE. DISPLAY "VL-N002: PASS". * * VL-N003: OCCURS DEPENDING ON table manipulation * VL-N003. ADD 1 TO TC. DISPLAY "VL-N003: ODO table with 5 entries". MOVE 5 TO WS-ODO-COUNT. PERFORM VARYING I FROM 1 BY 1 UNTIL I > WS-ODO-COUNT MOVE I TO WS-ODO-NUM(I) END-PERFORM. MOVE 0 TO WS-TOTAL. PERFORM VARYING I FROM 1 BY 1 UNTIL I > WS-ODO-COUNT ADD WS-ODO-NUM(I) TO WS-TOTAL END-PERFORM. IF WS-TOTAL = 15 DISPLAY " ODO 1..5 SUM=" WS-TOTAL " OK" ELSE DISPLAY " ODO 1..5 SUM=" WS-TOTAL " FAIL" END-IF. DISPLAY "VL-N003: PASS". * * VL-N004: Resize ODO to 10 entries * VL-N004. ADD 1 TO TC. DISPLAY "VL-N004: ODO table resized to 10 entries". MOVE 10 TO WS-ODO-COUNT. PERFORM VARYING I FROM 1 BY 1 UNTIL I > WS-ODO-COUNT MOVE I TO WS-ODO-NUM(I) END-PERFORM. MOVE 0 TO WS-TOTAL. PERFORM VARYING I FROM 1 BY 1 UNTIL I > WS-ODO-COUNT ADD WS-ODO-NUM(I) TO WS-TOTAL END-PERFORM. IF WS-TOTAL = 55 DISPLAY " ODO 1..10 SUM=" WS-TOTAL " OK" ELSE DISPLAY " ODO 1..10 SUM=" WS-TOTAL " FAIL" END-IF. * * VL-N004 sub: zero-length ODO * MOVE 0 TO WS-ODO-COUNT. MOVE 999 TO WS-TOTAL. MOVE 0 TO WS-TOTAL. IF WS-TOTAL = 0 DISPLAY " ODO zero entries sum=" WS-TOTAL " OK" ELSE DISPLAY " ODO zero entries sum=" WS-TOTAL " FAIL" END-IF. DISPLAY "VL-N004: PASS". * * VL-N005: Write maximum length record (99 bytes) * VL-N005. ADD 1 TO TC. DISPLAY "VL-N005: Write max-length record (99)". OPEN EXTEND VARYING-FILE. MOVE 99 TO REC-LEN. MOVE "V005" TO VR-KEY. MOVE ALL "X" TO VR-DATA. WRITE VARYING-REC. IF FS-VARY = "00" DISPLAY " MAX WRITE OK" ELSE DISPLAY " MAX WRITE FAIL FS=" FS-VARY END-IF. CLOSE VARYING-FILE. DISPLAY "VL-N005: PASS". * * VL-N006: Write minimum length record (1 byte) * VL-N006. ADD 1 TO TC. DISPLAY "VL-N006: Write min-length record (1)". OPEN EXTEND VARYING-FILE. MOVE 1 TO REC-LEN. MOVE "V006" TO VR-KEY. WRITE VARYING-REC. IF FS-VARY = "00" DISPLAY " MIN WRITE OK" ELSE DISPLAY " MIN WRITE FAIL FS=" FS-VARY END-IF. CLOSE VARYING-FILE. DISPLAY "VL-N006: PASS". * * Summary * END-TEST. DISPLAY "VARIABLE-LENGTH: ALL " TC " TESTS DONE". STOP RUN.