COBOL for AIX

 View Only

Question related to EBCDIC characters and -host when using COBOL for AIX

By Archive User posted Thu December 29, 2016 12:21 PM

  

Originally posted by: BasilTK



A COBOL for AIX user was expecting a certain output (described below) when compiling the following test case with -host when using COBOL for AIX:

 

===== COMPILE COMMAND: 
#Provides expected output:
cob2 -c -qWSCLEAR -qSOURCE -qLIB -qAPOST -qNOSEQUENCE -I'/home/db2/V10.5/db2in105/sqllib/include/cobol_a' -qSQL=_"BINDFILE DATABASE basil3   QUALIFIER cbldb2  USER cbldb2  USING zcmodb21"_: -qMDECK test.cbl
cob2 -L'/home/db2/V10.5/db2in105/sqllib/lib' -ldb2 -o test1 test.o


#Causes incorrect output with -host
cob2 -c -qWSCLEAR -qSOURCE -qLIB -qAPOST -qNOSEQUENCE -I'/home/db2/V10.5/db2in105/sqllib/include/cobol_a' -qSQL=_"BINDFILE DATABASE basil3   QUALIFIER cbldb2  USER cbldb2  USING zcmodb21"_: -qMDECK -host test.cbl
cob2 -L'/home/db2/V10.5/db2in105/sqllib/lib' -ldb2 -o test2 test.o

 

$ cat test.cob
       IDENTIFICATION DIVISION.
       PROGRAM-ID. FBITD.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       EXEC SQL INCLUDE SQLCA END-EXEC.

       01  EXPECTED     PIC X(16)
                        VALUE X'1234A0A0BEEF00459151202020202020'.
       01  ACTUAL       PIC X(16).
       01  HEXNUM                  PIC X(16).
       01  HEXVAL                  PIC X(32).
       01  HEXSTR                  PIC X(16) VALUE '0123456789ABCDEF'.
       01  DEC                     PIC S9(04) COMP. 
       01  FILLER REDEFINES DEC.
           05  FILLER              PIC X.
           05  DECBYTE             PIC X.
       01  I                       PIC S9(8) COMP.
       01  J                       PIC S9(8) COMP.
       01  Q                       PIC S9(8) COMP.
       01  R                       PIC S9(8) COMP.
       01  J1                      PIC S9(8) COMP.
       01  Q1                      PIC S9(8) COMP.
       01  R1                      PIC S9(8) COMP.

       PROCEDURE DIVISION.
           EXEC SQL CONNECT TO DB2NAME USER 'DB2USER' USING 'DB2PASS'
           END-EXEC.

           EXEC SQL SELECT CAST(X'1234A0A0BEEF00459151202020202020' AS
                           CHAR(16) FOR BIT DATA)
                    INTO :ACTUAL FROM SYSIBM.SYSDUMMY1
                    FETCH FIRST ROW ONLY
           END-EXEC.

           IF SQLCODE = 0 THEN
             MOVE EXPECTED TO HEXNUM
             PERFORM CONVERT-HEX
             DISPLAY 'EXPECTED >' HEXVAL '<'
             MOVE ACTUAL TO HEXNUM
             PERFORM CONVERT-HEX
             DISPLAY 'ACTUAL   >' HEXVAL '<'
           ELSE
             DISPLAY 'ERROR, SQLCA: ' SQLCA.
      
           EXEC SQL SELECT VAL INTO :ACTUAL FROM TSTCHR
                    FETCH FIRST ROW ONLY
           END-EXEC.

           IF SQLCODE = 0 THEN
             MOVE EXPECTED TO HEXNUM
             PERFORM CONVERT-HEX
             DISPLAY 'EXPECTED >' HEXVAL '<'
             MOVE ACTUAL TO HEXNUM
             PERFORM CONVERT-HEX
             DISPLAY 'ACTUAL   >' HEXVAL '<'
           ELSE
             DISPLAY 'ERROR, SQLCA: ' SQLCA.

           STOP RUN.

       CONVERT-HEX.
           PERFORM VARYING I FROM 1 BY 1 UNTIL I > 16
               COMPUTE J = 2 * I - 1
               MOVE HEXNUM(I:1) TO DECBYTE
               DIVIDE DEC BY 16 GIVING Q REMAINDER R
               COMPUTE J1 = J + 1
               COMPUTE Q1 = Q + 1
               COMPUTE R1 = R + 1
               MOVE HEXSTR(Q1:1) TO HEXVAL(J:1)
               MOVE HEXSTR(R1:1) TO HEXVAL(J1:1)
           END-PERFORM.

$

 

===== ACTUAL OUTPUT:        
$ ./test2
EXPECTED >1234A0A0BEEF00459151202020202020<
ACTUAL   >12F44141B95700C531D8404040404040<
EXPECTED >1234A0A0BEEF00459151202020202020<
ACTUAL   >12F44141B95700C531D8404040404040<
$


===== EXPECTED OUTPUT:      
$ ./test1
Connected to db.
EXPECTED >1234A0A0BEEF00459151202020202020<
ACTUAL   >1234A0A0BEEF00459151202020202020<
EXPECTED >1234A0A0BEEF00459151202020202020<
ACTUAL   >1234A0A0BEEF00459151202020202020<

$

 

 

To describe the above scenario, the compiler is actually working as expected!

 

"-host" changes several compiler options, the important one for this test case is CHAR(EBCDIC). 
 
The record written to the file is: 
INSERT INTO TSTCHR (VAL) VALUES(X'1234A0A0BEEF00459151202020202020') 
 
What is obvious about the value above is the x'20' (ASCII space) at the end of the record. 
 
When this value is read into the program it is placed into: 
      01  ACTUAL       PIC X(16) 
which is CHAR(EBCDIC) with -host.
 
 
So COBOL automatically converts the ASCII value into EBCDIC x'12F44141B95700C531D8404040404040'. 
 
To prevent this conversion you could change the definition of ACTUAL to:
01  ACTUAL       PIC X(16) usage display native. 
 
With this change ACTUAL will contain the ASCII value you want. 
 
You can check this by displaying the value in the debugger. 
 
If you really want to print the hex value then you will need a CONVERT-HEX paragraph that expects ASCII values. 
You would have to also change: 
01  HEXNUM                  PIC X(16) usage display native. 
01  FILLER REDEFINES DEC usage display native. 

 

 

0 comments
4 views

Permalink