aboutsummaryrefslogtreecommitdiffstats
path: root/src/grt/grt-vstrings.adb
diff options
context:
space:
mode:
authorTristan Gingold <tgingold@free.fr>2017-04-16 11:31:41 +0200
committerTristan Gingold <tgingold@free.fr>2017-04-19 20:48:23 +0200
commit918d0411347bdb2d8e5027a58803a072613e02b2 (patch)
treec078d225731eb96d0c9f5ecb634ea75370208b11 /src/grt/grt-vstrings.adb
parent7d17b527ea6bad8ef1e3f5450c0d7899c60febee (diff)
downloadghdl-918d0411347bdb2d8e5027a58803a072613e02b2.tar.gz
ghdl-918d0411347bdb2d8e5027a58803a072613e02b2.tar.bz2
ghdl-918d0411347bdb2d8e5027a58803a072613e02b2.zip
Use grt.fcvt for 'image.
Diffstat (limited to 'src/grt/grt-vstrings.adb')
-rw-r--r--src/grt/grt-vstrings.adb90
1 files changed, 5 insertions, 85 deletions
diff --git a/src/grt/grt-vstrings.adb b/src/grt/grt-vstrings.adb
index d5d14c856..544626f46 100644
--- a/src/grt/grt-vstrings.adb
+++ b/src/grt/grt-vstrings.adb
@@ -22,10 +22,11 @@
-- covered by the GNU General Public License. This exception does not
-- however invalidate any other reasons why the executable file might be
-- covered by the GNU Public License.
-with System.Storage_Elements; -- Work around GNAT bug.
-pragma Unreferenced (System.Storage_Elements);
+
+with Interfaces;
with Grt.Errors; use Grt.Errors;
with Grt.C; use Grt.C;
+with Grt.Fcvt;
package body Grt.Vstrings is
procedure Free (Fs : Fat_String_Acc);
@@ -262,90 +263,9 @@ package body Grt.Vstrings is
procedure To_String (Str : out String; First : out Natural; N : Ghdl_I64)
renames To_String_I64;
- procedure To_String (Str : out String; Last : out Natural; N : Ghdl_F64)
- is
- function Trunc (V : Ghdl_F64) return Ghdl_F64;
- pragma Import (C, Trunc);
-
- P : Natural := Str'First;
- V : Ghdl_F64;
- Vmax : Ghdl_F64;
- Vd : Ghdl_F64;
- Exp : Integer;
- D : Integer;
- B : Boolean;
+ procedure To_String (Str : out String; Last : out Natural; N : Ghdl_F64) is
begin
- -- Handle sign.
- if N < 0.0 then
- Str (P) := '-';
- P := P + 1;
- V := -N;
- else
- V := N;
- end if;
-
- -- Compute the mantissa.
- -- and normalize V in [0 .. 10.0[
- -- FIXME: should do a dichotomy.
- if V = 0.0 then
- Exp := 0;
- elsif V < 1.0 then
- Exp := 0;
- loop
- exit when V >= 1.0;
- Exp := Exp - 1;
- V := V * 10.0;
- end loop;
- else
- Exp := 0;
- loop
- exit when V < 10.0;
- Exp := Exp + 1;
- V := V / 10.0;
- end loop;
- end if;
-
- Vmax := 10.0 ** (1 - 15);
- for I in 0 .. 15 loop
- -- Vd := Ghdl_F64'Truncation (V);
- Vd := Trunc (V);
- Str (P) := Character'Val (48 + Integer (Vd));
- P := P + 1;
- V := (V - Vd) * 10.0;
-
- if I = 0 then
- Str (P) := '.';
- P := P + 1;
- end if;
- exit when I > 0 and V < Vmax;
- Vmax := Vmax * 10.0;
- end loop;
-
- if Exp /= 0 then
- -- LRM93 14.3
- -- if the exponent is present, the `e' is written as a lower case
- -- character.
- Str (P) := 'e';
- P := P + 1;
-
- if Exp < 0 then
- Str (P) := '-';
- P := P + 1;
- Exp := -Exp;
- end if;
- B := False;
- for I in 0 .. 4 loop
- D := (Exp / 10000) mod 10;
- if D /= 0 or B or I = 4 then
- Str (P) := Character'Val (48 + D);
- P := P + 1;
- B := True;
- end if;
- Exp := (Exp - D * 10000) * 10;
- end loop;
- end if;
-
- Last := P - 1;
+ Grt.Fcvt.Format_Image (Str, Last, Interfaces.IEEE_Float_64 (N));
end To_String;
procedure To_String (Str : out String_Real_Digits;