cstr_prog.mod 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. MODULE CStrProg;
  2. (* C string returns, char ** outputs and C-written CHAR buffers.
  3. CStr.CString is an explicit ADDRESS alias; CStr.Copy is the
  4. C-to-Modula-2 conversion. Expected exit code: 42. *)
  5. FROM CStr IMPORT CString, Length, Copy, IsNil;
  6. FROM CStrTest IMPORT m2_cstr_hello, m2_cstr_out, m2_cstr_fill;
  7. VAR
  8. ExitCode : INTEGER;
  9. buf : ARRAY [0..15] OF CHAR;
  10. p : CString;
  11. n : CARDINAL;
  12. ok : BOOLEAN;
  13. BEGIN
  14. p := m2_cstr_hello();
  15. ok := (NOT IsNil(p)) AND (Length(p) = 5);
  16. IF ok THEN
  17. n := Copy(p, buf);
  18. ok := (n = 5) AND (buf[0] = 'h') AND (buf[4] = 'o')
  19. AND (buf[5] = CHR(0))
  20. END;
  21. IF ok THEN
  22. p := NIL;
  23. ok := IsNil(p) AND (Length(p) = 0);
  24. IF ok THEN
  25. m2_cstr_out(p);
  26. ok := (NOT IsNil(p)) AND (Length(p) = 5);
  27. IF ok THEN
  28. n := Copy(p, buf);
  29. ok := (n = 5) AND (buf[0] = 'w') AND (buf[4] = 'd')
  30. AND (buf[5] = CHR(0))
  31. END
  32. END
  33. END;
  34. IF ok THEN
  35. n := m2_cstr_fill(buf, 16);
  36. ok := (n = 6) AND (buf[0] = 'b') AND (buf[5] = 'r')
  37. AND (buf[6] = CHR(0))
  38. END;
  39. IF ok THEN
  40. n := Copy(NIL, buf);
  41. ok := (n = 0) AND (buf[0] = CHR(0))
  42. END;
  43. IF ok THEN ExitCode := 42 ELSE ExitCode := 1 END
  44. END CStrProg.