Skip to main content

Problem:

If you have migrated an application from Windows to UNIX/Linux, which uses line drawing (to draw boxes etc), you may find that it doesn't work as expected.

Under Windows, you may have inserted the specific characters used to draw (corners, vertical and horizontal lines etc) into working storage fields, or your screen section, and displayed these directly onto the screen.   If you port these to a UNIX or Linux environment, the characters used for drawing may not be correctly represented, the possible exception being if you use ansi emulation.

Resolution:

The best way to solve this, is to use the CBL_GET_SCR_LINE_DRAW library routine.  This will load the characters required for line/box drawing into working-storage screen section fields, for manual drawing.  This allows you to load the required characters without needing to be concerned with the terminal emulation being used, and provides a platform independent way (including Windows) of drawing boxes.

In the original Windows program the characters may have been represented something like:

      *

       01  BORDER-DATA.

           05  BD-TOP-L            PIC X VALUE "ú".

           05  BD-TOP-R            PIC X VALUE "¿".

           05  BD-BOT-L            PIC X VALUE "Á".

           05  BD-BOT-R            PIC X VALUE "Ú".

           05  BD-VER                PIC X VALUE "³".

           05  BD-HOR               PIC X VALUE "ä".

These would then display as lines and corners etc.

Here is a full program, showing how to use the CBL_GET_SCR_LINE_DRAW routine.

WORKING-STORAGE SECTION.                                         

                                                                 

01  FUNCTION-CODE                   PIC X COMP-X.                

01  SINGLE-BYTE-TABLE.                                           

    05  SB-LINE-DRAW-CODE           PIC X COMP-X.                

    05                              PIC X.                       

    05  SB-LINE-DRAW-CHAR           PIC X OCCURS 256.            

    05  SB-LINE-DRAW-CHAR           PIC XX OCCURS 256.           

                                                                 

01  STATUS-CODE                     PIC X(2) COMP-5.            

                                                                 

01  WS-INPUT                        PIC X.                       

                                                                 

01  BOX-CO-ORDINATES.                                            

    05  ROW-FROM            PIC 99.                              

    05  ROW-TO              PIC 99.                              

    05  COL-FROM            PIC 99.                              

    05  COL-TO              PIC 99.                              

                                                                 

01  XX-WHICH-COLOR.                                              

    05  WHICH-COLOR         PIC 9.                               

                                                                 

01  BOX-ROWCOL.                                                  

    05  BOX-ROW             PIC 99.                              

    05  BOX-COL             PIC 99.                              

                                                                 

01  BORDER-DATA.                                                

    05  BD-TOP-L            PIC X.                               

    05  BD-TOP-R            PIC X.                               

    05  BD-BOT-L            PIC X.                               

    05  BD-BOT-R            PIC X.                               

    05  BD-V                PIC X.                               

    05  BD-H                PIC X.                               

                                                                 

*01  BORDER-DATA.  As directly represented for Windows screens                                               

*    05  BD-TOP-L            PIC X VALUE "ú".                     

*   05  BD-TOP-R            PIC X VALUE "¿".                     

*    05  BD-BOT-L            PIC X VALUE "Á".                     

*    05  BD-BOT-R            PIC X VALUE "Ú".                     

*    05  BD-V                PIC X VALUE "³".                     

*    05  BD-H                PIC X VALUE "ä".                     

                                                                 

01  CLR-BOX-LINE.                                                

    05  BOX-LINE            PIC X(80) VALUE SPACES.              

                                                                 

01  FROM-ROW                PIC 99.                              

01  TO-ROW                  PIC 99.                              

01  FROM-COL                PIC 99.                              

01  TO-COL                  PIC 99.                              

                                                                 

PROCEDURE DIVISION.                                              

STEP-1.                                                          

                                                                 

    MOVE 0 TO FUNCTION-CODE.                                    

    CALL "CBL_GET_SCR_LINE_DRAW" USING FUNCTION-CODE            

                                       SINGLE-BYTE-TABLE         

                                 RETURNING STATUS-CODE.          

                                                                 

    MOVE SB-LINE-DRAW-CHAR(17) TO BD-TOP-L.                      

    MOVE SB-LINE-DRAW-CHAR(20) TO BD-TOP-R.                      

    MOVE SB-LINE-DRAW-CHAR(65) TO BD-BOT-L.                      

    MOVE SB-LINE-DRAW-CHAR(68) TO BD-BOT-R.                      

    MOVE SB-LINE-DRAW-CHAR(80) TO BD-V.                          

    MOVE SB-LINE-DRAW-CHAR(5) TO BD-H.                           

                                                                 

    DISPLAY SPACES UPON CRT.

*Co-ordinates below are simple ro and column from and to positions

*In this case we're going to draw 2 boxes, one inside the other                                   

    MOVE 01240279 TO BOX-CO-ORDINATES.                           

    PERFORM DRAW-BOX.                                            

    MOVE 10201070 TO BOX-CO-ORDINATES.                           

    PERFORM DRAW-BOX.                                            

    DISPLAY "Box Test" AT 0335 WITH REVERSE-VIDEO.               

    DISPLAY "Press Enter to EXIT " AT 1925.                      

    ACCEPT WS-INPUT AT 1950.                                    

    STOP RUN.                                                    

                                                                 

DRAW-BOX SECTION.                                                

CC-DRAW-BOX.                                                     

    PERFORM SHOW-TOP-BORDER.                                    

    MOVE ROW-FROM TO BOX-ROW.                                    

    ADD 1 TO BOX-ROW.                                            

    PERFORM SHOW-VER                                             

        UNTIL BOX-ROW = ROW-TO.                                  

    PERFORM SHOW-BOT-BORDER.                                    

    PERFORM CLEAR-BOX.                                           

                                                                 

SHOW-TOP-BORDER SECTION.                                         

CC-SHOW-TOP-BORDER.                                              

    MOVE ROW-FROM TO BOX-ROW.                                    

    MOVE COL-FROM TO BOX-COL.                                    

    DISPLAY BD-TOP-L AT BOX-ROWCOL.                              

    MOVE COL-FROM TO BOX-COL.                                    

    ADD 1 TO BOX-COL.                                            

    PERFORM SHOW-HOR                                             

        UNTIL BOX-COL = COL-TO.                                  

    MOVE COL-TO TO BOX-COL.                                      

    DISPLAY BD-TOP-R AT BOX-ROWCOL.                              

                                                                 

SHOW-VER SECTION.                                                

CC-SHOW-VER.                                                     

    MOVE COL-FROM TO BOX-COL.                                    

    DISPLAY BD-V AT BOX-ROWCOL.                                  

    MOVE COL-TO TO BOX-COL.                                      

    DISPLAY BD-V AT BOX-ROWCOL.                                  

    ADD 1 TO BOX-ROW.                                            

                                                                 

SHOW-BOT-BORDER SECTION.                                         

CC-SHOW-BOT-BORDER.                                              

    MOVE ROW-TO TO BOX-ROW.                                      

    MOVE COL-FROM TO BOX-COL.                                    

    DISPLAY BD-BOT-L AT BOX-ROWCOL.                              

    MOVE COL-FROM TO BOX-COL.                                    

    ADD 1 TO BOX-COL.                                            

    PERFORM SHOW-HOR                                             

        UNTIL BOX-COL = COL-TO.                                  

    MOVE COL-TO TO BOX-COL.                                      

    DISPLAY BD-BOT-R AT BOX-ROWCOL.                              

                                                                 

SHOW-HOR SECTION.                                                

CC-SHOW-HOR.                                                     

    DISPLAY BD-H AT BOX-ROWCOL.                                  

    ADD 1 TO BOX-COL.                                            

                                                                 

Old KB# 3715