Calls to CEESECS, CEESECI, CEEISEC, and CEEDATM in PL/I

*PROCESS MACRO;
 /*Module/File Name: IBMDT3
 /******************************************************************/
 /*                                                                */
 /* Function      : CEESECS - convert timestamp to seconds         */
 /*               : CEESECI - convert seconds to time components   */
 /*               : CEEISEC - convert time components to seconds   */
 /*               : CEEDATM - convert seconds to timestamp         */
 /*               :                                                */
 /* 32 months is added to the timestamp 11/02/92 05:22             */
 /*    giving the new timestamp 07/02/95 05:22.                    */
 /*                                                                */
 /* CEESECS is used to convert the timestamp to seconds            */
 /* CEESECI is used to convert seconds to date/time components     */
 /* 32 months is added to the month component.                     */
 /* CEEISEC is used to convert the date components to seconds.     */
 /* CEEDATM is then used to build a new timestamp for the          */
 /*    updated time.                                               */
 /*                                                                */
 /******************************************************************/
 CE81DAT: PROC OPTIONS(MAIN);

    %INCLUDE  CEEIBMAW;
    %INCLUDE  CEEIBMCT;

    DCL TIMESTAMP       CHAR(255) VARYING INIT( '11/02/92 05:22' );
    DCL NEW_TIMESTAMP   CHAR(80);
    DCL PICSTR          CHAR(255) VARYING INIT( 'MM/DD/YY HH:MI' );
    DCL START_SECS      REAL FLOAT DECIMAL(16);
    DCL NEW_TIME        REAL FLOAT DECIMAL(16);
    DCL DISPLACEMENT    FIXED BIN(31,0) INIT(32);
    DCL MONTHNUM        FIXED BIN(31,0);
    DCL 01 FC,                      /* Feedback token */
           03 MsgSev    REAL FIXED BINARY(15,0),
           03 MsgNo     REAL FIXED BINARY(15,0),
           03 Flags,
              05 Case      BIT(2),
              05 Severity  BIT(3),
              05 Control   BIT(3),
           03 FacID     CHAR(3),    /* Facility ID */
           03 ISI                   /* Instance-Specific Information */
                        REAL FIXED BINARY(31,0);
    /******************************************/
    /* DATE COMPONENTS FOR CEESECI, CEEISEC   */
    /******************************************/
    DCL YEAR       REAL FIXED BINARY(31,0);
    DCL MONTH      REAL FIXED BINARY(31,0);
    DCL DAYS       REAL FIXED BINARY(31,0);
    DCL HOURS      REAL FIXED BINARY(31,0);
    DCL MINUTES    REAL FIXED BINARY(31,0);
    DCL SECONDS    REAL FIXED BINARY(31,0);
    DCL MILLSEC    REAL FIXED BINARY(31,0);

    /**********************************************************/
    /* The timestamp '11/02/92 05:22' is converted to seconds */
    /* under the control of the mask PICSTR. CEESECS will     */
    /* return a Lilian seconds tally in the double-precision  */
    /* floating-point field START_SECS.                       */
    /**********************************************************/
    CALL CEESECS ( TIMESTAMP, PICSTR, START_SECS, FC );
    IF  FBCHECK( FC, CEE000)  THEN  DO;
    /***************************************************************/
    /* The Lilian seconds tally in the field START_SECS is mapped  */
    /* into its date/time components using function CEESECI.       */
    /***************************************************************/
       CALL CEESECI( START_SECS, YEAR, MONTH, DAYS, HOURS, MINUTES,
          SECONDS, MILLSEC, FC);
       IF  FBCHECK( FC, CEE000)  THEN  DO;
          /************************************************************/
          /* MONTH is converted to month-in-century for the displace- */
          /* ment arithmetic. Then a new month and year are computed  */
          /* from the new month-in-century number. The months         */
          /* component has an allowed range of between 1 and 12.      */
          /************************************************************/
          MONTHNUM = YEAR * 12 + MONTH + DISPLACEMENT - 1;
          YEAR = MONTHNUM / 12;
          MONTH = MOD(MONTHNUM, 12) + 1;
          /***********************************************************/
          /* Now that the MONTH DateTime component has been shifted  */
          /* forward by 32 months, we must get a new Lilian          */
          /* seconds tally based on the new MONTH and YEAR compo-    */
          /* nents.  We do this with a call to service CEEISEC.      */
          /* The new Lilian seconds tally is placed in the double-   */
          /* precision floating- point variable NEW_TIME.            */
          /***********************************************************/
          CALL CEEISEC (YEAR, MONTH, DAYS, HOURS, MINUTES, SECONDS,
             MILLSEC, NEW_TIME, FC);
          IF  FBCHECK( FC, CEE000)  THEN  DO;
             /********************************************************/
             /* CEEDATM is now used to obtain a new timestamp based  */
             /* on the Lilian seconds tally in variable New_time     */
             /********************************************************/
             CALL CEEDATM( NEW_TIME, PICSTR, NEW_TIMESTAMP, FC );
             IF  FBCHECK( FC, CEE000) THEN DO;
                PUT SKIP EDIT( 'The time ', DISPLACEMENT,
                      ' months after ', TIMESTAMP,
                      ' is ', NEW_TIMESTAMP  )
                   (A, F(4), (3) A);
                 END;
              ELSE  DO;
                 PUT SKIP EDIT( 'ERROR ', FC.MsgNo,
                       ' CONVERTING SECONDS TO TIMESTAMP')
                    (A, F(4), A);
                 END;
              END;
           ELSE  DO;
              PUT SKIP EDIT( 'ERROR ', FC.MsgNo,
                    ' CONVERTING COMPONENTS TO SECONDS')
                 (A, F(4), A);
              END;
           END;
        ELSE  DO;
           PUT SKIP EDIT( 'ERROR ', FC.MsgNo,
                 ' CONVERTING SECONDS TO COMPONENTS' )
              (A, F(4), A);
           END;
        END;
    ELSE  DO;
        PUT SKIP EDIT( 'ERROR ', FC.MsgNo,
              ' CONVERTING TIMESTAMP TO SECONDS' )
           (A, F(4), A);
        END;
 END CE81DAT;