aboutsummaryrefslogtreecommitdiff
path: root/challenge-326/deadmarshal/modula-3/Ch1/src/Ch1.m3
blob: d19d99bf77e080f08360372ea9f9ac22e3a595a2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
MODULE Ch1 EXPORTS Main;

IMPORT SIO,Scan,Text,Lex,FloatMode;
FROM StableError IMPORT Halt;

PROCEDURE IsLeapYear(Y:CARDINAL):BOOLEAN =
  BEGIN
    RETURN Y MOD 4 = 0 AND Y MOD 100 # 0 OR Y MOD 400 = 0
  END IsLeapYear;

PROCEDURE DayOfTheYear(READONLY Date:TEXT):CARDINAL
  RAISES{FloatMode.Trap,Lex.Error} =
  CONST
    Days = ARRAY[0..1],[0..12] OF CARDINAL{
    ARRAY[0..12] OF CARDINAL{0,0,31,59,90,120,151,181,212,243,273,304,334},
    ARRAY[0..12] OF CARDINAL{0,0,31,60,91,121,152,182,213,244,274,305,335}};
  VAR
    Month,Day,Year:CARDINAL;
  BEGIN
    Year := Scan.Int(Text.Sub(Date,0,4));
    Month := Scan.Int(Text.Sub(Date,5,2));
    Day := Scan.Int(Text.Sub(Date,8,2));
    RETURN Days[ORD(IsLeapYear(Year)),Month] + Day;
  END DayOfTheYear;
  
BEGIN
  TRY 
    SIO.PutInt(DayOfTheYear("2025-02-02")); SIO.Nl();
    SIO.PutInt(DayOfTheYear("2025-04-10")); SIO.Nl();
    SIO.PutInt(DayOfTheYear("2025-09-07")); SIO.Nl()
  EXCEPT
    FloatMode.Trap => Halt("FloatMode.Trap")
  | Lex.Error => Halt("Failed lexing text")
  ELSE
    Halt("Some other exception!")
  END;
END Ch1.