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.