This program converts a report image into COBOL working storage. It took less than a second to generate 220 lines of COBOL code using this program on an AMD K5 133 mhz computer. A very handy tool for a COBOL programmer!


    ********************************************************************
    *** Program: PICGEN.Q                                            ***
    *** Purpose: Creates a file of COBOL working storage using info  ***
    ***          in a report layout file.  COBOL names are matched   ***
    ***          to fields in the order in which they are defined    ***
    ***          within the report layout file, from left to right,  ***
    ***          top to bottom.  There should be a one-for-one match ***
    ***          of COBOL names to fields.  This program performs    ***
    ***          no error checking whatsoever.                       ***
    ***                                                              ***
    *** To run.: Type ==> QUIKCODE PICGEN.Q filename          ***
    ***                   Where filename is the report layout file   ***
    ***                   to convert to COBOL pictures.  See sample  ***
    ***                   report layout file, SAMPLE.RPT.            ***
    ***                                                              ***
    *** Equates: NAME-FLAG    - Defines the start of a COBOL field   ***
    ***                         name with a report layout file.      ***
    ***                         COBOL field names must not be placed ***
    ***                         same line as fields.                 ***
    ***          REPORT-WIDTH - Sets the length of the COBOL         ***
    ***                         working-storage records to generate. ***
    ***          WORK-FILE    - Work file name to create.  This file ***
    ***                         stores the COBOL field names found   ***
    ***                         in the report layout file.           ***
    ***          PIC-FILE     - Output file name to create.          ***
    ***                                                              ***
    *** Fields.: The position of the field on a line determines its  ***
    ***          position within the COBOL record.  The valid field  ***
    ***          types are:                                          ***
    ***             X          - Alphanumeric (PIC X).               ***
    ***             9          - Numeric (PIC 9).                    ***
    ***             Z          - Numeric zero suppressed (PIC Z).    ***
    ***             -          - Numeric edited signed               ***
    ***             +          - Numeric edited signed               ***
    ***             ,          - Numeric edited with commas.         ***
    ***             MM/DD/YY   - 05 DATE.                            ***
    ***                             10 DATE-MM PIC X(002).           ***
    ***                             10 DATE-S1 PIC X(001) VALUE '/'. ***
    ***                             10 DATE-DD PIC X(002).           ***
    ***                             10 DATE-S2 PIC X(001) VALUE '/'. ***
    ***                             10 DATE-YY PIC X(002).           ***
    ***             MM/DD/YYYY - 05 DATE.                            ***
    ***                             10 DATE-MM PIC X(002).           ***
    ***                             10 DATE-S1 PIC X(001) VALUE '/'. ***
    ***                             10 DATE-DD PIC X(002).           ***
    ***                             10 DATE-S2 PIC X(001) VALUE '/'. ***
    ***                             10 DATE-YYYY PIC X(004).         ***
    ***             HH:MM:SS   - 05 TIME.                            ***
    ***                             10 TIME-HH PIC X(002).           ***
    ***                             10 TIME-H1 PIC X(001) VALUE ':'. ***
    ***                             10 TIME-MM PIC X(002).           ***
    ***                             10 TIME-H2 PIC X(001) VALUE ':'. ***
    ***                             10 TIME-SS PIC X(002).           ***
    ***             HR:MN:SC   - 05 TIME.                            ***
    ***                             10 TIME-HR PIC X(002).           ***
    ***                             10 TIME-H1 PIC X(001) VALUE ':'. ***
    ***                             10 TIME-MN PIC X(002).           ***
    ***                             10 TIME-H2 PIC X(001) VALUE ':'. ***
    ***                             10 TIME-SC PIC X(002).           ***
    *** Literal: Any text found within the report layout file that   ***
    ***          is not a COBOL name or a field.  To force two or    ***
    ***          or more literals to be placed within one field,     ***
    ***          place a tilde (~) characters between them.          ***
    ***          For example:  "REPORT~~~DATE" will generate...      ***
    ***          "05 FILLER PIC X(13) VALUE 'REPORT   DATE'."        ***
    ********************************************************************

    OPTION LIST = NO                       * DON'T LIST PROGRAM CODE
    OPTION INCLUDE = 'COLORS.INC'          * INCLUDE FILE OF SCREEN COLOR CODES
    FASTVIDEO OFF                          * USE BIOS VIDEO CALLS (FOR COMPATIBILITY)

    EQUATE REPORT-WIDTH    TO 133          * EQU REPORT RECORD WIDTH
    EQUATE NAME-FLAG       TO '@'          * EQU COBOL NAME FLAG
    EQUATE WORK-FILE       TO 'PICGEN.WRK' * EQU COBOL NAME WORK FILE
    EQUATE PIC-FILE        TO 'PICGEN.COB' * EQU COBOL PIC FILE

    * PROGRAM SUBSCRIPTS
    EQUATE SUB1            TO WST500-I     * SUB1 IS SUBSCRIPT 
    EQUATE SUB2            TO WST502-I     * SUB2 IS SUBSCRIPT 
    EQUATE HOLD-SUB        TO WST504-I     * HOLD-SUB IS SUBSCRIPT 

    * WORKING WHEEL AREA
    EQUATE WORKING-WHEEL-TIMER     TO WST506-I
    EQUATE WORKING-WHEEL-SUB       TO WST508-I
    EQUATE WORKING-WHEEL-SPOKES    TO WST101-104
       EQUATE WORKING-WHEEL-SPOKE  TO WST101

    * PICGEN.WRK FILE AREA
    EQUATE COBOL-NAME-LEN  TO IFB1-2
    EQUATE COBOL-NAME      TO IFB4-33
    EQUATE COBOL-NAME-1    TO IFB4

    * WORKING STORAGE AREA
    EQUATE BYTE-CNT        TO WST1-3
    EQUATE LINE-CNT        TO WST4-5
    EQUATE LITERAL         TO WST7-60
    EQUATE LITERAL-1       TO WST7-7
    EQUATE LITERAL-2       TO WST8-8
    EQUATE LITERAL-3       TO WST9-9
    EQUATE LITERAL-DATE    TO WST7-14
    EQUATE LITERAL-DATEX   TO WST7-16
    EQUATE LITERAL-TIME    TO WST7-14

*   CLS                             * CLEAR VIDEO SCREEN
    COLOR LTWHITE-ON-BLUE
    DISPLAY PROG NOSKIP             * DISPLAY WORKING MESSAGE
    DISPLAY ' WORKING...'
    MOVE '\|/-'         TO WORKING-WHEEL-SPOKES
    PERFORM 100                     * GET COBOL FIELDS
    PERFORM 200                     * GENERATE COBOL PICTURE CLAUSES
    DISPLAY
    DISPLAY 'OUTPUT WRITTEN TO FILE ' NOSKIP
    DISPLAY PIC-FILE
    DISPLAY 'PRESS ANY KEY TO CONTINUE'
    GETKEY WST1 WST1
    SYSTEM 'EDIT PICGEN.COB'
    END                             * TERMINATE PROGRAM

    * GET COBOL FIELDS
100 OPEN IFA PARM1-20   251  1000   * OPEN BUFFERED (1000) INPUT FILE - IFA
    OPEN OFB WORK-FILE   80   800   * OPEN BUFFERED (800) OUTPUT FILE - OFB
110 READ IFA AT EOF 149             * READ RECORD FROM INPUT FILE - IFA
    MOVE 1 TO SUB1                  * INITIALIZE SUBSCRIPT S1 TO 1
    PERFORM WW                      * DISPLAY WORKING WHEEL
120 IF SUB1 >= REPORT-WIDTH         * SUBSCRIPT SUB1 AT RECORD END?
      GO TO 110.                    *   YES, GO READ NEXT INPUT RECORD
    IF IFA1-1 (SUB1) = ' '          * CURRENT BYTE IN RECORD A BLANK?
      ADD 1 TO SUB1                 *   YES, ADD 1 TO SUBSCRIPT S1
      GO TO 120.                    *   GO CHECK NEXT BYTE IN RECORD
    IF IFA1-1 (SUB1) = NAME-FLAG    * CURRENT BYTE START OF COBOL FIELD NAME?
      PERFORM 150                   *   YES, GET COBOL FIELD NAME AND LENGTHS ON LINE
      WRITE OFB                     *   WRITE OUTPUT RECORD - OFB
      GO TO 120.                    *   GO CHECK NEXT BYTE IN INPUT RECORD
    GO TO 110                       * GO READ NEXT INPUT RECORD
149 CLOSE IFA                       * CLOSE INPUT FILE
    CLOSE OFB                       * CLOSE OUTPUT FILE
    EXIT                            * RETURN TO CALLER

    * GET LENGTH AND NAME OF COBOL FIELDS ON REPORT LINE
150 MOVE SPACES      TO OFB         * INITIALIZE OUTPUT RECORD - OFB
    MOVE 4           TO SUB2        * INITIALIZE SUBSCRIPT S2 TO 4
    ADD 1 TO SUB1                   * BUMP SUBSCRIPT S1 UP BY 1
160 IF SUB1 > REPORT-WIDTH          * SUBSCRIPT SUB1 BEYOND RECORD END?
      OR SUB2 > 33                  * OR... SUBSCRIPT S2 OVER 33?
      OR IFA1 (SUB1) = ' '          * CURRENT BYTE IN RECORD A BLANK?
      SUBTRACT 4 FROM SUB2          *   YES, SUBSTRACT 4 FROM SUBSCRIPT SUB2
      MOVE SUB2      TO OFB1-2      *   MOVE COBOL NAME LENGTH TO OUTPUT RECORD
      EXIT.                         *   RETURN TO CALLER
    MOVE IFA1 (SUB1) TO OFB1 (SUB2) * MOVE COBOL NAME BYTE TO OUTPUT RECORD
    ADD 1 TO SUB1                   * BUMP SUBSCRIPT S1 UP BY 1
    ADD 1 TO SUB2                   * BUMP SUBSCRIPT S2 UP BY 1
    GO TO 160                       * GO CHECK NEXT BYTE IN INPUT RECORD
199 EXIT                            * RETURN TO CALLER

    * GENERATE COBOL PICTURE CLAUSES
200 OPEN IFA PARM1-20     251 1000  * OPEN BUFFERED (1000) INPUT FILE - IFA
    OPEN IFB WORK-FILE     80  800  * OPEN BUFFERED (800) INPUT FILE - IFB
    OPEN OFA PIC-FILE      80  800  * OPEN BUFFERED (800) OUTPUT FILE - OFA
210 READ IFA AT EOF 299             * READ INPUT FILE - IFA
    MOVE 1           TO SUB1        * INITIALIZE SUBSCRIPT S1 TO 1
    PERFORM WW                      * DISPLAY WORKING WHEEL
    * BYPASS BLANK LINES AND LINES HAVING A COBOL FIELD NAME
220 IF SUB1 > REPORT-WIDTH          * SUBSCRIPT S1 BEYOND REPORT WIDTH?
      OR IFA1-1 (SUB1) = NAME-FLAG  * CURRENT BYTE START OF COBOL FIELD NAME?
      GO TO 210.                    *   YES, GO READ NEXT INPUT RECORD
    IF IFA1 (SUB1) IS SPACE         * CURRENT BYTE IN RECORD A BLANK?
      ADD 1 TO SUB1                 * BUMP SUBSCRIPT S1 UP 1
      GO TO 220.                    * GO CHECK NEXT BYTE IN INPUT RECORD
    *
    ADD 1 TO LINE-CNT               * BUMP LINE COUNTER BY 1
    MOVE SPACES        TO OFA1-80   * INITIALIZE OUTPUT RECORD - OFA
    WRITE OFA                       * WRITE OUTPUT FILE RECORD - OFA
    MOVE '01  REPORT-LINE-NN.' TO OFA8
    MOVE LINE-CNT              TO OFA24-25
    WRITE OFA                       * WRITE OUTPUT FILE RECORD- OFA
    MOVE 1             TO SUB1      * SET SUBSCRIPT S1 TO 1
230 IF SUB1 > REPORT-WIDTH          * SUBSCRIPT S1 BEYOND REPORT WIDTH?
      GO TO 210.                    *   YES, GO READ NEXT INPUT RECORD
    MOVE SPACES        TO OFA1-15
    MOVE '05 FILLER                         PIC X(XXX)' TO OFA12-76
    IF IFA1-1 (SUB1) IS SPACE       * CURRENT INPUT
      * PROCESS SPACES
      PERFORM 500
      GO TO 230.
    * PROCESS NON-SPACES
    PERFORM 600
    GO TO 230
299 CLOSE OFA
    EXIT

    * PROCESS SPACES ROUTINE
500 MOVE ZEROS              TO BYTE-CNT
510 IF SUB1 > REPORT-WIDTH
      OR IFA1-1 (SUB1) <> ' '
      IF IFA1-1 (SUB1) <> '~'
        MOVE BYTE-CNT       TO OFA52-54
        MOVE 'VALUE SPACE.' TO OFA57
        WRITE OFA
        EXIT.
    ADD 1 TO SUB1
    ADD 1 TO BYTE-CNT
    GO TO 510
599 EXIT

    * PROCESS NON-SPACES ROUTINE
600 MOVE ZEROS         TO BYTE-CNT
    MOVE 1             TO SUB2
    MOVE SPACES        TO LITERAL
610 IF SUB1 > REPORT-WIDTH
      OR IFA1-1 (SUB1) IS SPACES
      MOVE BYTE-CNT    TO OFA52-54
      PERFORM 700
      EXIT.
    IF SUB2 > 45
      IF LITERAL-2 <> 'X'
        MOVE BYTE-CNT TO OFA52-54
        PERFORM 700
        EXIT.
    IF IFA1-1 (SUB1) = '~'
      MOVE SPACE       TO IFA1-1 (SUB1).
    MOVE IFA1-1 (SUB1) TO LITERAL-1 (SUB2)
    ADD 1 TO SUB1
    ADD 1 TO SUB2
    ADD 1 TO BYTE-CNT
    GO TO 610
699 EXIT
    * WRITE LITERAL/COBOL FIELD
    * CHECK FOR NUMERIC SIGNED EDITED FIELDS
700 IF LITERAL-1     = '-'
      OR LITERAL-1   = '+'
      IF LITERAL-2   = '9'
        OR LITERAL-2 = 'Z'
        OR LITERAL-2 = '+'
        OR LITERAL-2 = '-'
        OR LITERAL-2 = ','
        PERFORM 800
        EXIT.
    * BYPASS LITERALS STARTING WITH AN 'X'
    IF LITERAL-1      = 'X'
      IF LITERAL-2   <> 'X'
        IF LITERAL-2 <> ' '
        GO TO 710.
    * CHECK FOR ALL OTHER DEFINED FIELD TYPES
    IF LITERAL-1       = '9'
      OR LITERAL-1     = 'X'
      OR LITERAL-1     = 'Z'
      OR LITERAL-DATE  = 'MM/DD/YY'
      OR LITERAL-DATEX = 'MM/DD/YYYY'
      OR LITERAL-TIME  = 'HH:MM:SS'
      OR LITERAL-TIME  = 'HR:MN:SC'
      PERFORM 800
      EXIT.
710 IF BYTE-CNT <= 3
      MOVE 'VALUE '   TO OFA57
      MOVE "'"        TO OFA63
      MOVE BYTE-CNT   TO SUB2
      ADD 1 TO SUB2
      MOVE "'"        TO LITERAL-1 (SUB2)
      ADD 1 TO SUB2
      MOVE "."        TO LITERAL-1 (SUB2)
      MOVE LITERAL    TO OFA64-76
      WRITE OFA
      EXIT.
    WRITE OFA
    MOVE SPACES       TO OFA1-80
    MOVE 'VALUE '     TO OFA15
    MOVE "'"          TO OFA21
    MOVE BYTE-CNT     TO SUB2
    ADD 1 TO SUB2
    MOVE "'"          TO LITERAL-1 (SUB2)
    ADD 1 TO SUB2
    MOVE "."          TO LITERAL-1 (SUB2)
    MOVE LITERAL      TO OFA22-76
    WRITE OFA
799 EXIT
    * PROCESS COBOL FIELD
800 MOVE '.'          TO OFA56
810 IF IFB IS EOF
      MOVE LITERAL    TO OFA15-44
      WRITE OFA
      EXIT.
    READ IFB AT EOF 810
    GO TO 816
816 IF LITERAL-1 = 'X'
      MOVE COBOL-NAME TO OFA15-44
      WRITE OFA
      EXIT.
    IF LITERAL-DATE = 'MM/DD/YY'
      PERFORM 900
      EXIT.
    IF LITERAL-TIME   = 'HH:MM:SS'
      OR LITERAL-TIME = 'HR:MN:SC'
      PERFORM 950
      EXIT.
    IF LITERAL-1   = '9'
      OR LITERAL-1 = 'Z'
      OR LITERAL-1 = '+'
      OR LITERAL-1 = '-'
      MOVE COBOL-NAME  TO OFA15-44
      MOVE SPACES      TO OFA50-55
      MOVE '.'         TO LITERAL-1 (SUB2)
      MOVE LITERAL     TO OFA50-76
      WRITE OFA
      EXIT.
899 EXIT
    * FORMAT MM/DD/YY & MM/DD/YYYY DATE PICTURES
900 MOVE COBOL-NAME-LEN TO SUB2
    ADD 1 TO SUB2
    MOVE SUB2          TO HOLD-SUB
    MOVE '.'           TO COBOL-NAME-1 (SUB2)
    MOVE COBOL-NAME    TO OFA15-44
    MOVE SPACES        TO OFA45-76
    WRITE OFA

    MOVE SPACES        TO OFA1-18
    MOVE '10                             PIC X(002).' TO OFA15-76
    MOVE '-MM'         TO COBOL-NAME-1 (SUB2)
    ADD 2 TO SUB2
    MOVE COBOL-NAME    TO OFA18-44
    WRITE OFA

    MOVE HOLD-SUB      TO SUB2
    MOVE '10                             PIC X(001)'  TO OFA15-76
    MOVE '-S1'         TO COBOL-NAME-1 (SUB2)
    MOVE "VALUE '/'."  TO OFA57-66
    ADD 2 TO SUB2
    MOVE COBOL-NAME    TO OFA18-44
    WRITE OFA

    MOVE HOLD-SUB      TO SUB2
    MOVE '10                             PIC X(002).' TO OFA15-76
    MOVE '-DD'         TO COBOL-NAME-1 (SUB2)
    ADD 2 TO SUB2
    MOVE COBOL-NAME    TO OFA18-44
    WRITE OFA

    MOVE HOLD-SUB      TO SUB2
    MOVE '10                             PIC X(001)'  TO OFA15-76
    MOVE '-S2'         TO COBOL-NAME-1 (SUB2)
    MOVE "VALUE '/'."  TO OFA57-66
    ADD 2 TO SUB2
    MOVE COBOL-NAME    TO OFA18-44
    WRITE OFA

    MOVE HOLD-SUB      TO SUB2
    MOVE '10                             PIC X(002).' TO OFA15-76
    MOVE '-YY'         TO COBOL-NAME-1 (SUB2)
    ADD 2 TO SUB2
    IF LITERAL-DATEX = 'MM/DD/YYYY'
      MOVE '004'       TO OFA52-54
      ADD 1 TO SUB2
      MOVE 'YY'        TO COBOL-NAME-1 (SUB2)
      ADD 1 TO SUB2.
    MOVE COBOL-NAME    TO OFA18-44
    WRITE OFA
909 EXIT
    * FORMAT HH:MM:SS & HR:MN:SC TIME PICTURES
950 MOVE COBOL-NAME-LEN TO SUB2
    ADD 1 TO SUB2
    MOVE SUB2          TO HOLD-SUB
    MOVE '.'           TO COBOL-NAME-1 (SUB2)
    MOVE COBOL-NAME    TO OFA15-44
    MOVE SPACES        TO OFA45-76
    WRITE OFA

    MOVE SPACES        TO OFA1-18
    MOVE '10                             PIC X(002).' TO OFA15-76
    MOVE '-HR'         TO COBOL-NAME-1 (SUB2)
    ADD 2 TO SUB2
    MOVE COBOL-NAME    TO OFA18-44
    WRITE OFA

    MOVE HOLD-SUB      TO SUB2
    MOVE '10                             PIC X(001)'  TO OFA15-76
    MOVE '-H1'         TO COBOL-NAME-1 (SUB2)
    MOVE "VALUE ':'."  TO OFA57-66
    ADD 2 TO SUB2
    MOVE COBOL-NAME    TO OFA18-44
    WRITE OFA

    MOVE HOLD-SUB      TO SUB2
    MOVE '10                             PIC X(002).' TO OFA15-76
    MOVE '-MN'         TO COBOL-NAME-1 (SUB2)
    ADD 2 TO SUB2
    MOVE COBOL-NAME    TO OFA18-44
    WRITE OFA

    MOVE HOLD-SUB      TO SUB2
    MOVE '10                             PIC X(001)'  TO OFA15-76
    MOVE '-H2'         TO COBOL-NAME-1 (SUB2)
    MOVE "VALUE ':'."  TO OFA57-66
    ADD 2 TO SUB2
    MOVE COBOL-NAME    TO OFA18-44
    WRITE OFA

    MOVE HOLD-SUB      TO SUB2
    MOVE '10                             PIC X(002).' TO OFA15-76
    MOVE '-SC'         TO COBOL-NAME-1 (SUB2)
    ADD 2 TO SUB2
    MOVE COBOL-NAME    TO OFA18-44
    WRITE OFA
959 EXIT

    * DISPLAY WORKING WHEEL - Informs the user the program is still running
WW: ADD 1 TO WORKING-WHEEL-TIMER
    IF WORKING-WHEEL-TIMER < 2
      EXIT.
    ADD 1 TO WORKING-WHEEL-SUB
    IF WORKING-WHEEL-SUB > 4
      MOVE 1 TO WORKING-WHEEL-SUB.
    CURSOR 1 20
    DISPLAY WORKING-WHEEL-SPOKE (WORKING-WHEEL-SUB) NOSKIP
    MOVE ZEROS TO WORKING-WHEEL-TIMER
    EXIT

Click on the image to view the sample input file to this program

Picgen Input


Click on the image to view the output file from this program

Picgen Output


Back to home Back to home