annotate gcc/ada/libgnat/s-stratt__xdr.adb @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children 84e7813d76e9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ------------------------------------------------------------------------------
kono
parents:
diff changeset
2 -- --
kono
parents:
diff changeset
3 -- GNAT RUN-TIME COMPONENTS --
kono
parents:
diff changeset
4 -- --
kono
parents:
diff changeset
5 -- S Y S T E M . S T R E A M _ A T T R I B U T E S --
kono
parents:
diff changeset
6 -- --
kono
parents:
diff changeset
7 -- B o d y --
kono
parents:
diff changeset
8 -- --
kono
parents:
diff changeset
9 -- Copyright (C) 1996-2017, Free Software Foundation, Inc. --
kono
parents:
diff changeset
10 -- --
kono
parents:
diff changeset
11 -- GARLIC is free software; you can redistribute it and/or modify it under --
kono
parents:
diff changeset
12 -- terms of the GNU General Public License as published by the Free Soft- --
kono
parents:
diff changeset
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
kono
parents:
diff changeset
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
kono
parents:
diff changeset
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
kono
parents:
diff changeset
16 -- or FITNESS FOR A PARTICULAR PURPOSE. --
kono
parents:
diff changeset
17 -- --
kono
parents:
diff changeset
18 -- As a special exception under Section 7 of GPL version 3, you are granted --
kono
parents:
diff changeset
19 -- additional permissions described in the GCC Runtime Library Exception, --
kono
parents:
diff changeset
20 -- version 3.1, as published by the Free Software Foundation. --
kono
parents:
diff changeset
21 -- --
kono
parents:
diff changeset
22 -- You should have received a copy of the GNU General Public License and --
kono
parents:
diff changeset
23 -- a copy of the GCC Runtime Library Exception along with this program; --
kono
parents:
diff changeset
24 -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
kono
parents:
diff changeset
25 -- <http://www.gnu.org/licenses/>. --
kono
parents:
diff changeset
26 -- --
kono
parents:
diff changeset
27 -- GNAT was originally developed by the GNAT team at New York University. --
kono
parents:
diff changeset
28 -- Extensive contributions were provided by Ada Core Technologies Inc. --
kono
parents:
diff changeset
29 -- --
kono
parents:
diff changeset
30 ------------------------------------------------------------------------------
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 -- This file is an alternate version of s-stratt.adb based on the XDR
kono
parents:
diff changeset
33 -- standard. It is especially useful for exchanging streams between two
kono
parents:
diff changeset
34 -- different systems with different basic type representations and endianness.
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 pragma Warnings (Off, "*not allowed in compiler unit");
kono
parents:
diff changeset
37 -- This body is used only when rebuilding the runtime library, not when
kono
parents:
diff changeset
38 -- building the compiler, so it's OK to depend on features that would
kono
parents:
diff changeset
39 -- otherwise break bootstrap (e.g. IF-expressions).
kono
parents:
diff changeset
40
kono
parents:
diff changeset
41 with Ada.IO_Exceptions;
kono
parents:
diff changeset
42 with Ada.Streams; use Ada.Streams;
kono
parents:
diff changeset
43 with Ada.Unchecked_Conversion;
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 package body System.Stream_Attributes is
kono
parents:
diff changeset
46
kono
parents:
diff changeset
47 pragma Suppress (Range_Check);
kono
parents:
diff changeset
48 pragma Suppress (Overflow_Check);
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 use UST;
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 Data_Error : exception renames Ada.IO_Exceptions.End_Error;
kono
parents:
diff changeset
53 -- Exception raised if insufficient data read (End_Error is mandated by
kono
parents:
diff changeset
54 -- AI95-00132).
kono
parents:
diff changeset
55
kono
parents:
diff changeset
56 SU : constant := System.Storage_Unit;
kono
parents:
diff changeset
57 -- The code in this body assumes that SU = 8
kono
parents:
diff changeset
58
kono
parents:
diff changeset
59 BB : constant := 2 ** SU; -- Byte base
kono
parents:
diff changeset
60 BL : constant := 2 ** SU - 1; -- Byte last
kono
parents:
diff changeset
61 BS : constant := 2 ** (SU - 1); -- Byte sign
kono
parents:
diff changeset
62
kono
parents:
diff changeset
63 US : constant := Unsigned'Size; -- Unsigned size
kono
parents:
diff changeset
64 UB : constant := (US - 1) / SU + 1; -- Unsigned byte
kono
parents:
diff changeset
65 UL : constant := 2 ** US - 1; -- Unsigned last
kono
parents:
diff changeset
66
kono
parents:
diff changeset
67 subtype SE is Ada.Streams.Stream_Element;
kono
parents:
diff changeset
68 subtype SEA is Ada.Streams.Stream_Element_Array;
kono
parents:
diff changeset
69 subtype SEO is Ada.Streams.Stream_Element_Offset;
kono
parents:
diff changeset
70
kono
parents:
diff changeset
71 generic function UC renames Ada.Unchecked_Conversion;
kono
parents:
diff changeset
72
kono
parents:
diff changeset
73 type Field_Type is
kono
parents:
diff changeset
74 record
kono
parents:
diff changeset
75 E_Size : Integer; -- Exponent bit size
kono
parents:
diff changeset
76 E_Bias : Integer; -- Exponent bias
kono
parents:
diff changeset
77 F_Size : Integer; -- Fraction bit size
kono
parents:
diff changeset
78 E_Last : Integer; -- Max exponent value
kono
parents:
diff changeset
79 F_Mask : SE; -- Mask to apply on first fraction byte
kono
parents:
diff changeset
80 E_Bytes : SEO; -- N. of exponent bytes completely used
kono
parents:
diff changeset
81 F_Bytes : SEO; -- N. of fraction bytes completely used
kono
parents:
diff changeset
82 F_Bits : Integer; -- N. of bits used on first fraction word
kono
parents:
diff changeset
83 end record;
kono
parents:
diff changeset
84
kono
parents:
diff changeset
85 type Precision is (Single, Double, Quadruple);
kono
parents:
diff changeset
86
kono
parents:
diff changeset
87 Fields : constant array (Precision) of Field_Type := (
kono
parents:
diff changeset
88
kono
parents:
diff changeset
89 -- Single precision
kono
parents:
diff changeset
90
kono
parents:
diff changeset
91 (E_Size => 8,
kono
parents:
diff changeset
92 E_Bias => 127,
kono
parents:
diff changeset
93 F_Size => 23,
kono
parents:
diff changeset
94 E_Last => 2 ** 8 - 1,
kono
parents:
diff changeset
95 F_Mask => 16#7F#, -- 2 ** 7 - 1,
kono
parents:
diff changeset
96 E_Bytes => 2,
kono
parents:
diff changeset
97 F_Bytes => 3,
kono
parents:
diff changeset
98 F_Bits => 23 mod US),
kono
parents:
diff changeset
99
kono
parents:
diff changeset
100 -- Double precision
kono
parents:
diff changeset
101
kono
parents:
diff changeset
102 (E_Size => 11,
kono
parents:
diff changeset
103 E_Bias => 1023,
kono
parents:
diff changeset
104 F_Size => 52,
kono
parents:
diff changeset
105 E_Last => 2 ** 11 - 1,
kono
parents:
diff changeset
106 F_Mask => 16#0F#, -- 2 ** 4 - 1,
kono
parents:
diff changeset
107 E_Bytes => 2,
kono
parents:
diff changeset
108 F_Bytes => 7,
kono
parents:
diff changeset
109 F_Bits => 52 mod US),
kono
parents:
diff changeset
110
kono
parents:
diff changeset
111 -- Quadruple precision
kono
parents:
diff changeset
112
kono
parents:
diff changeset
113 (E_Size => 15,
kono
parents:
diff changeset
114 E_Bias => 16383,
kono
parents:
diff changeset
115 F_Size => 112,
kono
parents:
diff changeset
116 E_Last => 2 ** 8 - 1,
kono
parents:
diff changeset
117 F_Mask => 16#FF#, -- 2 ** 8 - 1,
kono
parents:
diff changeset
118 E_Bytes => 2,
kono
parents:
diff changeset
119 F_Bytes => 14,
kono
parents:
diff changeset
120 F_Bits => 112 mod US));
kono
parents:
diff changeset
121
kono
parents:
diff changeset
122 -- The representation of all items requires a multiple of four bytes
kono
parents:
diff changeset
123 -- (or 32 bits) of data. The bytes are numbered 0 through n-1. The bytes
kono
parents:
diff changeset
124 -- are read or written to some byte stream such that byte m always
kono
parents:
diff changeset
125 -- precedes byte m+1. If the n bytes needed to contain the data are not
kono
parents:
diff changeset
126 -- a multiple of four, then the n bytes are followed by enough (0 to 3)
kono
parents:
diff changeset
127 -- residual zero bytes, r, to make the total byte count a multiple of 4.
kono
parents:
diff changeset
128
kono
parents:
diff changeset
129 -- An XDR signed integer is a 32-bit datum that encodes an integer
kono
parents:
diff changeset
130 -- in the range [-2147483648,2147483647]. The integer is represented
kono
parents:
diff changeset
131 -- in two's complement notation. The most and least significant bytes
kono
parents:
diff changeset
132 -- are 0 and 3, respectively. Integers are declared as follows:
kono
parents:
diff changeset
133
kono
parents:
diff changeset
134 -- (MSB) (LSB)
kono
parents:
diff changeset
135 -- +-------+-------+-------+-------+
kono
parents:
diff changeset
136 -- |byte 0 |byte 1 |byte 2 |byte 3 |
kono
parents:
diff changeset
137 -- +-------+-------+-------+-------+
kono
parents:
diff changeset
138 -- <------------32 bits------------>
kono
parents:
diff changeset
139
kono
parents:
diff changeset
140 SSI_L : constant := 1;
kono
parents:
diff changeset
141 SI_L : constant := 2;
kono
parents:
diff changeset
142 I_L : constant := 4;
kono
parents:
diff changeset
143 LI_L : constant := 8;
kono
parents:
diff changeset
144 LLI_L : constant := 8;
kono
parents:
diff changeset
145
kono
parents:
diff changeset
146 subtype XDR_S_SSI is SEA (1 .. SSI_L);
kono
parents:
diff changeset
147 subtype XDR_S_SI is SEA (1 .. SI_L);
kono
parents:
diff changeset
148 subtype XDR_S_I is SEA (1 .. I_L);
kono
parents:
diff changeset
149 subtype XDR_S_LI is SEA (1 .. LI_L);
kono
parents:
diff changeset
150 subtype XDR_S_LLI is SEA (1 .. LLI_L);
kono
parents:
diff changeset
151
kono
parents:
diff changeset
152 function Short_Short_Integer_To_XDR_S_SSI is
kono
parents:
diff changeset
153 new Ada.Unchecked_Conversion (Short_Short_Integer, XDR_S_SSI);
kono
parents:
diff changeset
154 function XDR_S_SSI_To_Short_Short_Integer is
kono
parents:
diff changeset
155 new Ada.Unchecked_Conversion (XDR_S_SSI, Short_Short_Integer);
kono
parents:
diff changeset
156
kono
parents:
diff changeset
157 function Short_Integer_To_XDR_S_SI is
kono
parents:
diff changeset
158 new Ada.Unchecked_Conversion (Short_Integer, XDR_S_SI);
kono
parents:
diff changeset
159 function XDR_S_SI_To_Short_Integer is
kono
parents:
diff changeset
160 new Ada.Unchecked_Conversion (XDR_S_SI, Short_Integer);
kono
parents:
diff changeset
161
kono
parents:
diff changeset
162 function Integer_To_XDR_S_I is
kono
parents:
diff changeset
163 new Ada.Unchecked_Conversion (Integer, XDR_S_I);
kono
parents:
diff changeset
164 function XDR_S_I_To_Integer is
kono
parents:
diff changeset
165 new Ada.Unchecked_Conversion (XDR_S_I, Integer);
kono
parents:
diff changeset
166
kono
parents:
diff changeset
167 function Long_Long_Integer_To_XDR_S_LI is
kono
parents:
diff changeset
168 new Ada.Unchecked_Conversion (Long_Long_Integer, XDR_S_LI);
kono
parents:
diff changeset
169 function XDR_S_LI_To_Long_Long_Integer is
kono
parents:
diff changeset
170 new Ada.Unchecked_Conversion (XDR_S_LI, Long_Long_Integer);
kono
parents:
diff changeset
171
kono
parents:
diff changeset
172 function Long_Long_Integer_To_XDR_S_LLI is
kono
parents:
diff changeset
173 new Ada.Unchecked_Conversion (Long_Long_Integer, XDR_S_LLI);
kono
parents:
diff changeset
174 function XDR_S_LLI_To_Long_Long_Integer is
kono
parents:
diff changeset
175 new Ada.Unchecked_Conversion (XDR_S_LLI, Long_Long_Integer);
kono
parents:
diff changeset
176
kono
parents:
diff changeset
177 -- An XDR unsigned integer is a 32-bit datum that encodes a nonnegative
kono
parents:
diff changeset
178 -- integer in the range [0,4294967295]. It is represented by an unsigned
kono
parents:
diff changeset
179 -- binary number whose most and least significant bytes are 0 and 3,
kono
parents:
diff changeset
180 -- respectively. An unsigned integer is declared as follows:
kono
parents:
diff changeset
181
kono
parents:
diff changeset
182 -- (MSB) (LSB)
kono
parents:
diff changeset
183 -- +-------+-------+-------+-------+
kono
parents:
diff changeset
184 -- |byte 0 |byte 1 |byte 2 |byte 3 |
kono
parents:
diff changeset
185 -- +-------+-------+-------+-------+
kono
parents:
diff changeset
186 -- <------------32 bits------------>
kono
parents:
diff changeset
187
kono
parents:
diff changeset
188 SSU_L : constant := 1;
kono
parents:
diff changeset
189 SU_L : constant := 2;
kono
parents:
diff changeset
190 U_L : constant := 4;
kono
parents:
diff changeset
191 LU_L : constant := 8;
kono
parents:
diff changeset
192 LLU_L : constant := 8;
kono
parents:
diff changeset
193
kono
parents:
diff changeset
194 subtype XDR_S_SSU is SEA (1 .. SSU_L);
kono
parents:
diff changeset
195 subtype XDR_S_SU is SEA (1 .. SU_L);
kono
parents:
diff changeset
196 subtype XDR_S_U is SEA (1 .. U_L);
kono
parents:
diff changeset
197 subtype XDR_S_LU is SEA (1 .. LU_L);
kono
parents:
diff changeset
198 subtype XDR_S_LLU is SEA (1 .. LLU_L);
kono
parents:
diff changeset
199
kono
parents:
diff changeset
200 type XDR_SSU is mod BB ** SSU_L;
kono
parents:
diff changeset
201 type XDR_SU is mod BB ** SU_L;
kono
parents:
diff changeset
202 type XDR_U is mod BB ** U_L;
kono
parents:
diff changeset
203
kono
parents:
diff changeset
204 function Short_Unsigned_To_XDR_S_SU is
kono
parents:
diff changeset
205 new Ada.Unchecked_Conversion (Short_Unsigned, XDR_S_SU);
kono
parents:
diff changeset
206 function XDR_S_SU_To_Short_Unsigned is
kono
parents:
diff changeset
207 new Ada.Unchecked_Conversion (XDR_S_SU, Short_Unsigned);
kono
parents:
diff changeset
208
kono
parents:
diff changeset
209 function Unsigned_To_XDR_S_U is
kono
parents:
diff changeset
210 new Ada.Unchecked_Conversion (Unsigned, XDR_S_U);
kono
parents:
diff changeset
211 function XDR_S_U_To_Unsigned is
kono
parents:
diff changeset
212 new Ada.Unchecked_Conversion (XDR_S_U, Unsigned);
kono
parents:
diff changeset
213
kono
parents:
diff changeset
214 function Long_Long_Unsigned_To_XDR_S_LU is
kono
parents:
diff changeset
215 new Ada.Unchecked_Conversion (Long_Long_Unsigned, XDR_S_LU);
kono
parents:
diff changeset
216 function XDR_S_LU_To_Long_Long_Unsigned is
kono
parents:
diff changeset
217 new Ada.Unchecked_Conversion (XDR_S_LU, Long_Long_Unsigned);
kono
parents:
diff changeset
218
kono
parents:
diff changeset
219 function Long_Long_Unsigned_To_XDR_S_LLU is
kono
parents:
diff changeset
220 new Ada.Unchecked_Conversion (Long_Long_Unsigned, XDR_S_LLU);
kono
parents:
diff changeset
221 function XDR_S_LLU_To_Long_Long_Unsigned is
kono
parents:
diff changeset
222 new Ada.Unchecked_Conversion (XDR_S_LLU, Long_Long_Unsigned);
kono
parents:
diff changeset
223
kono
parents:
diff changeset
224 -- The standard defines the floating-point data type "float" (32 bits
kono
parents:
diff changeset
225 -- or 4 bytes). The encoding used is the IEEE standard for normalized
kono
parents:
diff changeset
226 -- single-precision floating-point numbers.
kono
parents:
diff changeset
227
kono
parents:
diff changeset
228 -- The standard defines the encoding used for the double-precision
kono
parents:
diff changeset
229 -- floating-point data type "double" (64 bits or 8 bytes). The encoding
kono
parents:
diff changeset
230 -- used is the IEEE standard for normalized double-precision floating-point
kono
parents:
diff changeset
231 -- numbers.
kono
parents:
diff changeset
232
kono
parents:
diff changeset
233 SF_L : constant := 4; -- Single precision
kono
parents:
diff changeset
234 F_L : constant := 4; -- Single precision
kono
parents:
diff changeset
235 LF_L : constant := 8; -- Double precision
kono
parents:
diff changeset
236 LLF_L : constant := 16; -- Quadruple precision
kono
parents:
diff changeset
237
kono
parents:
diff changeset
238 TM_L : constant := 8;
kono
parents:
diff changeset
239 subtype XDR_S_TM is SEA (1 .. TM_L);
kono
parents:
diff changeset
240 type XDR_TM is mod BB ** TM_L;
kono
parents:
diff changeset
241
kono
parents:
diff changeset
242 type XDR_SA is mod 2 ** Standard'Address_Size;
kono
parents:
diff changeset
243 function To_XDR_SA is new UC (System.Address, XDR_SA);
kono
parents:
diff changeset
244 function To_XDR_SA is new UC (XDR_SA, System.Address);
kono
parents:
diff changeset
245
kono
parents:
diff changeset
246 -- Enumerations have the same representation as signed integers.
kono
parents:
diff changeset
247 -- Enumerations are handy for describing subsets of the integers.
kono
parents:
diff changeset
248
kono
parents:
diff changeset
249 -- Booleans are important enough and occur frequently enough to warrant
kono
parents:
diff changeset
250 -- their own explicit type in the standard. Booleans are declared as
kono
parents:
diff changeset
251 -- an enumeration, with FALSE = 0 and TRUE = 1.
kono
parents:
diff changeset
252
kono
parents:
diff changeset
253 -- The standard defines a string of n (numbered 0 through n-1) ASCII
kono
parents:
diff changeset
254 -- bytes to be the number n encoded as an unsigned integer (as described
kono
parents:
diff changeset
255 -- above), and followed by the n bytes of the string. Byte m of the string
kono
parents:
diff changeset
256 -- always precedes byte m+1 of the string, and byte 0 of the string always
kono
parents:
diff changeset
257 -- follows the string's length. If n is not a multiple of four, then the
kono
parents:
diff changeset
258 -- n bytes are followed by enough (0 to 3) residual zero bytes, r, to make
kono
parents:
diff changeset
259 -- the total byte count a multiple of four.
kono
parents:
diff changeset
260
kono
parents:
diff changeset
261 -- To fit with XDR string, do not consider character as an enumeration
kono
parents:
diff changeset
262 -- type.
kono
parents:
diff changeset
263
kono
parents:
diff changeset
264 C_L : constant := 1;
kono
parents:
diff changeset
265 subtype XDR_S_C is SEA (1 .. C_L);
kono
parents:
diff changeset
266
kono
parents:
diff changeset
267 -- Consider Wide_Character as an enumeration type
kono
parents:
diff changeset
268
kono
parents:
diff changeset
269 WC_L : constant := 4;
kono
parents:
diff changeset
270 subtype XDR_S_WC is SEA (1 .. WC_L);
kono
parents:
diff changeset
271 type XDR_WC is mod BB ** WC_L;
kono
parents:
diff changeset
272
kono
parents:
diff changeset
273 -- Consider Wide_Wide_Character as an enumeration type
kono
parents:
diff changeset
274
kono
parents:
diff changeset
275 WWC_L : constant := 8;
kono
parents:
diff changeset
276 subtype XDR_S_WWC is SEA (1 .. WWC_L);
kono
parents:
diff changeset
277 type XDR_WWC is mod BB ** WWC_L;
kono
parents:
diff changeset
278
kono
parents:
diff changeset
279 -- Optimization: if we already have the correct Bit_Order, then some
kono
parents:
diff changeset
280 -- computations can be avoided since the source and the target will be
kono
parents:
diff changeset
281 -- identical anyway. They will be replaced by direct unchecked
kono
parents:
diff changeset
282 -- conversions.
kono
parents:
diff changeset
283
kono
parents:
diff changeset
284 Optimize_Integers : constant Boolean :=
kono
parents:
diff changeset
285 Default_Bit_Order = High_Order_First;
kono
parents:
diff changeset
286
kono
parents:
diff changeset
287 -----------------
kono
parents:
diff changeset
288 -- Block_IO_OK --
kono
parents:
diff changeset
289 -----------------
kono
parents:
diff changeset
290
kono
parents:
diff changeset
291 -- We must inhibit Block_IO, because in XDR mode, each element is output
kono
parents:
diff changeset
292 -- according to XDR requirements, which is not at all the same as writing
kono
parents:
diff changeset
293 -- the whole array in one block.
kono
parents:
diff changeset
294
kono
parents:
diff changeset
295 function Block_IO_OK return Boolean is
kono
parents:
diff changeset
296 begin
kono
parents:
diff changeset
297 return False;
kono
parents:
diff changeset
298 end Block_IO_OK;
kono
parents:
diff changeset
299
kono
parents:
diff changeset
300 ----------
kono
parents:
diff changeset
301 -- I_AD --
kono
parents:
diff changeset
302 ----------
kono
parents:
diff changeset
303
kono
parents:
diff changeset
304 function I_AD (Stream : not null access RST) return Fat_Pointer is
kono
parents:
diff changeset
305 FP : Fat_Pointer;
kono
parents:
diff changeset
306
kono
parents:
diff changeset
307 begin
kono
parents:
diff changeset
308 FP.P1 := I_AS (Stream).P1;
kono
parents:
diff changeset
309 FP.P2 := I_AS (Stream).P1;
kono
parents:
diff changeset
310
kono
parents:
diff changeset
311 return FP;
kono
parents:
diff changeset
312 end I_AD;
kono
parents:
diff changeset
313
kono
parents:
diff changeset
314 ----------
kono
parents:
diff changeset
315 -- I_AS --
kono
parents:
diff changeset
316 ----------
kono
parents:
diff changeset
317
kono
parents:
diff changeset
318 function I_AS (Stream : not null access RST) return Thin_Pointer is
kono
parents:
diff changeset
319 S : XDR_S_TM;
kono
parents:
diff changeset
320 L : SEO;
kono
parents:
diff changeset
321 U : XDR_TM := 0;
kono
parents:
diff changeset
322
kono
parents:
diff changeset
323 begin
kono
parents:
diff changeset
324 Ada.Streams.Read (Stream.all, S, L);
kono
parents:
diff changeset
325
kono
parents:
diff changeset
326 if L /= S'Last then
kono
parents:
diff changeset
327 raise Data_Error;
kono
parents:
diff changeset
328
kono
parents:
diff changeset
329 else
kono
parents:
diff changeset
330 for N in S'Range loop
kono
parents:
diff changeset
331 U := U * BB + XDR_TM (S (N));
kono
parents:
diff changeset
332 end loop;
kono
parents:
diff changeset
333
kono
parents:
diff changeset
334 return (P1 => To_XDR_SA (XDR_SA (U)));
kono
parents:
diff changeset
335 end if;
kono
parents:
diff changeset
336 end I_AS;
kono
parents:
diff changeset
337
kono
parents:
diff changeset
338 ---------
kono
parents:
diff changeset
339 -- I_B --
kono
parents:
diff changeset
340 ---------
kono
parents:
diff changeset
341
kono
parents:
diff changeset
342 function I_B (Stream : not null access RST) return Boolean is
kono
parents:
diff changeset
343 begin
kono
parents:
diff changeset
344 case I_SSU (Stream) is
kono
parents:
diff changeset
345 when 0 => return False;
kono
parents:
diff changeset
346 when 1 => return True;
kono
parents:
diff changeset
347 when others => raise Data_Error;
kono
parents:
diff changeset
348 end case;
kono
parents:
diff changeset
349 end I_B;
kono
parents:
diff changeset
350
kono
parents:
diff changeset
351 ---------
kono
parents:
diff changeset
352 -- I_C --
kono
parents:
diff changeset
353 ---------
kono
parents:
diff changeset
354
kono
parents:
diff changeset
355 function I_C (Stream : not null access RST) return Character is
kono
parents:
diff changeset
356 S : XDR_S_C;
kono
parents:
diff changeset
357 L : SEO;
kono
parents:
diff changeset
358
kono
parents:
diff changeset
359 begin
kono
parents:
diff changeset
360 Ada.Streams.Read (Stream.all, S, L);
kono
parents:
diff changeset
361
kono
parents:
diff changeset
362 if L /= S'Last then
kono
parents:
diff changeset
363 raise Data_Error;
kono
parents:
diff changeset
364
kono
parents:
diff changeset
365 else
kono
parents:
diff changeset
366 -- Use Ada requirements on Character representation clause
kono
parents:
diff changeset
367
kono
parents:
diff changeset
368 return Character'Val (S (1));
kono
parents:
diff changeset
369 end if;
kono
parents:
diff changeset
370 end I_C;
kono
parents:
diff changeset
371
kono
parents:
diff changeset
372 ---------
kono
parents:
diff changeset
373 -- I_F --
kono
parents:
diff changeset
374 ---------
kono
parents:
diff changeset
375
kono
parents:
diff changeset
376 function I_F (Stream : not null access RST) return Float is
kono
parents:
diff changeset
377 I : constant Precision := Single;
kono
parents:
diff changeset
378 E_Size : Integer renames Fields (I).E_Size;
kono
parents:
diff changeset
379 E_Bias : Integer renames Fields (I).E_Bias;
kono
parents:
diff changeset
380 E_Last : Integer renames Fields (I).E_Last;
kono
parents:
diff changeset
381 F_Mask : SE renames Fields (I).F_Mask;
kono
parents:
diff changeset
382 E_Bytes : SEO renames Fields (I).E_Bytes;
kono
parents:
diff changeset
383 F_Bytes : SEO renames Fields (I).F_Bytes;
kono
parents:
diff changeset
384 F_Size : Integer renames Fields (I).F_Size;
kono
parents:
diff changeset
385
kono
parents:
diff changeset
386 Is_Positive : Boolean;
kono
parents:
diff changeset
387 Exponent : Long_Unsigned;
kono
parents:
diff changeset
388 Fraction : Long_Unsigned;
kono
parents:
diff changeset
389 Result : Float;
kono
parents:
diff changeset
390 S : SEA (1 .. F_L);
kono
parents:
diff changeset
391 L : SEO;
kono
parents:
diff changeset
392
kono
parents:
diff changeset
393 begin
kono
parents:
diff changeset
394 Ada.Streams.Read (Stream.all, S, L);
kono
parents:
diff changeset
395
kono
parents:
diff changeset
396 if L /= S'Last then
kono
parents:
diff changeset
397 raise Data_Error;
kono
parents:
diff changeset
398 end if;
kono
parents:
diff changeset
399
kono
parents:
diff changeset
400 -- Extract Fraction, Sign and Exponent
kono
parents:
diff changeset
401
kono
parents:
diff changeset
402 Fraction := Long_Unsigned (S (F_L + 1 - F_Bytes) and F_Mask);
kono
parents:
diff changeset
403 for N in F_L + 2 - F_Bytes .. F_L loop
kono
parents:
diff changeset
404 Fraction := Fraction * BB + Long_Unsigned (S (N));
kono
parents:
diff changeset
405 end loop;
kono
parents:
diff changeset
406 Result := Float'Scaling (Float (Fraction), -F_Size);
kono
parents:
diff changeset
407
kono
parents:
diff changeset
408 if BS <= S (1) then
kono
parents:
diff changeset
409 Is_Positive := False;
kono
parents:
diff changeset
410 Exponent := Long_Unsigned (S (1) - BS);
kono
parents:
diff changeset
411 else
kono
parents:
diff changeset
412 Is_Positive := True;
kono
parents:
diff changeset
413 Exponent := Long_Unsigned (S (1));
kono
parents:
diff changeset
414 end if;
kono
parents:
diff changeset
415
kono
parents:
diff changeset
416 for N in 2 .. E_Bytes loop
kono
parents:
diff changeset
417 Exponent := Exponent * BB + Long_Unsigned (S (N));
kono
parents:
diff changeset
418 end loop;
kono
parents:
diff changeset
419 Exponent := Shift_Right (Exponent, Integer (E_Bytes) * SU - E_Size - 1);
kono
parents:
diff changeset
420
kono
parents:
diff changeset
421 -- NaN or Infinities
kono
parents:
diff changeset
422
kono
parents:
diff changeset
423 if Integer (Exponent) = E_Last then
kono
parents:
diff changeset
424 raise Constraint_Error;
kono
parents:
diff changeset
425
kono
parents:
diff changeset
426 elsif Exponent = 0 then
kono
parents:
diff changeset
427
kono
parents:
diff changeset
428 -- Signed zeros
kono
parents:
diff changeset
429
kono
parents:
diff changeset
430 if Fraction = 0 then
kono
parents:
diff changeset
431 null;
kono
parents:
diff changeset
432
kono
parents:
diff changeset
433 -- Denormalized float
kono
parents:
diff changeset
434
kono
parents:
diff changeset
435 else
kono
parents:
diff changeset
436 Result := Float'Scaling (Result, 1 - E_Bias);
kono
parents:
diff changeset
437 end if;
kono
parents:
diff changeset
438
kono
parents:
diff changeset
439 -- Normalized float
kono
parents:
diff changeset
440
kono
parents:
diff changeset
441 else
kono
parents:
diff changeset
442 Result := Float'Scaling
kono
parents:
diff changeset
443 (1.0 + Result, Integer (Exponent) - E_Bias);
kono
parents:
diff changeset
444 end if;
kono
parents:
diff changeset
445
kono
parents:
diff changeset
446 if not Is_Positive then
kono
parents:
diff changeset
447 Result := -Result;
kono
parents:
diff changeset
448 end if;
kono
parents:
diff changeset
449
kono
parents:
diff changeset
450 return Result;
kono
parents:
diff changeset
451 end I_F;
kono
parents:
diff changeset
452
kono
parents:
diff changeset
453 ---------
kono
parents:
diff changeset
454 -- I_I --
kono
parents:
diff changeset
455 ---------
kono
parents:
diff changeset
456
kono
parents:
diff changeset
457 function I_I (Stream : not null access RST) return Integer is
kono
parents:
diff changeset
458 S : XDR_S_I;
kono
parents:
diff changeset
459 L : SEO;
kono
parents:
diff changeset
460 U : XDR_U := 0;
kono
parents:
diff changeset
461
kono
parents:
diff changeset
462 begin
kono
parents:
diff changeset
463 Ada.Streams.Read (Stream.all, S, L);
kono
parents:
diff changeset
464
kono
parents:
diff changeset
465 if L /= S'Last then
kono
parents:
diff changeset
466 raise Data_Error;
kono
parents:
diff changeset
467
kono
parents:
diff changeset
468 elsif Optimize_Integers then
kono
parents:
diff changeset
469 return XDR_S_I_To_Integer (S);
kono
parents:
diff changeset
470
kono
parents:
diff changeset
471 else
kono
parents:
diff changeset
472 for N in S'Range loop
kono
parents:
diff changeset
473 U := U * BB + XDR_U (S (N));
kono
parents:
diff changeset
474 end loop;
kono
parents:
diff changeset
475
kono
parents:
diff changeset
476 -- Test sign and apply two complement notation
kono
parents:
diff changeset
477
kono
parents:
diff changeset
478 if S (1) < BL then
kono
parents:
diff changeset
479 return Integer (U);
kono
parents:
diff changeset
480
kono
parents:
diff changeset
481 else
kono
parents:
diff changeset
482 return Integer (-((XDR_U'Last xor U) + 1));
kono
parents:
diff changeset
483 end if;
kono
parents:
diff changeset
484 end if;
kono
parents:
diff changeset
485 end I_I;
kono
parents:
diff changeset
486
kono
parents:
diff changeset
487 ----------
kono
parents:
diff changeset
488 -- I_LF --
kono
parents:
diff changeset
489 ----------
kono
parents:
diff changeset
490
kono
parents:
diff changeset
491 function I_LF (Stream : not null access RST) return Long_Float is
kono
parents:
diff changeset
492 I : constant Precision := Double;
kono
parents:
diff changeset
493 E_Size : Integer renames Fields (I).E_Size;
kono
parents:
diff changeset
494 E_Bias : Integer renames Fields (I).E_Bias;
kono
parents:
diff changeset
495 E_Last : Integer renames Fields (I).E_Last;
kono
parents:
diff changeset
496 F_Mask : SE renames Fields (I).F_Mask;
kono
parents:
diff changeset
497 E_Bytes : SEO renames Fields (I).E_Bytes;
kono
parents:
diff changeset
498 F_Bytes : SEO renames Fields (I).F_Bytes;
kono
parents:
diff changeset
499 F_Size : Integer renames Fields (I).F_Size;
kono
parents:
diff changeset
500
kono
parents:
diff changeset
501 Is_Positive : Boolean;
kono
parents:
diff changeset
502 Exponent : Long_Unsigned;
kono
parents:
diff changeset
503 Fraction : Long_Long_Unsigned;
kono
parents:
diff changeset
504 Result : Long_Float;
kono
parents:
diff changeset
505 S : SEA (1 .. LF_L);
kono
parents:
diff changeset
506 L : SEO;
kono
parents:
diff changeset
507
kono
parents:
diff changeset
508 begin
kono
parents:
diff changeset
509 Ada.Streams.Read (Stream.all, S, L);
kono
parents:
diff changeset
510
kono
parents:
diff changeset
511 if L /= S'Last then
kono
parents:
diff changeset
512 raise Data_Error;
kono
parents:
diff changeset
513 end if;
kono
parents:
diff changeset
514
kono
parents:
diff changeset
515 -- Extract Fraction, Sign and Exponent
kono
parents:
diff changeset
516
kono
parents:
diff changeset
517 Fraction := Long_Long_Unsigned (S (LF_L + 1 - F_Bytes) and F_Mask);
kono
parents:
diff changeset
518 for N in LF_L + 2 - F_Bytes .. LF_L loop
kono
parents:
diff changeset
519 Fraction := Fraction * BB + Long_Long_Unsigned (S (N));
kono
parents:
diff changeset
520 end loop;
kono
parents:
diff changeset
521
kono
parents:
diff changeset
522 Result := Long_Float'Scaling (Long_Float (Fraction), -F_Size);
kono
parents:
diff changeset
523
kono
parents:
diff changeset
524 if BS <= S (1) then
kono
parents:
diff changeset
525 Is_Positive := False;
kono
parents:
diff changeset
526 Exponent := Long_Unsigned (S (1) - BS);
kono
parents:
diff changeset
527 else
kono
parents:
diff changeset
528 Is_Positive := True;
kono
parents:
diff changeset
529 Exponent := Long_Unsigned (S (1));
kono
parents:
diff changeset
530 end if;
kono
parents:
diff changeset
531
kono
parents:
diff changeset
532 for N in 2 .. E_Bytes loop
kono
parents:
diff changeset
533 Exponent := Exponent * BB + Long_Unsigned (S (N));
kono
parents:
diff changeset
534 end loop;
kono
parents:
diff changeset
535
kono
parents:
diff changeset
536 Exponent := Shift_Right (Exponent, Integer (E_Bytes) * SU - E_Size - 1);
kono
parents:
diff changeset
537
kono
parents:
diff changeset
538 -- NaN or Infinities
kono
parents:
diff changeset
539
kono
parents:
diff changeset
540 if Integer (Exponent) = E_Last then
kono
parents:
diff changeset
541 raise Constraint_Error;
kono
parents:
diff changeset
542
kono
parents:
diff changeset
543 elsif Exponent = 0 then
kono
parents:
diff changeset
544
kono
parents:
diff changeset
545 -- Signed zeros
kono
parents:
diff changeset
546
kono
parents:
diff changeset
547 if Fraction = 0 then
kono
parents:
diff changeset
548 null;
kono
parents:
diff changeset
549
kono
parents:
diff changeset
550 -- Denormalized float
kono
parents:
diff changeset
551
kono
parents:
diff changeset
552 else
kono
parents:
diff changeset
553 Result := Long_Float'Scaling (Result, 1 - E_Bias);
kono
parents:
diff changeset
554 end if;
kono
parents:
diff changeset
555
kono
parents:
diff changeset
556 -- Normalized float
kono
parents:
diff changeset
557
kono
parents:
diff changeset
558 else
kono
parents:
diff changeset
559 Result := Long_Float'Scaling
kono
parents:
diff changeset
560 (1.0 + Result, Integer (Exponent) - E_Bias);
kono
parents:
diff changeset
561 end if;
kono
parents:
diff changeset
562
kono
parents:
diff changeset
563 if not Is_Positive then
kono
parents:
diff changeset
564 Result := -Result;
kono
parents:
diff changeset
565 end if;
kono
parents:
diff changeset
566
kono
parents:
diff changeset
567 return Result;
kono
parents:
diff changeset
568 end I_LF;
kono
parents:
diff changeset
569
kono
parents:
diff changeset
570 ----------
kono
parents:
diff changeset
571 -- I_LI --
kono
parents:
diff changeset
572 ----------
kono
parents:
diff changeset
573
kono
parents:
diff changeset
574 function I_LI (Stream : not null access RST) return Long_Integer is
kono
parents:
diff changeset
575 S : XDR_S_LI;
kono
parents:
diff changeset
576 L : SEO;
kono
parents:
diff changeset
577 U : Unsigned := 0;
kono
parents:
diff changeset
578 X : Long_Unsigned := 0;
kono
parents:
diff changeset
579
kono
parents:
diff changeset
580 begin
kono
parents:
diff changeset
581 Ada.Streams.Read (Stream.all, S, L);
kono
parents:
diff changeset
582
kono
parents:
diff changeset
583 if L /= S'Last then
kono
parents:
diff changeset
584 raise Data_Error;
kono
parents:
diff changeset
585
kono
parents:
diff changeset
586 elsif Optimize_Integers then
kono
parents:
diff changeset
587 return Long_Integer (XDR_S_LI_To_Long_Long_Integer (S));
kono
parents:
diff changeset
588
kono
parents:
diff changeset
589 else
kono
parents:
diff changeset
590
kono
parents:
diff changeset
591 -- Compute using machine unsigned
kono
parents:
diff changeset
592 -- rather than long_long_unsigned
kono
parents:
diff changeset
593
kono
parents:
diff changeset
594 for N in S'Range loop
kono
parents:
diff changeset
595 U := U * BB + Unsigned (S (N));
kono
parents:
diff changeset
596
kono
parents:
diff changeset
597 -- We have filled an unsigned
kono
parents:
diff changeset
598
kono
parents:
diff changeset
599 if N mod UB = 0 then
kono
parents:
diff changeset
600 X := Shift_Left (X, US) + Long_Unsigned (U);
kono
parents:
diff changeset
601 U := 0;
kono
parents:
diff changeset
602 end if;
kono
parents:
diff changeset
603 end loop;
kono
parents:
diff changeset
604
kono
parents:
diff changeset
605 -- Test sign and apply two complement notation
kono
parents:
diff changeset
606
kono
parents:
diff changeset
607 if S (1) < BL then
kono
parents:
diff changeset
608 return Long_Integer (X);
kono
parents:
diff changeset
609 else
kono
parents:
diff changeset
610 return Long_Integer (-((Long_Unsigned'Last xor X) + 1));
kono
parents:
diff changeset
611 end if;
kono
parents:
diff changeset
612
kono
parents:
diff changeset
613 end if;
kono
parents:
diff changeset
614 end I_LI;
kono
parents:
diff changeset
615
kono
parents:
diff changeset
616 -----------
kono
parents:
diff changeset
617 -- I_LLF --
kono
parents:
diff changeset
618 -----------
kono
parents:
diff changeset
619
kono
parents:
diff changeset
620 function I_LLF (Stream : not null access RST) return Long_Long_Float is
kono
parents:
diff changeset
621 I : constant Precision := Quadruple;
kono
parents:
diff changeset
622 E_Size : Integer renames Fields (I).E_Size;
kono
parents:
diff changeset
623 E_Bias : Integer renames Fields (I).E_Bias;
kono
parents:
diff changeset
624 E_Last : Integer renames Fields (I).E_Last;
kono
parents:
diff changeset
625 E_Bytes : SEO renames Fields (I).E_Bytes;
kono
parents:
diff changeset
626 F_Bytes : SEO renames Fields (I).F_Bytes;
kono
parents:
diff changeset
627 F_Size : Integer renames Fields (I).F_Size;
kono
parents:
diff changeset
628
kono
parents:
diff changeset
629 Is_Positive : Boolean;
kono
parents:
diff changeset
630 Exponent : Long_Unsigned;
kono
parents:
diff changeset
631 Fraction_1 : Long_Long_Unsigned := 0;
kono
parents:
diff changeset
632 Fraction_2 : Long_Long_Unsigned := 0;
kono
parents:
diff changeset
633 Result : Long_Long_Float;
kono
parents:
diff changeset
634 HF : constant Natural := F_Size / 2;
kono
parents:
diff changeset
635 S : SEA (1 .. LLF_L);
kono
parents:
diff changeset
636 L : SEO;
kono
parents:
diff changeset
637
kono
parents:
diff changeset
638 begin
kono
parents:
diff changeset
639 Ada.Streams.Read (Stream.all, S, L);
kono
parents:
diff changeset
640
kono
parents:
diff changeset
641 if L /= S'Last then
kono
parents:
diff changeset
642 raise Data_Error;
kono
parents:
diff changeset
643 end if;
kono
parents:
diff changeset
644
kono
parents:
diff changeset
645 -- Extract Fraction, Sign and Exponent
kono
parents:
diff changeset
646
kono
parents:
diff changeset
647 for I in LLF_L - F_Bytes + 1 .. LLF_L - 7 loop
kono
parents:
diff changeset
648 Fraction_1 := Fraction_1 * BB + Long_Long_Unsigned (S (I));
kono
parents:
diff changeset
649 end loop;
kono
parents:
diff changeset
650
kono
parents:
diff changeset
651 for I in SEO (LLF_L - 6) .. SEO (LLF_L) loop
kono
parents:
diff changeset
652 Fraction_2 := Fraction_2 * BB + Long_Long_Unsigned (S (I));
kono
parents:
diff changeset
653 end loop;
kono
parents:
diff changeset
654
kono
parents:
diff changeset
655 Result := Long_Long_Float'Scaling (Long_Long_Float (Fraction_2), -HF);
kono
parents:
diff changeset
656 Result := Long_Long_Float (Fraction_1) + Result;
kono
parents:
diff changeset
657 Result := Long_Long_Float'Scaling (Result, HF - F_Size);
kono
parents:
diff changeset
658
kono
parents:
diff changeset
659 if BS <= S (1) then
kono
parents:
diff changeset
660 Is_Positive := False;
kono
parents:
diff changeset
661 Exponent := Long_Unsigned (S (1) - BS);
kono
parents:
diff changeset
662 else
kono
parents:
diff changeset
663 Is_Positive := True;
kono
parents:
diff changeset
664 Exponent := Long_Unsigned (S (1));
kono
parents:
diff changeset
665 end if;
kono
parents:
diff changeset
666
kono
parents:
diff changeset
667 for N in 2 .. E_Bytes loop
kono
parents:
diff changeset
668 Exponent := Exponent * BB + Long_Unsigned (S (N));
kono
parents:
diff changeset
669 end loop;
kono
parents:
diff changeset
670
kono
parents:
diff changeset
671 Exponent := Shift_Right (Exponent, Integer (E_Bytes) * SU - E_Size - 1);
kono
parents:
diff changeset
672
kono
parents:
diff changeset
673 -- NaN or Infinities
kono
parents:
diff changeset
674
kono
parents:
diff changeset
675 if Integer (Exponent) = E_Last then
kono
parents:
diff changeset
676 raise Constraint_Error;
kono
parents:
diff changeset
677
kono
parents:
diff changeset
678 elsif Exponent = 0 then
kono
parents:
diff changeset
679
kono
parents:
diff changeset
680 -- Signed zeros
kono
parents:
diff changeset
681
kono
parents:
diff changeset
682 if Fraction_1 = 0 and then Fraction_2 = 0 then
kono
parents:
diff changeset
683 null;
kono
parents:
diff changeset
684
kono
parents:
diff changeset
685 -- Denormalized float
kono
parents:
diff changeset
686
kono
parents:
diff changeset
687 else
kono
parents:
diff changeset
688 Result := Long_Long_Float'Scaling (Result, 1 - E_Bias);
kono
parents:
diff changeset
689 end if;
kono
parents:
diff changeset
690
kono
parents:
diff changeset
691 -- Normalized float
kono
parents:
diff changeset
692
kono
parents:
diff changeset
693 else
kono
parents:
diff changeset
694 Result := Long_Long_Float'Scaling
kono
parents:
diff changeset
695 (1.0 + Result, Integer (Exponent) - E_Bias);
kono
parents:
diff changeset
696 end if;
kono
parents:
diff changeset
697
kono
parents:
diff changeset
698 if not Is_Positive then
kono
parents:
diff changeset
699 Result := -Result;
kono
parents:
diff changeset
700 end if;
kono
parents:
diff changeset
701
kono
parents:
diff changeset
702 return Result;
kono
parents:
diff changeset
703 end I_LLF;
kono
parents:
diff changeset
704
kono
parents:
diff changeset
705 -----------
kono
parents:
diff changeset
706 -- I_LLI --
kono
parents:
diff changeset
707 -----------
kono
parents:
diff changeset
708
kono
parents:
diff changeset
709 function I_LLI (Stream : not null access RST) return Long_Long_Integer is
kono
parents:
diff changeset
710 S : XDR_S_LLI;
kono
parents:
diff changeset
711 L : SEO;
kono
parents:
diff changeset
712 U : Unsigned := 0;
kono
parents:
diff changeset
713 X : Long_Long_Unsigned := 0;
kono
parents:
diff changeset
714
kono
parents:
diff changeset
715 begin
kono
parents:
diff changeset
716 Ada.Streams.Read (Stream.all, S, L);
kono
parents:
diff changeset
717
kono
parents:
diff changeset
718 if L /= S'Last then
kono
parents:
diff changeset
719 raise Data_Error;
kono
parents:
diff changeset
720
kono
parents:
diff changeset
721 elsif Optimize_Integers then
kono
parents:
diff changeset
722 return XDR_S_LLI_To_Long_Long_Integer (S);
kono
parents:
diff changeset
723
kono
parents:
diff changeset
724 else
kono
parents:
diff changeset
725 -- Compute using machine unsigned for computing
kono
parents:
diff changeset
726 -- rather than long_long_unsigned.
kono
parents:
diff changeset
727
kono
parents:
diff changeset
728 for N in S'Range loop
kono
parents:
diff changeset
729 U := U * BB + Unsigned (S (N));
kono
parents:
diff changeset
730
kono
parents:
diff changeset
731 -- We have filled an unsigned
kono
parents:
diff changeset
732
kono
parents:
diff changeset
733 if N mod UB = 0 then
kono
parents:
diff changeset
734 X := Shift_Left (X, US) + Long_Long_Unsigned (U);
kono
parents:
diff changeset
735 U := 0;
kono
parents:
diff changeset
736 end if;
kono
parents:
diff changeset
737 end loop;
kono
parents:
diff changeset
738
kono
parents:
diff changeset
739 -- Test sign and apply two complement notation
kono
parents:
diff changeset
740
kono
parents:
diff changeset
741 if S (1) < BL then
kono
parents:
diff changeset
742 return Long_Long_Integer (X);
kono
parents:
diff changeset
743 else
kono
parents:
diff changeset
744 return Long_Long_Integer (-((Long_Long_Unsigned'Last xor X) + 1));
kono
parents:
diff changeset
745 end if;
kono
parents:
diff changeset
746 end if;
kono
parents:
diff changeset
747 end I_LLI;
kono
parents:
diff changeset
748
kono
parents:
diff changeset
749 -----------
kono
parents:
diff changeset
750 -- I_LLU --
kono
parents:
diff changeset
751 -----------
kono
parents:
diff changeset
752
kono
parents:
diff changeset
753 function I_LLU (Stream : not null access RST) return Long_Long_Unsigned is
kono
parents:
diff changeset
754 S : XDR_S_LLU;
kono
parents:
diff changeset
755 L : SEO;
kono
parents:
diff changeset
756 U : Unsigned := 0;
kono
parents:
diff changeset
757 X : Long_Long_Unsigned := 0;
kono
parents:
diff changeset
758
kono
parents:
diff changeset
759 begin
kono
parents:
diff changeset
760 Ada.Streams.Read (Stream.all, S, L);
kono
parents:
diff changeset
761
kono
parents:
diff changeset
762 if L /= S'Last then
kono
parents:
diff changeset
763 raise Data_Error;
kono
parents:
diff changeset
764
kono
parents:
diff changeset
765 elsif Optimize_Integers then
kono
parents:
diff changeset
766 return XDR_S_LLU_To_Long_Long_Unsigned (S);
kono
parents:
diff changeset
767
kono
parents:
diff changeset
768 else
kono
parents:
diff changeset
769 -- Compute using machine unsigned
kono
parents:
diff changeset
770 -- rather than long_long_unsigned.
kono
parents:
diff changeset
771
kono
parents:
diff changeset
772 for N in S'Range loop
kono
parents:
diff changeset
773 U := U * BB + Unsigned (S (N));
kono
parents:
diff changeset
774
kono
parents:
diff changeset
775 -- We have filled an unsigned
kono
parents:
diff changeset
776
kono
parents:
diff changeset
777 if N mod UB = 0 then
kono
parents:
diff changeset
778 X := Shift_Left (X, US) + Long_Long_Unsigned (U);
kono
parents:
diff changeset
779 U := 0;
kono
parents:
diff changeset
780 end if;
kono
parents:
diff changeset
781 end loop;
kono
parents:
diff changeset
782
kono
parents:
diff changeset
783 return X;
kono
parents:
diff changeset
784 end if;
kono
parents:
diff changeset
785 end I_LLU;
kono
parents:
diff changeset
786
kono
parents:
diff changeset
787 ----------
kono
parents:
diff changeset
788 -- I_LU --
kono
parents:
diff changeset
789 ----------
kono
parents:
diff changeset
790
kono
parents:
diff changeset
791 function I_LU (Stream : not null access RST) return Long_Unsigned is
kono
parents:
diff changeset
792 S : XDR_S_LU;
kono
parents:
diff changeset
793 L : SEO;
kono
parents:
diff changeset
794 U : Unsigned := 0;
kono
parents:
diff changeset
795 X : Long_Unsigned := 0;
kono
parents:
diff changeset
796
kono
parents:
diff changeset
797 begin
kono
parents:
diff changeset
798 Ada.Streams.Read (Stream.all, S, L);
kono
parents:
diff changeset
799
kono
parents:
diff changeset
800 if L /= S'Last then
kono
parents:
diff changeset
801 raise Data_Error;
kono
parents:
diff changeset
802
kono
parents:
diff changeset
803 elsif Optimize_Integers then
kono
parents:
diff changeset
804 return Long_Unsigned (XDR_S_LU_To_Long_Long_Unsigned (S));
kono
parents:
diff changeset
805
kono
parents:
diff changeset
806 else
kono
parents:
diff changeset
807 -- Compute using machine unsigned
kono
parents:
diff changeset
808 -- rather than long_unsigned.
kono
parents:
diff changeset
809
kono
parents:
diff changeset
810 for N in S'Range loop
kono
parents:
diff changeset
811 U := U * BB + Unsigned (S (N));
kono
parents:
diff changeset
812
kono
parents:
diff changeset
813 -- We have filled an unsigned
kono
parents:
diff changeset
814
kono
parents:
diff changeset
815 if N mod UB = 0 then
kono
parents:
diff changeset
816 X := Shift_Left (X, US) + Long_Unsigned (U);
kono
parents:
diff changeset
817 U := 0;
kono
parents:
diff changeset
818 end if;
kono
parents:
diff changeset
819 end loop;
kono
parents:
diff changeset
820
kono
parents:
diff changeset
821 return X;
kono
parents:
diff changeset
822 end if;
kono
parents:
diff changeset
823 end I_LU;
kono
parents:
diff changeset
824
kono
parents:
diff changeset
825 ----------
kono
parents:
diff changeset
826 -- I_SF --
kono
parents:
diff changeset
827 ----------
kono
parents:
diff changeset
828
kono
parents:
diff changeset
829 function I_SF (Stream : not null access RST) return Short_Float is
kono
parents:
diff changeset
830 I : constant Precision := Single;
kono
parents:
diff changeset
831 E_Size : Integer renames Fields (I).E_Size;
kono
parents:
diff changeset
832 E_Bias : Integer renames Fields (I).E_Bias;
kono
parents:
diff changeset
833 E_Last : Integer renames Fields (I).E_Last;
kono
parents:
diff changeset
834 F_Mask : SE renames Fields (I).F_Mask;
kono
parents:
diff changeset
835 E_Bytes : SEO renames Fields (I).E_Bytes;
kono
parents:
diff changeset
836 F_Bytes : SEO renames Fields (I).F_Bytes;
kono
parents:
diff changeset
837 F_Size : Integer renames Fields (I).F_Size;
kono
parents:
diff changeset
838
kono
parents:
diff changeset
839 Exponent : Long_Unsigned;
kono
parents:
diff changeset
840 Fraction : Long_Unsigned;
kono
parents:
diff changeset
841 Is_Positive : Boolean;
kono
parents:
diff changeset
842 Result : Short_Float;
kono
parents:
diff changeset
843 S : SEA (1 .. SF_L);
kono
parents:
diff changeset
844 L : SEO;
kono
parents:
diff changeset
845
kono
parents:
diff changeset
846 begin
kono
parents:
diff changeset
847 Ada.Streams.Read (Stream.all, S, L);
kono
parents:
diff changeset
848
kono
parents:
diff changeset
849 if L /= S'Last then
kono
parents:
diff changeset
850 raise Data_Error;
kono
parents:
diff changeset
851 end if;
kono
parents:
diff changeset
852
kono
parents:
diff changeset
853 -- Extract Fraction, Sign and Exponent
kono
parents:
diff changeset
854
kono
parents:
diff changeset
855 Fraction := Long_Unsigned (S (SF_L + 1 - F_Bytes) and F_Mask);
kono
parents:
diff changeset
856 for N in SF_L + 2 - F_Bytes .. SF_L loop
kono
parents:
diff changeset
857 Fraction := Fraction * BB + Long_Unsigned (S (N));
kono
parents:
diff changeset
858 end loop;
kono
parents:
diff changeset
859 Result := Short_Float'Scaling (Short_Float (Fraction), -F_Size);
kono
parents:
diff changeset
860
kono
parents:
diff changeset
861 if BS <= S (1) then
kono
parents:
diff changeset
862 Is_Positive := False;
kono
parents:
diff changeset
863 Exponent := Long_Unsigned (S (1) - BS);
kono
parents:
diff changeset
864 else
kono
parents:
diff changeset
865 Is_Positive := True;
kono
parents:
diff changeset
866 Exponent := Long_Unsigned (S (1));
kono
parents:
diff changeset
867 end if;
kono
parents:
diff changeset
868
kono
parents:
diff changeset
869 for N in 2 .. E_Bytes loop
kono
parents:
diff changeset
870 Exponent := Exponent * BB + Long_Unsigned (S (N));
kono
parents:
diff changeset
871 end loop;
kono
parents:
diff changeset
872 Exponent := Shift_Right (Exponent, Integer (E_Bytes) * SU - E_Size - 1);
kono
parents:
diff changeset
873
kono
parents:
diff changeset
874 -- NaN or Infinities
kono
parents:
diff changeset
875
kono
parents:
diff changeset
876 if Integer (Exponent) = E_Last then
kono
parents:
diff changeset
877 raise Constraint_Error;
kono
parents:
diff changeset
878
kono
parents:
diff changeset
879 elsif Exponent = 0 then
kono
parents:
diff changeset
880
kono
parents:
diff changeset
881 -- Signed zeros
kono
parents:
diff changeset
882
kono
parents:
diff changeset
883 if Fraction = 0 then
kono
parents:
diff changeset
884 null;
kono
parents:
diff changeset
885
kono
parents:
diff changeset
886 -- Denormalized float
kono
parents:
diff changeset
887
kono
parents:
diff changeset
888 else
kono
parents:
diff changeset
889 Result := Short_Float'Scaling (Result, 1 - E_Bias);
kono
parents:
diff changeset
890 end if;
kono
parents:
diff changeset
891
kono
parents:
diff changeset
892 -- Normalized float
kono
parents:
diff changeset
893
kono
parents:
diff changeset
894 else
kono
parents:
diff changeset
895 Result := Short_Float'Scaling
kono
parents:
diff changeset
896 (1.0 + Result, Integer (Exponent) - E_Bias);
kono
parents:
diff changeset
897 end if;
kono
parents:
diff changeset
898
kono
parents:
diff changeset
899 if not Is_Positive then
kono
parents:
diff changeset
900 Result := -Result;
kono
parents:
diff changeset
901 end if;
kono
parents:
diff changeset
902
kono
parents:
diff changeset
903 return Result;
kono
parents:
diff changeset
904 end I_SF;
kono
parents:
diff changeset
905
kono
parents:
diff changeset
906 ----------
kono
parents:
diff changeset
907 -- I_SI --
kono
parents:
diff changeset
908 ----------
kono
parents:
diff changeset
909
kono
parents:
diff changeset
910 function I_SI (Stream : not null access RST) return Short_Integer is
kono
parents:
diff changeset
911 S : XDR_S_SI;
kono
parents:
diff changeset
912 L : SEO;
kono
parents:
diff changeset
913 U : XDR_SU := 0;
kono
parents:
diff changeset
914
kono
parents:
diff changeset
915 begin
kono
parents:
diff changeset
916 Ada.Streams.Read (Stream.all, S, L);
kono
parents:
diff changeset
917
kono
parents:
diff changeset
918 if L /= S'Last then
kono
parents:
diff changeset
919 raise Data_Error;
kono
parents:
diff changeset
920
kono
parents:
diff changeset
921 elsif Optimize_Integers then
kono
parents:
diff changeset
922 return XDR_S_SI_To_Short_Integer (S);
kono
parents:
diff changeset
923
kono
parents:
diff changeset
924 else
kono
parents:
diff changeset
925 for N in S'Range loop
kono
parents:
diff changeset
926 U := U * BB + XDR_SU (S (N));
kono
parents:
diff changeset
927 end loop;
kono
parents:
diff changeset
928
kono
parents:
diff changeset
929 -- Test sign and apply two complement notation
kono
parents:
diff changeset
930
kono
parents:
diff changeset
931 if S (1) < BL then
kono
parents:
diff changeset
932 return Short_Integer (U);
kono
parents:
diff changeset
933 else
kono
parents:
diff changeset
934 return Short_Integer (-((XDR_SU'Last xor U) + 1));
kono
parents:
diff changeset
935 end if;
kono
parents:
diff changeset
936 end if;
kono
parents:
diff changeset
937 end I_SI;
kono
parents:
diff changeset
938
kono
parents:
diff changeset
939 -----------
kono
parents:
diff changeset
940 -- I_SSI --
kono
parents:
diff changeset
941 -----------
kono
parents:
diff changeset
942
kono
parents:
diff changeset
943 function I_SSI (Stream : not null access RST) return Short_Short_Integer is
kono
parents:
diff changeset
944 S : XDR_S_SSI;
kono
parents:
diff changeset
945 L : SEO;
kono
parents:
diff changeset
946 U : XDR_SSU;
kono
parents:
diff changeset
947
kono
parents:
diff changeset
948 begin
kono
parents:
diff changeset
949 Ada.Streams.Read (Stream.all, S, L);
kono
parents:
diff changeset
950
kono
parents:
diff changeset
951 if L /= S'Last then
kono
parents:
diff changeset
952 raise Data_Error;
kono
parents:
diff changeset
953
kono
parents:
diff changeset
954 elsif Optimize_Integers then
kono
parents:
diff changeset
955 return XDR_S_SSI_To_Short_Short_Integer (S);
kono
parents:
diff changeset
956
kono
parents:
diff changeset
957 else
kono
parents:
diff changeset
958 U := XDR_SSU (S (1));
kono
parents:
diff changeset
959
kono
parents:
diff changeset
960 -- Test sign and apply two complement notation
kono
parents:
diff changeset
961
kono
parents:
diff changeset
962 if S (1) < BL then
kono
parents:
diff changeset
963 return Short_Short_Integer (U);
kono
parents:
diff changeset
964 else
kono
parents:
diff changeset
965 return Short_Short_Integer (-((XDR_SSU'Last xor U) + 1));
kono
parents:
diff changeset
966 end if;
kono
parents:
diff changeset
967 end if;
kono
parents:
diff changeset
968 end I_SSI;
kono
parents:
diff changeset
969
kono
parents:
diff changeset
970 -----------
kono
parents:
diff changeset
971 -- I_SSU --
kono
parents:
diff changeset
972 -----------
kono
parents:
diff changeset
973
kono
parents:
diff changeset
974 function I_SSU (Stream : not null access RST) return Short_Short_Unsigned is
kono
parents:
diff changeset
975 S : XDR_S_SSU;
kono
parents:
diff changeset
976 L : SEO;
kono
parents:
diff changeset
977 U : XDR_SSU := 0;
kono
parents:
diff changeset
978
kono
parents:
diff changeset
979 begin
kono
parents:
diff changeset
980 Ada.Streams.Read (Stream.all, S, L);
kono
parents:
diff changeset
981
kono
parents:
diff changeset
982 if L /= S'Last then
kono
parents:
diff changeset
983 raise Data_Error;
kono
parents:
diff changeset
984
kono
parents:
diff changeset
985 else
kono
parents:
diff changeset
986 U := XDR_SSU (S (1));
kono
parents:
diff changeset
987 return Short_Short_Unsigned (U);
kono
parents:
diff changeset
988 end if;
kono
parents:
diff changeset
989 end I_SSU;
kono
parents:
diff changeset
990
kono
parents:
diff changeset
991 ----------
kono
parents:
diff changeset
992 -- I_SU --
kono
parents:
diff changeset
993 ----------
kono
parents:
diff changeset
994
kono
parents:
diff changeset
995 function I_SU (Stream : not null access RST) return Short_Unsigned is
kono
parents:
diff changeset
996 S : XDR_S_SU;
kono
parents:
diff changeset
997 L : SEO;
kono
parents:
diff changeset
998 U : XDR_SU := 0;
kono
parents:
diff changeset
999
kono
parents:
diff changeset
1000 begin
kono
parents:
diff changeset
1001 Ada.Streams.Read (Stream.all, S, L);
kono
parents:
diff changeset
1002
kono
parents:
diff changeset
1003 if L /= S'Last then
kono
parents:
diff changeset
1004 raise Data_Error;
kono
parents:
diff changeset
1005
kono
parents:
diff changeset
1006 elsif Optimize_Integers then
kono
parents:
diff changeset
1007 return XDR_S_SU_To_Short_Unsigned (S);
kono
parents:
diff changeset
1008
kono
parents:
diff changeset
1009 else
kono
parents:
diff changeset
1010 for N in S'Range loop
kono
parents:
diff changeset
1011 U := U * BB + XDR_SU (S (N));
kono
parents:
diff changeset
1012 end loop;
kono
parents:
diff changeset
1013
kono
parents:
diff changeset
1014 return Short_Unsigned (U);
kono
parents:
diff changeset
1015 end if;
kono
parents:
diff changeset
1016 end I_SU;
kono
parents:
diff changeset
1017
kono
parents:
diff changeset
1018 ---------
kono
parents:
diff changeset
1019 -- I_U --
kono
parents:
diff changeset
1020 ---------
kono
parents:
diff changeset
1021
kono
parents:
diff changeset
1022 function I_U (Stream : not null access RST) return Unsigned is
kono
parents:
diff changeset
1023 S : XDR_S_U;
kono
parents:
diff changeset
1024 L : SEO;
kono
parents:
diff changeset
1025 U : XDR_U := 0;
kono
parents:
diff changeset
1026
kono
parents:
diff changeset
1027 begin
kono
parents:
diff changeset
1028 Ada.Streams.Read (Stream.all, S, L);
kono
parents:
diff changeset
1029
kono
parents:
diff changeset
1030 if L /= S'Last then
kono
parents:
diff changeset
1031 raise Data_Error;
kono
parents:
diff changeset
1032
kono
parents:
diff changeset
1033 elsif Optimize_Integers then
kono
parents:
diff changeset
1034 return XDR_S_U_To_Unsigned (S);
kono
parents:
diff changeset
1035
kono
parents:
diff changeset
1036 else
kono
parents:
diff changeset
1037 for N in S'Range loop
kono
parents:
diff changeset
1038 U := U * BB + XDR_U (S (N));
kono
parents:
diff changeset
1039 end loop;
kono
parents:
diff changeset
1040
kono
parents:
diff changeset
1041 return Unsigned (U);
kono
parents:
diff changeset
1042 end if;
kono
parents:
diff changeset
1043 end I_U;
kono
parents:
diff changeset
1044
kono
parents:
diff changeset
1045 ----------
kono
parents:
diff changeset
1046 -- I_WC --
kono
parents:
diff changeset
1047 ----------
kono
parents:
diff changeset
1048
kono
parents:
diff changeset
1049 function I_WC (Stream : not null access RST) return Wide_Character is
kono
parents:
diff changeset
1050 S : XDR_S_WC;
kono
parents:
diff changeset
1051 L : SEO;
kono
parents:
diff changeset
1052 U : XDR_WC := 0;
kono
parents:
diff changeset
1053
kono
parents:
diff changeset
1054 begin
kono
parents:
diff changeset
1055 Ada.Streams.Read (Stream.all, S, L);
kono
parents:
diff changeset
1056
kono
parents:
diff changeset
1057 if L /= S'Last then
kono
parents:
diff changeset
1058 raise Data_Error;
kono
parents:
diff changeset
1059
kono
parents:
diff changeset
1060 else
kono
parents:
diff changeset
1061 for N in S'Range loop
kono
parents:
diff changeset
1062 U := U * BB + XDR_WC (S (N));
kono
parents:
diff changeset
1063 end loop;
kono
parents:
diff changeset
1064
kono
parents:
diff changeset
1065 -- Use Ada requirements on Wide_Character representation clause
kono
parents:
diff changeset
1066
kono
parents:
diff changeset
1067 return Wide_Character'Val (U);
kono
parents:
diff changeset
1068 end if;
kono
parents:
diff changeset
1069 end I_WC;
kono
parents:
diff changeset
1070
kono
parents:
diff changeset
1071 -----------
kono
parents:
diff changeset
1072 -- I_WWC --
kono
parents:
diff changeset
1073 -----------
kono
parents:
diff changeset
1074
kono
parents:
diff changeset
1075 function I_WWC (Stream : not null access RST) return Wide_Wide_Character is
kono
parents:
diff changeset
1076 S : XDR_S_WWC;
kono
parents:
diff changeset
1077 L : SEO;
kono
parents:
diff changeset
1078 U : XDR_WWC := 0;
kono
parents:
diff changeset
1079
kono
parents:
diff changeset
1080 begin
kono
parents:
diff changeset
1081 Ada.Streams.Read (Stream.all, S, L);
kono
parents:
diff changeset
1082
kono
parents:
diff changeset
1083 if L /= S'Last then
kono
parents:
diff changeset
1084 raise Data_Error;
kono
parents:
diff changeset
1085
kono
parents:
diff changeset
1086 else
kono
parents:
diff changeset
1087 for N in S'Range loop
kono
parents:
diff changeset
1088 U := U * BB + XDR_WWC (S (N));
kono
parents:
diff changeset
1089 end loop;
kono
parents:
diff changeset
1090
kono
parents:
diff changeset
1091 -- Use Ada requirements on Wide_Wide_Character representation clause
kono
parents:
diff changeset
1092
kono
parents:
diff changeset
1093 return Wide_Wide_Character'Val (U);
kono
parents:
diff changeset
1094 end if;
kono
parents:
diff changeset
1095 end I_WWC;
kono
parents:
diff changeset
1096
kono
parents:
diff changeset
1097 ----------
kono
parents:
diff changeset
1098 -- W_AD --
kono
parents:
diff changeset
1099 ----------
kono
parents:
diff changeset
1100
kono
parents:
diff changeset
1101 procedure W_AD (Stream : not null access RST; Item : Fat_Pointer) is
kono
parents:
diff changeset
1102 S : XDR_S_TM;
kono
parents:
diff changeset
1103 U : XDR_TM;
kono
parents:
diff changeset
1104
kono
parents:
diff changeset
1105 begin
kono
parents:
diff changeset
1106 U := XDR_TM (To_XDR_SA (Item.P1));
kono
parents:
diff changeset
1107 for N in reverse S'Range loop
kono
parents:
diff changeset
1108 S (N) := SE (U mod BB);
kono
parents:
diff changeset
1109 U := U / BB;
kono
parents:
diff changeset
1110 end loop;
kono
parents:
diff changeset
1111
kono
parents:
diff changeset
1112 Ada.Streams.Write (Stream.all, S);
kono
parents:
diff changeset
1113
kono
parents:
diff changeset
1114 U := XDR_TM (To_XDR_SA (Item.P2));
kono
parents:
diff changeset
1115 for N in reverse S'Range loop
kono
parents:
diff changeset
1116 S (N) := SE (U mod BB);
kono
parents:
diff changeset
1117 U := U / BB;
kono
parents:
diff changeset
1118 end loop;
kono
parents:
diff changeset
1119
kono
parents:
diff changeset
1120 Ada.Streams.Write (Stream.all, S);
kono
parents:
diff changeset
1121
kono
parents:
diff changeset
1122 if U /= 0 then
kono
parents:
diff changeset
1123 raise Data_Error;
kono
parents:
diff changeset
1124 end if;
kono
parents:
diff changeset
1125 end W_AD;
kono
parents:
diff changeset
1126
kono
parents:
diff changeset
1127 ----------
kono
parents:
diff changeset
1128 -- W_AS --
kono
parents:
diff changeset
1129 ----------
kono
parents:
diff changeset
1130
kono
parents:
diff changeset
1131 procedure W_AS (Stream : not null access RST; Item : Thin_Pointer) is
kono
parents:
diff changeset
1132 S : XDR_S_TM;
kono
parents:
diff changeset
1133 U : XDR_TM := XDR_TM (To_XDR_SA (Item.P1));
kono
parents:
diff changeset
1134
kono
parents:
diff changeset
1135 begin
kono
parents:
diff changeset
1136 for N in reverse S'Range loop
kono
parents:
diff changeset
1137 S (N) := SE (U mod BB);
kono
parents:
diff changeset
1138 U := U / BB;
kono
parents:
diff changeset
1139 end loop;
kono
parents:
diff changeset
1140
kono
parents:
diff changeset
1141 Ada.Streams.Write (Stream.all, S);
kono
parents:
diff changeset
1142
kono
parents:
diff changeset
1143 if U /= 0 then
kono
parents:
diff changeset
1144 raise Data_Error;
kono
parents:
diff changeset
1145 end if;
kono
parents:
diff changeset
1146 end W_AS;
kono
parents:
diff changeset
1147
kono
parents:
diff changeset
1148 ---------
kono
parents:
diff changeset
1149 -- W_B --
kono
parents:
diff changeset
1150 ---------
kono
parents:
diff changeset
1151
kono
parents:
diff changeset
1152 procedure W_B (Stream : not null access RST; Item : Boolean) is
kono
parents:
diff changeset
1153 begin
kono
parents:
diff changeset
1154 if Item then
kono
parents:
diff changeset
1155 W_SSU (Stream, 1);
kono
parents:
diff changeset
1156 else
kono
parents:
diff changeset
1157 W_SSU (Stream, 0);
kono
parents:
diff changeset
1158 end if;
kono
parents:
diff changeset
1159 end W_B;
kono
parents:
diff changeset
1160
kono
parents:
diff changeset
1161 ---------
kono
parents:
diff changeset
1162 -- W_C --
kono
parents:
diff changeset
1163 ---------
kono
parents:
diff changeset
1164
kono
parents:
diff changeset
1165 procedure W_C (Stream : not null access RST; Item : Character) is
kono
parents:
diff changeset
1166 S : XDR_S_C;
kono
parents:
diff changeset
1167
kono
parents:
diff changeset
1168 pragma Assert (C_L = 1);
kono
parents:
diff changeset
1169
kono
parents:
diff changeset
1170 begin
kono
parents:
diff changeset
1171 -- Use Ada requirements on Character representation clause
kono
parents:
diff changeset
1172
kono
parents:
diff changeset
1173 S (1) := SE (Character'Pos (Item));
kono
parents:
diff changeset
1174
kono
parents:
diff changeset
1175 Ada.Streams.Write (Stream.all, S);
kono
parents:
diff changeset
1176 end W_C;
kono
parents:
diff changeset
1177
kono
parents:
diff changeset
1178 ---------
kono
parents:
diff changeset
1179 -- W_F --
kono
parents:
diff changeset
1180 ---------
kono
parents:
diff changeset
1181
kono
parents:
diff changeset
1182 procedure W_F (Stream : not null access RST; Item : Float) is
kono
parents:
diff changeset
1183 I : constant Precision := Single;
kono
parents:
diff changeset
1184 E_Size : Integer renames Fields (I).E_Size;
kono
parents:
diff changeset
1185 E_Bias : Integer renames Fields (I).E_Bias;
kono
parents:
diff changeset
1186 E_Bytes : SEO renames Fields (I).E_Bytes;
kono
parents:
diff changeset
1187 F_Bytes : SEO renames Fields (I).F_Bytes;
kono
parents:
diff changeset
1188 F_Size : Integer renames Fields (I).F_Size;
kono
parents:
diff changeset
1189 F_Mask : SE renames Fields (I).F_Mask;
kono
parents:
diff changeset
1190
kono
parents:
diff changeset
1191 Exponent : Long_Unsigned;
kono
parents:
diff changeset
1192 Fraction : Long_Unsigned;
kono
parents:
diff changeset
1193 Is_Positive : Boolean;
kono
parents:
diff changeset
1194 E : Integer;
kono
parents:
diff changeset
1195 F : Float;
kono
parents:
diff changeset
1196 S : SEA (1 .. F_L) := (others => 0);
kono
parents:
diff changeset
1197
kono
parents:
diff changeset
1198 begin
kono
parents:
diff changeset
1199 if not Item'Valid then
kono
parents:
diff changeset
1200 raise Constraint_Error;
kono
parents:
diff changeset
1201 end if;
kono
parents:
diff changeset
1202
kono
parents:
diff changeset
1203 -- Compute Sign
kono
parents:
diff changeset
1204
kono
parents:
diff changeset
1205 Is_Positive := (0.0 <= Item);
kono
parents:
diff changeset
1206 F := abs (Item);
kono
parents:
diff changeset
1207
kono
parents:
diff changeset
1208 -- Signed zero
kono
parents:
diff changeset
1209
kono
parents:
diff changeset
1210 if F = 0.0 then
kono
parents:
diff changeset
1211 Exponent := 0;
kono
parents:
diff changeset
1212 Fraction := 0;
kono
parents:
diff changeset
1213
kono
parents:
diff changeset
1214 else
kono
parents:
diff changeset
1215 E := Float'Exponent (F) - 1;
kono
parents:
diff changeset
1216
kono
parents:
diff changeset
1217 -- Denormalized float
kono
parents:
diff changeset
1218
kono
parents:
diff changeset
1219 if E <= -E_Bias then
kono
parents:
diff changeset
1220 F := Float'Scaling (F, F_Size + E_Bias - 1);
kono
parents:
diff changeset
1221 E := -E_Bias;
kono
parents:
diff changeset
1222 else
kono
parents:
diff changeset
1223 F := Float'Scaling (Float'Fraction (F), F_Size + 1);
kono
parents:
diff changeset
1224 end if;
kono
parents:
diff changeset
1225
kono
parents:
diff changeset
1226 -- Compute Exponent and Fraction
kono
parents:
diff changeset
1227
kono
parents:
diff changeset
1228 Exponent := Long_Unsigned (E + E_Bias);
kono
parents:
diff changeset
1229 Fraction := Long_Unsigned (F * 2.0) / 2;
kono
parents:
diff changeset
1230 end if;
kono
parents:
diff changeset
1231
kono
parents:
diff changeset
1232 -- Store Fraction
kono
parents:
diff changeset
1233
kono
parents:
diff changeset
1234 for I in reverse F_L - F_Bytes + 1 .. F_L loop
kono
parents:
diff changeset
1235 S (I) := SE (Fraction mod BB);
kono
parents:
diff changeset
1236 Fraction := Fraction / BB;
kono
parents:
diff changeset
1237 end loop;
kono
parents:
diff changeset
1238
kono
parents:
diff changeset
1239 -- Remove implicit bit
kono
parents:
diff changeset
1240
kono
parents:
diff changeset
1241 S (F_L - F_Bytes + 1) := S (F_L - F_Bytes + 1) and F_Mask;
kono
parents:
diff changeset
1242
kono
parents:
diff changeset
1243 -- Store Exponent (not always at the beginning of a byte)
kono
parents:
diff changeset
1244
kono
parents:
diff changeset
1245 Exponent := Shift_Left (Exponent, Integer (E_Bytes) * SU - E_Size - 1);
kono
parents:
diff changeset
1246 for N in reverse 1 .. E_Bytes loop
kono
parents:
diff changeset
1247 S (N) := SE (Exponent mod BB) + S (N);
kono
parents:
diff changeset
1248 Exponent := Exponent / BB;
kono
parents:
diff changeset
1249 end loop;
kono
parents:
diff changeset
1250
kono
parents:
diff changeset
1251 -- Store Sign
kono
parents:
diff changeset
1252
kono
parents:
diff changeset
1253 if not Is_Positive then
kono
parents:
diff changeset
1254 S (1) := S (1) + BS;
kono
parents:
diff changeset
1255 end if;
kono
parents:
diff changeset
1256
kono
parents:
diff changeset
1257 Ada.Streams.Write (Stream.all, S);
kono
parents:
diff changeset
1258 end W_F;
kono
parents:
diff changeset
1259
kono
parents:
diff changeset
1260 ---------
kono
parents:
diff changeset
1261 -- W_I --
kono
parents:
diff changeset
1262 ---------
kono
parents:
diff changeset
1263
kono
parents:
diff changeset
1264 procedure W_I (Stream : not null access RST; Item : Integer) is
kono
parents:
diff changeset
1265 S : XDR_S_I;
kono
parents:
diff changeset
1266 U : XDR_U;
kono
parents:
diff changeset
1267
kono
parents:
diff changeset
1268 begin
kono
parents:
diff changeset
1269 if Optimize_Integers then
kono
parents:
diff changeset
1270 S := Integer_To_XDR_S_I (Item);
kono
parents:
diff changeset
1271
kono
parents:
diff changeset
1272 else
kono
parents:
diff changeset
1273 -- Test sign and apply two complement notation
kono
parents:
diff changeset
1274
kono
parents:
diff changeset
1275 U := (if Item < 0
kono
parents:
diff changeset
1276 then XDR_U'Last xor XDR_U (-(Item + 1))
kono
parents:
diff changeset
1277 else XDR_U (Item));
kono
parents:
diff changeset
1278
kono
parents:
diff changeset
1279 for N in reverse S'Range loop
kono
parents:
diff changeset
1280 S (N) := SE (U mod BB);
kono
parents:
diff changeset
1281 U := U / BB;
kono
parents:
diff changeset
1282 end loop;
kono
parents:
diff changeset
1283
kono
parents:
diff changeset
1284 if U /= 0 then
kono
parents:
diff changeset
1285 raise Data_Error;
kono
parents:
diff changeset
1286 end if;
kono
parents:
diff changeset
1287 end if;
kono
parents:
diff changeset
1288
kono
parents:
diff changeset
1289 Ada.Streams.Write (Stream.all, S);
kono
parents:
diff changeset
1290 end W_I;
kono
parents:
diff changeset
1291
kono
parents:
diff changeset
1292 ----------
kono
parents:
diff changeset
1293 -- W_LF --
kono
parents:
diff changeset
1294 ----------
kono
parents:
diff changeset
1295
kono
parents:
diff changeset
1296 procedure W_LF (Stream : not null access RST; Item : Long_Float) is
kono
parents:
diff changeset
1297 I : constant Precision := Double;
kono
parents:
diff changeset
1298 E_Size : Integer renames Fields (I).E_Size;
kono
parents:
diff changeset
1299 E_Bias : Integer renames Fields (I).E_Bias;
kono
parents:
diff changeset
1300 E_Bytes : SEO renames Fields (I).E_Bytes;
kono
parents:
diff changeset
1301 F_Bytes : SEO renames Fields (I).F_Bytes;
kono
parents:
diff changeset
1302 F_Size : Integer renames Fields (I).F_Size;
kono
parents:
diff changeset
1303 F_Mask : SE renames Fields (I).F_Mask;
kono
parents:
diff changeset
1304
kono
parents:
diff changeset
1305 Exponent : Long_Unsigned;
kono
parents:
diff changeset
1306 Fraction : Long_Long_Unsigned;
kono
parents:
diff changeset
1307 Is_Positive : Boolean;
kono
parents:
diff changeset
1308 E : Integer;
kono
parents:
diff changeset
1309 F : Long_Float;
kono
parents:
diff changeset
1310 S : SEA (1 .. LF_L) := (others => 0);
kono
parents:
diff changeset
1311
kono
parents:
diff changeset
1312 begin
kono
parents:
diff changeset
1313 if not Item'Valid then
kono
parents:
diff changeset
1314 raise Constraint_Error;
kono
parents:
diff changeset
1315 end if;
kono
parents:
diff changeset
1316
kono
parents:
diff changeset
1317 -- Compute Sign
kono
parents:
diff changeset
1318
kono
parents:
diff changeset
1319 Is_Positive := (0.0 <= Item);
kono
parents:
diff changeset
1320 F := abs (Item);
kono
parents:
diff changeset
1321
kono
parents:
diff changeset
1322 -- Signed zero
kono
parents:
diff changeset
1323
kono
parents:
diff changeset
1324 if F = 0.0 then
kono
parents:
diff changeset
1325 Exponent := 0;
kono
parents:
diff changeset
1326 Fraction := 0;
kono
parents:
diff changeset
1327
kono
parents:
diff changeset
1328 else
kono
parents:
diff changeset
1329 E := Long_Float'Exponent (F) - 1;
kono
parents:
diff changeset
1330
kono
parents:
diff changeset
1331 -- Denormalized float
kono
parents:
diff changeset
1332
kono
parents:
diff changeset
1333 if E <= -E_Bias then
kono
parents:
diff changeset
1334 E := -E_Bias;
kono
parents:
diff changeset
1335 F := Long_Float'Scaling (F, F_Size + E_Bias - 1);
kono
parents:
diff changeset
1336 else
kono
parents:
diff changeset
1337 F := Long_Float'Scaling (F, F_Size - E);
kono
parents:
diff changeset
1338 end if;
kono
parents:
diff changeset
1339
kono
parents:
diff changeset
1340 -- Compute Exponent and Fraction
kono
parents:
diff changeset
1341
kono
parents:
diff changeset
1342 Exponent := Long_Unsigned (E + E_Bias);
kono
parents:
diff changeset
1343 Fraction := Long_Long_Unsigned (F * 2.0) / 2;
kono
parents:
diff changeset
1344 end if;
kono
parents:
diff changeset
1345
kono
parents:
diff changeset
1346 -- Store Fraction
kono
parents:
diff changeset
1347
kono
parents:
diff changeset
1348 for I in reverse LF_L - F_Bytes + 1 .. LF_L loop
kono
parents:
diff changeset
1349 S (I) := SE (Fraction mod BB);
kono
parents:
diff changeset
1350 Fraction := Fraction / BB;
kono
parents:
diff changeset
1351 end loop;
kono
parents:
diff changeset
1352
kono
parents:
diff changeset
1353 -- Remove implicit bit
kono
parents:
diff changeset
1354
kono
parents:
diff changeset
1355 S (LF_L - F_Bytes + 1) := S (LF_L - F_Bytes + 1) and F_Mask;
kono
parents:
diff changeset
1356
kono
parents:
diff changeset
1357 -- Store Exponent (not always at the beginning of a byte)
kono
parents:
diff changeset
1358
kono
parents:
diff changeset
1359 Exponent := Shift_Left (Exponent, Integer (E_Bytes) * SU - E_Size - 1);
kono
parents:
diff changeset
1360 for N in reverse 1 .. E_Bytes loop
kono
parents:
diff changeset
1361 S (N) := SE (Exponent mod BB) + S (N);
kono
parents:
diff changeset
1362 Exponent := Exponent / BB;
kono
parents:
diff changeset
1363 end loop;
kono
parents:
diff changeset
1364
kono
parents:
diff changeset
1365 -- Store Sign
kono
parents:
diff changeset
1366
kono
parents:
diff changeset
1367 if not Is_Positive then
kono
parents:
diff changeset
1368 S (1) := S (1) + BS;
kono
parents:
diff changeset
1369 end if;
kono
parents:
diff changeset
1370
kono
parents:
diff changeset
1371 Ada.Streams.Write (Stream.all, S);
kono
parents:
diff changeset
1372 end W_LF;
kono
parents:
diff changeset
1373
kono
parents:
diff changeset
1374 ----------
kono
parents:
diff changeset
1375 -- W_LI --
kono
parents:
diff changeset
1376 ----------
kono
parents:
diff changeset
1377
kono
parents:
diff changeset
1378 procedure W_LI (Stream : not null access RST; Item : Long_Integer) is
kono
parents:
diff changeset
1379 S : XDR_S_LI;
kono
parents:
diff changeset
1380 U : Unsigned;
kono
parents:
diff changeset
1381 X : Long_Unsigned;
kono
parents:
diff changeset
1382
kono
parents:
diff changeset
1383 begin
kono
parents:
diff changeset
1384 if Optimize_Integers then
kono
parents:
diff changeset
1385 S := Long_Long_Integer_To_XDR_S_LI (Long_Long_Integer (Item));
kono
parents:
diff changeset
1386
kono
parents:
diff changeset
1387 else
kono
parents:
diff changeset
1388 -- Test sign and apply two complement notation
kono
parents:
diff changeset
1389
kono
parents:
diff changeset
1390 if Item < 0 then
kono
parents:
diff changeset
1391 X := Long_Unsigned'Last xor Long_Unsigned (-(Item + 1));
kono
parents:
diff changeset
1392 else
kono
parents:
diff changeset
1393 X := Long_Unsigned (Item);
kono
parents:
diff changeset
1394 end if;
kono
parents:
diff changeset
1395
kono
parents:
diff changeset
1396 -- Compute using machine unsigned rather than long_unsigned
kono
parents:
diff changeset
1397
kono
parents:
diff changeset
1398 for N in reverse S'Range loop
kono
parents:
diff changeset
1399
kono
parents:
diff changeset
1400 -- We have filled an unsigned
kono
parents:
diff changeset
1401
kono
parents:
diff changeset
1402 if (LU_L - N) mod UB = 0 then
kono
parents:
diff changeset
1403 U := Unsigned (X and UL);
kono
parents:
diff changeset
1404 X := Shift_Right (X, US);
kono
parents:
diff changeset
1405 end if;
kono
parents:
diff changeset
1406
kono
parents:
diff changeset
1407 S (N) := SE (U mod BB);
kono
parents:
diff changeset
1408 U := U / BB;
kono
parents:
diff changeset
1409 end loop;
kono
parents:
diff changeset
1410
kono
parents:
diff changeset
1411 if U /= 0 then
kono
parents:
diff changeset
1412 raise Data_Error;
kono
parents:
diff changeset
1413 end if;
kono
parents:
diff changeset
1414 end if;
kono
parents:
diff changeset
1415
kono
parents:
diff changeset
1416 Ada.Streams.Write (Stream.all, S);
kono
parents:
diff changeset
1417 end W_LI;
kono
parents:
diff changeset
1418
kono
parents:
diff changeset
1419 -----------
kono
parents:
diff changeset
1420 -- W_LLF --
kono
parents:
diff changeset
1421 -----------
kono
parents:
diff changeset
1422
kono
parents:
diff changeset
1423 procedure W_LLF (Stream : not null access RST; Item : Long_Long_Float) is
kono
parents:
diff changeset
1424 I : constant Precision := Quadruple;
kono
parents:
diff changeset
1425 E_Size : Integer renames Fields (I).E_Size;
kono
parents:
diff changeset
1426 E_Bias : Integer renames Fields (I).E_Bias;
kono
parents:
diff changeset
1427 E_Bytes : SEO renames Fields (I).E_Bytes;
kono
parents:
diff changeset
1428 F_Bytes : SEO renames Fields (I).F_Bytes;
kono
parents:
diff changeset
1429 F_Size : Integer renames Fields (I).F_Size;
kono
parents:
diff changeset
1430
kono
parents:
diff changeset
1431 HFS : constant Integer := F_Size / 2;
kono
parents:
diff changeset
1432
kono
parents:
diff changeset
1433 Exponent : Long_Unsigned;
kono
parents:
diff changeset
1434 Fraction_1 : Long_Long_Unsigned;
kono
parents:
diff changeset
1435 Fraction_2 : Long_Long_Unsigned;
kono
parents:
diff changeset
1436 Is_Positive : Boolean;
kono
parents:
diff changeset
1437 E : Integer;
kono
parents:
diff changeset
1438 F : Long_Long_Float := Item;
kono
parents:
diff changeset
1439 S : SEA (1 .. LLF_L) := (others => 0);
kono
parents:
diff changeset
1440
kono
parents:
diff changeset
1441 begin
kono
parents:
diff changeset
1442 if not Item'Valid then
kono
parents:
diff changeset
1443 raise Constraint_Error;
kono
parents:
diff changeset
1444 end if;
kono
parents:
diff changeset
1445
kono
parents:
diff changeset
1446 -- Compute Sign
kono
parents:
diff changeset
1447
kono
parents:
diff changeset
1448 Is_Positive := (0.0 <= Item);
kono
parents:
diff changeset
1449
kono
parents:
diff changeset
1450 if F < 0.0 then
kono
parents:
diff changeset
1451 F := -Item;
kono
parents:
diff changeset
1452 end if;
kono
parents:
diff changeset
1453
kono
parents:
diff changeset
1454 -- Signed zero
kono
parents:
diff changeset
1455
kono
parents:
diff changeset
1456 if F = 0.0 then
kono
parents:
diff changeset
1457 Exponent := 0;
kono
parents:
diff changeset
1458 Fraction_1 := 0;
kono
parents:
diff changeset
1459 Fraction_2 := 0;
kono
parents:
diff changeset
1460
kono
parents:
diff changeset
1461 else
kono
parents:
diff changeset
1462 E := Long_Long_Float'Exponent (F) - 1;
kono
parents:
diff changeset
1463
kono
parents:
diff changeset
1464 -- Denormalized float
kono
parents:
diff changeset
1465
kono
parents:
diff changeset
1466 if E <= -E_Bias then
kono
parents:
diff changeset
1467 F := Long_Long_Float'Scaling (F, E_Bias - 1);
kono
parents:
diff changeset
1468 E := -E_Bias;
kono
parents:
diff changeset
1469 else
kono
parents:
diff changeset
1470 F := Long_Long_Float'Scaling
kono
parents:
diff changeset
1471 (Long_Long_Float'Fraction (F), 1);
kono
parents:
diff changeset
1472 end if;
kono
parents:
diff changeset
1473
kono
parents:
diff changeset
1474 -- Compute Exponent and Fraction
kono
parents:
diff changeset
1475
kono
parents:
diff changeset
1476 Exponent := Long_Unsigned (E + E_Bias);
kono
parents:
diff changeset
1477 F := Long_Long_Float'Scaling (F, F_Size - HFS);
kono
parents:
diff changeset
1478 Fraction_1 := Long_Long_Unsigned (Long_Long_Float'Floor (F));
kono
parents:
diff changeset
1479 F := F - Long_Long_Float (Fraction_1);
kono
parents:
diff changeset
1480 F := Long_Long_Float'Scaling (F, HFS);
kono
parents:
diff changeset
1481 Fraction_2 := Long_Long_Unsigned (Long_Long_Float'Floor (F));
kono
parents:
diff changeset
1482 end if;
kono
parents:
diff changeset
1483
kono
parents:
diff changeset
1484 -- Store Fraction_1
kono
parents:
diff changeset
1485
kono
parents:
diff changeset
1486 for I in reverse LLF_L - F_Bytes + 1 .. LLF_L - 7 loop
kono
parents:
diff changeset
1487 S (I) := SE (Fraction_1 mod BB);
kono
parents:
diff changeset
1488 Fraction_1 := Fraction_1 / BB;
kono
parents:
diff changeset
1489 end loop;
kono
parents:
diff changeset
1490
kono
parents:
diff changeset
1491 -- Store Fraction_2
kono
parents:
diff changeset
1492
kono
parents:
diff changeset
1493 for I in reverse LLF_L - 6 .. LLF_L loop
kono
parents:
diff changeset
1494 S (SEO (I)) := SE (Fraction_2 mod BB);
kono
parents:
diff changeset
1495 Fraction_2 := Fraction_2 / BB;
kono
parents:
diff changeset
1496 end loop;
kono
parents:
diff changeset
1497
kono
parents:
diff changeset
1498 -- Store Exponent (not always at the beginning of a byte)
kono
parents:
diff changeset
1499
kono
parents:
diff changeset
1500 Exponent := Shift_Left (Exponent, Integer (E_Bytes) * SU - E_Size - 1);
kono
parents:
diff changeset
1501 for N in reverse 1 .. E_Bytes loop
kono
parents:
diff changeset
1502 S (N) := SE (Exponent mod BB) + S (N);
kono
parents:
diff changeset
1503 Exponent := Exponent / BB;
kono
parents:
diff changeset
1504 end loop;
kono
parents:
diff changeset
1505
kono
parents:
diff changeset
1506 -- Store Sign
kono
parents:
diff changeset
1507
kono
parents:
diff changeset
1508 if not Is_Positive then
kono
parents:
diff changeset
1509 S (1) := S (1) + BS;
kono
parents:
diff changeset
1510 end if;
kono
parents:
diff changeset
1511
kono
parents:
diff changeset
1512 Ada.Streams.Write (Stream.all, S);
kono
parents:
diff changeset
1513 end W_LLF;
kono
parents:
diff changeset
1514
kono
parents:
diff changeset
1515 -----------
kono
parents:
diff changeset
1516 -- W_LLI --
kono
parents:
diff changeset
1517 -----------
kono
parents:
diff changeset
1518
kono
parents:
diff changeset
1519 procedure W_LLI
kono
parents:
diff changeset
1520 (Stream : not null access RST;
kono
parents:
diff changeset
1521 Item : Long_Long_Integer)
kono
parents:
diff changeset
1522 is
kono
parents:
diff changeset
1523 S : XDR_S_LLI;
kono
parents:
diff changeset
1524 U : Unsigned;
kono
parents:
diff changeset
1525 X : Long_Long_Unsigned;
kono
parents:
diff changeset
1526
kono
parents:
diff changeset
1527 begin
kono
parents:
diff changeset
1528 if Optimize_Integers then
kono
parents:
diff changeset
1529 S := Long_Long_Integer_To_XDR_S_LLI (Item);
kono
parents:
diff changeset
1530
kono
parents:
diff changeset
1531 else
kono
parents:
diff changeset
1532 -- Test sign and apply two complement notation
kono
parents:
diff changeset
1533
kono
parents:
diff changeset
1534 if Item < 0 then
kono
parents:
diff changeset
1535 X := Long_Long_Unsigned'Last xor Long_Long_Unsigned (-(Item + 1));
kono
parents:
diff changeset
1536 else
kono
parents:
diff changeset
1537 X := Long_Long_Unsigned (Item);
kono
parents:
diff changeset
1538 end if;
kono
parents:
diff changeset
1539
kono
parents:
diff changeset
1540 -- Compute using machine unsigned rather than long_long_unsigned
kono
parents:
diff changeset
1541
kono
parents:
diff changeset
1542 for N in reverse S'Range loop
kono
parents:
diff changeset
1543
kono
parents:
diff changeset
1544 -- We have filled an unsigned
kono
parents:
diff changeset
1545
kono
parents:
diff changeset
1546 if (LLU_L - N) mod UB = 0 then
kono
parents:
diff changeset
1547 U := Unsigned (X and UL);
kono
parents:
diff changeset
1548 X := Shift_Right (X, US);
kono
parents:
diff changeset
1549 end if;
kono
parents:
diff changeset
1550
kono
parents:
diff changeset
1551 S (N) := SE (U mod BB);
kono
parents:
diff changeset
1552 U := U / BB;
kono
parents:
diff changeset
1553 end loop;
kono
parents:
diff changeset
1554
kono
parents:
diff changeset
1555 if U /= 0 then
kono
parents:
diff changeset
1556 raise Data_Error;
kono
parents:
diff changeset
1557 end if;
kono
parents:
diff changeset
1558 end if;
kono
parents:
diff changeset
1559
kono
parents:
diff changeset
1560 Ada.Streams.Write (Stream.all, S);
kono
parents:
diff changeset
1561 end W_LLI;
kono
parents:
diff changeset
1562
kono
parents:
diff changeset
1563 -----------
kono
parents:
diff changeset
1564 -- W_LLU --
kono
parents:
diff changeset
1565 -----------
kono
parents:
diff changeset
1566
kono
parents:
diff changeset
1567 procedure W_LLU
kono
parents:
diff changeset
1568 (Stream : not null access RST;
kono
parents:
diff changeset
1569 Item : Long_Long_Unsigned)
kono
parents:
diff changeset
1570 is
kono
parents:
diff changeset
1571 S : XDR_S_LLU;
kono
parents:
diff changeset
1572 U : Unsigned;
kono
parents:
diff changeset
1573 X : Long_Long_Unsigned := Item;
kono
parents:
diff changeset
1574
kono
parents:
diff changeset
1575 begin
kono
parents:
diff changeset
1576 if Optimize_Integers then
kono
parents:
diff changeset
1577 S := Long_Long_Unsigned_To_XDR_S_LLU (Item);
kono
parents:
diff changeset
1578
kono
parents:
diff changeset
1579 else
kono
parents:
diff changeset
1580 -- Compute using machine unsigned rather than long_long_unsigned
kono
parents:
diff changeset
1581
kono
parents:
diff changeset
1582 for N in reverse S'Range loop
kono
parents:
diff changeset
1583
kono
parents:
diff changeset
1584 -- We have filled an unsigned
kono
parents:
diff changeset
1585
kono
parents:
diff changeset
1586 if (LLU_L - N) mod UB = 0 then
kono
parents:
diff changeset
1587 U := Unsigned (X and UL);
kono
parents:
diff changeset
1588 X := Shift_Right (X, US);
kono
parents:
diff changeset
1589 end if;
kono
parents:
diff changeset
1590
kono
parents:
diff changeset
1591 S (N) := SE (U mod BB);
kono
parents:
diff changeset
1592 U := U / BB;
kono
parents:
diff changeset
1593 end loop;
kono
parents:
diff changeset
1594
kono
parents:
diff changeset
1595 if U /= 0 then
kono
parents:
diff changeset
1596 raise Data_Error;
kono
parents:
diff changeset
1597 end if;
kono
parents:
diff changeset
1598 end if;
kono
parents:
diff changeset
1599
kono
parents:
diff changeset
1600 Ada.Streams.Write (Stream.all, S);
kono
parents:
diff changeset
1601 end W_LLU;
kono
parents:
diff changeset
1602
kono
parents:
diff changeset
1603 ----------
kono
parents:
diff changeset
1604 -- W_LU --
kono
parents:
diff changeset
1605 ----------
kono
parents:
diff changeset
1606
kono
parents:
diff changeset
1607 procedure W_LU (Stream : not null access RST; Item : Long_Unsigned) is
kono
parents:
diff changeset
1608 S : XDR_S_LU;
kono
parents:
diff changeset
1609 U : Unsigned;
kono
parents:
diff changeset
1610 X : Long_Unsigned := Item;
kono
parents:
diff changeset
1611
kono
parents:
diff changeset
1612 begin
kono
parents:
diff changeset
1613 if Optimize_Integers then
kono
parents:
diff changeset
1614 S := Long_Long_Unsigned_To_XDR_S_LU (Long_Long_Unsigned (Item));
kono
parents:
diff changeset
1615
kono
parents:
diff changeset
1616 else
kono
parents:
diff changeset
1617 -- Compute using machine unsigned rather than long_unsigned
kono
parents:
diff changeset
1618
kono
parents:
diff changeset
1619 for N in reverse S'Range loop
kono
parents:
diff changeset
1620
kono
parents:
diff changeset
1621 -- We have filled an unsigned
kono
parents:
diff changeset
1622
kono
parents:
diff changeset
1623 if (LU_L - N) mod UB = 0 then
kono
parents:
diff changeset
1624 U := Unsigned (X and UL);
kono
parents:
diff changeset
1625 X := Shift_Right (X, US);
kono
parents:
diff changeset
1626 end if;
kono
parents:
diff changeset
1627 S (N) := SE (U mod BB);
kono
parents:
diff changeset
1628 U := U / BB;
kono
parents:
diff changeset
1629 end loop;
kono
parents:
diff changeset
1630
kono
parents:
diff changeset
1631 if U /= 0 then
kono
parents:
diff changeset
1632 raise Data_Error;
kono
parents:
diff changeset
1633 end if;
kono
parents:
diff changeset
1634 end if;
kono
parents:
diff changeset
1635
kono
parents:
diff changeset
1636 Ada.Streams.Write (Stream.all, S);
kono
parents:
diff changeset
1637 end W_LU;
kono
parents:
diff changeset
1638
kono
parents:
diff changeset
1639 ----------
kono
parents:
diff changeset
1640 -- W_SF --
kono
parents:
diff changeset
1641 ----------
kono
parents:
diff changeset
1642
kono
parents:
diff changeset
1643 procedure W_SF (Stream : not null access RST; Item : Short_Float) is
kono
parents:
diff changeset
1644 I : constant Precision := Single;
kono
parents:
diff changeset
1645 E_Size : Integer renames Fields (I).E_Size;
kono
parents:
diff changeset
1646 E_Bias : Integer renames Fields (I).E_Bias;
kono
parents:
diff changeset
1647 E_Bytes : SEO renames Fields (I).E_Bytes;
kono
parents:
diff changeset
1648 F_Bytes : SEO renames Fields (I).F_Bytes;
kono
parents:
diff changeset
1649 F_Size : Integer renames Fields (I).F_Size;
kono
parents:
diff changeset
1650 F_Mask : SE renames Fields (I).F_Mask;
kono
parents:
diff changeset
1651
kono
parents:
diff changeset
1652 Exponent : Long_Unsigned;
kono
parents:
diff changeset
1653 Fraction : Long_Unsigned;
kono
parents:
diff changeset
1654 Is_Positive : Boolean;
kono
parents:
diff changeset
1655 E : Integer;
kono
parents:
diff changeset
1656 F : Short_Float;
kono
parents:
diff changeset
1657 S : SEA (1 .. SF_L) := (others => 0);
kono
parents:
diff changeset
1658
kono
parents:
diff changeset
1659 begin
kono
parents:
diff changeset
1660 if not Item'Valid then
kono
parents:
diff changeset
1661 raise Constraint_Error;
kono
parents:
diff changeset
1662 end if;
kono
parents:
diff changeset
1663
kono
parents:
diff changeset
1664 -- Compute Sign
kono
parents:
diff changeset
1665
kono
parents:
diff changeset
1666 Is_Positive := (0.0 <= Item);
kono
parents:
diff changeset
1667 F := abs (Item);
kono
parents:
diff changeset
1668
kono
parents:
diff changeset
1669 -- Signed zero
kono
parents:
diff changeset
1670
kono
parents:
diff changeset
1671 if F = 0.0 then
kono
parents:
diff changeset
1672 Exponent := 0;
kono
parents:
diff changeset
1673 Fraction := 0;
kono
parents:
diff changeset
1674
kono
parents:
diff changeset
1675 else
kono
parents:
diff changeset
1676 E := Short_Float'Exponent (F) - 1;
kono
parents:
diff changeset
1677
kono
parents:
diff changeset
1678 -- Denormalized float
kono
parents:
diff changeset
1679
kono
parents:
diff changeset
1680 if E <= -E_Bias then
kono
parents:
diff changeset
1681 E := -E_Bias;
kono
parents:
diff changeset
1682 F := Short_Float'Scaling (F, F_Size + E_Bias - 1);
kono
parents:
diff changeset
1683 else
kono
parents:
diff changeset
1684 F := Short_Float'Scaling (F, F_Size - E);
kono
parents:
diff changeset
1685 end if;
kono
parents:
diff changeset
1686
kono
parents:
diff changeset
1687 -- Compute Exponent and Fraction
kono
parents:
diff changeset
1688
kono
parents:
diff changeset
1689 Exponent := Long_Unsigned (E + E_Bias);
kono
parents:
diff changeset
1690 Fraction := Long_Unsigned (F * 2.0) / 2;
kono
parents:
diff changeset
1691 end if;
kono
parents:
diff changeset
1692
kono
parents:
diff changeset
1693 -- Store Fraction
kono
parents:
diff changeset
1694
kono
parents:
diff changeset
1695 for I in reverse SF_L - F_Bytes + 1 .. SF_L loop
kono
parents:
diff changeset
1696 S (I) := SE (Fraction mod BB);
kono
parents:
diff changeset
1697 Fraction := Fraction / BB;
kono
parents:
diff changeset
1698 end loop;
kono
parents:
diff changeset
1699
kono
parents:
diff changeset
1700 -- Remove implicit bit
kono
parents:
diff changeset
1701
kono
parents:
diff changeset
1702 S (SF_L - F_Bytes + 1) := S (SF_L - F_Bytes + 1) and F_Mask;
kono
parents:
diff changeset
1703
kono
parents:
diff changeset
1704 -- Store Exponent (not always at the beginning of a byte)
kono
parents:
diff changeset
1705
kono
parents:
diff changeset
1706 Exponent := Shift_Left (Exponent, Integer (E_Bytes) * SU - E_Size - 1);
kono
parents:
diff changeset
1707 for N in reverse 1 .. E_Bytes loop
kono
parents:
diff changeset
1708 S (N) := SE (Exponent mod BB) + S (N);
kono
parents:
diff changeset
1709 Exponent := Exponent / BB;
kono
parents:
diff changeset
1710 end loop;
kono
parents:
diff changeset
1711
kono
parents:
diff changeset
1712 -- Store Sign
kono
parents:
diff changeset
1713
kono
parents:
diff changeset
1714 if not Is_Positive then
kono
parents:
diff changeset
1715 S (1) := S (1) + BS;
kono
parents:
diff changeset
1716 end if;
kono
parents:
diff changeset
1717
kono
parents:
diff changeset
1718 Ada.Streams.Write (Stream.all, S);
kono
parents:
diff changeset
1719 end W_SF;
kono
parents:
diff changeset
1720
kono
parents:
diff changeset
1721 ----------
kono
parents:
diff changeset
1722 -- W_SI --
kono
parents:
diff changeset
1723 ----------
kono
parents:
diff changeset
1724
kono
parents:
diff changeset
1725 procedure W_SI (Stream : not null access RST; Item : Short_Integer) is
kono
parents:
diff changeset
1726 S : XDR_S_SI;
kono
parents:
diff changeset
1727 U : XDR_SU;
kono
parents:
diff changeset
1728
kono
parents:
diff changeset
1729 begin
kono
parents:
diff changeset
1730 if Optimize_Integers then
kono
parents:
diff changeset
1731 S := Short_Integer_To_XDR_S_SI (Item);
kono
parents:
diff changeset
1732
kono
parents:
diff changeset
1733 else
kono
parents:
diff changeset
1734 -- Test sign and apply two complement's notation
kono
parents:
diff changeset
1735
kono
parents:
diff changeset
1736 U := (if Item < 0
kono
parents:
diff changeset
1737 then XDR_SU'Last xor XDR_SU (-(Item + 1))
kono
parents:
diff changeset
1738 else XDR_SU (Item));
kono
parents:
diff changeset
1739
kono
parents:
diff changeset
1740 for N in reverse S'Range loop
kono
parents:
diff changeset
1741 S (N) := SE (U mod BB);
kono
parents:
diff changeset
1742 U := U / BB;
kono
parents:
diff changeset
1743 end loop;
kono
parents:
diff changeset
1744
kono
parents:
diff changeset
1745 if U /= 0 then
kono
parents:
diff changeset
1746 raise Data_Error;
kono
parents:
diff changeset
1747 end if;
kono
parents:
diff changeset
1748 end if;
kono
parents:
diff changeset
1749
kono
parents:
diff changeset
1750 Ada.Streams.Write (Stream.all, S);
kono
parents:
diff changeset
1751 end W_SI;
kono
parents:
diff changeset
1752
kono
parents:
diff changeset
1753 -----------
kono
parents:
diff changeset
1754 -- W_SSI --
kono
parents:
diff changeset
1755 -----------
kono
parents:
diff changeset
1756
kono
parents:
diff changeset
1757 procedure W_SSI
kono
parents:
diff changeset
1758 (Stream : not null access RST;
kono
parents:
diff changeset
1759 Item : Short_Short_Integer)
kono
parents:
diff changeset
1760 is
kono
parents:
diff changeset
1761 S : XDR_S_SSI;
kono
parents:
diff changeset
1762 U : XDR_SSU;
kono
parents:
diff changeset
1763
kono
parents:
diff changeset
1764 begin
kono
parents:
diff changeset
1765 if Optimize_Integers then
kono
parents:
diff changeset
1766 S := Short_Short_Integer_To_XDR_S_SSI (Item);
kono
parents:
diff changeset
1767
kono
parents:
diff changeset
1768 else
kono
parents:
diff changeset
1769 -- Test sign and apply two complement's notation
kono
parents:
diff changeset
1770
kono
parents:
diff changeset
1771 U := (if Item < 0
kono
parents:
diff changeset
1772 then XDR_SSU'Last xor XDR_SSU (-(Item + 1))
kono
parents:
diff changeset
1773 else XDR_SSU (Item));
kono
parents:
diff changeset
1774
kono
parents:
diff changeset
1775 S (1) := SE (U);
kono
parents:
diff changeset
1776 end if;
kono
parents:
diff changeset
1777
kono
parents:
diff changeset
1778 Ada.Streams.Write (Stream.all, S);
kono
parents:
diff changeset
1779 end W_SSI;
kono
parents:
diff changeset
1780
kono
parents:
diff changeset
1781 -----------
kono
parents:
diff changeset
1782 -- W_SSU --
kono
parents:
diff changeset
1783 -----------
kono
parents:
diff changeset
1784
kono
parents:
diff changeset
1785 procedure W_SSU
kono
parents:
diff changeset
1786 (Stream : not null access RST;
kono
parents:
diff changeset
1787 Item : Short_Short_Unsigned)
kono
parents:
diff changeset
1788 is
kono
parents:
diff changeset
1789 U : constant XDR_SSU := XDR_SSU (Item);
kono
parents:
diff changeset
1790 S : XDR_S_SSU;
kono
parents:
diff changeset
1791
kono
parents:
diff changeset
1792 begin
kono
parents:
diff changeset
1793 S (1) := SE (U);
kono
parents:
diff changeset
1794 Ada.Streams.Write (Stream.all, S);
kono
parents:
diff changeset
1795 end W_SSU;
kono
parents:
diff changeset
1796
kono
parents:
diff changeset
1797 ----------
kono
parents:
diff changeset
1798 -- W_SU --
kono
parents:
diff changeset
1799 ----------
kono
parents:
diff changeset
1800
kono
parents:
diff changeset
1801 procedure W_SU (Stream : not null access RST; Item : Short_Unsigned) is
kono
parents:
diff changeset
1802 S : XDR_S_SU;
kono
parents:
diff changeset
1803 U : XDR_SU := XDR_SU (Item);
kono
parents:
diff changeset
1804
kono
parents:
diff changeset
1805 begin
kono
parents:
diff changeset
1806 if Optimize_Integers then
kono
parents:
diff changeset
1807 S := Short_Unsigned_To_XDR_S_SU (Item);
kono
parents:
diff changeset
1808
kono
parents:
diff changeset
1809 else
kono
parents:
diff changeset
1810 for N in reverse S'Range loop
kono
parents:
diff changeset
1811 S (N) := SE (U mod BB);
kono
parents:
diff changeset
1812 U := U / BB;
kono
parents:
diff changeset
1813 end loop;
kono
parents:
diff changeset
1814
kono
parents:
diff changeset
1815 if U /= 0 then
kono
parents:
diff changeset
1816 raise Data_Error;
kono
parents:
diff changeset
1817 end if;
kono
parents:
diff changeset
1818 end if;
kono
parents:
diff changeset
1819
kono
parents:
diff changeset
1820 Ada.Streams.Write (Stream.all, S);
kono
parents:
diff changeset
1821 end W_SU;
kono
parents:
diff changeset
1822
kono
parents:
diff changeset
1823 ---------
kono
parents:
diff changeset
1824 -- W_U --
kono
parents:
diff changeset
1825 ---------
kono
parents:
diff changeset
1826
kono
parents:
diff changeset
1827 procedure W_U (Stream : not null access RST; Item : Unsigned) is
kono
parents:
diff changeset
1828 S : XDR_S_U;
kono
parents:
diff changeset
1829 U : XDR_U := XDR_U (Item);
kono
parents:
diff changeset
1830
kono
parents:
diff changeset
1831 begin
kono
parents:
diff changeset
1832 if Optimize_Integers then
kono
parents:
diff changeset
1833 S := Unsigned_To_XDR_S_U (Item);
kono
parents:
diff changeset
1834
kono
parents:
diff changeset
1835 else
kono
parents:
diff changeset
1836 for N in reverse S'Range loop
kono
parents:
diff changeset
1837 S (N) := SE (U mod BB);
kono
parents:
diff changeset
1838 U := U / BB;
kono
parents:
diff changeset
1839 end loop;
kono
parents:
diff changeset
1840
kono
parents:
diff changeset
1841 if U /= 0 then
kono
parents:
diff changeset
1842 raise Data_Error;
kono
parents:
diff changeset
1843 end if;
kono
parents:
diff changeset
1844 end if;
kono
parents:
diff changeset
1845
kono
parents:
diff changeset
1846 Ada.Streams.Write (Stream.all, S);
kono
parents:
diff changeset
1847 end W_U;
kono
parents:
diff changeset
1848
kono
parents:
diff changeset
1849 ----------
kono
parents:
diff changeset
1850 -- W_WC --
kono
parents:
diff changeset
1851 ----------
kono
parents:
diff changeset
1852
kono
parents:
diff changeset
1853 procedure W_WC (Stream : not null access RST; Item : Wide_Character) is
kono
parents:
diff changeset
1854 S : XDR_S_WC;
kono
parents:
diff changeset
1855 U : XDR_WC;
kono
parents:
diff changeset
1856
kono
parents:
diff changeset
1857 begin
kono
parents:
diff changeset
1858 -- Use Ada requirements on Wide_Character representation clause
kono
parents:
diff changeset
1859
kono
parents:
diff changeset
1860 U := XDR_WC (Wide_Character'Pos (Item));
kono
parents:
diff changeset
1861
kono
parents:
diff changeset
1862 for N in reverse S'Range loop
kono
parents:
diff changeset
1863 S (N) := SE (U mod BB);
kono
parents:
diff changeset
1864 U := U / BB;
kono
parents:
diff changeset
1865 end loop;
kono
parents:
diff changeset
1866
kono
parents:
diff changeset
1867 Ada.Streams.Write (Stream.all, S);
kono
parents:
diff changeset
1868
kono
parents:
diff changeset
1869 if U /= 0 then
kono
parents:
diff changeset
1870 raise Data_Error;
kono
parents:
diff changeset
1871 end if;
kono
parents:
diff changeset
1872 end W_WC;
kono
parents:
diff changeset
1873
kono
parents:
diff changeset
1874 -----------
kono
parents:
diff changeset
1875 -- W_WWC --
kono
parents:
diff changeset
1876 -----------
kono
parents:
diff changeset
1877
kono
parents:
diff changeset
1878 procedure W_WWC
kono
parents:
diff changeset
1879 (Stream : not null access RST; Item : Wide_Wide_Character)
kono
parents:
diff changeset
1880 is
kono
parents:
diff changeset
1881 S : XDR_S_WWC;
kono
parents:
diff changeset
1882 U : XDR_WWC;
kono
parents:
diff changeset
1883
kono
parents:
diff changeset
1884 begin
kono
parents:
diff changeset
1885 -- Use Ada requirements on Wide_Wide_Character representation clause
kono
parents:
diff changeset
1886
kono
parents:
diff changeset
1887 U := XDR_WWC (Wide_Wide_Character'Pos (Item));
kono
parents:
diff changeset
1888
kono
parents:
diff changeset
1889 for N in reverse S'Range loop
kono
parents:
diff changeset
1890 S (N) := SE (U mod BB);
kono
parents:
diff changeset
1891 U := U / BB;
kono
parents:
diff changeset
1892 end loop;
kono
parents:
diff changeset
1893
kono
parents:
diff changeset
1894 Ada.Streams.Write (Stream.all, S);
kono
parents:
diff changeset
1895
kono
parents:
diff changeset
1896 if U /= 0 then
kono
parents:
diff changeset
1897 raise Data_Error;
kono
parents:
diff changeset
1898 end if;
kono
parents:
diff changeset
1899 end W_WWC;
kono
parents:
diff changeset
1900
kono
parents:
diff changeset
1901 end System.Stream_Attributes;