s-valint.adb (Scan_Integer): Call Scan_Raw_Unsigned instead of Scan_Unsigned...
authorBob Duff <duff@adacore.com>
Wed, 15 Feb 2006 09:46:41 +0000 (10:46 +0100)
committerArnaud Charlet <charlet@gcc.gnu.org>
Wed, 15 Feb 2006 09:46:41 +0000 (10:46 +0100)
2006-02-13  Bob Duff  <duff@adacore.com>

* s-valint.adb (Scan_Integer): Call Scan_Raw_Unsigned instead of
Scan_Unsigned, so we do not scan leading blanks and sign twice.
Integer'Value("- 5") and Integer'Value("-+5") now correctly
raise Constraint_Error.

* s-vallli.adb (Scan_Long_Long_Integer): Call
Scan_Raw_Long_Long_Unsigned instead of Scan_Long_Long_Unsigned, so we
do not scan leading blanks and sign twice.
Integer'Value("- 5") and Integer'Value("-+5") now correctly
raise Constraint_Error.

* s-valllu.ads, s-valllu.adb (Scan_Raw_Long_Long_Unsigned,
Scan_Long_Long_Unsigned): Split out most of the processing from
Scan_Long_Long_Unsigned out into
Scan_Raw_Long_Long_Unsigned, so that Val_LLI can call the Raw_ version.
This prevents scanning leading blanks and sign twice.
Also fixed a bug: Modular'Value("-0") should raise Constraint_Error
See RM-3.5(44).

* s-valuns.ads, s-valuns.adb (Scan_Raw_Unsigned, Scan_Unsigned): Split
out most of the processing from Scan_Unsigned out into
Scan_Raw_Unsigned, so that Val_LLI can call the Raw_ version.
This prevents scanning leading blanks and sign twice.

* s-valuti.ads, s-valuti.adb (Scan_Plus_Sign): Add Scan_Plus_Sign, for
use with Modular'Value attribute.
(Scan_Plus_Sign): Add Scan_Plus_Sign, for use with Modular'Value
attribute.

From-SVN: r111101

gcc/ada/s-valint.adb
gcc/ada/s-vallli.adb
gcc/ada/s-valllu.adb
gcc/ada/s-valllu.ads
gcc/ada/s-valuns.adb
gcc/ada/s-valuns.ads
gcc/ada/s-valuti.adb
gcc/ada/s-valuti.ads

index 8bfb3733d4bf67bf7127e2f0cbea255381cb80de..60c761fdfd381ba5ff9d62e58de30b7d32fa61a4 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2005, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2006, 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- --
@@ -57,7 +57,13 @@ package body System.Val_Int is
 
    begin
       Scan_Sign (Str, Ptr, Max, Minus, Start);
-      Uval := Scan_Unsigned (Str, Ptr, Max);
+
+      if Str (Ptr.all) not in '0' .. '9' then
+         Ptr.all := Start;
+         raise Constraint_Error;
+      end if;
+
+      Uval := Scan_Raw_Unsigned (Str, Ptr, Max);
 
       --  Deal with overflow cases, and also with maximum negative number
 
index ad54db946077c6e9e314d0488c93de546cdac1cb..850bdf1b7a938a6d16e5b5caa5a00317065389fa 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2005, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2006, 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- --
@@ -37,9 +37,9 @@ with System.Val_Util;       use System.Val_Util;
 
 package body System.Val_LLI is
 
-   ---------------------------
-   -- Scn_Long_Long_Integer --
-   ---------------------------
+   ----------------------------
+   -- Scan_Long_Long_Integer --
+   ----------------------------
 
    function Scan_Long_Long_Integer
      (Str  : String;
@@ -57,13 +57,20 @@ package body System.Val_LLI is
 
    begin
       Scan_Sign (Str, Ptr, Max, Minus, Start);
-      Uval := Scan_Long_Long_Unsigned (Str, Ptr, Max);
+
+      if Str (Ptr.all) not in '0' .. '9' then
+         Ptr.all := Start;
+         raise Constraint_Error;
+      end if;
+
+      Uval := Scan_Raw_Long_Long_Unsigned (Str, Ptr, Max);
 
       --  Deal with overflow cases, and also with maximum negative number
 
       if Uval > Long_Long_Unsigned (Long_Long_Integer'Last) then
          if Minus
-           and then Uval = Long_Long_Unsigned (-(Long_Long_Integer'First)) then
+           and then Uval = Long_Long_Unsigned (-(Long_Long_Integer'First))
+         then
             return Long_Long_Integer'First;
          else
             raise Constraint_Error;
index ca4cbb2a38cc493ef1a18dd28c4bcfb39d5571d9..ab5752f4c7c41d04926a8e53108bdb50c1618329 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2005, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2006, 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- --
@@ -36,11 +36,11 @@ with System.Val_Util;       use System.Val_Util;
 
 package body System.Val_LLU is
 
-   -----------------------------
-   -- Scan_Long_Long_Unsigned --
-   -----------------------------
+   ---------------------------------
+   -- Scan_Raw_Long_Long_Unsigned --
+   ---------------------------------
 
-   function Scan_Long_Long_Unsigned
+   function Scan_Raw_Long_Long_Unsigned
      (Str : String;
       Ptr : access Integer;
       Max : Integer) return Long_Long_Unsigned
@@ -54,17 +54,9 @@ package body System.Val_LLU is
       Expon : Integer;
       --  Exponent value
 
-      Minus : Boolean := False;
-      --  Set to True if minus sign is present, otherwise to False. Note that
-      --  a minus sign is permissible for the singular case of -0, and in any
-      --  case the pointer is left pointing past a negative integer literal.
-
       Overflow : Boolean := False;
       --  Set True if overflow is detected at any point
 
-      Start : Positive;
-      --  Save location of first non-blank character
-
       Base_Char : Character;
       --  Base character (# or :) in based case
 
@@ -75,13 +67,6 @@ package body System.Val_LLU is
       --  Digit value
 
    begin
-      Scan_Sign (Str, Ptr, Max, Minus, Start);
-
-      if Str (Ptr.all) not in '0' .. '9' then
-         Ptr.all := Start;
-         raise Constraint_Error;
-      end if;
-
       P := Ptr.all;
       Uval := Character'Pos (Str (P)) - Character'Pos ('0');
       P := P + 1;
@@ -273,11 +258,34 @@ package body System.Val_LLU is
 
       --  Return result, dealing with sign and overflow
 
-      if Overflow or else (Minus and then Uval /= 0) then
+      if Overflow then
          raise Constraint_Error;
       else
          return Uval;
       end if;
+   end Scan_Raw_Long_Long_Unsigned;
+
+   -----------------------------
+   -- Scan_Long_Long_Unsigned --
+   -----------------------------
+
+   function Scan_Long_Long_Unsigned
+     (Str : String;
+      Ptr : access Integer;
+      Max : Integer) return Long_Long_Unsigned
+   is
+      Start : Positive;
+      --  Save location of first non-blank character
+
+   begin
+      Scan_Plus_Sign (Str, Ptr, Max, Start);
+
+      if Str (Ptr.all) not in '0' .. '9' then
+         Ptr.all := Start;
+         raise Constraint_Error;
+      end if;
+
+      return Scan_Raw_Long_Long_Unsigned (Str, Ptr, Max);
    end Scan_Long_Long_Unsigned;
 
    ------------------------------
index 603e4b6bc80aad97570caace04bacc86a4495918..e6c740f8a50cf021ca08a954c7cbc7df67e3616a 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 S p e c                                  --
 --                                                                          --
---          Copyright (C) 1992-2005, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2006, 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- --
@@ -31,7 +31,7 @@
 --                                                                          --
 ------------------------------------------------------------------------------
 
---  This package contains routines for scanning unsigned Long_Long_Unsigned
+--  This package contains routines for scanning modular Long_Long_Unsigned
 --  values for use in Text_IO.Modular_IO, and the Value attribute.
 
 with System.Unsigned_Types;
@@ -39,18 +39,19 @@ with System.Unsigned_Types;
 package System.Val_LLU is
    pragma Pure;
 
-   function Scan_Long_Long_Unsigned
+   function Scan_Raw_Long_Long_Unsigned
      (Str : String;
       Ptr : access Integer;
       Max : Integer) return System.Unsigned_Types.Long_Long_Unsigned;
    --  This function scans the string starting at Str (Ptr.all) for a valid
    --  integer according to the syntax described in (RM 3.5(43)). The substring
-   --  scanned extends no further than Str (Max). There are three cases for the
-   --  return:
+   --  scanned extends no further than Str (Max).  Note: this does not scan
+   --  leading or trailing blanks, nor leading sign.
+   --
+   --  There are three cases for the return:
    --
-   --  If a valid integer is found after scanning past any initial spaces, then
-   --  Ptr.all is updated past the last character of the integer (but trailing
-   --  spaces are not scanned out).
+   --  If a valid integer is found, then Ptr.all is updated past the last
+   --  character of the integer.
    --
    --  If no valid integer is found, then Ptr.all points either to an initial
    --  non-digit character, or to Max + 1 if the field is all spaces and the
@@ -59,16 +60,24 @@ package System.Val_LLU is
    --  If a syntactically valid integer is scanned, but the value is out of
    --  range, or, in the based case, the base value is out of range or there
    --  is an out of range digit, then Ptr.all points past the integer, and
-   --  Constraint_Error is raised. Note that if a minus sign is present, and
-   --  the integer value is non-zero, then constraint error will be raised.
+   --  Constraint_Error is raised.
    --
    --  Note: these rules correspond to the requirements for leaving the pointer
-   --  positioned in Text_Io.Get
+   --  positioned in Text_IO.Get
    --
-   --  Note: if Str is null, i.e. if Max is less than Ptr, then this is a
+   --  Note: if Str is empty, i.e. if Max is less than Ptr, then this is a
    --  special case of an all-blank string, and Ptr is unchanged, and hence
    --  is greater than Max as required in this case.
 
+   function Scan_Long_Long_Unsigned
+     (Str : String;
+      Ptr : access Integer;
+      Max : Integer) return System.Unsigned_Types.Long_Long_Unsigned;
+   --  Same as Scan_Raw_Long_Long_Unsigned, except scans optional leading
+   --  blanks, and an optional leading plus sign.
+   --  Note: if a minus sign is present, Constraint_Error will be raised.
+   --  Note: trailing blanks are not scanned.
+
    function Value_Long_Long_Unsigned
      (Str : String) return System.Unsigned_Types.Long_Long_Unsigned;
    --  Used in computing X'Value (Str) where X is a modular integer type whose
index 885db28f3c7e87d3e0a6e6ef979e6d8b205c2964..d9d7940a3560787fed50961544228a03ed3309c8 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2005, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2006, 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- --
@@ -36,11 +36,11 @@ with System.Val_Util;       use System.Val_Util;
 
 package body System.Val_Uns is
 
-   -------------------
-   -- Scan_Unsigned --
-   -------------------
+   -----------------------
+   -- Scan_Raw_Unsigned --
+   -----------------------
 
-   function Scan_Unsigned
+   function Scan_Raw_Unsigned
      (Str : String;
       Ptr : access Integer;
       Max : Integer) return Unsigned
@@ -54,17 +54,9 @@ package body System.Val_Uns is
       Expon : Integer;
       --  Exponent value
 
-      Minus : Boolean := False;
-      --  Set to True if minus sign is present, otherwise to False. Note that
-      --  a minus sign is permissible for the singular case of -0, and in any
-      --  case the pointer is left pointing past a negative integer literal.
-
       Overflow : Boolean := False;
       --  Set True if overflow is detected at any point
 
-      Start : Positive;
-      --  Save location of first non-blank character
-
       Base_Char : Character;
       --  Base character (# or :) in based case
 
@@ -75,13 +67,6 @@ package body System.Val_Uns is
       --  Digit value
 
    begin
-      Scan_Sign (Str, Ptr, Max, Minus, Start);
-
-      if Str (Ptr.all) not in '0' .. '9' then
-         Ptr.all := Start;
-         raise Constraint_Error;
-      end if;
-
       P := Ptr.all;
       Uval := Character'Pos (Str (P)) - Character'Pos ('0');
       P := P + 1;
@@ -270,11 +255,34 @@ package body System.Val_Uns is
 
       --  Return result, dealing with sign and overflow
 
-      if Overflow or else (Minus and then Uval /= 0) then
+      if Overflow then
          raise Constraint_Error;
       else
          return Uval;
       end if;
+   end Scan_Raw_Unsigned;
+
+   -------------------
+   -- Scan_Unsigned --
+   -------------------
+
+   function Scan_Unsigned
+     (Str : String;
+      Ptr : access Integer;
+      Max : Integer) return Unsigned
+   is
+      Start : Positive;
+      --  Save location of first non-blank character
+
+   begin
+      Scan_Plus_Sign (Str, Ptr, Max, Start);
+
+      if Str (Ptr.all) not in '0' .. '9' then
+         Ptr.all := Start;
+         raise Constraint_Error;
+      end if;
+
+      return Scan_Raw_Unsigned (Str, Ptr, Max);
    end Scan_Unsigned;
 
    --------------------
index bd41849e98fbf9bef1d83eadf6225c6ddc8ea4cb..7503ca4b72036b4ce74c87ba98cf7a819eb9fba0 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 S p e c                                  --
 --                                                                          --
---          Copyright (C) 1992-2005, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2006, 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- --
 ------------------------------------------------------------------------------
 
 --  This package contains routines for scanning modular Unsigned
---  values for use in Text_IO.Modular, and the Value attribute.
+--  values for use in Text_IO.Modular_IO, and the Value attribute.
 
 with System.Unsigned_Types;
 
 package System.Val_Uns is
    pragma Pure;
 
-   function Scan_Unsigned
+   function Scan_Raw_Unsigned
      (Str : String;
       Ptr : access Integer;
       Max : Integer) return System.Unsigned_Types.Unsigned;
    --  This function scans the string starting at Str (Ptr.all) for a valid
    --  integer according to the syntax described in (RM 3.5(43)). The substring
-   --  scanned extends no further than Str (Max). There are three cases for the
-   --  return:
+   --  scanned extends no further than Str (Max).  Note: this does not scan
+   --  leading or trailing blanks, nor leading sign.
+   --
+   --  There are three cases for the return:
    --
-   --  If a valid integer is found after scanning past any initial spaces, then
-   --  Ptr.all is updated past the last character of the integer (but trailing
-   --  spaces are not scanned out).
+   --  If a valid integer is found, then Ptr.all is updated past the last
+   --  character of the integer.
    --
    --  If no valid integer is found, then Ptr.all points either to an initial
    --  non-digit character, or to Max + 1 if the field is all spaces and the
@@ -59,16 +60,24 @@ package System.Val_Uns is
    --  If a syntactically valid integer is scanned, but the value is out of
    --  range, or, in the based case, the base value is out of range or there
    --  is an out of range digit, then Ptr.all points past the integer, and
-   --  Constraint_Error is raised. Note that if a minus sign is present, and
-   --  the integer value is non-zero, then constraint error will be raised.
+   --  Constraint_Error is raised.
    --
    --  Note: these rules correspond to the requirements for leaving the pointer
-   --  positioned in Text_Io.Get
+   --  positioned in Text_IO.Get
    --
-   --  Note: if Str is null, i.e. if Max is less than Ptr, then this is a
+   --  Note: if Str is empty, i.e. if Max is less than Ptr, then this is a
    --  special case of an all-blank string, and Ptr is unchanged, and hence
    --  is greater than Max as required in this case.
 
+   function Scan_Unsigned
+     (Str : String;
+      Ptr : access Integer;
+      Max : Integer) return System.Unsigned_Types.Unsigned;
+   --  Same as Scan_Raw_Unsigned, except scans optional leading
+   --  blanks, and an optional leading plus sign.
+   --  Note: if a minus sign is present, Constraint_Error will be raised.
+   --  Note: trailing blanks are not scanned.
+
    function Value_Unsigned
      (Str : String) return System.Unsigned_Types.Unsigned;
    --  Used in computing X'Value (Str) where X is a modular integer type whose
index 07f067b79cc920027dc985a0a8acbb8cdbc402e0..258620e24b6482fa70c1b193f3881e70631911ce 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2005, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2006, 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- --
@@ -159,6 +159,50 @@ package body System.Val_Util is
 
    end Scan_Exponent;
 
+   --------------------
+   -- Scan_Plus_Sign --
+   --------------------
+
+   procedure Scan_Plus_Sign
+     (Str   : String;
+      Ptr   : access Integer;
+      Max   : Integer;
+      Start : out Positive)
+   is
+      P : Natural := Ptr.all;
+
+   begin
+      if P > Max then
+         raise Constraint_Error;
+      end if;
+
+      --  Scan past initial blanks
+
+      while Str (P) = ' ' loop
+         P := P + 1;
+
+         if P > Max then
+            Ptr.all := P;
+            raise Constraint_Error;
+         end if;
+      end loop;
+
+      Start := P;
+
+      --  Skip past an initial plus sign
+
+      if Str (P) = '+' then
+         P := P + 1;
+
+         if P > Max then
+            Ptr.all := Start;
+            raise Constraint_Error;
+         end if;
+      end if;
+
+      Ptr.all := P;
+   end Scan_Plus_Sign;
+
    ---------------
    -- Scan_Sign --
    ---------------
index ac905096862843b078ce8d889ec07983cc2b6daa..944b945a2ae18ec3be6fcb83ad59bcac2c7c654c 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 S p e c                                  --
 --                                                                          --
---          Copyright (C) 1992-2005, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2006, 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- --
@@ -70,6 +70,14 @@ package System.Val_Util is
    --  is greater than Max as required in this case. Constraint_Error is
    --  also raised in this case.
 
+   procedure Scan_Plus_Sign
+     (Str   : String;
+      Ptr   : access Integer;
+      Max   : Integer;
+      Start : out Positive);
+   --  Same as Scan_Sign, but allows only plus, not minus.
+   --  This is used for modular types.
+
    function Scan_Exponent
      (Str  : String;
       Ptr  : access Integer;