CBL APOST,DLL,PGMN(LM),RENT IDENTIFICATION DIVISION. PROGRAM-ID. 'SOFLCICV'. AUTHOR. LIMES DATENTECHNIK GMBH. *************************************************************** * EXAMPLE FOR USING THE FLUC-ICONV INTERFACE IN COBOL. * * * SOFLCICV calls functions of the interface provided in * module FLCICV of FLAM.LOAD. * * An input file is read, all characters are converted * to UTF-8, illegal Characters are ignored. All data is * written to an output file. *-------------------------------------------------------------- * LINK WITH: * //DLLIMP DD DSN=FLAM.IMPORT,DISP=SHR * * INCLUDE DLLIMP(FLCICV) *-------------------------------------------------------------- * DD-NAMES USED IN THIS EXAMPLE: * * INPUT -> INPUT FILE TO READ (PS, F/FB 80) * OUTPUT -> OUTPUT DATA SET (PS, V/VB 2040) * *-------------------------------------------------------------- * Note: * Strings are suffixed with X'00'. *************************************************************** ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT OUTDAT ASSIGN TO S-OUTPUT ACCESS MODE IS SEQUENTIAL. * SELECT INDAT ASSIGN TO S-INPUT ACCESS MODE IS SEQUENTIAL. * DATA DIVISION. * FILE SECTION. FD OUTDAT BLOCK CONTAINS 0 CHARACTERS RECORDING MODE V RECORD IS VARYING FROM 1 TO 240 CHARACTERS DEPENDING ON OUTREC-LEN LABEL RECORD IS STANDARD. 01 OUTDAT-RECORD. 02 FILLER PIC X(240). * FD INDAT BLOCK CONTAINS 0 CHARACTERS RECORDING MODE F RECORD CONTAINS 80 CHARACTERS LABEL RECORD IS STANDARD. 01 INDAT-RECORD. 02 FILLER PIC X(80). * WORKING-STORAGE SECTION. * 77 RET-PTR USAGE IS POINTER. 77 IN-PTR USAGE IS POINTER. 77 OUT-PTR USAGE IS POINTER. * 77 INLEFT PIC 9(8) COMP. 77 OUTLEFT PIC 9(8) COMP. 77 MSGLEN PIC 9(8) BINARY VALUE ZERO. 77 FLICV-HDL PIC 9(8) COMP VALUE ZERO. 77 FLICV-RC PIC S9(8) COMP VALUE ZERO. 77 FLICV-ERRNO PIC 9(8) COMP. * 77 REC-COUNTER PIC 9(8) COMP VALUE ZERO. * MAX. RECORD SIZE OF INPUT/OUTPUT FILE 77 IRECSIZE PIC 9(8) COMP VALUE 80. 77 ORECSIZE PIC 9(8) COMP VALUE 240. * 77 OUTREC-LEN PIC 9(8) COMP. 77 BUFFEXP PIC 9(8) COMP VALUE ZERO. 77 REQBUFFLEN PIC 9(8) COMP VALUE ZERO. * 77 DISP-DLIM PIC X. 77 DISP-PTR PIC 9(8) COMP VALUE 1. 01 DISPAREA PIC X(8120) VALUE SPACES. 01 DISP-CCSID PIC X(80). * 01 INRECORD PIC X(80). 01 OUTRECORD PIC X(240). * 01 FLICONV-PARAMETER. 05 FLICV-FROM. 10 CCSID-FROM PIC X(8) VALUE 'IBM-1141'. 10 FILLER PIC X(8) VALUE '//IGNORE'. 10 FILLER PIC X(1) VALUE LOW-VALUE. 05 FLICV-TO. 10 CCSID-TO PIC X(4) VALUE 'UTF8'. 10 FILLER PIC X(1) VALUE LOW-VALUE. * LINKAGE SECTION. * 01 MSGAREA PIC X(256). / PROCEDURE DIVISION. * MAIN SECTION. * START-PROGRAM. DISPLAY 'Program SOFLCICV startet'. DISPLAY 'Converts data from ' CCSID-FROM ' to ' CCSID-TO. DISPLAY ' '. GET-VERSION. * * Call the function to receive version information * CALL 'fliconv_version' RETURNING RET-PTR. * SET ADDRESS OF MSGAREA TO RET-PTR. UNSTRING MSGAREA DELIMITED BY X'00' INTO DISPAREA COUNT MSGLEN. * DISPLAY 'Version Message:'. DISPLAY DISPAREA(1:MSGLEN). * GET-CCSID-LIST. * * GET A STANDARD FORMATTED LIST OF SUPPORTED CCSIDS, * CALL 'fliconv_list' USING OMITTED, DISPAREA. DISPLAY 'Supported CCSIDs:'. * * THE AREA IS DELIMITED BY X'15' FOR EVERY CCSIS AND BY X'00' * AT THEN END * DISP-CCSIDS. MOVE ZERO TO MSGLEN. UNSTRING DISPAREA DELIMITED BY X'15' OR X'00' INTO DISP-CCSID DELIMITER DISP-DLIM COUNT MSGLEN WITH POINTER DISP-PTR. IF DISP-DLIM = X'15' THEN DISPLAY DISP-CCSID(1:MSGLEN) GO TO DISP-CCSIDS END-IF. OPEN-FLICONV. CALL 'fliconv_open' USING FLICV-TO, FLICV-FROM RETURNING FLICV-HDL. IF FLICV-HDL = ZERO THEN DISPLAY 'Open of fliconv in error.' PERFORM ERROR-FOUND MOVE 12 TO RETURN-CODE GO TO END-PROGRAM END-IF. CHECK-BUFFER-SPACE. CALL 'fliconv_expansion' USING BY VALUE FLICV-HDL RETURNING BUFFEXP. DISPLAY 'Expansion factor: ' BUFFEXP. COMPUTE REQBUFFLEN = BUFFEXP * IRECSIZE IF REQBUFFLEN > ORECSIZE THEN DISPLAY 'For this translation, the OUTPUT RECSIZE', ' is too small.' DISPLAY 'Need a RECSIZE of ' REQBUFFLEN ' bytes.' DISPLAY 'Program SOFLCICV stops.' GO TO CLOSE-FLICONV END-IF. OPEN-FILES. OPEN INPUT INDAT, OUTPUT OUTDAT. DO-CONVERSION. * * Assumed all records have completed multibytes, * no blocking/unblocking mechanism is done here * READ INDAT INTO INRECORD AT END GO TO DONE-CONVERSION. ADD 1 TO REC-COUNTER. SET IN-PTR TO ADDRESS OF INRECORD. SET OUT-PTR TO ADDRESS OF OUTRECORD. MOVE IRECSIZE TO INLEFT. MOVE ORECSIZE TO OUTLEFT. CALL 'fliconv' USING BY VALUE FLICV-HDL, BY REFERENCE IN-PTR, BY REFERENCE INLEFT, BY REFERENCE OUT-PTR, BY REFERENCE OUTLEFT RETURNING FLICV-RC IF FLICV-RC < ZERO THEN DISPLAY 'Errorcode received on conversion:' PERFORM ERROR-FOUND ELSE COMPUTE OUTREC-LEN = ORECSIZE - OUTLEFT WRITE OUTDAT-RECORD FROM OUTRECORD END-IF. IF INLEFT = ZERO THEN GO TO DO-CONVERSION ELSE DISPLAY 'INPUT record has incomplete multibytes at end:' DISPLAY INRECORD(70:10) DISPLAY 'Program stopped.' END-IF. DONE-CONVERSION. DISPLAY REC-COUNTER ' records converted.'. CLOSE-FILES. CLOSE INDAT, OUTDAT. CLOSE-FLICONV. CALL 'fliconv_close' USING BY VALUE FLICV-HDL. DISPLAY 'Program SOFLCICV finished'. END-PROGRAM. STOP RUN. / ERROR-FOUND SECTION. * * Get the ERRNO variable from fliconv, receive the * corresponding error message and display the message. * EF-1. CALL 'fliconv_geterrno' RETURNING FLICV-ERRNO. DISPLAY FLICV-ERRNO. CALL 'fliconv_strerror' USING BY VALUE FLICV-ERRNO RETURNING RET-PTR. SET ADDRESS OF MSGAREA TO RET-PTR. UNSTRING MSGAREA DELIMITED BY X'00' INTO DISPAREA COUNT MSGLEN. DISPLAY 'Error Message:'. DISPLAY DISPAREA(1:MSGLEN). EF-99. EXIT.