home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / mbug / mbug027.arc / AGE.INC < prev    next >
Text File  |  1979-12-31  |  5KB  |  187 lines

  1.  
  2. PROCEDURE Load_Months;
  3. BEGIN
  4.   Month[1]  := 'JAN';
  5.   Month[2]  := 'FEB';
  6.   Month[3]  := 'MAR';
  7.   Month[4]  := 'APR';
  8.   Month[5]  := 'MAY';
  9.   Month[6]  := 'JUN';
  10.   Month[7]  := 'JUL';
  11.   Month[8]  := 'AUG';
  12.   Month[9]  := 'SEP';
  13.   Month[10] := 'OCT';
  14.   Month[11] := 'NOV';
  15.   Month[12] := 'DEC';
  16. END;
  17.  
  18. FUNCTION Leapyear (YearX : INTEGER) :  BOOLEAN;
  19. BEGIN
  20.     Leapyear := (( YearX MOD 4 = 0) AND ( YearX MOD 100 <> 0))
  21.                 OR ( YearX MOD 400 = 0)
  22. END (* Leapyear  *)  ;
  23.  
  24. PROCEDURE No_Of_Days(mm ,yy : INTEGER; VAR MonthLength : INTEGER);
  25. BEGIN
  26.   CASE mm OF
  27.     4,6,9,11        : MonthLength := 30;
  28.  
  29.     1,3,5,7,8,10,12 : MonthLength := 31;
  30.  
  31.     2               : BEGIN
  32.                         IF Leapyear(yy)
  33.                           THEN Monthlength := 29
  34.                           ELSE Monthlength := 28;
  35.                       END;
  36.   END;{Case mm}
  37. END;
  38.  
  39. PROCEDURE verify_date(x : str11; VAR OK : BOOLEAN);
  40.  
  41. VAR 
  42.   Work_Day     : STRING[2];
  43.   Work_month   : STRING[3];
  44.   Work_year    : STRING[4];
  45.   yes,i        : INTEGER;
  46.   MonthLength  : INTEGER;
  47. BEGIN
  48.   IF x = '__ ___ 19__'
  49.     THEN ok := FALSE
  50.     ELSE
  51.       BEGIN
  52.         Work_Day   := copy(x,1,2);
  53.         Work_month := copy(x,4,3);
  54.         Work_year  := copy(x,8,4);
  55.         i      := 0;
  56.         Iday   := 0;
  57.         Imonth := 0;
  58.         Iyear  := 0;
  59.         ok     := FALSE;
  60.         REPEAT
  61.           i := i + 1;
  62.         UNTIL (work_month = month[i]) OR (i = 12);
  63.         IF Work_month = month[i]
  64.           THEN
  65.             BEGIN
  66.               Imonth := i;
  67.               val(Work_year,Iyear,yes);
  68.               IF yes = 0
  69.                 THEN ok := TRUE
  70.                     ELSE ok := FALSE;
  71.               IF (Work_Day  <> '  ') AND OK
  72.                 THEN
  73.                   BEGIN
  74.                     val(Work_Day ,Iday,yes);
  75.                     IF yes = 0
  76.                       THEN ok := TRUE
  77.                           ELSE ok := FALSE;
  78.                     IF ok
  79.                       THEN
  80.                         BEGIN
  81.                           No_Of_Days(i,iyear,MonthLength);
  82.                           IF (Iday > MonthLength) OR (Iday < 1)
  83.                             THEN OK := FALSE
  84.                             ELSE OK := TRUE;
  85.                         END;
  86.                   END;
  87.             END;
  88.       END;
  89. END;
  90.  
  91. PROCEDURE age(date1,date2 : str11; VAR yy,ww,dd : INTEGER);
  92.  
  93. {Accepts two dates as strings and returns how many days between them.
  94.  The date MUST be in the form '01 SEP 1986' There MUST be two digets
  95.  for the day, three UPPER case letters for the month and four digets
  96.  for the year.}
  97.  
  98. VAR 
  99.   Monthlength  : INTEGER;
  100.   Quite,ok     : BOOLEAN;
  101.   total_date   : str11;
  102.   dev          : CHAR;
  103.   yearsgone,
  104.   weeks,
  105.   daysleft,
  106.   i,
  107.   tdays,
  108.   dd1,dd2,
  109.   mm1,mm2,
  110.   yy1,yy2      : INTEGER;
  111.  
  112. BEGIN
  113.   tdays := 0;
  114.   verify_date(date1,ok);
  115.   IF OK
  116.     THEN BEGIN
  117.            yy1 := Iyear;
  118.            mm1 := Imonth;
  119.            dd1 := Iday;
  120.            tdays := monthlength - dd1;
  121.            verify_date(date2,ok);
  122.       END;
  123.   IF OK
  124.     THEN BEGIN
  125.            yy2 := Iyear;
  126.            mm2 := Imonth;
  127.            dd2 := Iday;
  128.            tdays := tdays + dd2;
  129.            IF yy1 = yy2
  130.              THEN
  131.                BEGIN
  132.                  IF mm1 = mm2
  133.                    THEN tdays := dd2 - dd1
  134.                    ELSE
  135.                      FOR i := mm1 + 1 TO mm2 - 1 DO
  136.                        BEGIN
  137.                          No_Of_Days(i,yy1,MonthLength);
  138.                          tdays := tdays + monthlength;
  139.                        END;
  140.                END;
  141.            IF yy1 < yy2
  142.              THEN
  143.                BEGIN
  144.                  FOR i := mm1 + 1 TO 12 DO
  145.                    BEGIN
  146.                      No_Of_Days(i,yy1,MonthLength);
  147.                      tdays := tdays + monthlength;
  148.                    END;
  149.                  FOR i := 1 TO mm2 - 1 DO
  150.                    BEGIN
  151.                      No_Of_Days(i,yy1,MonthLength);
  152.                      tdays := tdays + monthlength;
  153.                    END;
  154.                  IF yy2 - yy1 > 1
  155.                    THEN
  156.                      BEGIN
  157.                        FOR i := YY1+1 TO yy2 - 1  DO
  158.                          BEGIN
  159.                            IF leapyear(i)
  160.                              THEN tdays := tdays + 366
  161.                              ELSE tdays := tdays + 365 ;
  162.                          END;
  163.                      END;
  164.                END;
  165.            yearsgone := 0;
  166.            weeks     := 0;
  167.            daysleft  := 0;
  168.            yy        := 0;
  169.            ww        := 0;
  170.            dd        := 0;
  171.            weeks := tdays DIV 7;
  172.            yearsgone := weeks DIV 52;
  173.            IF yearsgone > 0
  174.              THEN
  175.                BEGIN
  176.                  FOR i := 1 TO yearsgone DO
  177.                    weeks := weeks - 52;
  178.                END;
  179.            daysleft := tdays mod 7;
  180.       END;
  181.     IF OK
  182.       THEN
  183.         yy := yearsgone;
  184.     ww := weeks;
  185.     dd := daysleft;
  186. END;
  187. eft :=