MODULE CStrProg; (* C string returns, char ** outputs and C-written CHAR buffers. CStr.CString is an explicit ADDRESS alias; CStr.Copy is the C-to-Modula-2 conversion. Expected exit code: 42. *) FROM CStr IMPORT CString, Length, Copy, IsNil; FROM CStrTest IMPORT m2_cstr_hello, m2_cstr_out, m2_cstr_fill; VAR ExitCode : INTEGER; buf : ARRAY [0..15] OF CHAR; p : CString; n : CARDINAL; ok : BOOLEAN; BEGIN p := m2_cstr_hello(); ok := (NOT IsNil(p)) AND (Length(p) = 5); IF ok THEN n := Copy(p, buf); ok := (n = 5) AND (buf[0] = 'h') AND (buf[4] = 'o') AND (buf[5] = CHR(0)) END; IF ok THEN p := NIL; ok := IsNil(p) AND (Length(p) = 0); IF ok THEN m2_cstr_out(p); ok := (NOT IsNil(p)) AND (Length(p) = 5); IF ok THEN n := Copy(p, buf); ok := (n = 5) AND (buf[0] = 'w') AND (buf[4] = 'd') AND (buf[5] = CHR(0)) END END END; IF ok THEN n := m2_cstr_fill(buf, 16); ok := (n = 6) AND (buf[0] = 'b') AND (buf[5] = 'r') AND (buf[6] = CHR(0)) END; IF ok THEN n := Copy(NIL, buf); ok := (n = 0) AND (buf[0] = CHR(0)) END; IF ok THEN ExitCode := 42 ELSE ExitCode := 1 END END CStrProg.