The ENTRY statement represents a fundamental component of modular programming and alternative entry point management in COBOL, serving as a mechanism for defining multiple entry points within a single program unit. This statement embodies modern modular programming principles by providing structured access points for program execution, enabling sophisticated program organization capabilities, and supporting the development of reusable program components that require precise control over entry point management and parameter passing procedures.
The ENTRY statement allows a COBOL program to have multiple entry points, each with its own name and parameter list. This enables external programs to call different parts of the same program unit, promoting code reuse and modular design. Each ENTRY statement defines an alternative starting point for program execution, allowing the same program to provide multiple related services.
When an external program calls an ENTRY point, execution begins at that specific location rather than at the beginning of the PROCEDURE DIVISION. This mechanism is particularly useful for creating utility programs that provide multiple related functions or for implementing different processing modes within the same program unit.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226IDENTIFICATION DIVISION. PROGRAM-ID. ENTRY-DEMO. DATA DIVISION. WORKING-STORAGE SECTION. 01 ENTRY-POINT-CONTROLS. 05 CURRENT-ENTRY-POINT PIC X(20). 05 ENTRY-CALL-COUNT PIC 9(7) VALUE 0. 05 MAIN-ENTRY-CALLS PIC 9(5) VALUE 0. 05 ALT-ENTRY-CALLS PIC 9(5) VALUE 0. 01 CALCULATION-AREAS. 05 INPUT-NUMBER-1 PIC 9(7)V99. 05 INPUT-NUMBER-2 PIC 9(7)V99. 05 CALCULATION-RESULT PIC 9(9)V99. 05 OPERATION-TYPE PIC X(10). 01 VALIDATION-CONTROLS. 05 VALIDATION-STATUS PIC X VALUE 'N'. 88 VALIDATION-PASSED VALUE 'Y'. 88 VALIDATION-FAILED VALUE 'N'. 05 ERROR-MESSAGE PIC X(80). LINKAGE SECTION. 01 MAIN-PARAMETERS. 05 PARAM-OPERATION PIC X(10). 05 PARAM-NUM1 PIC 9(7)V99. 05 PARAM-NUM2 PIC 9(7)V99. 05 PARAM-RESULT PIC 9(9)V99. 01 ADDITION-PARAMETERS. 05 ADD-NUM1 PIC 9(7)V99. 05 ADD-NUM2 PIC 9(7)V99. 05 ADD-RESULT PIC 9(9)V99. 01 MULTIPLICATION-PARAMETERS. 05 MULT-NUM1 PIC 9(7)V99. 05 MULT-NUM2 PIC 9(7)V99. 05 MULT-RESULT PIC 9(9)V99. 01 VALIDATION-PARAMETERS. 05 VALID-NUMBER PIC 9(7)V99. 05 VALID-STATUS PIC X. 05 VALID-MESSAGE PIC X(80). PROCEDURE DIVISION USING MAIN-PARAMETERS. MAIN-ENTRY-POINT. MOVE 'MAIN-ENTRY' TO CURRENT-ENTRY-POINT ADD 1 TO ENTRY-CALL-COUNT ADD 1 TO MAIN-ENTRY-CALLS DISPLAY 'Main entry point called' DISPLAY 'Operation: ' PARAM-OPERATION MOVE PARAM-NUM1 TO INPUT-NUMBER-1 MOVE PARAM-NUM2 TO INPUT-NUMBER-2 MOVE PARAM-OPERATION TO OPERATION-TYPE PERFORM VALIDATE-MAIN-PARAMETERS IF VALIDATION-PASSED EVALUATE PARAM-OPERATION WHEN 'ADD' PERFORM PERFORM-ADDITION WHEN 'MULTIPLY' PERFORM PERFORM-MULTIPLICATION WHEN 'SUBTRACT' PERFORM PERFORM-SUBTRACTION WHEN 'DIVIDE' PERFORM PERFORM-DIVISION WHEN OTHER DISPLAY 'Unsupported operation: ' PARAM-OPERATION MOVE 'Invalid operation' TO ERROR-MESSAGE SET VALIDATION-FAILED TO TRUE END-EVALUATE IF VALIDATION-PASSED MOVE CALCULATION-RESULT TO PARAM-RESULT DISPLAY 'Result: ' PARAM-RESULT END-IF END-IF GOBACK. *> Alternative entry point for addition operations ENTRY 'ADD-NUMBERS' USING ADDITION-PARAMETERS. ADD-ENTRY-POINT. MOVE 'ADD-ENTRY' TO CURRENT-ENTRY-POINT ADD 1 TO ENTRY-CALL-COUNT ADD 1 TO ALT-ENTRY-CALLS DISPLAY 'Addition entry point called' DISPLAY 'Numbers: ' ADD-NUM1 ' + ' ADD-NUM2 MOVE ADD-NUM1 TO INPUT-NUMBER-1 MOVE ADD-NUM2 TO INPUT-NUMBER-2 PERFORM VALIDATE-NUMERIC-INPUTS IF VALIDATION-PASSED COMPUTE CALCULATION-RESULT = ADD-NUM1 + ADD-NUM2 MOVE CALCULATION-RESULT TO ADD-RESULT DISPLAY 'Addition result: ' ADD-RESULT ELSE MOVE 0 TO ADD-RESULT DISPLAY 'Addition failed: ' ERROR-MESSAGE END-IF GOBACK. *> Alternative entry point for multiplication operations ENTRY 'MULTIPLY-NUMBERS' USING MULTIPLICATION-PARAMETERS. MULTIPLY-ENTRY-POINT. MOVE 'MULTIPLY-ENTRY' TO CURRENT-ENTRY-POINT ADD 1 TO ENTRY-CALL-COUNT ADD 1 TO ALT-ENTRY-CALLS DISPLAY 'Multiplication entry point called' DISPLAY 'Numbers: ' MULT-NUM1 ' * ' MULT-NUM2 MOVE MULT-NUM1 TO INPUT-NUMBER-1 MOVE MULT-NUM2 TO INPUT-NUMBER-2 PERFORM VALIDATE-NUMERIC-INPUTS IF VALIDATION-PASSED COMPUTE CALCULATION-RESULT = MULT-NUM1 * MULT-NUM2 MOVE CALCULATION-RESULT TO MULT-RESULT DISPLAY 'Multiplication result: ' MULT-RESULT ELSE MOVE 0 TO MULT-RESULT DISPLAY 'Multiplication failed: ' ERROR-MESSAGE END-IF GOBACK. *> Alternative entry point for validation operations ENTRY 'VALIDATE-NUMBER' USING VALIDATION-PARAMETERS. VALIDATION-ENTRY-POINT. MOVE 'VALIDATION-ENTRY' TO CURRENT-ENTRY-POINT ADD 1 TO ENTRY-CALL-COUNT ADD 1 TO ALT-ENTRY-CALLS DISPLAY 'Validation entry point called' DISPLAY 'Number to validate: ' VALID-NUMBER MOVE VALID-NUMBER TO INPUT-NUMBER-1 IF VALID-NUMBER IS NUMERIC IF VALID-NUMBER > 0 AND VALID-NUMBER < 9999999.99 MOVE 'Y' TO VALID-STATUS MOVE 'Number is valid' TO VALID-MESSAGE DISPLAY 'Validation passed' ELSE MOVE 'N' TO VALID-STATUS MOVE 'Number out of valid range' TO VALID-MESSAGE DISPLAY 'Validation failed: out of range' END-IF ELSE MOVE 'N' TO VALID-STATUS MOVE 'Invalid numeric format' TO VALID-MESSAGE DISPLAY 'Validation failed: not numeric' END-IF GOBACK. *> Common validation procedures VALIDATE-MAIN-PARAMETERS. SET VALIDATION-PASSED TO TRUE MOVE SPACES TO ERROR-MESSAGE IF PARAM-NUM1 IS NOT NUMERIC SET VALIDATION-FAILED TO TRUE MOVE 'First parameter not numeric' TO ERROR-MESSAGE END-IF IF PARAM-NUM2 IS NOT NUMERIC SET VALIDATION-FAILED TO TRUE MOVE 'Second parameter not numeric' TO ERROR-MESSAGE END-IF IF PARAM-OPERATION = SPACES SET VALIDATION-FAILED TO TRUE MOVE 'Operation not specified' TO ERROR-MESSAGE END-IF. VALIDATE-NUMERIC-INPUTS. SET VALIDATION-PASSED TO TRUE MOVE SPACES TO ERROR-MESSAGE IF INPUT-NUMBER-1 IS NOT NUMERIC SET VALIDATION-FAILED TO TRUE MOVE 'First input not numeric' TO ERROR-MESSAGE END-IF IF INPUT-NUMBER-2 IS NOT NUMERIC SET VALIDATION-FAILED TO TRUE MOVE 'Second input not numeric' TO ERROR-MESSAGE END-IF. *> Arithmetic operation procedures PERFORM-ADDITION. COMPUTE CALCULATION-RESULT = INPUT-NUMBER-1 + INPUT-NUMBER-2 DISPLAY 'Addition performed: ' INPUT-NUMBER-1 ' + ' INPUT-NUMBER-2 ' = ' CALCULATION-RESULT. PERFORM-MULTIPLICATION. COMPUTE CALCULATION-RESULT = INPUT-NUMBER-1 * INPUT-NUMBER-2 DISPLAY 'Multiplication performed: ' INPUT-NUMBER-1 ' * ' INPUT-NUMBER-2 ' = ' CALCULATION-RESULT. PERFORM-SUBTRACTION. COMPUTE CALCULATION-RESULT = INPUT-NUMBER-1 - INPUT-NUMBER-2 DISPLAY 'Subtraction performed: ' INPUT-NUMBER-1 ' - ' INPUT-NUMBER-2 ' = ' CALCULATION-RESULT. PERFORM-DIVISION. IF INPUT-NUMBER-2 = 0 SET VALIDATION-FAILED TO TRUE MOVE 'Division by zero not allowed' TO ERROR-MESSAGE DISPLAY 'Division error: division by zero' ELSE COMPUTE CALCULATION-RESULT = INPUT-NUMBER-1 / INPUT-NUMBER-2 DISPLAY 'Division performed: ' INPUT-NUMBER-1 ' / ' INPUT-NUMBER-2 ' = ' CALCULATION-RESULT END-IF.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260IDENTIFICATION DIVISION. PROGRAM-ID. ADVANCED-ENTRY. DATA DIVISION. WORKING-STORAGE SECTION. 01 ADVANCED-ENTRY-CONTROLS. 05 ENTRY-STATISTICS. 10 TOTAL-ENTRIES PIC 9(7) VALUE 0. 10 SUCCESSFUL-ENTRIES PIC 9(7) VALUE 0. 10 FAILED-ENTRIES PIC 9(5) VALUE 0. 10 LAST-ENTRY-NAME PIC X(20). 10 ENTRY-TIMESTAMP PIC X(14). 05 PERFORMANCE-METRICS. 10 ENTRY-START-TIME PIC 9(8). 10 ENTRY-END-TIME PIC 9(8). 10 EXECUTION-TIME PIC 9(6). 10 AVERAGE-EXEC-TIME PIC 9(6)V99. 01 SHARED-RESOURCES. 05 SHARED-BUFFER PIC X(1000). 05 BUFFER-LENGTH PIC 9(4) VALUE 0. 05 RESOURCE-LOCK PIC X VALUE 'N'. 88 RESOURCE-LOCKED VALUE 'Y'. 88 RESOURCE-AVAILABLE VALUE 'N'. LINKAGE SECTION. 01 ENTRY-CONTEXT. 05 CONTEXT-ID PIC X(10). 05 CONTEXT-DATA PIC X(500). 05 CONTEXT-STATUS PIC X. 01 PROCESSING-PARAMETERS. 05 PROCESS-TYPE PIC X(15). 05 INPUT-DATA PIC X(200). 05 OUTPUT-DATA PIC X(200). 05 PROCESS-STATUS PIC X. 01 UTILITY-PARAMETERS. 05 UTILITY-FUNCTION PIC X(20). 05 UTILITY-INPUT PIC X(100). 05 UTILITY-OUTPUT PIC X(100). 05 UTILITY-RESULT PIC X. PROCEDURE DIVISION USING ENTRY-CONTEXT. MAIN-ENTRY-PROCEDURE. PERFORM INITIALIZE-ENTRY-SYSTEM PERFORM LOG-ENTRY-CALL DISPLAY 'Main entry procedure called' DISPLAY 'Context ID: ' CONTEXT-ID PERFORM PROCESS-MAIN-CONTEXT PERFORM FINALIZE-ENTRY-CALL GOBACK. *> Entry point for data processing operations ENTRY 'PROCESS-DATA' USING PROCESSING-PARAMETERS. DATA-PROCESSING-ENTRY. PERFORM INITIALIZE-ENTRY-SYSTEM MOVE 'PROCESS-DATA' TO LAST-ENTRY-NAME PERFORM LOG-ENTRY-CALL DISPLAY 'Data processing entry called' DISPLAY 'Process type: ' PROCESS-TYPE PERFORM ACQUIRE-SHARED-RESOURCE IF RESOURCE-LOCKED EVALUATE PROCESS-TYPE WHEN 'VALIDATE' PERFORM VALIDATE-INPUT-DATA WHEN 'TRANSFORM' PERFORM TRANSFORM-DATA WHEN 'ANALYZE' PERFORM ANALYZE-DATA WHEN 'EXPORT' PERFORM EXPORT-DATA WHEN OTHER DISPLAY 'Unknown process type: ' PROCESS-TYPE MOVE 'F' TO PROCESS-STATUS END-EVALUATE PERFORM RELEASE-SHARED-RESOURCE ELSE DISPLAY 'Unable to acquire shared resource' MOVE 'F' TO PROCESS-STATUS END-IF PERFORM FINALIZE-ENTRY-CALL GOBACK. *> Entry point for utility operations ENTRY 'UTILITY-SERVICE' USING UTILITY-PARAMETERS. UTILITY-SERVICE-ENTRY. PERFORM INITIALIZE-ENTRY-SYSTEM MOVE 'UTILITY-SERVICE' TO LAST-ENTRY-NAME PERFORM LOG-ENTRY-CALL DISPLAY 'Utility service entry called' DISPLAY 'Function: ' UTILITY-FUNCTION EVALUATE UTILITY-FUNCTION WHEN 'FORMAT-DATE' PERFORM FORMAT-DATE-UTILITY WHEN 'VALIDATE-EMAIL' PERFORM VALIDATE-EMAIL-UTILITY WHEN 'CALCULATE-CHECKSUM' PERFORM CALCULATE-CHECKSUM-UTILITY WHEN 'GENERATE-ID' PERFORM GENERATE-ID-UTILITY WHEN 'ENCRYPT-DATA' PERFORM ENCRYPT-DATA-UTILITY WHEN OTHER DISPLAY 'Unknown utility function: ' UTILITY-FUNCTION MOVE 'F' TO UTILITY-RESULT END-EVALUATE PERFORM FINALIZE-ENTRY-CALL GOBACK. *> Entry point for system diagnostics ENTRY 'SYSTEM-DIAGNOSTICS'. DIAGNOSTICS-ENTRY. PERFORM INITIALIZE-ENTRY-SYSTEM MOVE 'SYSTEM-DIAGNOSTICS' TO LAST-ENTRY-NAME PERFORM LOG-ENTRY-CALL DISPLAY 'System diagnostics entry called' PERFORM DISPLAY-ENTRY-STATISTICS PERFORM DISPLAY-RESOURCE-STATUS PERFORM DISPLAY-PERFORMANCE-METRICS PERFORM FINALIZE-ENTRY-CALL GOBACK. *> Common initialization and cleanup procedures INITIALIZE-ENTRY-SYSTEM. MOVE FUNCTION CURRENT-DATE TO ENTRY-TIMESTAMP ACCEPT ENTRY-START-TIME FROM TIME ADD 1 TO TOTAL-ENTRIES. LOG-ENTRY-CALL. DISPLAY 'Entry call logged:' DISPLAY 'Entry name: ' LAST-ENTRY-NAME DISPLAY 'Timestamp: ' ENTRY-TIMESTAMP DISPLAY 'Total entries: ' TOTAL-ENTRIES. FINALIZE-ENTRY-CALL. ACCEPT ENTRY-END-TIME FROM TIME COMPUTE EXECUTION-TIME = ENTRY-END-TIME - ENTRY-START-TIME IF EXECUTION-TIME > 0 COMPUTE AVERAGE-EXEC-TIME = (AVERAGE-EXEC-TIME + EXECUTION-TIME) / 2 END-IF DISPLAY 'Entry call completed' DISPLAY 'Execution time: ' EXECUTION-TIME ' centiseconds'. *> Resource management procedures ACQUIRE-SHARED-RESOURCE. IF RESOURCE-AVAILABLE SET RESOURCE-LOCKED TO TRUE DISPLAY 'Shared resource acquired' ELSE DISPLAY 'Shared resource busy' END-IF. RELEASE-SHARED-RESOURCE. SET RESOURCE-AVAILABLE TO TRUE DISPLAY 'Shared resource released'. *> Processing procedures PROCESS-MAIN-CONTEXT. DISPLAY 'Processing main context...' MOVE 'Main context processed' TO CONTEXT-DATA MOVE 'S' TO CONTEXT-STATUS ADD 1 TO SUCCESSFUL-ENTRIES. VALIDATE-INPUT-DATA. DISPLAY 'Validating input data...' MOVE 'Data validation completed' TO OUTPUT-DATA MOVE 'S' TO PROCESS-STATUS ADD 1 TO SUCCESSFUL-ENTRIES. TRANSFORM-DATA. DISPLAY 'Transforming data...' MOVE 'Data transformation completed' TO OUTPUT-DATA MOVE 'S' TO PROCESS-STATUS ADD 1 TO SUCCESSFUL-ENTRIES. ANALYZE-DATA. DISPLAY 'Analyzing data...' MOVE 'Data analysis completed' TO OUTPUT-DATA MOVE 'S' TO PROCESS-STATUS ADD 1 TO SUCCESSFUL-ENTRIES. EXPORT-DATA. DISPLAY 'Exporting data...' MOVE 'Data export completed' TO OUTPUT-DATA MOVE 'S' TO PROCESS-STATUS ADD 1 TO SUCCESSFUL-ENTRIES. *> Utility procedures FORMAT-DATE-UTILITY. DISPLAY 'Formatting date...' MOVE FUNCTION CURRENT-DATE(1:8) TO UTILITY-OUTPUT MOVE 'S' TO UTILITY-RESULT. VALIDATE-EMAIL-UTILITY. DISPLAY 'Validating email...' IF UTILITY-INPUT CONTAINS '@' MOVE 'Valid email format' TO UTILITY-OUTPUT MOVE 'S' TO UTILITY-RESULT ELSE MOVE 'Invalid email format' TO UTILITY-OUTPUT MOVE 'F' TO UTILITY-RESULT END-IF. CALCULATE-CHECKSUM-UTILITY. DISPLAY 'Calculating checksum...' MOVE 'Checksum calculated' TO UTILITY-OUTPUT MOVE 'S' TO UTILITY-RESULT. GENERATE-ID-UTILITY. DISPLAY 'Generating ID...' STRING 'ID' DELIMITED BY SIZE FUNCTION CURRENT-DATE(1:8) DELIMITED BY SIZE INTO UTILITY-OUTPUT END-STRING MOVE 'S' TO UTILITY-RESULT. ENCRYPT-DATA-UTILITY. DISPLAY 'Encrypting data...' MOVE 'Data encrypted' TO UTILITY-OUTPUT MOVE 'S' TO UTILITY-RESULT. *> Diagnostic procedures DISPLAY-ENTRY-STATISTICS. DISPLAY 'Entry Point Statistics:' DISPLAY 'Total entries: ' TOTAL-ENTRIES DISPLAY 'Successful entries: ' SUCCESSFUL-ENTRIES DISPLAY 'Failed entries: ' FAILED-ENTRIES DISPLAY 'Last entry: ' LAST-ENTRY-NAME. DISPLAY-RESOURCE-STATUS. DISPLAY 'Resource Status:' DISPLAY 'Shared buffer length: ' BUFFER-LENGTH IF RESOURCE-LOCKED DISPLAY 'Shared resource: LOCKED' ELSE DISPLAY 'Shared resource: AVAILABLE' END-IF. DISPLAY-PERFORMANCE-METRICS. DISPLAY 'Performance Metrics:' DISPLAY 'Average execution time: ' AVERAGE-EXEC-TIME ' centiseconds' DISPLAY 'Last execution time: ' EXECUTION-TIME ' centiseconds'.