aboutsummaryrefslogtreecommitdiff
path: root/challenge-331/deadmarshal/modula-3/Ch1/src/Ch1.m3
blob: 28b7e0c7dc82b9fbe1cd83b9083bcee7ee7cfc8c (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
39
40
41
MODULE Ch1 EXPORTS Main;

IMPORT SIO,Text,TextConv,ASCII;

PROCEDURE Trim(READONLY Str:TEXT):TEXT =
  VAR
    Start:CARDINAL := 0;
    Stop:CARDINAL := Text.Length(Str);
    C:CHAR;
  BEGIN
    WHILE Start < Stop DO
      C := Text.GetChar(Str,Start);
      IF NOT C IN ASCII.Spaces THEN EXIT END;
      INC(Start)
    END;
    WHILE Start < Stop DO
      C := Text.GetChar(Str,Stop-1);
      IF NOT C IN ASCII.Spaces THEN EXIT END;
      DEC(Stop)
    END;
    RETURN Text.Sub(Str,Start,Stop-Start)
  END Trim;

PROCEDURE LastWord(READONLY Str:TEXT):CARDINAL =
  CONST
    S = SET OF CHAR{' ', '\t', '\n', '\r', '\f'};
  VAR
    Trimmed := Trim(Str);
    Len := TextConv.ExplodedSize(Trimmed,S);
    A := NEW(REF ARRAY OF TEXT,Len);
  BEGIN
    TextConv.Explode(Trimmed,A^,S);
    RETURN Text.Length(A[LAST(A^)])
  END LastWord;

BEGIN
  SIO.PutInt(LastWord("The Weekly Challenge")); SIO.Nl();
  SIO.PutInt(LastWord("    Hello World    ")); SIO.Nl();
  SIO.PutInt(LastWord("Let's begin the fun")); SIO.Nl()
END Ch1.