$ SET SOURCEFORMAT"FREE"
IDENTIFICATION DIVISION.
PROGRAM-ID. Validate IS INITIAL.
AUTHOR.  Michael Coughlan.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 MonthDayTable.
   02 TableValues           PIC X(24)
            VALUE "312831303130313130313031".
   02 FILLER REDEFINES TableValues.
      03 DaysInMonth 
            OCCURS 12 TIMES PIC 99.


01 CurruptDate              PIC 9(8).

01 LeapQuot                 PIC 9(4).
01 LeapRemain               PIC 9(4).

01 FILLER                   PIC 9 VALUE ZERO.
   88 LeapYear              VALUE 1.


LINKAGE SECTION.
01 InputDateLA.
   02 DayLA                 PIC 99.
   02 MonthLA               PIC 99.
      88 MonthInvalid       VALUE 13 THRU 99.
      88 MonthIsFebruary    VALUE 2. 
   02 YearLA                PIC 9(4).

01 ValidationResultLB       PIC 9.
   88 DateIsValid           VALUE 0.
   88 DateNotNumeric        VALUE 1.
   88 YearContainsZeros     VALUE 2.
   88 MonthContainsZeros    VALUE 3.
   88 DayContainsZeros      VALUE 4.
   88 MonthGreaterThan12    VALUE 5.
   88 DayTooGreatForMonth   VALUE 6.

PROCEDURE DIVISION USING InputDateLA, ValidationResultLB.
Begin.
   EVALUATE TRUE
     WHEN InputDateLA NOT NUMERIC  SET DateNotNumeric     TO TRUE
     WHEN YearLA EQUAL TO ZEROS    SET YearContainsZeros  TO TRUE
     WHEN MonthLA EQUAL TO ZEROS   SET MonthContainsZeros TO TRUE
     WHEN DayLA EQUAL TO ZEROS     SET DayContainsZeros   TO TRUE
     WHEN MonthInvalid             SET MonthGreaterThan12 TO TRUE
     WHEN OTHER PERFORM CheckForValidDay
   END-EVALUATE

   EXIT PROGRAM.


CheckForValidDay.
*  Years evenly divisible by 4 are leap years, but
*  years evenly divisible by 100 are not leap years, but
*  years evenly divisible by 400 are leap years.

   DIVIDE YearLA BY 400 GIVING LeapQuot REMAINDER LeapRemain.
   IF LeapRemain = 0
      SET LeapYear TO TRUE
    ELSE 
      DIVIDE YearLA BY 100 GIVING LeapQuot REMAINDER LeapRemain
      IF LeapRemain NOT = 0 
         DIVIDE YearLA BY 4 GIVING LeapQuot REMAINDER LeapRemain
         IF LeapRemain = 0
            SET LeapYear TO TRUE
         END-IF
      END-IF
   END-IF

  IF LeapYear AND MonthIsFebruary 
         MOVE 29 TO DaysInMonth(2)
  END-IF
  IF DayLA GREATER THAN DaysInMonth(MonthLA)
     SET DayTooGreatForMonth TO TRUE
   ELSE
     SET DateIsValid TO TRUE
  END-IF.