IMPLEMENTATION MODULE SRealIO; IMPORT IOConsts, SIOResult; FROM IOConsts IMPORT allRight; PROCEDURE m2realconv (x : REAL; mode : INTEGER; prec : INTEGER; VAR s : ARRAY OF CHAR) : INTEGER; EXTERNAL; PROCEDURE m2readreal () : REAL; EXTERNAL; PROCEDURE m2writechar (c : CHAR); EXTERNAL; PROCEDURE m2write (VAR s : ARRAY OF CHAR); EXTERNAL; PROCEDURE StrLen (VAR s : ARRAY OF CHAR) : CARDINAL; VAR i : CARDINAL; BEGIN i := 0; WHILE (i <= HIGH(s)) AND (s[i] # CHR(0)) DO INC(i) END; RETURN i END StrLen; PROCEDURE WritePadded (VAR s : ARRAY OF CHAR; width : CARDINAL); VAR n, i : CARDINAL; BEGIN n := StrLen(s); IF width > n THEN i := width - n; WHILE i > 0 DO m2writechar(" "); DEC(i) END END; m2write(s) END WritePadded; PROCEDURE WriteFloat (real : REAL; sigFigs : CARDINAL; width : CARDINAL); VAR s : ARRAY [0 .. 127] OF CHAR; n : INTEGER; BEGIN n := m2realconv(real, 1, VAL(INTEGER, sigFigs), s); WritePadded(s, width) END WriteFloat; PROCEDURE WriteEng (real : REAL; sigFigs : CARDINAL; width : CARDINAL); VAR s : ARRAY [0 .. 127] OF CHAR; n : INTEGER; BEGIN n := m2realconv(real, 2, VAL(INTEGER, sigFigs), s); WritePadded(s, width) END WriteEng; PROCEDURE WriteFixed (real : REAL; place : INTEGER; width : CARDINAL); VAR s : ARRAY [0 .. 127] OF CHAR; n : INTEGER; BEGIN n := m2realconv(real, 0, place, s); WritePadded(s, width) END WriteFixed; PROCEDURE WriteReal (real : REAL; width : CARDINAL); BEGIN (* ISO: fixed if it fits, otherwise floating; approximate by fixed with a width-derived number of places. *) IF width <= 16 THEN WriteFixed(real, 6, width) ELSE WriteFloat(real, 6, width) END END WriteReal; PROCEDURE ReadReal (VAR real : REAL); BEGIN real := m2readreal(); SIOResult.SetReadResult(allRight) END ReadReal; END SRealIO.