      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
      * * * * * * * *  THIS MODULE IS CASE SENSITIVE  * * * * * * * *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

       IDENTIFICATION DIVISION.
       PROGRAM-ID.     CLOCK.

      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
      *   PDFLIB CLIENT: PDFCLOCK EXAMPLE IN COBOL                  *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

       ENVIRONMENT DIVISION.

       DATA DIVISION.
       WORKING-STORAGE SECTION.


       01  PDFLIB-PAGE-SIZE-CONSTANTS.
           05  PDFLIB-A4-WIDTH         USAGE COMP-1 VALUE 5.95E+2.
           05  PDFLIB-A4-HEIGHT        USAGE COMP-1 VALUE 8.42E+2.
           05  RADIUS                  USAGE COMP-1 VALUE 2.00E+2.
           05  MARGIN                  USAGE COMP-1 VALUE 2.00E+1.


       01  PDFLIB-CALL-AREA.
           05  P                       PIC S9(9) BINARY.
           05  RC                      PIC S9(9) BINARY.
           05  PDFLIB-RETURN-LONG      PIC S9(9) BINARY.
           05  PDFLIB-RETURN-CHAR      PIC X(64) VALUE SPACES.
           05  PDFLIB-RETURN-FLOAT     COMP-1 VALUE ZEROS.
           05  PDFLIB-ERR-STRING       PIC X(128).

       01  WS-WORK-FIELDS.
           05  WS-INT                  PIC S9(9) BINARY.
           05  WS-INT2                 PIC S9(9) BINARY.
           05  WS-FORM                 PIC S9(9) BINARY.
           05  WS-PAGE                 PIC S9(9) BINARY.
           05  WS-ALPHA                PIC S9(9) BINARY.
           05  WS-HOUR                 PIC S9(9) BINARY.
           05  WS-MINUTE               PIC S9(9) BINARY.
           05  WS-SECOND               PIC S9(9) BINARY.
           05  WS-FLOAT                COMP-1.
           05  WS-FLOAT1               COMP-1.
           05  WS-FLOAT2               COMP-1.
           05  WS-FLOAT3               COMP-1.
           05  WS-FLOAT4               COMP-1.
           05  WS-STRING               PIC X(128).
           05  WS-STRING1              PIC X(128).
           05  WS-STRING2              PIC X(128).
           05  WS-STRING3              PIC X(128).




       PROCEDURE DIVISION.

      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
      *   CREATE A PDF OBJECT                                       *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

           CALL "PDNEW" USING          P,
                                       RC.

      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
      *   OPEN PDF FILE                                             *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

           MOVE 0 TO WS-INT.

           STRING 'PDFCLOCK.PDF' LOW-VALUES
                   DELIMITED BY SIZE INTO WS-STRING.

           CALL "PDBEGDOC" USING       P,
                                       WS-STRING,
                                       WS-INT,
                                       WS-NULL,
                                       PDFLIB-RETURN-LONG,
                                       RC.

           IF PDFLIB-RETURN-LONG = -1
               CALL "PDERRMSG" USING   P,
                                       PDFLIB-ERR-STRING,
                                       RC.
               DISPLAY PDFLIB-ERR-STRING.
               MOVE +8 TO RETURN-CODE
               GOBACK.

      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
      *   SET HYPERTEXT ENCODING FOR JAPANESE SYSTEMS COMPATABILITY *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

           STRING 'hypertextencoding' LOW-VALUES
                   DELIMITED BY SIZE INTO WS-STRING.
           STRING 'host' LOW-VALUES
                   DELIMITED BY SIZE INTO WS-STRING2.

           CALL "PDSETPAR" USING       P,
                                       WS-STRING,
                                       WS-STRING2,
                                       RC.

      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
      *   SET PDF INFORMATION                                       *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

           STRING 'Creator' LOW-VALUES
                   DELIMITED BY SIZE INTO WS-STRING.
           STRING 'PDFCLOCK.cbl' LOW-VALUES
                   DELIMITED BY SIZE INTO WS-STRING2.

           CALL "PDSETINF" USING       P,
                                       WS-STRING,
                                       WS-STRING2,
                                       RC.

           STRING 'Author' LOW-VALUES
                   DELIMITED BY SIZE INTO WS-STRING.
           STRING 'Thomas Merz' LOW-VALUES
                   DELIMITED BY SIZE INTO WS-STRING2.

           CALL "PDSETINF" USING       P,
                                       WS-STRING
                                       WS-STRING2,
                                       RC.

           STRING 'Title' LOW-VALUES
                   DELIMITED BY SIZE INTO WS-STRING.
           STRING 'PDF clock (COBOL)' LOW-VALUES
                   DELIMITED BY SIZE INTO WS-STRING2.

           CALL "PDSETINF" USING       P,
                                       WS-STRING
                                       WS-STRING2,
                                       RC.





      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
      *   START A NEW PAGE                                          *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

           COMPUTE WS-FLOAT1 = 2 * (RADIUS + MARGIN).
           COMPUTE WS-FLOAT2 = 2 * (RADIUS + MARGIN).

           CALL "PDBGNPAG" USING       P,
                                       WS-FLOAT1,
                                       WS-FLOAT2,
                                       WS-NULL,
                                       RC.





      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
      *   SET GRAPHICS STATE AND POSITION                           *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *


           COMPUTE WS-FLOAT1 = RADIUS + MARGIN.
           COMPUTE WS-FLOAT2 = RADIUS + MARGIN.

           CALL "PDTRANS" USING        P,
                                       WS-FLOAT1,
                                       WS-FLOAT2,
                                       RC.



           STRING 'fillstroke' LOW-VALUES
                   DELIMITED BY SIZE INTO WS-STRING.
           STRING 'rgb' LOW-VALUES
                   DELIMITED BY SIZE INTO WS-STRING2.

           MOVE 0 TO WS-FLOAT1.
           MOVE 0 TO WS-FLOAT2.
           MOVE 1 TO WS-FLOAT3.
           MOVE 0 TO WS-FLOAT4.


           CALL "PDSETCOL" USING       P,
                                       WS-STRING,
                                       WS-STRING2,
                                       WS-FLOAT1,
                                       WS-FLOAT2,
                                       WS-FLOAT3,
                                       WS-FLOAT4
                                       RC.


           CALL "PDSAVE" USING         P,
                                       RC.

      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
      *   MINUTE STROKES                                            *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

           MOVE 2 TO WS-FLOAT.

           CALL "PDLWIDTH" USING       P,
                                       WS-FLOAT,
                                       RC.



           PERFORM VARYING WS-ALPHA FROM 0 BY 6 UNTIL WS-ALPHA > 360


           MOVE 6 TO WS-FLOAT

           CALL "PDROTATE" USING       P,
                                       WS-FLOAT,
                                       RC


           MOVE 0 TO WS-FLOAT

           CALL "PDMOVETO" USING       P,
                                       RADIUS,
                                       WS-FLOAT,
                                       RC


           COMPUTE WS-FLOAT1 = RADIUS - MARGIN / 3
           MOVE 0 TO WS-FLOAT2

           CALL "PDLINETO" USING       P,
                                       WS-FLOAT1,
                                       WS-FLOAT2,
                                       RC

           CALL "PDSTROKE" USING       P,
                                       RC

           END-PERFORM.



           CALL "PDRESTOR" USING       P,
                                       RC.


           CALL "PDSAVE" USING         P,
                                       RC.


      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
      *   5 MINUTE STROKES                                          *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

           MOVE 3 TO WS-FLOAT.

           CALL "PDLWIDTH" USING       P,
                                       WS-FLOAT,
                                       RC.



           PERFORM VARYING WS-ALPHA FROM 0 BY 30 UNTIL WS-ALPHA > 360


           MOVE 30 TO WS-FLOAT

           CALL "PDROTATE" USING       P,
                                       WS-FLOAT,
                                       RC


           MOVE 0 TO WS-FLOAT

           CALL "PDMOVETO" USING       P,
                                       RADIUS,
                                       WS-FLOAT,
                                       RC


           COMPUTE WS-FLOAT1 = RADIUS - MARGIN
           MOVE 0 TO WS-FLOAT2

           CALL "PDLINETO" USING       P,
                                       WS-FLOAT1,
                                       WS-FLOAT2,
                                       RC

           CALL "PDSTROKE" USING       P,
                                       RC

           END-PERFORM.



      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
      *   FAKE OUT CURRENT TIME                                     *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

           MOVE 20 TO WS-HOUR.
           MOVE 5 TO WS-MINUTE.
           MOVE 30 TO WS-SECOND.




      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
      *   DRAW HOUR HAND                                            *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

           CALL "PDSAVE" USING         P,
                                       RC.

           COMPUTE WS-FLOAT =
                   (-1 * (((WS-MINUTE / 60.0) + WS-HOUR - 3.0) * 30.0)).


           CALL "PDROTATE" USING       P,
                                       WS-FLOAT,
                                       RC.


           COMPUTE WS-FLOAT1 = -1 * (RADIUS / 10.0).
           COMPUTE WS-FLOAT2 = -1 * (RADIUS / 20.0).

           CALL "PDMOVETO" USING       P,
                                       WS-FLOAT1,
                                       WS-FLOAT2,
                                       RC.


           COMPUTE WS-FLOAT1 = RADIUS / 2.0.
           MOVE 0 TO WS-FLOAT2.

           CALL "PDLINETO" USING       P,
                                       WS-FLOAT1,
                                       WS-FLOAT2,
                                       RC.


           COMPUTE WS-FLOAT1 = -1 * (RADIUS / 10.0).
           COMPUTE WS-FLOAT2 = RADIUS / 20.0.

           CALL "PDLINETO" USING       P,
                                       WS-FLOAT1,
                                       WS-FLOAT2,
                                       RC.

           CALL "PDCLSP" USING         P,
                                       RC.

           CALL "PDFILL" USING         P,
                                       RC.



           CALL "PDRESTOR" USING       P,
                                       RC.

      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
      *   DRAW MINUTE HAND                                          *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

           CALL "PDSAVE" USING         P,
                                       RC.

           COMPUTE WS-FLOAT =
                (-1 * (((WS-SECOND / 60.0) + WS-MINUTE - 15.0) * 6.0)).


           CALL "PDROTATE" USING       P,
                                       WS-FLOAT,
                                       RC.


           COMPUTE WS-FLOAT1 = -1 * (RADIUS / 10.0).
           COMPUTE WS-FLOAT2 = -1 * (RADIUS / 20.0).

           CALL "PDMOVETO" USING       P,
                                       WS-FLOAT1,
                                       WS-FLOAT2,
                                       RC.


           COMPUTE WS-FLOAT1 = RADIUS * 0.8.
           MOVE 0 TO WS-FLOAT2.

           CALL "PDLINETO" USING       P,
                                       WS-FLOAT1,
                                       WS-FLOAT2,
                                       RC.


           COMPUTE WS-FLOAT1 = -1 * (RADIUS / 10.0).
           COMPUTE WS-FLOAT2 = RADIUS / 20.0.

           CALL "PDLINETO" USING       P,
                                       WS-FLOAT1,
                                       WS-FLOAT2,
                                       RC.

           CALL "PDCLSP" USING         P,
                                       RC.

           CALL "PDFILL" USING         P,
                                       RC.



           CALL "PDRESTOR" USING       P,
                                       RC.


      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
      *   DRAW SECOND HAND                                          *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *


           STRING 'fillstroke' LOW-VALUES
                   DELIMITED BY SIZE INTO WS-STRING.
           STRING 'rgb' LOW-VALUES
                   DELIMITED BY SIZE INTO WS-STRING2.

           MOVE 1 TO WS-FLOAT1.
           MOVE 0 TO WS-FLOAT2.
           MOVE 0 TO WS-FLOAT3.
           MOVE 0 TO WS-FLOAT4.



           CALL "PDSETCOL" USING       P,
                                       WS-STRING,
                                       WS-STRING2,
                                       WS-FLOAT1,
                                       WS-FLOAT2,
                                       WS-FLOAT3,
                                       WS-FLOAT4
                                       RC.

           MOVE 2 TO WS-FLOAT.

           CALL "PDLWIDTH" USING       P,
                                       WS-FLOAT,
                                       RC.


           CALL "PDSAVE" USING         P,
                                       RC.

           COMPUTE WS-FLOAT = -1 * ((WS-MINUTE - 15.0) * 6.0).

           CALL "PDROTATE" USING       P,
                                       WS-FLOAT,
                                       RC


           COMPUTE WS-FLOAT1 = -1 * (RADIUS / 5.0).
           MOVE 0 TO WS-FLOAT2.


           CALL "PDMOVETO" USING       P,
                                       WS-FLOAT1,
                                       WS-FLOAT2,
                                       RC



           MOVE 0 TO WS-FLOAT2

           CALL "PDLINETO" USING       P,
                                       RADIUS,
                                       WS-FLOAT2,
                                       RC

           CALL "PDSTROKE" USING       P,
                                       RC

           CALL "PDRESTOR" USING       P,
                                       RC.



      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
      *   DRAW LITTLE CIRCLE AT CENTER                              *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

           MOVE 0 TO WS-FLOAT1.
           MOVE 0 TO WS-FLOAT2.
           COMPUTE WS-FLOAT3 = RADIUS / 30.

           CALL "PDCIRCLE" USING       P,
                                       WS-FLOAT1,
                                       WS-FLOAT2,
                                       WS-FLOAT3,
                                       RC


           CALL "PDFILL" USING         P,
                                       RC.



      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
      *   RESTORE CURRENT GRAPHICS STATE                            *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

           CALL "PDRESTOR" USING       P,
                                       RC.


      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
      *   END THE PAGE                                              *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

           CALL "PDENDPAG" USING       P,
                                       WS-NULL,
                                       RC.

      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
      *   CLOSE THE PDF DOCUMENT                                    *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

           CALL "PDENDDOC" USING       P,
                                       WS-NULL,
                                       RC.

      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
      *   DELETE THE PDF OBJECT                                     *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

           CALL "PDDELETE" USING       P,
                                       RC.

      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
      *   END THE PROGRAM                                           *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

           MOVE ZERO                   TO RETURN-CODE.
           GOBACK.

       END PROGRAM CLOCK.

