OpenArrTest.mod 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. MODULE OpenArrTest ;
  2. (* Minimal probe: do open-array formals actually propagate writes back to the
  3. caller's buffer under gm2 -fiso? Linker.WriteCom builds its path with
  4. ZCopy(dst : ARRAY OF CHAR ; src : ARRAY OF CHAR) and the file it created
  5. was named "END" - i.e. the destination buffer was never written. Before
  6. working around it, measure it.
  7. Prints what each variant leaves in its buffer, so the answer is a run and
  8. not an opinion. *)
  9. FROM Posix IMPORT write ;
  10. FROM SYSTEM IMPORT ADR ;
  11. PROCEDURE PutStr (s : ARRAY OF CHAR) ;
  12. VAR i : CARDINAL ; n : LONGINT ;
  13. BEGIN
  14. i := 0 ;
  15. WHILE (i <= HIGH (s)) AND (s [i] # 0C) DO
  16. n := write (1, ADR (s [i]), 1) ;
  17. INC (i)
  18. END
  19. END PutStr ;
  20. PROCEDURE NL ;
  21. VAR n : LONGINT ; c : ARRAY [0..1] OF CHAR ;
  22. BEGIN
  23. c [0] := CHR (13) ; c [1] := CHR (10) ;
  24. n := write (1, ADR (c), 2)
  25. END NL ;
  26. (* open array, value formal *)
  27. PROCEDURE FillOpen (VAR dst : ARRAY OF CHAR ; src : ARRAY OF CHAR) ;
  28. VAR i : CARDINAL ;
  29. BEGIN
  30. i := 0 ;
  31. WHILE (i <= HIGH (dst) - 1) AND (i <= HIGH (src)) AND (src [i] # 0C) DO
  32. dst [i] := src [i] ;
  33. INC (i)
  34. END ;
  35. dst [i] := 0C
  36. END FillOpen ;
  37. (* open array, no VAR - forces a copy, so writes cannot escape *)
  38. PROCEDURE FillOpenVal (dst : ARRAY OF CHAR ; src : ARRAY OF CHAR) ;
  39. VAR i : CARDINAL ;
  40. BEGIN
  41. i := 0 ;
  42. WHILE (i <= HIGH (dst) - 1) AND (i <= HIGH (src)) AND (src [i] # 0C) DO
  43. dst [i] := src [i] ;
  44. INC (i)
  45. END ;
  46. dst [i] := 0C
  47. END FillOpenVal ;
  48. TYPE
  49. Buf = ARRAY [0..63] OF CHAR ;
  50. (* fixed array, VAR formal *)
  51. PROCEDURE FillFixed (VAR dst : Buf ; src : Buf) ;
  52. VAR i : CARDINAL ;
  53. BEGIN
  54. i := 0 ;
  55. WHILE (i <= HIGH (dst) - 1) AND (i <= HIGH (src)) AND (src [i] # 0C) DO
  56. dst [i] := src [i] ;
  57. INC (i)
  58. END ;
  59. dst [i] := 0C
  60. END FillFixed ;
  61. VAR
  62. a, b, c : Buf ;
  63. src : Buf ;
  64. BEGIN
  65. (* seed src *)
  66. src [0] := "A" ; src [1] := "B" ; src [2] := "C" ; src [3] := 0C ;
  67. a := "XXXXXXXXXXXXXXXX" ;
  68. FillOpen (a, src) ;
  69. PutStr ("FillOpen (VAR dst : ARRAY OF CHAR) -> [") ; PutStr (a) ; PutStr ("]") ; NL ;
  70. b := "XXXXXXXXXXXXXXXX" ;
  71. FillOpenVal (b, src) ;
  72. PutStr ("FillOpenVal(dst : ARRAY OF CHAR) -> [") ; PutStr (b) ; PutStr ("]") ; NL ;
  73. c := "XXXXXXXXXXXXXXXX" ;
  74. FillFixed (c, src) ;
  75. PutStr ("FillFixed (VAR dst : Buf) -> [") ; PutStr (c) ; PutStr ("]") ; NL
  76. END OpenArrTest.