IMPLEMENTATION MODULE RealStr; (* String conversion uses the runtime shim's snprintf formatter (m2realconv); the numeric parse delegates to Conversions. *) IMPORT ConvTypes, Conversions; FROM ConvTypes IMPORT strAllRight, strOutOfRange, strWrongFormat, strEmpty; PROCEDURE m2realconv (x : REAL; mode : INTEGER; prec : INTEGER; VAR s : ARRAY OF CHAR) : INTEGER; EXTERNAL; PROCEDURE Map (cr : Conversions.ConvResults) : ConvTypes.ConvResults; BEGIN IF ORD(cr) = 0 THEN RETURN strAllRight ELSIF ORD(cr) = 1 THEN RETURN strOutOfRange ELSIF ORD(cr) = 2 THEN RETURN strWrongFormat ELSE RETURN strEmpty END END Map; PROCEDURE StrToReal (str : ARRAY OF CHAR; VAR real : REAL; VAR res : ConvResults); VAR s : ARRAY [0 .. 255] OF CHAR; i : CARDINAL; BEGIN real := 0.0; (* Conversions.StrToReal takes a VAR array; copy to a scratch one. *) i := 0; WHILE (i <= HIGH(s)) AND (i <= HIGH(str)) AND (str[i] # CHR(0)) DO s[i] := str[i]; INC(i) END; s[i] := CHR(0); res := Map(Conversions.StrToReal(s, real)) END StrToReal; PROCEDURE RealToFloat (real : REAL; sigFigs : CARDINAL; VAR str : ARRAY OF CHAR); VAR n : INTEGER; BEGIN n := m2realconv(real, 1, VAL(INTEGER, sigFigs), str) END RealToFloat; PROCEDURE RealToEng (real : REAL; sigFigs : CARDINAL; VAR str : ARRAY OF CHAR); VAR n : INTEGER; BEGIN n := m2realconv(real, 2, VAL(INTEGER, sigFigs), str) END RealToEng; PROCEDURE RealToFixed (real : REAL; place : INTEGER; VAR str : ARRAY OF CHAR); VAR n : INTEGER; BEGIN n := m2realconv(real, 0, place, str) END RealToFixed; PROCEDURE RealToStr (real : REAL; VAR str : ARRAY OF CHAR); BEGIN Conversions.RealToStr(real, str) END RealToStr; END RealStr.