COBOL85 Libraries and Client Program

The following is a COBOL85 library named TASKM/COBOL85/LIBRARY:

000100$ RESET LIST SET ERRORLIST LINEINFO
000200 IDENTIFICATION DIVISION.
000300  PROGRAM-ID. EXPLICIT-LIBRARY LIBRARY.
000400  ENVIRONMENT DIVISION.
000500  INPUT-OUTPUT SECTION.
000600  FILE-CONTROL.
000700       SELECT FL-1 ASSIGN TO DISK.
000800  DATA DIVISION.
000900  FILE SECTION.
001000  FD FL-1 GLOBAL.
001100  01 FL-1-REC PIC X(80) GLOBAL.
001200  WORKING-STORAGE SECTION.
001300  PROGRAM-LIBRARY SECTION.
001400  LB EXPLICIT-LIBRARY EXPORT
001500                      ATTRIBUTE SHARING IS SHAREDBYRUNUNIT.
001600  ENTRY PROCEDURE USERCODE.
001700  ENTRY PROCEDURE WRITER.
001800  PROCEDURE DIVISION.
001900  P-1.
002000      OPEN OUTPUT FL-1.
002100      CALL “DISPLAYER”.
002200      CALL SYSTEM FREEZE TEMPORARY.
002300      CLOSE       FL-1 SAVE.
002400      EXIT PROGRAM.
002500  IDENTIFICATION DIVISION.
002600  PROGRAM-ID. WRITER.
002700  DATA DIVISION.
002800  PROCEDURE DIVISION.
002900  P-1.
003000       MOVE “DATA WRITTEN FROM LIBRARY” TO FL-1-REC.
003100       WRITE FL-1-REC.
003200       EXIT PROGRAM.
003300  END PROGRAM WRITER.
003400  IDENTIFICATION DIVISION.
003500  PROGRAM-ID. DISPLAYER.
003600 PROCEDURE DIVISION.
003700  P-1.
003800       DISPLAY “THE EXPLICIT LIBRARY HAS BEEN ENTERED.”
003900       EXIT PROGRAM.
004000  END PROGRAM DISPLAYER.
004100  IDENTIFICATION DIVISION.
004200  PROGRAM-ID. USERCODE.
004300  DATA DIVISION.
004400  WORKING-STORAGE SECTION.
004500  01 REC-1.
004600     02 BUFFER      PIC X(20).
004700     02 USERNAME    PIC X(20).
004800     02 DIRECTORIES PIC 9(4) COMP.
004900  01 MAX-DIRECTORIES PIC 9(4) COMP VALUE 17 GLOBAL.
005000  LINKAGE SECTION.
005100  01 STR       PIC X(80).
005200  01 USER-CODE PIC X(20).
005300  PROCEDURE DIVISION USING STR USER-CODE.
005400  P-1.
005500       UNSTRING STR DELIMITED BY “/” OR “(“ OR “)”
005600       INTO BUFFER USERNAME TALLYING IN DIRECTORIES.
005700       MOVE USERNAME TO USER-CODE.
005800       IF DIRECTORIES IS GREATER THAN MAX-DIRECTORIES
005900         CALL “ERROR-MESSAGE” USING DIRECTORIES.
006000       EXIT PROGRAM.
006100  IDENTIFICATION DIVISION.
006200  PROGRAM-ID. ERROR-MESSAGE.
006300  DATA DIVISION.
006400  WORKING-STORAGE SECTION.
006500  77 EXTRA-DIRECTORIES PIC 9(4) COMP.
006600  LINKAGE SECTION.
006700  77 TOTAL-DIRECTORIES PIC 9(4) COMP.
006800  PROCEDURE DIVISION USING TOTAL-DIRECTORIES.
006900  P-1.
007000       SUBTRACT MAX-DIRECTORIES FROM   TOTAL-DIRECTORIES
007100                                GIVING EXTRA-DIRECTORIES.
007200       DISPLAY “THERE WERE “ EXTRA-DIRECTORIES
007300                            “EXTRA DIRECTORIES”.
007400       EXIT PROGRAM.
007500  END PROGRAM ERROR-MESSAGE.
007600  END PROGRAM USERCODE.
007700  END PROGRAM EXPLICIT-LIBRARY.

The program TASKM/COBOL85/LIBRARY illustrates several library features that distinguish COBOL85 libraries from libraries in earlier COBOL implementations. These features include:

  • An explicit FREEZE statement at line 2200, which includes the freeze duration option of TEMPORARY.

  • The PROGRAM-LIBRARY SECTION, which includes an explicit export declaration at lines 1400-1700. The declaration specifies a sharing option of SHAREDBYRUNUNIT and lists USERCODE and WRITER as the names of nested programs to be exported.

  • Three nested programs, including the two specified in the export declaration: USERCODE, at lines 4100-7600; and WRITER, at lines 2500-3300.

  • Local variables. The exported nested program USERCODE includes declarations of the data items REC-1 at line 4500 and MAX-DIRECTORIES at 4900. Note that these local variables are reinitialized each time the USERCODE nested program is invoked. You can cause the values of these variables to be preserved by adding an IS INITIAL clause to the PROGRAM-ID paragraph at line 4200.

The following is another COBOL85 library called TASKM/COBOL85/PROCEDURE:

000100$RESET LIST SET ERRORLIST LINEINFO
000200$SHARING = SHAREDBYRUNUNIT
000300$LIBRARYPROG
000400  IDENTIFICATION DIVISION.
000500  PROGRAM-ID. IMPLICIT-LIBRARY.
000600  ENVIRONMENT DIVISION.
000700  DATA DIVISION.
000800  WORKING-STORAGE SECTION.
000900  77 SWAP PIC X(10).
001000  LINKAGE SECTION.
001100  01 A-REC.
001200     02 FLD-1 PIC X(10).
001300     02 FLD-2 PIC X(10).
001400  PROCEDURE DIVISION USING A-REC.
001500  P-1.
001600        MOVE FLD-1 TO SWAP.
001700        MOVE FLD-2 TO FLD-1.
001800        MOVE SWAP  TO FLD-2.
001900        EXIT PROGRAM.

The library TASKM/COBOL85/PROCEDURE is designed to function much as a COBOL74 library. There is no explicit export declaration or freeze statement, and the entire PROCEDURE DIVISION is exported. However, unlike COBOL74, COBOL85 requires the LIBRARYPROG compiler option to be set in order to indicate that the program will function as a library.

The following is a COBOL85 client program called TASKM/COBOL85/PROGRAM. This program calls the two COBOL85 libraries described previously:

000100$ RESET LIST SET ERRORLIST LINEINFO
000200  IDENTIFICATION DIVISION.
000300  PROGRAM-ID. DRIVER.
000400  ENVIRONMENT DIVISION.
000900  DATA DIVISION.
001500  WORKING-STORAGE SECTION.
001600  01 THE-TITLE PIC X(80).
001700  01 USERCODES.
001800     02 USERCODE-1 PIC X(20).
001900     02 USERCODE-2 PIC X(20).
002000  LOCAL-STORAGE SECTION.
002100  LD PARAM-1.
002200  01 P-REC-1.
002300     02 A-FLD-1 PIC X(10).
002400     02 A-FLD-2 PIC X(10).
002500  LD PARAM-2.
002600  01 P-REC-2 PIC X(80).
002700  01 P-REC-3 PIC X(20).
003100  PROGRAM-LIBRARY SECTION.
003200  LB LIB-ONE IMPORT
003300             ATTRIBUTE FUNCTIONNAME IS “THELIBRARY”
003400                       LIBACCESS    IS BYTITLE.
003500  ENTRY PROCEDURE WRITER.
003600  ENTRY PROCEDURE USERCODE WITH  PARAM-2
003700                           USING P-REC-2 P-REC-3.
003800  LB LIB-TWO IMPORT
003900             ATTRIBUTE TITLE IS “OBJECT/TASKM/COBOL85/PROCEDURE”.
004000  ENTRY PROCEDURE PROCEDUREDIVISION WITH  PARAM-1
004100                                    USING P-REC-1.
004500  PROCEDURE DIVISION.
004600  P-1.
004700      CHANGE ATTRIBUTE TITLE OF LIB-ONE
004800                             TO “OBJECT/TASKM/COBOL85/LIBRARY”.
005000      CALL WRITER.
005100      CALL WRITER OF LIB-ONE.
005200      MOVE ATTRIBUTE TITLE OF LIB-TWO TO THE-TITLE.
005300      CALL USERCODE
005400           USING THE-TITLE USERCODE-1.
005500      MOVE ATTRIBUTE TITLE OF LIB-ONE TO THE-TITLE.
005600      CALL “USERCODE IN OBJECT/TASKM/COBOL85/LIBRARY”
005700           USING THE-TITLE USERCODE-2.
005800      CALL PROCEDUREDIVISION OF LIB-TWO
005900           USING USERCODES.
006000      CALL “OBJECT/TASKM/COBOL85/PROCEDURE”
006100           USING USERCODES.
006200      DISPLAY USERCODES.
006300      STOP RUN.

The program TASKM/COBOL85/PROGRAM illustrates the explicit library declarations and import declarations provided by COBOL85. Thus, the PROGRAM-LIBRARY SECTION at lines 3100-4400 includes declarations of the libraries LIB-ONE and LIB-TWO. These library declarations include library attribute assignments as well as import declarations for WRITER, USERCODE, and PROCEDUREDIVISION.

TASKM/COBOL85/PROGRAM includes examples of the following types of CALL statements:

  • A CALL statement that invokes an explicitly declared import object. The statements at lines 5000 and 5300-5400 are examples that invoke import objects declared in the PROGRAM-LIBRARY SECTION.

  • A CALL statement that invokes an explicitly declared import object in an explicitly specified library. The statements at lines 5100 and 5800 refer to the LIB-ONE and LIB-TWO declarations in the PROGRAM-LIBRARY SECTION.

  • A CALL statement that uses a string literal to specify the library object code file title. The statement at line 6000 invokes the library TASKM/COBOL85/PROCEDURE. The CALL statement does not need to specify the name of a particular import object, as the library in question exports only the PROCEDUREDIVISION.

  • A CALL statement that uses a string literal to specify both the library object code file title and the import object name. The statement at line 5600 invokes the object USERCODE in the library OBJECT/TASKM/COBOL85/LIBRARY.