Expanded COBOL

본 장에서는 Expanded COBOL의 변환에 대해서 설명한다.

1. Expanded COBOL element

Expanded COBOL의 경우 내부적으로 COBOL의 문법으로 변환되어 처리된다. Expanded COBOL은 --expanded 옵션을 사용하였을 때만 처리된다.

다음은 Expanded COBOL에서 쓰이는 elements에 대한 설명 및 변환된 내용이다.

  • EVALUATE Statement

    다음은 Expanded COBOL의 Evaluate 예제이다.

    EVALUATE WK
       WHEN 28
       WHEN OTHER
         DISPLAY 'WNE OTHER'
    END-EVALUATE.

    다음은 위의 Expanded COBOL이 변환된 후 결과 소스이다.

    EVALUATE WK
       WHEN 28
         DISPLAY 'WHEN OTHER'
       WHEN OTHER
         DISPLAY 'WHEN OTHER'
    END-EVALUATE.
  • VALUE CLAUSE truncate

    VALUE CLAUSE에 PICTURE SIZE를 초과하는 값이 오는 경우 truncate한다.

    다음은 Expanded COBOL의 VALUE CLAUSE truncate 예제이다.

    01 WK PIC X(10) VALUE '1234567890*'.

    다음은 위의 Expanded COBOL이 변환된 후 결과 소스이다.

    01 WK PIC X(10) VALUE '1234567890'.
  • INSPECT Statement TRAILING phrase

    INSPECT Statement에서 TRAILING phrase 를 사용해 우측에서 부터 지정한 character의 반복 사용된 수를 count 할 수 있도록 한다.

    다음은 Expanded COBOL의 VALUE INSPECT Statement에서 TRAILING phrase 예제이다.

    WORKING-STORAGE SECTION.
    01 TARGET-FIELD PIC X(10) VALUE '123   '.
    01 WS-TALLY-LEN PIC 9999.
    
    PROCEDURE DIVISION.
        INSPECT TARGET-FIELD TALLYING
            WS-TALLY-LEN FOR TRAILING SPACE.
        DISPLAY WS-TALLY-LEN.

    다음은 위의 결과이다.

    3
  • SEARCH Statement

    SEARCH Statement 사용 시 AT END 뒤에 바로 WHEN 절이 올 수 있도록 한다.

    SEARCH WS-ARH-TBL
    AT END
    WHEN WK = ZEROES
    DISPLAY 'WK :' WK
    END-SEARCH.
  • COMMIT Statement

    OpenFrame에서 실행시켰을 때 text_commit 함수를 호출하는 COMMIT Statement를 사용할 수 있도록 한다.

    COMMIT.
  • DIVIDE ZERO Exception

    Divide 연산 수행 시 제수(Divisor)가 0인 경우 runtime assertion이 아닌 몫(quotient)에 0값을 설정한다.

           WORKING-STORAGE SECTION.
           01 RESULT1 PIC 9999.
           01 RESULT2 PIC 9999.
           01 DIVISOR PIC 9999 VALUE 0.
           PROCEDURE      DIVISION.
    
           DIVIDE DIVISOR INTO RESULT1.
           DISPLAY "RESULT1 : " RESULT1.
    
           COMPUTE RESULT2 = 10 / 0.
           DISPLAY "RESULT2 : " RESULT2.

    다음은 위의 결과이다.

    RESULT1 : 0
    RESULT2 : 0
  • Zoned Decimal Sign zone portion

    String 값을 Zoned Decimal에 MOVE하는 경우 Zoned Decimal의 4-bit unsigned 값으로 치환하지 않고 String 값 그대로 MOVE 한다.

    다음은 Expanded COBOL 의 Zoned Decimal Sign zone portion 에 대한 예제이다.

           WORKING-STORAGE SECTION.
           01 ZONED PIC S9(4).
           01 STR   PIC X(4) VALUE 'AAAA'.
           PROCEDURE DIVISION.
               MOVE STR TO ZONED.
               CALL 'ofcob_hexdump' USING ZONED VALUE LENGTH OF ZONED.

    다음은 위의 결과이다.

    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    HEXA VALUE : 41414141
    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  • LINKAGE SECTION variable life cycle

    LINKAGE SECTION에 작성된 변수가 LOCAL 변수로 사용되도록 한다.

    다음은 Expanded COBOL 의 LINKAGE SECTION variable life cycle 에 대한 예제이다.

           IDENTIFICATION DIVISION.
           PROGRAM-ID.    TESTCOB.
           DATA           DIVISION.
           WORKING-STORAGE SECTION.
           PROCEDURE       DIVISION.
               CALL 'SUBCOB'.
    IDENTIFICATION DIVISION.
           PROGRAM-ID.    SUBCOB.
           DATA           DIVISION.
           WORKING-STORAGE SECTION.
           01 F PIC 9(1) COMP.
           01 WK-VAR PIC X(8).
           LINKAGE          SECTION.
           01 LK-VAR PIC X(8).
           PROCEDURE       DIVISION.
    
               DISPLAY "ADDRESS OF LK-VAR : " ADDRESS OF LK-VAR.
    
               ADD 1 TO F.
               IF F = 1 THEN
                 SET ADDRESS OF LK-VAR TO ADDRESS OF WK-VAR
                 CALL 'SUBCOB'.

    다음은 위의 결과이다.

    ADDRESS OF LK-VAR : 0000000000
    ADDRESS OF LK-VAR : 0000000000
  • Expansion of target types for reference modification

    지정된 USAGE와 관계 없이 Reference Modifier를 사용할 수 있도록 한다.

    다음은 Expanded COBOL 의 Expansion of target types for reference modification 에 대한 예제이다.

           IDENTIFICATION      DIVISION.
           PROGRAM-ID.         TESTCOB.
           ENVIRONMENT            DIVISION.
           CONFIGURATION          SECTION.
           DATA                   DIVISION.
           WORKING-STORAGE        SECTION.
           01 Z PIC 9(8).
           01 S PIC X(8) VALUE 'ZZZZZZZZ'.
           01 C PIC 9(15) COMP-3.
           01 B PIC 9(16) COMP.
           PROCEDURE       DIVISION.
               MOVE S(1:4) TO Z(1:4).
               CALL 'ofcob_hexdump' USING Z VALUE LENGTH OF Z.
               MOVE S(1:4) TO C(1:4).
               CALL 'ofcob_hexdump' USING C VALUE LENGTH OF C.
               MOVE S(1:4) TO B(1:4).
               CALL 'ofcob_hexdump' USING B VALUE LENGTH OF B.

    다음은 위의 결과이다.

    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    HEXA VALUE : 5a5a5a5a00000000
    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    HEXA VALUE : 5a5a5a5a00000000
    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    HEXA VALUE : 5a5a5a5a00000000
    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>