1------------------------------------------------------------------------------ 2-- -- 3-- GNAT COMPILER COMPONENTS -- 4-- -- 5-- S Y S T E M . V A L _ I N T -- 6-- -- 7-- B o d y -- 8-- -- 9-- Copyright (C) 1992-2012, Free Software Foundation, Inc. -- 10-- -- 11-- GNAT is free software; you can redistribute it and/or modify it under -- 12-- terms of the GNU General Public License as published by the Free Soft- -- 13-- ware Foundation; either version 3, or (at your option) any later ver- -- 14-- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- 15-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- 16-- or FITNESS FOR A PARTICULAR PURPOSE. -- 17-- -- 18-- As a special exception under Section 7 of GPL version 3, you are granted -- 19-- additional permissions described in the GCC Runtime Library Exception, -- 20-- version 3.1, as published by the Free Software Foundation. -- 21-- -- 22-- You should have received a copy of the GNU General Public License and -- 23-- a copy of the GCC Runtime Library Exception along with this program; -- 24-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- 25-- <http://www.gnu.org/licenses/>. -- 26-- -- 27-- GNAT was originally developed by the GNAT team at New York University. -- 28-- Extensive contributions were provided by Ada Core Technologies Inc. -- 29-- -- 30------------------------------------------------------------------------------ 31 32with System.Unsigned_Types; use System.Unsigned_Types; 33with System.Val_Uns; use System.Val_Uns; 34with System.Val_Util; use System.Val_Util; 35 36package body System.Val_Int is 37 38 ------------------ 39 -- Scan_Integer -- 40 ------------------ 41 42 function Scan_Integer 43 (Str : String; 44 Ptr : not null access Integer; 45 Max : Integer) return Integer 46 is 47 Uval : Unsigned; 48 -- Unsigned result 49 50 Minus : Boolean := False; 51 -- Set to True if minus sign is present, otherwise to False 52 53 Start : Positive; 54 -- Saves location of first non-blank (not used in this case) 55 56 begin 57 Scan_Sign (Str, Ptr, Max, Minus, Start); 58 59 if Str (Ptr.all) not in '0' .. '9' then 60 Ptr.all := Start; 61 Bad_Value (Str); 62 end if; 63 64 Uval := Scan_Raw_Unsigned (Str, Ptr, Max); 65 66 -- Deal with overflow cases, and also with maximum negative number 67 68 if Uval > Unsigned (Integer'Last) then 69 if Minus and then Uval = Unsigned (-(Integer'First)) then 70 return Integer'First; 71 else 72 Bad_Value (Str); 73 end if; 74 75 -- Negative values 76 77 elsif Minus then 78 return -(Integer (Uval)); 79 80 -- Positive values 81 82 else 83 return Integer (Uval); 84 end if; 85 end Scan_Integer; 86 87 ------------------- 88 -- Value_Integer -- 89 ------------------- 90 91 function Value_Integer (Str : String) return Integer is 92 V : Integer; 93 P : aliased Integer := Str'First; 94 begin 95 V := Scan_Integer (Str, P'Access, Str'Last); 96 Scan_Trailing_Blanks (Str, P); 97 return V; 98 end Value_Integer; 99 100end System.Val_Int; 101