1------------------------------------------------------------------------------ 2-- -- 3-- GNAT COMPILER COMPONENTS -- 4-- -- 5-- S Y S T E M . V A L _ L L I -- 6-- -- 7-- S p e c -- 8-- -- 9-- Copyright (C) 1992,1993,1994,1995,1996 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 2, 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. See the GNU General Public License -- 17-- for more details. You should have received a copy of the GNU General -- 18-- Public License distributed with GNAT; see file COPYING. If not, write -- 19-- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, -- 20-- MA 02111-1307, USA. -- 21-- -- 22-- As a special exception, if other files instantiate generics from this -- 23-- unit, or you link this unit with other files to produce an executable, -- 24-- this unit does not by itself cause the resulting executable to be -- 25-- covered by the GNU General Public License. This exception does not -- 26-- however invalidate any other reasons why the executable file might be -- 27-- covered by the GNU Public License. -- 28-- -- 29-- GNAT was originally developed by the GNAT team at New York University. -- 30-- Extensive contributions were provided by Ada Core Technologies Inc. -- 31-- -- 32------------------------------------------------------------------------------ 33 34with System.Unsigned_Types; use System.Unsigned_Types; 35with System.Val_LLU; use System.Val_LLU; 36with System.Val_Util; use System.Val_Util; 37 38package body System.Val_LLI is 39 40 --------------------------- 41 -- Scn_Long_Long_Integer -- 42 --------------------------- 43 44 function Scan_Long_Long_Integer 45 (Str : String; 46 Ptr : access Integer; 47 Max : Integer) 48 return Long_Long_Integer 49 is 50 Uval : Long_Long_Unsigned; 51 -- Unsigned result 52 53 Minus : Boolean := False; 54 -- Set to True if minus sign is present, otherwise to False 55 56 Start : Positive; 57 -- Saves location of first non-blank (not used in this case) 58 59 begin 60 Scan_Sign (Str, Ptr, Max, Minus, Start); 61 Uval := Scan_Long_Long_Unsigned (Str, Ptr, Max); 62 63 -- Deal with overflow cases, and also with maximum negative number 64 65 if Uval > Long_Long_Unsigned (Long_Long_Integer'Last) then 66 if Minus 67 and then Uval = Long_Long_Unsigned (-(Long_Long_Integer'First)) then 68 return Long_Long_Integer'First; 69 else 70 raise Constraint_Error; 71 end if; 72 73 -- Negative values 74 75 elsif Minus then 76 return -(Long_Long_Integer (Uval)); 77 78 -- Positive values 79 80 else 81 return Long_Long_Integer (Uval); 82 end if; 83 84 end Scan_Long_Long_Integer; 85 86 ----------------------------- 87 -- Value_Long_Long_Integer -- 88 ----------------------------- 89 90 function Value_Long_Long_Integer (Str : String) return Long_Long_Integer is 91 V : Long_Long_Integer; 92 P : aliased Integer := Str'First; 93 94 begin 95 V := Scan_Long_Long_Integer (Str, P'Access, Str'Last); 96 Scan_Trailing_Blanks (Str, P); 97 return V; 98 99 end Value_Long_Long_Integer; 100 101end System.Val_LLI; 102