1------------------------------------------------------------------------------ 2-- -- 3-- GNAT RUN-TIME COMPONENTS -- 4-- -- 5-- A D A . W I D E _ W I D E _ T E X T _ I O . F I X E D _ I O -- 6-- -- 7-- B o d y -- 8-- -- 9-- Copyright (C) 2020-2021, 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.Wide_Wide_Text_IO.Generic_Aux; use Ada.Wide_Wide_Text_IO.Generic_Aux; 33 34package body Ada.Wide_Wide_Text_IO.Fixed_Aux is 35 36 --------- 37 -- Get -- 38 --------- 39 40 function Get 41 (File : File_Type; 42 Width : Field; 43 Num : Int; 44 Den : Int) return Int 45 is 46 Buf : String (1 .. Field'Last); 47 Ptr : aliased Integer; 48 Stop : Integer := 0; 49 Item : Int; 50 51 begin 52 if Width /= 0 then 53 Load_Width (File, Width, Buf, Stop); 54 String_Skip (Buf, Ptr); 55 else 56 Load_Real (File, Buf, Stop); 57 Ptr := 1; 58 end if; 59 60 Item := Scan (Buf, Ptr'Access, Stop, Num, Den); 61 Check_End_Of_Field (Buf, Stop, Ptr, Width); 62 return Item; 63 end Get; 64 65 ---------- 66 -- Gets -- 67 ---------- 68 69 function Gets 70 (From : String; 71 Last : out Positive; 72 Num : Int; 73 Den : Int) return Int 74 is 75 Pos : aliased Integer; 76 Item : Int; 77 78 begin 79 String_Skip (From, Pos); 80 Item := Scan (From, Pos'Access, From'Last, Num, Den); 81 Last := Pos - 1; 82 return Item; 83 84 exception 85 when Constraint_Error => 86 Last := Pos - 1; 87 raise Data_Error; 88 end Gets; 89 90 --------- 91 -- Put -- 92 --------- 93 94 procedure Put 95 (File : File_Type; 96 Item : Int; 97 Fore : Field; 98 Aft : Field; 99 Exp : Natural; 100 Num : Int; 101 Den : Int; 102 For0 : Natural; 103 Aft0 : Natural) 104 is 105 Buf : String (1 .. Field'Last); 106 Ptr : Natural := 0; 107 108 begin 109 Set_Image (Item, Buf, Ptr, Num, Den, For0, Aft0, Fore, Aft, Exp); 110 Put_Item (File, Buf (1 .. Ptr)); 111 end Put; 112 113 ---------- 114 -- Puts -- 115 ---------- 116 117 procedure Puts 118 (To : out String; 119 Item : Int; 120 Aft : Field; 121 Exp : Natural; 122 Num : Int; 123 Den : Int; 124 For0 : Natural; 125 Aft0 : Natural) 126 is 127 Buf : String (1 .. Positive'Max (Field'Last, To'Length)); 128 Fore : Integer; 129 Ptr : Natural := 0; 130 131 begin 132 -- Compute Fore, allowing for the decimal dot and Aft digits 133 134 Fore := To'Length - 1 - Field'Max (1, Aft); 135 136 -- Allow for Exp and one more for E if exponent present 137 138 if Exp /= 0 then 139 Fore := Fore - 1 - Field'Max (2, Exp); 140 end if; 141 142 -- Make sure we have enough room 143 144 if Fore < 1 + Boolean'Pos (Item < 0) then 145 raise Layout_Error; 146 end if; 147 148 -- Do the conversion and check length of result 149 150 Set_Image (Item, Buf, Ptr, Num, Den, For0, Aft0, Fore, Aft, Exp); 151 152 if Ptr > To'Length then 153 raise Layout_Error; 154 else 155 To := Buf (1 .. Ptr); 156 end if; 157 end Puts; 158 159end Ada.Wide_Wide_Text_IO.Fixed_Aux; 160