1------------------------------------------------------------------------------ 2-- -- 3-- GNAT RUN-TIME COMPONENTS -- 4-- -- 5-- A D A . T E X T _ I O . D E C I M A L _ I O -- 6-- -- 7-- B o d y -- 8-- -- 9-- Copyright (C) 1992-2019, 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 Ada.Text_IO.Decimal_Aux; 33 34package body Ada.Text_IO.Decimal_IO is 35 36 package Aux renames Ada.Text_IO.Decimal_Aux; 37 38 Scale : constant Integer := Num'Scale; 39 40 --------- 41 -- Get -- 42 --------- 43 44 procedure Get 45 (File : File_Type; 46 Item : out Num; 47 Width : Field := 0) 48 is 49 pragma Unsuppress (Range_Check); 50 51 begin 52 if Num'Size > Integer'Size then 53 Item := Num'Fixed_Value (Aux.Get_LLD (File, Width, Scale)); 54 else 55 Item := Num'Fixed_Value (Aux.Get_Dec (File, Width, Scale)); 56 end if; 57 58 exception 59 when Constraint_Error => raise Data_Error; 60 end Get; 61 62 procedure Get 63 (Item : out Num; 64 Width : Field := 0) 65 is 66 begin 67 Get (Current_In, Item, Width); 68 end Get; 69 70 procedure Get 71 (From : String; 72 Item : out Num; 73 Last : out Positive) 74 is 75 pragma Unsuppress (Range_Check); 76 77 begin 78 if Num'Size > Integer'Size then 79 Item := Num'Fixed_Value 80 (Aux.Gets_LLD (From, Last'Unrestricted_Access, Scale)); 81 else 82 Item := Num'Fixed_Value 83 (Aux.Gets_Dec (From, Last'Unrestricted_Access, Scale)); 84 end if; 85 86 exception 87 when Constraint_Error => raise Data_Error; 88 end Get; 89 90 --------- 91 -- Put -- 92 --------- 93 94 procedure Put 95 (File : File_Type; 96 Item : Num; 97 Fore : Field := Default_Fore; 98 Aft : Field := Default_Aft; 99 Exp : Field := Default_Exp) 100 is 101 begin 102 if Num'Size > Integer'Size then 103 Aux.Put_LLD 104 (File, Long_Long_Integer'Integer_Value (Item), 105 Fore, Aft, Exp, Scale); 106 else 107 Aux.Put_Dec 108 (File, Integer'Integer_Value (Item), Fore, Aft, Exp, Scale); 109 end if; 110 end Put; 111 112 procedure Put 113 (Item : Num; 114 Fore : Field := Default_Fore; 115 Aft : Field := Default_Aft; 116 Exp : Field := Default_Exp) 117 is 118 begin 119 Put (Current_Out, Item, Fore, Aft, Exp); 120 end Put; 121 122 procedure Put 123 (To : out String; 124 Item : Num; 125 Aft : Field := Default_Aft; 126 Exp : Field := Default_Exp) 127 is 128 begin 129 if Num'Size > Integer'Size then 130 Aux.Puts_LLD 131 (To, Long_Long_Integer'Integer_Value (Item), Aft, Exp, Scale); 132 else 133 Aux.Puts_Dec (To, Integer'Integer_Value (Item), Aft, Exp, Scale); 134 end if; 135 end Put; 136 137end Ada.Text_IO.Decimal_IO; 138