*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;