| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- MODULE OpenArrTest ;
- (* Minimal probe: do open-array formals actually propagate writes back to the
- caller's buffer under gm2 -fiso? Linker.WriteCom builds its path with
- ZCopy(dst : ARRAY OF CHAR ; src : ARRAY OF CHAR) and the file it created
- was named "END" - i.e. the destination buffer was never written. Before
- working around it, measure it.
- Prints what each variant leaves in its buffer, so the answer is a run and
- not an opinion. *)
- FROM Posix IMPORT write ;
- FROM SYSTEM IMPORT ADR ;
- PROCEDURE PutStr (s : ARRAY OF CHAR) ;
- VAR i : CARDINAL ; n : LONGINT ;
- BEGIN
- i := 0 ;
- WHILE (i <= HIGH (s)) AND (s [i] # 0C) DO
- n := write (1, ADR (s [i]), 1) ;
- INC (i)
- END
- END PutStr ;
- PROCEDURE NL ;
- VAR n : LONGINT ; c : ARRAY [0..1] OF CHAR ;
- BEGIN
- c [0] := CHR (13) ; c [1] := CHR (10) ;
- n := write (1, ADR (c), 2)
- END NL ;
- (* open array, value formal *)
- PROCEDURE FillOpen (VAR dst : ARRAY OF CHAR ; src : ARRAY OF CHAR) ;
- VAR i : CARDINAL ;
- BEGIN
- i := 0 ;
- WHILE (i <= HIGH (dst) - 1) AND (i <= HIGH (src)) AND (src [i] # 0C) DO
- dst [i] := src [i] ;
- INC (i)
- END ;
- dst [i] := 0C
- END FillOpen ;
- (* open array, no VAR - forces a copy, so writes cannot escape *)
- PROCEDURE FillOpenVal (dst : ARRAY OF CHAR ; src : ARRAY OF CHAR) ;
- VAR i : CARDINAL ;
- BEGIN
- i := 0 ;
- WHILE (i <= HIGH (dst) - 1) AND (i <= HIGH (src)) AND (src [i] # 0C) DO
- dst [i] := src [i] ;
- INC (i)
- END ;
- dst [i] := 0C
- END FillOpenVal ;
- TYPE
- Buf = ARRAY [0..63] OF CHAR ;
- (* fixed array, VAR formal *)
- PROCEDURE FillFixed (VAR dst : Buf ; src : Buf) ;
- VAR i : CARDINAL ;
- BEGIN
- i := 0 ;
- WHILE (i <= HIGH (dst) - 1) AND (i <= HIGH (src)) AND (src [i] # 0C) DO
- dst [i] := src [i] ;
- INC (i)
- END ;
- dst [i] := 0C
- END FillFixed ;
- VAR
- a, b, c : Buf ;
- src : Buf ;
- BEGIN
- (* seed src *)
- src [0] := "A" ; src [1] := "B" ; src [2] := "C" ; src [3] := 0C ;
- a := "XXXXXXXXXXXXXXXX" ;
- FillOpen (a, src) ;
- PutStr ("FillOpen (VAR dst : ARRAY OF CHAR) -> [") ; PutStr (a) ; PutStr ("]") ; NL ;
- b := "XXXXXXXXXXXXXXXX" ;
- FillOpenVal (b, src) ;
- PutStr ("FillOpenVal(dst : ARRAY OF CHAR) -> [") ; PutStr (b) ; PutStr ("]") ; NL ;
- c := "XXXXXXXXXXXXXXXX" ;
- FillFixed (c, src) ;
- PutStr ("FillFixed (VAR dst : Buf) -> [") ; PutStr (c) ; PutStr ("]") ; NL
- END OpenArrTest.
|