OSDN Git Service

2010-10-05 Ed Schonberg <schonberg@adacore.com>
[pf3gnuchains/gcc-fork.git] / gcc / ada / s-imgdec.adb
index facafcb..6ddf5e0 100644 (file)
@@ -6,25 +6,23 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2008, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2009, Free Software Foundation, Inc.         --
 --                                                                          --
 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
 -- terms of the  GNU General Public License as published  by the Free Soft- --
--- ware  Foundation;  either version 2,  or (at your option) any later ver- --
+-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
--- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
--- for  more details.  You should have  received  a copy of the GNU General --
--- Public License  distributed with GNAT;  see file COPYING.  If not, write --
--- to  the  Free Software Foundation,  51  Franklin  Street,  Fifth  Floor, --
--- Boston, MA 02110-1301, USA.                                              --
+-- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
 --                                                                          --
--- As a special exception,  if other files  instantiate  generics from this --
--- unit, or you link  this unit with other files  to produce an executable, --
--- this  unit  does not  by itself cause  the resulting  executable  to  be --
--- 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.                                      --
+-- As a special exception under Section 7 of GPL version 3, you are granted --
+-- additional permissions described in the GCC Runtime Library Exception,   --
+-- version 3.1, as published by the Free Software Foundation.               --
+--                                                                          --
+-- You should have received a copy of the GNU General Public License and    --
+-- a copy of the GCC Runtime Library Exception along with this program;     --
+-- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
+-- <http://www.gnu.org/licenses/>.                                          --
 --                                                                          --
 -- GNAT was originally developed  by the GNAT team at  New York University. --
 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
@@ -103,13 +101,14 @@ package body System.Img_Dec is
       Expon : Integer;
       --  Integer value of exponent
 
-      procedure Round (N : Natural);
+      procedure Round (N : Integer);
       --  Round the number in Digs. N is the position of the last digit to be
       --  retained in the rounded position (rounding is based on Digs (N + 1)
       --  FD, LD, ND are reset as necessary if required. Note that if the
       --  result value rounds up (e.g. 9.99 => 10.0), an extra digit can be
       --  placed in the sign position as a result of the rounding, this is
-      --  the case in which FD is adjusted.
+      --  the case in which FD is adjusted. The call to Round has no effect
+      --  if N is outside the range FD .. LD.
 
       procedure Set (C : Character);
       pragma Inline (Set);
@@ -133,11 +132,11 @@ package body System.Img_Dec is
       -- Round --
       -----------
 
-      procedure Round (N : Natural) is
+      procedure Round (N : Integer) is
          D : Character;
 
       begin
-         --  Nothing to do if rounding at or past last digit
+         --  Nothing to do if rounding past the last digit we have
 
          if N >= LD then
             return;
@@ -274,12 +273,7 @@ package body System.Img_Dec is
          --  exception is for the value zero, which by convention has an
          --  exponent of +0.
 
-         if Zero then
-            Expon := 0;
-         else
-            Expon := Digits_Before_Point - 1;
-         end if;
-
+         Expon := (if Zero then 0 else Digits_Before_Point - 1);
          Set ('E');
          ND := 0;
 
@@ -320,9 +314,27 @@ package body System.Img_Dec is
             Set_Blanks_And_Sign (Fore - 1);
             Set ('0');
             Set ('.');
-            Set_Zeroes (-Digits_Before_Point);
-            Set_Digits (FD, LD);
-            Set_Zeroes (Digits_After_Point - Scale);
+
+            declare
+               DA : Natural := Digits_After_Point;
+               --  Digits remaining to output after point
+
+               LZ : constant Integer :=
+                      Integer'Max (0, Integer'Min (DA, -Digits_Before_Point));
+               --  Number of leading zeroes after point
+
+            begin
+               Set_Zeroes (LZ);
+               DA := DA - LZ;
+
+               if DA < ND then
+                  Set_Digits (FD, FD + DA - 1);
+
+               else
+                  Set_Digits (FD, LD);
+                  Set_Zeroes (DA - ND);
+               end if;
+            end;
 
          --  At least one digit before point in input