IDENTIFICATION DIVISION.                                         
        PROGRAM-ID. DATEval.                                            
        AUTHOR. MARTIN OSULLIVAN                                         
       * THIS PROGRAM WILL TAKE A 10 CHARACTER STRING                    
       * CHECK WHETHER IT IS A VALID DATE IN THE FORMAT DD/MM/CCYY       
       *                               OR IN THE FORMAT DD:MM:CCYY       
       * IT IS A SUB PROGRAM AND IS CALLED BY DATEVAL                    
        DATE-WRITTEN. 09/12/86.                                          
        DATE-COMPILED.                                                   
        ENVIRONMENT DIVISION.                                            
        CONFIGURATION SECTION.                                           
        SOURCE-COMPUTER. IBM-AS400.                                      
        OBJECT-COMPUTER. IBM-AS400.                                      
        DATA DIVISION.                                                   
        WORKING-STORAGE SECTION.                                         
                                                                         
        01  NUMERIC-DATE-IN .                                            
            03 N-DAY                 PIC 9(2).                           
            03 N-MONTH               PIC 9(2).                           
            03 N-YEAR.                                                   
               05 N-CENTURY          PIC 9(2).                           
               05 N-TENS-PART        PIC 9(2).                           
                  88 CENTURY-YEAR    VALUE 0.                            
                                                                         
        01  SCRATCH-PAD.                                                 
            03 QUOTIENT              PIC 9(3).                           
            03 LEAP                  PIC 9.                              
               88 LEAP-YEAR          VALUE 0.                            
            03 MONTH-SUB             PIC 9(2).                           
                                                                         
                                                                         
        COPY DAYSINMONT.                                                 
                                                                         
        01  FLAGS-ETC.                                                   
            02 DATE-VALID-FLAG      PIC X.                               
            02 OTHER-FLAGS.                                              
               03 NUMERIC-FLAG         PIC X.                            
                  88 DATE-NUMERIC      VALUE "Y".                        
                  88 DATE-NOT-NUMERIC  VALUE "N".                        
               03 MONTH-FLAG           PIC X.                            
                  88 MONTH-VALID       VALUE "Y".                        
                  88 MONTH-NOT-VALID   VALUE "N".            
               03 DAY-FLAG             PIC X.                
                  88 DAY-VALID         VALUE "Y".            
                  88 DAY-NOT-VALID     VALUE "N".            
                                                             
        LINKAGE SECTION.                                     
        01 DATE-STRING.                                      
            03 DAY-IN                PIC X(2).               
            03 MONTH-IN              PIC X(2).               
            03 YEAR-IN               PIC X(4).               
                                                             
                                                             
        01 VALIDITY-FLAG.                                    
            02 DATE-VALID-FLAG      PIC X.                   
               88 DATE-VALID        VALUE "Y".               
               88 DATE-NOT-VALID    VALUE "N".               
                                                             
        PROCEDURE DIVISION                                   
            USING DATE-STRING, VALIDITY-FLAG.                
                                                             
        TOP-CONTROL.                                         
            PERFORM CHECK-NUMERIC-VALIDATE-MTH-DAY.          
            PERFORM RETURN-CONTROAL.                         
                                                             
        CHECK-NUMERIC-VALIDATE-MTH-DAY.                      
            PERFORM CHECK-FOR-NUMERIC.                       
            PERFORM POSS-VALIDATE-MONTH-DAY.                 
                                                             
       * 3                                                   
        CHECK-FOR-NUMERIC.                                   
            IF DAY-IN NOT NUMERIC                            
               OR MONTH-IN NOT NUMERIC                       
               OR YEAR-IN NOT NUMERIC                        
            THEN                                             
               SET DATE-NOT-NUMERIC TO TRUE                  
            ELSE                                             
               SET DATE-NUMERIC TO TRUE.                     
                                                             
                                                             
        POSS-VALIDATE-MONTH-DAY.                             
            IF DATE-NUMERIC                                  
               MOVE DATE-STRING TO NUMERIC-DATE-IN           
               PERFORM VALIDATE-MONTH-DAY                                
            ELSE                                                         
               SET DATE-NOT-VALID TO TRUE.                               
                                                                         
       * 19                                                              
        VALIDATE-MONTH-DAY.                                              
            PERFORM VALIDATE-MONTH.                                      
            PERFORM POSS-VALIDATE-DAY.                                   
                                                                         
       * 21                                                              
        VALIDATE-MONTH.                                                  
            IF N-MONTH > 12 OR = ZERO                                    
               SET MONTH-NOT-VALID TO TRUE                               
            ELSE                                                         
               SET MONTH-VALID TO TRUE.                                  
       /                                                                 
       * 22                                                              
        POSS-VALIDATE-DAY.                                               
            IF MONTH-VALID                                               
               PERFORM CHECK-LEAP-VALIDATE-DAY                           
            ELSE                                                         
               SET DATE-NOT-VALID TO TRUE.                               
                                                                         
       * 23                                                              
        CHECK-LEAP-VALIDATE-DAY.                                         
            PERFORM LEAP-YEAR-CALCS.                                     
            PERFORM POSS-LEAP-YEAR.                                      
            PERFORM VALIDATE-DAY.                                        
            PERFORM POSS-VALID-DATE.                                     
                                                                         
        COPY LEAPYEAR.                                                   
                                                                         
        VALIDATE-DAY.                                                    
            IF N-DAY > DAYS-IN-MONTH(N-MONTH)                            
               OR N-DAY = ZERO                                           
                  SET DAY-NOT-VALID TO TRUE                              
            ELSE                                                         
                  SET DAY-VALID TO TRUE.                                 
                                                                         
       * 28                                                              
        POSS-VALID-DATE.                                                 
             IF DAY-VALID                                                
                SET DATE-VALID TO TRUE                          
             ELSE                                               
                SET DATE-NOT-VALID TO TRUE.                     
                                                                
        RETURN-CONTROAL.                                        
            EXIT PROGRAM.                                       


   Link back to cobol page