aboutsummaryrefslogtreecommitdiff
path: root/challenge-235/deadmarshal/modula-3/ch2/src/Ch2.m3
blob: a9983080c49c1c8dcba666dc2240fa1bb8a2a624 (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
42
43
44
45
MODULE Ch2 EXPORTS Main;

IMPORT IO;

TYPE
  PArr = REF ARRAY OF INTEGER;

VAR
  A1:ARRAY[0..7] OF INTEGER := ARRAY OF INTEGER{1,0,2,3,0,4,5,0};
  A2:ARRAY[0..2] OF INTEGER := ARRAY OF INTEGER{1,2,3};
  A3:ARRAY[0..4] OF INTEGER := ARRAY OF INTEGER{0,3,0,4,5};
  Ret1,Ret2,Ret3:PArr;
  
PROCEDURE DuplicateZeros(VAR A:ARRAY OF INTEGER):PArr =
  VAR
    I,J:INTEGER := 0;
    Ret:PArr;
  BEGIN
    Ret := NEW(PArr,NUMBER(A));
    WHILE J <= LAST(A) DO
      IF A[I] = 0 THEN
        Ret[J] := 0; INC(J); Ret[J] := 0;
        INC(I); INC(J);
      ELSE
        Ret[J] := A[I]; INC(I); INC(J);
      END
    END;
    RETURN Ret
  END DuplicateZeros;

  PROCEDURE PrintArray(VAR A:ARRAY OF INTEGER) = 
    BEGIN
      FOR I := FIRST(A) TO LAST(A) DO IO.PutInt(A[I]); IO.PutChar(' ') END;
      IO.Put("\n");
    END PrintArray;
    
BEGIN
  Ret1 := DuplicateZeros(A1);
  Ret2 := DuplicateZeros(A2);
  Ret3 := DuplicateZeros(A3);
  PrintArray(Ret1^);
  PrintArray(Ret2^);
  PrintArray(Ret3^);
END Ch2.