COMCVDE 
COMMON
          CTEXT  COMCVDE - VALIDATE DATE OR TIME EXPRESSION.
          SPACE  4,10 
          IF     -DEF,QUAL$ 
          QUAL   COMCVDE
          ENDIF 
          BASE   D
*         COMMENT  COPYRIGHT CONTROL DATA SYSTEMS INC.  1992. 
 VDE      SPACE  4,10 
***       COMCVDE - VALIDATE DATE OR TIME EXPRESSION. 
* 
*         G. S. YODER.       89/05/11.
          SPACE  4,15 
***       VDE - VALIDATE DATE OR TIME EXPRESSION. 
* 
*         *VDE* CONVERTS A DISPLAY CODED DATE OR TIME EXPRESSION TO A 
*         PACKED FORMAT DATE OR A PACKED FORMAT DATE AND TIME.  A DATE
*         MAY BE SPECIFIED EXPLICITLY OR AS THE NUMBER OF DAYS BEFORE 
*         OR AFTER A BASE DATE.  A TIME MAY BE SPECIFIED EXPLICITLY OR
*         AS THE NUMBER OF DAYS, HOURS, MINUTES, OR SECONDS BEFORE OR 
*         AFTER A BASE DATE AND TIME.  STATUS IS RETURNED INDICATING
*         WHETHER THE ENTERED DATE OR TIME IS BEFORE OR AFTER THE BASE
*         DATE AND TIME AND WHETHER AN EXPLICIT VALUE WAS SPECIFIED.
* 
*         THE BASE DATE AND TIME WILL BE SET TO THE CURRENT DATE AND
*         TIME ON THE FIRST CALL TO *VDT* IF NOT PRESET BY THE CALLER.
 VDE      SPACE  4,75 
**        VDE - VALIDATE RELATIVE OR EXPLICIT DATE OR TIME EXPRESSION.
* 
*         ENTRY  (X1) = DATE OR TIME PARAMETER, LEFT JUSTIFIED. 
*                (X2) = 0 IF TO CONVERT DATE. 
*                (X2) = 1 IF TO CONVERT TIME. 
*                (VDTA) = 0 IF TO USE CURRENT SYSTEM DATE AND TIME AS 
*                           BASE. 
*                (VDTA) = PACKED FORMAT BASE DATE AND TIME IF .NE. 0. 
* 
*         EXIT   (X6) = 18 BIT PACKED FORMAT DATE OR TIME IF NOT
*                         RELATIVE TIME ENTRY.
*                (X6) = 36 BIT PACKED FORMAT DATE AND TIME IF 
*                         RELATIVE TIME ENTRY.
*                (X6) .LT. 0 IF ERROR IN DATE OR TIME ENTRY.
*                (X1) .LT. 0 IF DATE OR TIME EARLIER THAN BASE DATE AND 
*                     TIME. 
*                (X1) .GE. 0 IF DATE OR TIME LATER THAN BASE DATE AND 
*                     TIME. 
*                (X2) = 0 IF EXPLICIT DATE OR TIME ENTRY. 
*                (X2) .NE. 0 IF RELATIVE DATE OR TIME ENTRY.
*                (VDTA) = BASE DATE AND TIME. 
* 
*         USES   X - 1, 2, 3, 5, 6, 7.
*                A - 1, 2, 6, 7.
*                B - 6, 7.
* 
*         CALLS  DXB, EDP, ETP, PDE, PTE, VDT.
* 
*         NOTES  THE FOLLOWING RULES ARE USED TO DETERMINE THE VALIDITY 
*                OF THE ENTERED DATE AND TIME.
* 
*                1. A DATE CAN BE ENTERED EXPLICITLY IN YYMMDD FORMAT 
*                   OR IN ONE OF THE FOLLOWING RELATIVE FORMS - 
* 
*                   BDNNN    NNN = NUMBER OF DAYS BEFORE BASE DATE. 
*                   ADNNN    NNN = NUMBER OF DAYS AFTER BASE DATE.
*                   BNNN     NNN = NUMBER OF DAYS BEFORE BASE DATE. 
*                   ANNN     NNN = NUMBER OF DAYS AFTER BASE DATE.
* 
*                   THE INCREMENT *NNN* IS ONE TO EIGHT DIGITS FOR THE
*                   *BD* AND *AD* FORMS AND ONE TO NINE DIGITS FOR THE
*                   *B* OR *A* FORM.  THE ASSUMED BASE IS DECIMAL.  IF
*                   A DATE INCREMENT PRODUCES A DATE BEFORE 70/01/01 OR 
*                   AFTER 33/12/31 THE RESULT WILL BE SET TO 70/01/01 
*                   OR 33/12/31 RESPECTIVELY. 
* 
*                2. A TIME CAN BE ENTERED EXPLICITLY IN HHMMSS FORMAT 
*                   OR IN ONE OF THE FOLLOWING RELATIVE FORMS - 
* 
*                   BDNNN    NNN = NUMBER OF DAYS BEFORE BASE DATE AND
*                                  TIME.
*                   ADNNN    NNN = NUMBER OF DAYS AFTER BASE DATE AND 
*                                  TIME.
*                   BHNNN    NNN = NUMBER OF HOURS BEFORE BASE DATE AND 
*                                  TIME.
*                   AHNNN    NNN = NUMBER OF HOURS AFTER BASE DATE AND
*                                  TIME.
*                   BMNNN    NNN = NUMBER OF MINUTES BEFORE BASE DATE 
*                                  AND TIME.
*                   AMNNN    NNN = NUMBER OF MINUTES AFTER BASE DATE
*                                  AND TIME.
*                   BSNNN    NNN = NUMBER OF SECONDS BEFORE BASE DATE 
*                                  AND TIME.
*                   ASNNN    NNN = NUMBER OF SECONDS AFTER BASE DATE
*                                  AND TIME.
*                   BNNN     NNN = NUMBER OF HOURS BEFORE BASE DATE AND 
*                                  TIME.
*                   ANNN     NNN = NUMBER OF HOURS AFTER BASE DATE AND
*                                  TIME.
* 
*                   THE INCREMENT *NNN* IS ONE TO EIGHT DIGITS FOR THE
*                   *BD*, *AD*, *BH*, *AH*, *BM*, *AM*, *BS*, AND *AS*
*                   FORMS, AND ONE TO NINE DIGITS FOR THE *B* OR *A*
*                   FORM.  A DECIMAL BASE IS ASSUMED.  A TIME INCREMENT 
*                   PRODUCES A RESULT OF 70/01/01 00.00.00 OR 33/12/31
*                   23.59.59 RESPECTIVELY IF THE RESULTING DATE AND 
*                   TIME IS LESS THAN OR GREATER THAN THESE LIMITS. 
* 
*                   A TIME ENTERED IN RELATIVE FORMAT DEFINES BOTH A
*                   DATE AND TIME.  IT IS THE RESPONSIBILITY OF THE 
*                   CALLING PROGRAM TO DETECT A CONFLICT IF BOTH A DATE 
*                   AND AN RELATIVE TIME PARAMETER ARE ENTERED. 
* 
*         XREF   COMCDTC, COMCDXB, COMCVDT. 
  
  
 VDE11    SX6    -1          SET ERROR IN ENTRY 
  
 VDE      SUBR               ENTRY/EXIT 
  
*         CHECK FOR EXPLICIT DATE OR TIME ENTRY.
  
          BX6    X1          SAVE ENTERED VALUE 
          BX7    X2          SAVE DATE/TIME FLAG
          SA6    VDEC 
          SA7    VDED 
          RJ     VDT         CHECK FOR EXPLICIT ENTRY 
          SX2    0           SET EXPLICIT ENTRY 
          PL     X6,VDEX     IF VALID DATE OR TIME ENTERED
  
*         UPDATE BASE DATE AND TIME FOR RELATIVE ENTRIES. 
  
          SA1    VDTA 
          SA2    VDEA 
          BX2    X1-X2
          ZR     X2,VDE1     IF BASE ELAPSED DAYS AND SECONDS CURRENT 
          BX6    X1 
          AX1    18 
          SA6    VDEA        SAVE BASE DATE AND TIME
          RJ     PDE         COMPUTE BASE ELAPSED DAYS
          SA6    VDEB        SET ELAPSED DAYS 
          SA1    VDTA        COMPUTE BASE ELAPSED SECONDS 
          RJ     PTE
          SA6    VDEB+1      SET ELAPSED SECONDS
  
*         VALIDATE RELATIVE ENTRY.
  
 VDE1     SA1    VDEC        RESTORE DATE OR TIME ENTRY 
          SA2    VDED        RESTORE DATE/TIME FLAG 
          MX6    -6 
          LX1    6
          BX7    -X6*X1      ISOLATE *A* OR *B* 
          MX6    6
          SB6    X7-1RA      SET BEFORE/AFTER FLAG
          SX7    X7-1RB 
          ZR     B6,VDE2     IF *AFTER* ENTRY 
          NZ     X7,VDE11    IF NOT *BEFORE* ENTRY
 VDE2     BX3    X6*X1       CHECK UNITS IDENTIFIER 
          LX3    6
          SX7    X3-1R0 
          SB7    60*60       PRESET SECONDS MULTIPLIER FOR HOURS
          PL     X7,VDE4     IF NOT ALPHABETIC
          SX7    X3-1RD 
          LX1    6
          ZR     X2,VDE3     IF DATE ENTRY
          SX2    X3-1RH 
          ZR     X2,VDE4     IF HOURS ENTRY 
          SX2    X3-1RM 
          SB7    60 
          ZR     X2,VDE4     IF MINUTES ENTRY 
          SX2    X3-1RS 
          SB7    1
          ZR     X2,VDE4     IF SECONDS ENTRY 
          SB7    60*60*24 
 VDE3     NZ     X7,VDE11    IF NOT DAYS ENTRY
  
*         CONVERT RELATIVE ENTRY. 
  
 VDE4     MX6    48 
          BX5    X6*X1       ISOLATE INCREMENT
          RJ     DXB         CONVERT INCREMENT
          SA2    VDED        RESTORE DATE/TIME FLAG 
          NZ     X4,VDE11    IF ERROR IN CONVERSION 
          ZR     X6,VDE5     IF ZERO INCREMENT
          ZR     B6,VDE5     IF *AFTER* ENTRY 
          BX6    -X6         COMPLEMENT INCREMENT 
          SB6    -B1         FLAG BEFORE BASE DATE OR TIME
 VDE5     NZ     X2,VDE8     IF TIME ENTRY
          SA1    VDEB 
          IX1    X1+X6       ADD DAYS INCREMENT TO BASE 
          PL     X1,VDE6     IF VALUE .GE. 70/01/01 
          SX1    B0          SET MINIMUM VALUE
          EQ     VDE7        CONVERT ENTRY
  
 VDE6     SX3    X1-23375-1 
          NG     X3,VDE7     IF VALUE .LE. 33/12/31 
          SX1    23375       SET MAXIMUM VALUE
 VDE7     RJ     EDP         CONVERT INCREMENTED DATE TO PACKED FORMAT
          SX1    B6          SET BEFORE/AFTER BASE DATE FLAG
          SX2    B1          SET RELATIVE ENTRY FLAG
          EQ     VDEX        RETURN 
  
 VDE8     SA1    VDEB+1      GET BASE DATE AND TIME 
          SA2    VDEF 
          SX7    B7+         SET SECONDS MULTIPLIER 
          IX6    X6*X7
          IX1    X1+X6
          PL     X1,VDE9     IF VALUE .GE. 70/01/01 00.00.00
          SX1    B0+         SET MINIMUM VALUE
          EQ     VDE10       CONVERT VALUE
  
 VDE9     IX3    X2-X1
          PL     X3,VDE10    IF VALUE .LE. 33/12/31 23.59.59
          BX1    X2          SET MAXIMUM VALUE
 VDE10    RJ     ETP         CONVERT SECONDS TO PACKED DATE AND TIME
          SX1    B6          SET BEFORE/AFTER BASE DATE AND TIME FLAG 
          SX2    B1          SET RELATIVE ENTRY FLAG
          EQ     VDEX        RETURN 
  
  
 VDEA     CON    0           BASE DATE AND TIME FOR ELAPSED VALUES
 VDEB     CON    0           BASE ELAPSED DAYS
          CON    0           BASE ELAPSED SECONDS 
 VDEC     CON    0           ENTERED VALUE
 VDED     CON    0           DATE/TIME FLAG 
 VDEF     CON    2019686399 
  
  
 QUAL$    IF     -DEF,QUAL$ 
          QUAL   *
 VDE      EQU    /COMCVDE/VDE 
 QUAL$    ENDIF 
 VDE      ENDX
