mirror of
https://github.com/vishapoberon/compiler.git
synced 2026-04-06 21:32:26 +00:00
106 lines
3.3 KiB
Modula-2
106 lines
3.3 KiB
Modula-2
(* $Id: LRealConv.Mod,v 1.13 2003/04/06 12:11:15 mva Exp $ *)
|
|
MODULE ooc2LRealConv;
|
|
(* String to LONGREAL conversion functions.
|
|
Copyright (C) 2002 Michael van Acken
|
|
|
|
This module is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public License
|
|
as published by the Free Software Foundation; either version 2 of
|
|
the License, or (at your option) any later version.
|
|
|
|
This module is distributed in the hope that it will be useful, but
|
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with OOC. If not, write to the Free Software Foundation,
|
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
*)
|
|
|
|
IMPORT
|
|
SYSTEM, libc := oocwrapperlibc, CharClass := ooc2CharClass, ConvTypes := ooc2ConvTypes, Real0 := ooc2Real0;
|
|
|
|
(**
|
|
|
|
The regular expression for a signed fixed-point real number is
|
|
@samp{[+-]?\d+(\.\d* )?}. For the optional exponent part, it is
|
|
@samp{E[+-]?\d+}.
|
|
|
|
*)
|
|
|
|
TYPE
|
|
ConvResults* = ConvTypes.ConvResults;
|
|
(**One of @oconst{strAllRight}, @oconst{strOutOfRange},
|
|
@oconst{strWrongFormat}, or @oconst{strEmpty}. *)
|
|
|
|
CONST
|
|
strAllRight*=ConvTypes.strAllRight;
|
|
(**The string format is correct for the corresponding conversion. *)
|
|
strOutOfRange*=ConvTypes.strOutOfRange;
|
|
(**The string is well-formed but the value cannot be represented. *)
|
|
strWrongFormat*=ConvTypes.strWrongFormat;
|
|
(**The string is in the wrong format for the conversion. *)
|
|
strEmpty*=ConvTypes.strEmpty;
|
|
(**The given string is empty. *)
|
|
|
|
CONST
|
|
maxValue = "17976931348623157";
|
|
(* signifcant digits of the maximum value 1.7976931348623157D+308 *)
|
|
maxExp = 308;
|
|
(* maxium positive exponent of a normalized number *)
|
|
|
|
PROCEDURE ScanReal*(inputCh: CHAR;
|
|
VAR chClass: ConvTypes.ScanClass;
|
|
VAR nextState: ConvTypes.ScanState);
|
|
BEGIN
|
|
Real0.ScanReal (inputCh, chClass, nextState);
|
|
END ScanReal;
|
|
|
|
PROCEDURE FormatReal* (str: ARRAY OF CHAR): ConvResults;
|
|
BEGIN
|
|
RETURN Real0.FormatReal (str, maxExp, maxValue);
|
|
END FormatReal;
|
|
|
|
PROCEDURE ValueReal*(str: ARRAY OF CHAR): LONGREAL;
|
|
(* result is undefined if FormatReal(str) # strAllRight *)
|
|
VAR
|
|
i: LONGINT;
|
|
value: LONGREAL;
|
|
BEGIN
|
|
i := 0;
|
|
WHILE CharClass.IsWhiteSpace(str[i]) DO
|
|
(* skip our definition of whitespace *)
|
|
INC (i);
|
|
END;
|
|
IF libc.sscanf(SYSTEM.ADR(str[i]), "%lf", SYSTEM.ADR(value)) = 1 THEN
|
|
(* <*PUSH; Warnings:=FALSE*> *)
|
|
RETURN value (* syntax is ok *)
|
|
(* <*POP*> *)
|
|
ELSE
|
|
RETURN 0; (* error *)
|
|
END;
|
|
END ValueReal;
|
|
|
|
PROCEDURE LengthFloatReal*(real: LONGREAL; sigFigs: INTEGER): INTEGER;
|
|
BEGIN
|
|
(*<*PUSH; Assertions:=TRUE*>*)
|
|
ASSERT (FALSE)
|
|
(*<*POP*>*)
|
|
END LengthFloatReal;
|
|
|
|
PROCEDURE LengthEngReal*(real: LONGREAL; sigFigs: INTEGER): INTEGER;
|
|
BEGIN
|
|
(*<*PUSH; Assertions:=TRUE*>*)
|
|
ASSERT (FALSE)
|
|
(*<*POP*>*)
|
|
END LengthEngReal;
|
|
|
|
PROCEDURE LengthFixedReal*(real: LONGREAL; place: INTEGER): INTEGER;
|
|
BEGIN
|
|
(*<*PUSH; Assertions:=TRUE*>*)
|
|
ASSERT (FALSE)
|
|
(*<*POP*>*)
|
|
END LengthFixedReal;
|
|
|
|
END ooc2LRealConv.
|