Modern Standard Features

COBOL 2002 FUNCTION-ID (GnuCOBOL; IBM Enterprise COBOL 6.4+):

31.1 User-defined functions

COBOL 2002 FUNCTION-ID (GnuCOBOL; IBM Enterprise COBOL 6.4+):

Output: Area: 19.6350.

IDENTIFICATION DIVISION.
       PROGRAM-ID. USEFUNC.
       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       REPOSITORY.
           FUNCTION CIRCLE-AREA.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  WS-R                 PIC 9(5)V99 VALUE 2.5.
       01  ED-AREA              PIC Z(8)9.9999.
       PROCEDURE DIVISION.
           MOVE FUNCTION CIRCLE-AREA(WS-R) TO ED-AREA
           DISPLAY "Area: " ED-AREA
           STOP RUN.
       END PROGRAM USEFUNC.

       IDENTIFICATION DIVISION.
       FUNCTION-ID. CIRCLE-AREA.
       DATA DIVISION.
       LINKAGE SECTION.
       01  LK-RADIUS            PIC 9(5)V99.
       01  LK-AREA              PIC 9(9)V9999.
       PROCEDURE DIVISION USING LK-RADIUS RETURNING LK-AREA.
           COMPUTE LK-AREA ROUNDED = FUNCTION PI * LK-RADIUS ** 2
           GOBACK.
       END FUNCTION CIRCLE-AREA.

31.2 Pointers and dynamic storage

SET ADDRESS OF linkage-item TO pointer maps a LINKAGE description onto any storage (how COBOL walks linked lists and system control blocks).

ALLOCATE/FREE are COBOL 2002 statements (GnuCOBOL; supported in recent IBM releases). Traditional IBM code uses LE services CEEGTST/CEEFRST.

ADDRESS OF item and LENGTH OF item are special registers; SET ptr UP BY n does pointer arithmetic.

In CICS, EXEC CICS GETMAIN and SET(ADDRESS OF ...) serve the same purpose.

WORKING-STORAGE SECTION.
       01  WS-PTR               USAGE POINTER.
       LINKAGE SECTION.
       01  LK-BUFFER            PIC X(1000).
      * ...
           ALLOCATE LK-BUFFER RETURNING WS-PTR
           SET ADDRESS OF LK-BUFFER TO WS-PTR
           MOVE "dynamic data" TO LK-BUFFER
           FREE WS-PTR

31.3 Exception handling (COBOL 2002)

Exception names (EC-SIZE-ZERO-DIVIDE, EC-BOUND-SUBSCRIPT, EC-DATA-INCOMPATIBLE, EC-I-O…) and functions EXCEPTION-STATUS, EXCEPTION-LOCATION, EXCEPTION-STATEMENT are implemented in GnuCOBOL (enable checking with -fec=... or >>TURN). RAISE signals an exception explicitly. IBM Enterprise COBOL relies instead on compiler options (SSRANGE, NUMCHECK), Language Environment condition handling (CEEHDLR), and ON SIZE ERROR/INVALID KEY phrases.

>>TURN EC-ALL CHECKING ON
       ...
       PROCEDURE DIVISION.
       DECLARATIVES.
       BOUNDS-ERROR SECTION.
           USE AFTER EXCEPTION CONDITION EC-BOUND-SUBSCRIPT.
       BOUNDS-ERROR-PARA.
           DISPLAY "Subscript error: " FUNCTION EXCEPTION-LOCATION.
       END DECLARATIVES.

31.4 Conditional compilation

Supported by GnuCOBOL (cobc -D ENV-TEST=1) and IBM Enterprise COBOL 6.2+ (DEFINE compiler option).

>>DEFINE ENV-TEST AS 1
       >>IF ENV-TEST IS DEFINED
           DISPLAY "Running in TEST configuration"
       >>ELSE
           DISPLAY "Running in PRODUCTION configuration"
       >>END-IF

31.5 Other modern features at a glance

Boolean data (PIC 1, USAGE BIT) and bit operators (B-AND, B-OR, B-XOR, B-NOT)

Partial support; IBM 6.x offers BIT-OF/BIT-TO-CHAR functions

National data (PIC N, USAGE NATIONAL) UTF-16; IBM also has PIC U UTF-8 (6.3+)

FLOAT-SHORT, FLOAT-LONG, FLOAT-DECIMAL-16/34 IEEE 754 binary and decimal floating point Typed data: TYPEDEF and TYPE

Dynamic-capacity tables (OCCURS DYNAMIC) LINE SEQUENTIAL organization Long-time vendor extension COMMIT / ROLLBACK Standardized transaction verbs

SEND / RECEIVE asynchronous messaging Little implementation support yet