annotate gcc/ada/libgnat/i-cobol.adb @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
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 -- I N T E R F A C E S . C O B O L --
kono
parents:
diff changeset
6 -- --
kono
parents:
diff changeset
7 -- B o d y --
kono
parents:
diff changeset
8 -- --
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
9 -- Copyright (C) 1992-2018, Free Software Foundation, Inc. --
111
kono
parents:
diff changeset
10 -- --
kono
parents:
diff changeset
11 -- GNAT 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 -- The body of Interfaces.COBOL is implementation independent (i.e. the same
kono
parents:
diff changeset
33 -- version is used with all versions of GNAT). The specialization to a
kono
parents:
diff changeset
34 -- particular COBOL format is completely contained in the private part of
kono
parents:
diff changeset
35 -- the spec.
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 with Interfaces; use Interfaces;
kono
parents:
diff changeset
38 with System; use System;
kono
parents:
diff changeset
39 with Ada.Unchecked_Conversion;
kono
parents:
diff changeset
40
kono
parents:
diff changeset
41 package body Interfaces.COBOL is
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 -----------------------------------------------
kono
parents:
diff changeset
44 -- Declarations for External Binary Handling --
kono
parents:
diff changeset
45 -----------------------------------------------
kono
parents:
diff changeset
46
kono
parents:
diff changeset
47 subtype B1 is Byte_Array (1 .. 1);
kono
parents:
diff changeset
48 subtype B2 is Byte_Array (1 .. 2);
kono
parents:
diff changeset
49 subtype B4 is Byte_Array (1 .. 4);
kono
parents:
diff changeset
50 subtype B8 is Byte_Array (1 .. 8);
kono
parents:
diff changeset
51 -- Representations for 1,2,4,8 byte binary values
kono
parents:
diff changeset
52
kono
parents:
diff changeset
53 function To_B1 is new Ada.Unchecked_Conversion (Integer_8, B1);
kono
parents:
diff changeset
54 function To_B2 is new Ada.Unchecked_Conversion (Integer_16, B2);
kono
parents:
diff changeset
55 function To_B4 is new Ada.Unchecked_Conversion (Integer_32, B4);
kono
parents:
diff changeset
56 function To_B8 is new Ada.Unchecked_Conversion (Integer_64, B8);
kono
parents:
diff changeset
57 -- Conversions from native binary to external binary
kono
parents:
diff changeset
58
kono
parents:
diff changeset
59 function From_B1 is new Ada.Unchecked_Conversion (B1, Integer_8);
kono
parents:
diff changeset
60 function From_B2 is new Ada.Unchecked_Conversion (B2, Integer_16);
kono
parents:
diff changeset
61 function From_B4 is new Ada.Unchecked_Conversion (B4, Integer_32);
kono
parents:
diff changeset
62 function From_B8 is new Ada.Unchecked_Conversion (B8, Integer_64);
kono
parents:
diff changeset
63 -- Conversions from external binary to signed native binary
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 function From_B1U is new Ada.Unchecked_Conversion (B1, Unsigned_8);
kono
parents:
diff changeset
66 function From_B2U is new Ada.Unchecked_Conversion (B2, Unsigned_16);
kono
parents:
diff changeset
67 function From_B4U is new Ada.Unchecked_Conversion (B4, Unsigned_32);
kono
parents:
diff changeset
68 function From_B8U is new Ada.Unchecked_Conversion (B8, Unsigned_64);
kono
parents:
diff changeset
69 -- Conversions from external binary to unsigned native binary
kono
parents:
diff changeset
70
kono
parents:
diff changeset
71 -----------------------
kono
parents:
diff changeset
72 -- Local Subprograms --
kono
parents:
diff changeset
73 -----------------------
kono
parents:
diff changeset
74
kono
parents:
diff changeset
75 function Binary_To_Decimal
kono
parents:
diff changeset
76 (Item : Byte_Array;
kono
parents:
diff changeset
77 Format : Binary_Format) return Integer_64;
kono
parents:
diff changeset
78 -- This function converts a numeric value in the given format to its
kono
parents:
diff changeset
79 -- corresponding integer value. This is the non-generic implementation
kono
parents:
diff changeset
80 -- of Decimal_Conversions.To_Decimal. The generic routine does the
kono
parents:
diff changeset
81 -- final conversion to the fixed-point format.
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83 function Numeric_To_Decimal
kono
parents:
diff changeset
84 (Item : Numeric;
kono
parents:
diff changeset
85 Format : Display_Format) return Integer_64;
kono
parents:
diff changeset
86 -- This function converts a numeric value in the given format to its
kono
parents:
diff changeset
87 -- corresponding integer value. This is the non-generic implementation
kono
parents:
diff changeset
88 -- of Decimal_Conversions.To_Decimal. The generic routine does the
kono
parents:
diff changeset
89 -- final conversion to the fixed-point format.
kono
parents:
diff changeset
90
kono
parents:
diff changeset
91 function Packed_To_Decimal
kono
parents:
diff changeset
92 (Item : Packed_Decimal;
kono
parents:
diff changeset
93 Format : Packed_Format) return Integer_64;
kono
parents:
diff changeset
94 -- This function converts a packed value in the given format to its
kono
parents:
diff changeset
95 -- corresponding integer value. This is the non-generic implementation
kono
parents:
diff changeset
96 -- of Decimal_Conversions.To_Decimal. The generic routine does the
kono
parents:
diff changeset
97 -- final conversion to the fixed-point format.
kono
parents:
diff changeset
98
kono
parents:
diff changeset
99 procedure Swap (B : in out Byte_Array; F : Binary_Format);
kono
parents:
diff changeset
100 -- Swaps the bytes if required by the binary format F
kono
parents:
diff changeset
101
kono
parents:
diff changeset
102 function To_Display
kono
parents:
diff changeset
103 (Item : Integer_64;
kono
parents:
diff changeset
104 Format : Display_Format;
kono
parents:
diff changeset
105 Length : Natural) return Numeric;
kono
parents:
diff changeset
106 -- This function converts the given integer value into display format,
kono
parents:
diff changeset
107 -- using the given format, with the length in bytes of the result given
kono
parents:
diff changeset
108 -- by the last parameter. This is the non-generic implementation of
kono
parents:
diff changeset
109 -- Decimal_Conversions.To_Display. The conversion of the item from its
kono
parents:
diff changeset
110 -- original decimal format to Integer_64 is done by the generic routine.
kono
parents:
diff changeset
111
kono
parents:
diff changeset
112 function To_Packed
kono
parents:
diff changeset
113 (Item : Integer_64;
kono
parents:
diff changeset
114 Format : Packed_Format;
kono
parents:
diff changeset
115 Length : Natural) return Packed_Decimal;
kono
parents:
diff changeset
116 -- This function converts the given integer value into packed format,
kono
parents:
diff changeset
117 -- using the given format, with the length in digits of the result given
kono
parents:
diff changeset
118 -- by the last parameter. This is the non-generic implementation of
kono
parents:
diff changeset
119 -- Decimal_Conversions.To_Display. The conversion of the item from its
kono
parents:
diff changeset
120 -- original decimal format to Integer_64 is done by the generic routine.
kono
parents:
diff changeset
121
kono
parents:
diff changeset
122 function Valid_Numeric
kono
parents:
diff changeset
123 (Item : Numeric;
kono
parents:
diff changeset
124 Format : Display_Format) return Boolean;
kono
parents:
diff changeset
125 -- This is the non-generic implementation of Decimal_Conversions.Valid
kono
parents:
diff changeset
126 -- for the display case.
kono
parents:
diff changeset
127
kono
parents:
diff changeset
128 function Valid_Packed
kono
parents:
diff changeset
129 (Item : Packed_Decimal;
kono
parents:
diff changeset
130 Format : Packed_Format) return Boolean;
kono
parents:
diff changeset
131 -- This is the non-generic implementation of Decimal_Conversions.Valid
kono
parents:
diff changeset
132 -- for the packed case.
kono
parents:
diff changeset
133
kono
parents:
diff changeset
134 -----------------------
kono
parents:
diff changeset
135 -- Binary_To_Decimal --
kono
parents:
diff changeset
136 -----------------------
kono
parents:
diff changeset
137
kono
parents:
diff changeset
138 function Binary_To_Decimal
kono
parents:
diff changeset
139 (Item : Byte_Array;
kono
parents:
diff changeset
140 Format : Binary_Format) return Integer_64
kono
parents:
diff changeset
141 is
kono
parents:
diff changeset
142 Len : constant Natural := Item'Length;
kono
parents:
diff changeset
143
kono
parents:
diff changeset
144 begin
kono
parents:
diff changeset
145 if Len = 1 then
kono
parents:
diff changeset
146 if Format in Binary_Unsigned_Format then
kono
parents:
diff changeset
147 return Integer_64 (From_B1U (Item));
kono
parents:
diff changeset
148 else
kono
parents:
diff changeset
149 return Integer_64 (From_B1 (Item));
kono
parents:
diff changeset
150 end if;
kono
parents:
diff changeset
151
kono
parents:
diff changeset
152 elsif Len = 2 then
kono
parents:
diff changeset
153 declare
kono
parents:
diff changeset
154 R : B2 := Item;
kono
parents:
diff changeset
155
kono
parents:
diff changeset
156 begin
kono
parents:
diff changeset
157 Swap (R, Format);
kono
parents:
diff changeset
158
kono
parents:
diff changeset
159 if Format in Binary_Unsigned_Format then
kono
parents:
diff changeset
160 return Integer_64 (From_B2U (R));
kono
parents:
diff changeset
161 else
kono
parents:
diff changeset
162 return Integer_64 (From_B2 (R));
kono
parents:
diff changeset
163 end if;
kono
parents:
diff changeset
164 end;
kono
parents:
diff changeset
165
kono
parents:
diff changeset
166 elsif Len = 4 then
kono
parents:
diff changeset
167 declare
kono
parents:
diff changeset
168 R : B4 := Item;
kono
parents:
diff changeset
169
kono
parents:
diff changeset
170 begin
kono
parents:
diff changeset
171 Swap (R, Format);
kono
parents:
diff changeset
172
kono
parents:
diff changeset
173 if Format in Binary_Unsigned_Format then
kono
parents:
diff changeset
174 return Integer_64 (From_B4U (R));
kono
parents:
diff changeset
175 else
kono
parents:
diff changeset
176 return Integer_64 (From_B4 (R));
kono
parents:
diff changeset
177 end if;
kono
parents:
diff changeset
178 end;
kono
parents:
diff changeset
179
kono
parents:
diff changeset
180 elsif Len = 8 then
kono
parents:
diff changeset
181 declare
kono
parents:
diff changeset
182 R : B8 := Item;
kono
parents:
diff changeset
183
kono
parents:
diff changeset
184 begin
kono
parents:
diff changeset
185 Swap (R, Format);
kono
parents:
diff changeset
186
kono
parents:
diff changeset
187 if Format in Binary_Unsigned_Format then
kono
parents:
diff changeset
188 return Integer_64 (From_B8U (R));
kono
parents:
diff changeset
189 else
kono
parents:
diff changeset
190 return Integer_64 (From_B8 (R));
kono
parents:
diff changeset
191 end if;
kono
parents:
diff changeset
192 end;
kono
parents:
diff changeset
193
kono
parents:
diff changeset
194 -- Length is not 1, 2, 4 or 8
kono
parents:
diff changeset
195
kono
parents:
diff changeset
196 else
kono
parents:
diff changeset
197 raise Conversion_Error;
kono
parents:
diff changeset
198 end if;
kono
parents:
diff changeset
199 end Binary_To_Decimal;
kono
parents:
diff changeset
200
kono
parents:
diff changeset
201 ------------------------
kono
parents:
diff changeset
202 -- Numeric_To_Decimal --
kono
parents:
diff changeset
203 ------------------------
kono
parents:
diff changeset
204
kono
parents:
diff changeset
205 -- The following assumptions are made in the coding of this routine:
kono
parents:
diff changeset
206
kono
parents:
diff changeset
207 -- The range of COBOL_Digits is compact and the ten values
kono
parents:
diff changeset
208 -- represent the digits 0-9 in sequence
kono
parents:
diff changeset
209
kono
parents:
diff changeset
210 -- The range of COBOL_Plus_Digits is compact and the ten values
kono
parents:
diff changeset
211 -- represent the digits 0-9 in sequence with a plus sign.
kono
parents:
diff changeset
212
kono
parents:
diff changeset
213 -- The range of COBOL_Minus_Digits is compact and the ten values
kono
parents:
diff changeset
214 -- represent the digits 0-9 in sequence with a minus sign.
kono
parents:
diff changeset
215
kono
parents:
diff changeset
216 -- The COBOL_Minus_Digits set is disjoint from COBOL_Digits
kono
parents:
diff changeset
217
kono
parents:
diff changeset
218 -- These assumptions are true for all COBOL representations we know of
kono
parents:
diff changeset
219
kono
parents:
diff changeset
220 function Numeric_To_Decimal
kono
parents:
diff changeset
221 (Item : Numeric;
kono
parents:
diff changeset
222 Format : Display_Format) return Integer_64
kono
parents:
diff changeset
223 is
kono
parents:
diff changeset
224 pragma Unsuppress (Range_Check);
kono
parents:
diff changeset
225 Sign : COBOL_Character := COBOL_Plus;
kono
parents:
diff changeset
226 Result : Integer_64 := 0;
kono
parents:
diff changeset
227
kono
parents:
diff changeset
228 begin
kono
parents:
diff changeset
229 if not Valid_Numeric (Item, Format) then
kono
parents:
diff changeset
230 raise Conversion_Error;
kono
parents:
diff changeset
231 end if;
kono
parents:
diff changeset
232
kono
parents:
diff changeset
233 for J in Item'Range loop
kono
parents:
diff changeset
234 declare
kono
parents:
diff changeset
235 K : constant COBOL_Character := Item (J);
kono
parents:
diff changeset
236
kono
parents:
diff changeset
237 begin
kono
parents:
diff changeset
238 if K in COBOL_Digits then
kono
parents:
diff changeset
239 Result := Result * 10 +
kono
parents:
diff changeset
240 (COBOL_Character'Pos (K) -
kono
parents:
diff changeset
241 COBOL_Character'Pos (COBOL_Digits'First));
kono
parents:
diff changeset
242
kono
parents:
diff changeset
243 elsif K in COBOL_Plus_Digits then
kono
parents:
diff changeset
244 Result := Result * 10 +
kono
parents:
diff changeset
245 (COBOL_Character'Pos (K) -
kono
parents:
diff changeset
246 COBOL_Character'Pos (COBOL_Plus_Digits'First));
kono
parents:
diff changeset
247
kono
parents:
diff changeset
248 elsif K in COBOL_Minus_Digits then
kono
parents:
diff changeset
249 Result := Result * 10 +
kono
parents:
diff changeset
250 (COBOL_Character'Pos (K) -
kono
parents:
diff changeset
251 COBOL_Character'Pos (COBOL_Minus_Digits'First));
kono
parents:
diff changeset
252 Sign := COBOL_Minus;
kono
parents:
diff changeset
253
kono
parents:
diff changeset
254 -- Only remaining possibility is COBOL_Plus or COBOL_Minus
kono
parents:
diff changeset
255
kono
parents:
diff changeset
256 else
kono
parents:
diff changeset
257 Sign := K;
kono
parents:
diff changeset
258 end if;
kono
parents:
diff changeset
259 end;
kono
parents:
diff changeset
260 end loop;
kono
parents:
diff changeset
261
kono
parents:
diff changeset
262 if Sign = COBOL_Plus then
kono
parents:
diff changeset
263 return Result;
kono
parents:
diff changeset
264 else
kono
parents:
diff changeset
265 return -Result;
kono
parents:
diff changeset
266 end if;
kono
parents:
diff changeset
267
kono
parents:
diff changeset
268 exception
kono
parents:
diff changeset
269 when Constraint_Error =>
kono
parents:
diff changeset
270 raise Conversion_Error;
kono
parents:
diff changeset
271
kono
parents:
diff changeset
272 end Numeric_To_Decimal;
kono
parents:
diff changeset
273
kono
parents:
diff changeset
274 -----------------------
kono
parents:
diff changeset
275 -- Packed_To_Decimal --
kono
parents:
diff changeset
276 -----------------------
kono
parents:
diff changeset
277
kono
parents:
diff changeset
278 function Packed_To_Decimal
kono
parents:
diff changeset
279 (Item : Packed_Decimal;
kono
parents:
diff changeset
280 Format : Packed_Format) return Integer_64
kono
parents:
diff changeset
281 is
kono
parents:
diff changeset
282 pragma Unsuppress (Range_Check);
kono
parents:
diff changeset
283 Result : Integer_64 := 0;
kono
parents:
diff changeset
284 Sign : constant Decimal_Element := Item (Item'Last);
kono
parents:
diff changeset
285
kono
parents:
diff changeset
286 begin
kono
parents:
diff changeset
287 if not Valid_Packed (Item, Format) then
kono
parents:
diff changeset
288 raise Conversion_Error;
kono
parents:
diff changeset
289 end if;
kono
parents:
diff changeset
290
kono
parents:
diff changeset
291 case Packed_Representation is
kono
parents:
diff changeset
292 when IBM =>
kono
parents:
diff changeset
293 for J in Item'First .. Item'Last - 1 loop
kono
parents:
diff changeset
294 Result := Result * 10 + Integer_64 (Item (J));
kono
parents:
diff changeset
295 end loop;
kono
parents:
diff changeset
296
kono
parents:
diff changeset
297 if Sign = 16#0B# or else Sign = 16#0D# then
kono
parents:
diff changeset
298 return -Result;
kono
parents:
diff changeset
299 else
kono
parents:
diff changeset
300 return +Result;
kono
parents:
diff changeset
301 end if;
kono
parents:
diff changeset
302 end case;
kono
parents:
diff changeset
303
kono
parents:
diff changeset
304 exception
kono
parents:
diff changeset
305 when Constraint_Error =>
kono
parents:
diff changeset
306 raise Conversion_Error;
kono
parents:
diff changeset
307 end Packed_To_Decimal;
kono
parents:
diff changeset
308
kono
parents:
diff changeset
309 ----------
kono
parents:
diff changeset
310 -- Swap --
kono
parents:
diff changeset
311 ----------
kono
parents:
diff changeset
312
kono
parents:
diff changeset
313 procedure Swap (B : in out Byte_Array; F : Binary_Format) is
kono
parents:
diff changeset
314 Little_Endian : constant Boolean :=
kono
parents:
diff changeset
315 System.Default_Bit_Order = System.Low_Order_First;
kono
parents:
diff changeset
316
kono
parents:
diff changeset
317 begin
kono
parents:
diff changeset
318 -- Return if no swap needed
kono
parents:
diff changeset
319
kono
parents:
diff changeset
320 case F is
kono
parents:
diff changeset
321 when H | HU =>
kono
parents:
diff changeset
322 if not Little_Endian then
kono
parents:
diff changeset
323 return;
kono
parents:
diff changeset
324 end if;
kono
parents:
diff changeset
325
kono
parents:
diff changeset
326 when L | LU =>
kono
parents:
diff changeset
327 if Little_Endian then
kono
parents:
diff changeset
328 return;
kono
parents:
diff changeset
329 end if;
kono
parents:
diff changeset
330
kono
parents:
diff changeset
331 when N | NU =>
kono
parents:
diff changeset
332 return;
kono
parents:
diff changeset
333 end case;
kono
parents:
diff changeset
334
kono
parents:
diff changeset
335 -- Here a swap is needed
kono
parents:
diff changeset
336
kono
parents:
diff changeset
337 declare
kono
parents:
diff changeset
338 Len : constant Natural := B'Length;
kono
parents:
diff changeset
339
kono
parents:
diff changeset
340 begin
kono
parents:
diff changeset
341 for J in 1 .. Len / 2 loop
kono
parents:
diff changeset
342 declare
kono
parents:
diff changeset
343 Temp : constant Byte := B (J);
kono
parents:
diff changeset
344
kono
parents:
diff changeset
345 begin
kono
parents:
diff changeset
346 B (J) := B (Len + 1 - J);
kono
parents:
diff changeset
347 B (Len + 1 - J) := Temp;
kono
parents:
diff changeset
348 end;
kono
parents:
diff changeset
349 end loop;
kono
parents:
diff changeset
350 end;
kono
parents:
diff changeset
351 end Swap;
kono
parents:
diff changeset
352
kono
parents:
diff changeset
353 -----------------------
kono
parents:
diff changeset
354 -- To_Ada (function) --
kono
parents:
diff changeset
355 -----------------------
kono
parents:
diff changeset
356
kono
parents:
diff changeset
357 function To_Ada (Item : Alphanumeric) return String is
kono
parents:
diff changeset
358 Result : String (Item'Range);
kono
parents:
diff changeset
359
kono
parents:
diff changeset
360 begin
kono
parents:
diff changeset
361 for J in Item'Range loop
kono
parents:
diff changeset
362 Result (J) := COBOL_To_Ada (Item (J));
kono
parents:
diff changeset
363 end loop;
kono
parents:
diff changeset
364
kono
parents:
diff changeset
365 return Result;
kono
parents:
diff changeset
366 end To_Ada;
kono
parents:
diff changeset
367
kono
parents:
diff changeset
368 ------------------------
kono
parents:
diff changeset
369 -- To_Ada (procedure) --
kono
parents:
diff changeset
370 ------------------------
kono
parents:
diff changeset
371
kono
parents:
diff changeset
372 procedure To_Ada
kono
parents:
diff changeset
373 (Item : Alphanumeric;
kono
parents:
diff changeset
374 Target : out String;
kono
parents:
diff changeset
375 Last : out Natural)
kono
parents:
diff changeset
376 is
kono
parents:
diff changeset
377 Last_Val : Integer;
kono
parents:
diff changeset
378
kono
parents:
diff changeset
379 begin
kono
parents:
diff changeset
380 if Item'Length > Target'Length then
kono
parents:
diff changeset
381 raise Constraint_Error;
kono
parents:
diff changeset
382 end if;
kono
parents:
diff changeset
383
kono
parents:
diff changeset
384 Last_Val := Target'First - 1;
kono
parents:
diff changeset
385 for J in Item'Range loop
kono
parents:
diff changeset
386 Last_Val := Last_Val + 1;
kono
parents:
diff changeset
387 Target (Last_Val) := COBOL_To_Ada (Item (J));
kono
parents:
diff changeset
388 end loop;
kono
parents:
diff changeset
389
kono
parents:
diff changeset
390 Last := Last_Val;
kono
parents:
diff changeset
391 end To_Ada;
kono
parents:
diff changeset
392
kono
parents:
diff changeset
393 -------------------------
kono
parents:
diff changeset
394 -- To_COBOL (function) --
kono
parents:
diff changeset
395 -------------------------
kono
parents:
diff changeset
396
kono
parents:
diff changeset
397 function To_COBOL (Item : String) return Alphanumeric is
kono
parents:
diff changeset
398 Result : Alphanumeric (Item'Range);
kono
parents:
diff changeset
399
kono
parents:
diff changeset
400 begin
kono
parents:
diff changeset
401 for J in Item'Range loop
kono
parents:
diff changeset
402 Result (J) := Ada_To_COBOL (Item (J));
kono
parents:
diff changeset
403 end loop;
kono
parents:
diff changeset
404
kono
parents:
diff changeset
405 return Result;
kono
parents:
diff changeset
406 end To_COBOL;
kono
parents:
diff changeset
407
kono
parents:
diff changeset
408 --------------------------
kono
parents:
diff changeset
409 -- To_COBOL (procedure) --
kono
parents:
diff changeset
410 --------------------------
kono
parents:
diff changeset
411
kono
parents:
diff changeset
412 procedure To_COBOL
kono
parents:
diff changeset
413 (Item : String;
kono
parents:
diff changeset
414 Target : out Alphanumeric;
kono
parents:
diff changeset
415 Last : out Natural)
kono
parents:
diff changeset
416 is
kono
parents:
diff changeset
417 Last_Val : Integer;
kono
parents:
diff changeset
418
kono
parents:
diff changeset
419 begin
kono
parents:
diff changeset
420 if Item'Length > Target'Length then
kono
parents:
diff changeset
421 raise Constraint_Error;
kono
parents:
diff changeset
422 end if;
kono
parents:
diff changeset
423
kono
parents:
diff changeset
424 Last_Val := Target'First - 1;
kono
parents:
diff changeset
425 for J in Item'Range loop
kono
parents:
diff changeset
426 Last_Val := Last_Val + 1;
kono
parents:
diff changeset
427 Target (Last_Val) := Ada_To_COBOL (Item (J));
kono
parents:
diff changeset
428 end loop;
kono
parents:
diff changeset
429
kono
parents:
diff changeset
430 Last := Last_Val;
kono
parents:
diff changeset
431 end To_COBOL;
kono
parents:
diff changeset
432
kono
parents:
diff changeset
433 ----------------
kono
parents:
diff changeset
434 -- To_Display --
kono
parents:
diff changeset
435 ----------------
kono
parents:
diff changeset
436
kono
parents:
diff changeset
437 function To_Display
kono
parents:
diff changeset
438 (Item : Integer_64;
kono
parents:
diff changeset
439 Format : Display_Format;
kono
parents:
diff changeset
440 Length : Natural) return Numeric
kono
parents:
diff changeset
441 is
kono
parents:
diff changeset
442 Result : Numeric (1 .. Length);
kono
parents:
diff changeset
443 Val : Integer_64 := Item;
kono
parents:
diff changeset
444
kono
parents:
diff changeset
445 procedure Convert (First, Last : Natural);
kono
parents:
diff changeset
446 -- Convert the number in Val into COBOL_Digits, storing the result
kono
parents:
diff changeset
447 -- in Result (First .. Last). Raise Conversion_Error if too large.
kono
parents:
diff changeset
448
kono
parents:
diff changeset
449 procedure Embed_Sign (Loc : Natural);
kono
parents:
diff changeset
450 -- Used for the nonseparate formats to embed the appropriate sign
kono
parents:
diff changeset
451 -- at the specified location (i.e. at Result (Loc))
kono
parents:
diff changeset
452
kono
parents:
diff changeset
453 -------------
kono
parents:
diff changeset
454 -- Convert --
kono
parents:
diff changeset
455 -------------
kono
parents:
diff changeset
456
kono
parents:
diff changeset
457 procedure Convert (First, Last : Natural) is
kono
parents:
diff changeset
458 J : Natural;
kono
parents:
diff changeset
459
kono
parents:
diff changeset
460 begin
kono
parents:
diff changeset
461 J := Last;
kono
parents:
diff changeset
462 while J >= First loop
kono
parents:
diff changeset
463 Result (J) :=
kono
parents:
diff changeset
464 COBOL_Character'Val
kono
parents:
diff changeset
465 (COBOL_Character'Pos (COBOL_Digits'First) +
kono
parents:
diff changeset
466 Integer (Val mod 10));
kono
parents:
diff changeset
467 Val := Val / 10;
kono
parents:
diff changeset
468
kono
parents:
diff changeset
469 if Val = 0 then
kono
parents:
diff changeset
470 for K in First .. J - 1 loop
kono
parents:
diff changeset
471 Result (J) := COBOL_Digits'First;
kono
parents:
diff changeset
472 end loop;
kono
parents:
diff changeset
473
kono
parents:
diff changeset
474 return;
kono
parents:
diff changeset
475
kono
parents:
diff changeset
476 else
kono
parents:
diff changeset
477 J := J - 1;
kono
parents:
diff changeset
478 end if;
kono
parents:
diff changeset
479 end loop;
kono
parents:
diff changeset
480
kono
parents:
diff changeset
481 raise Conversion_Error;
kono
parents:
diff changeset
482 end Convert;
kono
parents:
diff changeset
483
kono
parents:
diff changeset
484 ----------------
kono
parents:
diff changeset
485 -- Embed_Sign --
kono
parents:
diff changeset
486 ----------------
kono
parents:
diff changeset
487
kono
parents:
diff changeset
488 procedure Embed_Sign (Loc : Natural) is
kono
parents:
diff changeset
489 Digit : Natural range 0 .. 9;
kono
parents:
diff changeset
490
kono
parents:
diff changeset
491 begin
kono
parents:
diff changeset
492 Digit := COBOL_Character'Pos (Result (Loc)) -
kono
parents:
diff changeset
493 COBOL_Character'Pos (COBOL_Digits'First);
kono
parents:
diff changeset
494
kono
parents:
diff changeset
495 if Item >= 0 then
kono
parents:
diff changeset
496 Result (Loc) :=
kono
parents:
diff changeset
497 COBOL_Character'Val
kono
parents:
diff changeset
498 (COBOL_Character'Pos (COBOL_Plus_Digits'First) + Digit);
kono
parents:
diff changeset
499 else
kono
parents:
diff changeset
500 Result (Loc) :=
kono
parents:
diff changeset
501 COBOL_Character'Val
kono
parents:
diff changeset
502 (COBOL_Character'Pos (COBOL_Minus_Digits'First) + Digit);
kono
parents:
diff changeset
503 end if;
kono
parents:
diff changeset
504 end Embed_Sign;
kono
parents:
diff changeset
505
kono
parents:
diff changeset
506 -- Start of processing for To_Display
kono
parents:
diff changeset
507
kono
parents:
diff changeset
508 begin
kono
parents:
diff changeset
509 case Format is
kono
parents:
diff changeset
510 when Unsigned =>
kono
parents:
diff changeset
511 if Val < 0 then
kono
parents:
diff changeset
512 raise Conversion_Error;
kono
parents:
diff changeset
513 else
kono
parents:
diff changeset
514 Convert (1, Length);
kono
parents:
diff changeset
515 end if;
kono
parents:
diff changeset
516
kono
parents:
diff changeset
517 when Leading_Separate =>
kono
parents:
diff changeset
518 if Val < 0 then
kono
parents:
diff changeset
519 Result (1) := COBOL_Minus;
kono
parents:
diff changeset
520 Val := -Val;
kono
parents:
diff changeset
521 else
kono
parents:
diff changeset
522 Result (1) := COBOL_Plus;
kono
parents:
diff changeset
523 end if;
kono
parents:
diff changeset
524
kono
parents:
diff changeset
525 Convert (2, Length);
kono
parents:
diff changeset
526
kono
parents:
diff changeset
527 when Trailing_Separate =>
kono
parents:
diff changeset
528 if Val < 0 then
kono
parents:
diff changeset
529 Result (Length) := COBOL_Minus;
kono
parents:
diff changeset
530 Val := -Val;
kono
parents:
diff changeset
531 else
kono
parents:
diff changeset
532 Result (Length) := COBOL_Plus;
kono
parents:
diff changeset
533 end if;
kono
parents:
diff changeset
534
kono
parents:
diff changeset
535 Convert (1, Length - 1);
kono
parents:
diff changeset
536
kono
parents:
diff changeset
537 when Leading_Nonseparate =>
kono
parents:
diff changeset
538 Val := abs Val;
kono
parents:
diff changeset
539 Convert (1, Length);
kono
parents:
diff changeset
540 Embed_Sign (1);
kono
parents:
diff changeset
541
kono
parents:
diff changeset
542 when Trailing_Nonseparate =>
kono
parents:
diff changeset
543 Val := abs Val;
kono
parents:
diff changeset
544 Convert (1, Length);
kono
parents:
diff changeset
545 Embed_Sign (Length);
kono
parents:
diff changeset
546 end case;
kono
parents:
diff changeset
547
kono
parents:
diff changeset
548 return Result;
kono
parents:
diff changeset
549 end To_Display;
kono
parents:
diff changeset
550
kono
parents:
diff changeset
551 ---------------
kono
parents:
diff changeset
552 -- To_Packed --
kono
parents:
diff changeset
553 ---------------
kono
parents:
diff changeset
554
kono
parents:
diff changeset
555 function To_Packed
kono
parents:
diff changeset
556 (Item : Integer_64;
kono
parents:
diff changeset
557 Format : Packed_Format;
kono
parents:
diff changeset
558 Length : Natural) return Packed_Decimal
kono
parents:
diff changeset
559 is
kono
parents:
diff changeset
560 Result : Packed_Decimal (1 .. Length);
kono
parents:
diff changeset
561 Val : Integer_64;
kono
parents:
diff changeset
562
kono
parents:
diff changeset
563 procedure Convert (First, Last : Natural);
kono
parents:
diff changeset
564 -- Convert the number in Val into a sequence of Decimal_Element values,
kono
parents:
diff changeset
565 -- storing the result in Result (First .. Last). Raise Conversion_Error
kono
parents:
diff changeset
566 -- if the value is too large to fit.
kono
parents:
diff changeset
567
kono
parents:
diff changeset
568 -------------
kono
parents:
diff changeset
569 -- Convert --
kono
parents:
diff changeset
570 -------------
kono
parents:
diff changeset
571
kono
parents:
diff changeset
572 procedure Convert (First, Last : Natural) is
kono
parents:
diff changeset
573 J : Natural := Last;
kono
parents:
diff changeset
574
kono
parents:
diff changeset
575 begin
kono
parents:
diff changeset
576 while J >= First loop
kono
parents:
diff changeset
577 Result (J) := Decimal_Element (Val mod 10);
kono
parents:
diff changeset
578
kono
parents:
diff changeset
579 Val := Val / 10;
kono
parents:
diff changeset
580
kono
parents:
diff changeset
581 if Val = 0 then
kono
parents:
diff changeset
582 for K in First .. J - 1 loop
kono
parents:
diff changeset
583 Result (K) := 0;
kono
parents:
diff changeset
584 end loop;
kono
parents:
diff changeset
585
kono
parents:
diff changeset
586 return;
kono
parents:
diff changeset
587
kono
parents:
diff changeset
588 else
kono
parents:
diff changeset
589 J := J - 1;
kono
parents:
diff changeset
590 end if;
kono
parents:
diff changeset
591 end loop;
kono
parents:
diff changeset
592
kono
parents:
diff changeset
593 raise Conversion_Error;
kono
parents:
diff changeset
594 end Convert;
kono
parents:
diff changeset
595
kono
parents:
diff changeset
596 -- Start of processing for To_Packed
kono
parents:
diff changeset
597
kono
parents:
diff changeset
598 begin
kono
parents:
diff changeset
599 case Packed_Representation is
kono
parents:
diff changeset
600 when IBM =>
kono
parents:
diff changeset
601 if Format = Packed_Unsigned then
kono
parents:
diff changeset
602 if Item < 0 then
kono
parents:
diff changeset
603 raise Conversion_Error;
kono
parents:
diff changeset
604 else
kono
parents:
diff changeset
605 Result (Length) := 16#F#;
kono
parents:
diff changeset
606 Val := Item;
kono
parents:
diff changeset
607 end if;
kono
parents:
diff changeset
608
kono
parents:
diff changeset
609 elsif Item >= 0 then
kono
parents:
diff changeset
610 Result (Length) := 16#C#;
kono
parents:
diff changeset
611 Val := Item;
kono
parents:
diff changeset
612
kono
parents:
diff changeset
613 else -- Item < 0
kono
parents:
diff changeset
614 Result (Length) := 16#D#;
kono
parents:
diff changeset
615 Val := -Item;
kono
parents:
diff changeset
616 end if;
kono
parents:
diff changeset
617
kono
parents:
diff changeset
618 Convert (1, Length - 1);
kono
parents:
diff changeset
619 return Result;
kono
parents:
diff changeset
620 end case;
kono
parents:
diff changeset
621 end To_Packed;
kono
parents:
diff changeset
622
kono
parents:
diff changeset
623 -------------------
kono
parents:
diff changeset
624 -- Valid_Numeric --
kono
parents:
diff changeset
625 -------------------
kono
parents:
diff changeset
626
kono
parents:
diff changeset
627 function Valid_Numeric
kono
parents:
diff changeset
628 (Item : Numeric;
kono
parents:
diff changeset
629 Format : Display_Format) return Boolean
kono
parents:
diff changeset
630 is
kono
parents:
diff changeset
631 begin
kono
parents:
diff changeset
632 if Item'Length = 0 then
kono
parents:
diff changeset
633 return False;
kono
parents:
diff changeset
634 end if;
kono
parents:
diff changeset
635
kono
parents:
diff changeset
636 -- All character positions except first and last must be Digits.
kono
parents:
diff changeset
637 -- This is true for all the formats.
kono
parents:
diff changeset
638
kono
parents:
diff changeset
639 for J in Item'First + 1 .. Item'Last - 1 loop
kono
parents:
diff changeset
640 if Item (J) not in COBOL_Digits then
kono
parents:
diff changeset
641 return False;
kono
parents:
diff changeset
642 end if;
kono
parents:
diff changeset
643 end loop;
kono
parents:
diff changeset
644
kono
parents:
diff changeset
645 case Format is
kono
parents:
diff changeset
646 when Unsigned =>
kono
parents:
diff changeset
647 return Item (Item'First) in COBOL_Digits
kono
parents:
diff changeset
648 and then Item (Item'Last) in COBOL_Digits;
kono
parents:
diff changeset
649
kono
parents:
diff changeset
650 when Leading_Separate =>
kono
parents:
diff changeset
651 return (Item (Item'First) = COBOL_Plus or else
kono
parents:
diff changeset
652 Item (Item'First) = COBOL_Minus)
kono
parents:
diff changeset
653 and then Item (Item'Last) in COBOL_Digits;
kono
parents:
diff changeset
654
kono
parents:
diff changeset
655 when Trailing_Separate =>
kono
parents:
diff changeset
656 return Item (Item'First) in COBOL_Digits
kono
parents:
diff changeset
657 and then
kono
parents:
diff changeset
658 (Item (Item'Last) = COBOL_Plus or else
kono
parents:
diff changeset
659 Item (Item'Last) = COBOL_Minus);
kono
parents:
diff changeset
660
kono
parents:
diff changeset
661 when Leading_Nonseparate =>
kono
parents:
diff changeset
662 return (Item (Item'First) in COBOL_Plus_Digits or else
kono
parents:
diff changeset
663 Item (Item'First) in COBOL_Minus_Digits)
kono
parents:
diff changeset
664 and then Item (Item'Last) in COBOL_Digits;
kono
parents:
diff changeset
665
kono
parents:
diff changeset
666 when Trailing_Nonseparate =>
kono
parents:
diff changeset
667 return Item (Item'First) in COBOL_Digits
kono
parents:
diff changeset
668 and then
kono
parents:
diff changeset
669 (Item (Item'Last) in COBOL_Plus_Digits or else
kono
parents:
diff changeset
670 Item (Item'Last) in COBOL_Minus_Digits);
kono
parents:
diff changeset
671
kono
parents:
diff changeset
672 end case;
kono
parents:
diff changeset
673 end Valid_Numeric;
kono
parents:
diff changeset
674
kono
parents:
diff changeset
675 ------------------
kono
parents:
diff changeset
676 -- Valid_Packed --
kono
parents:
diff changeset
677 ------------------
kono
parents:
diff changeset
678
kono
parents:
diff changeset
679 function Valid_Packed
kono
parents:
diff changeset
680 (Item : Packed_Decimal;
kono
parents:
diff changeset
681 Format : Packed_Format) return Boolean
kono
parents:
diff changeset
682 is
kono
parents:
diff changeset
683 begin
kono
parents:
diff changeset
684 case Packed_Representation is
kono
parents:
diff changeset
685 when IBM =>
kono
parents:
diff changeset
686 for J in Item'First .. Item'Last - 1 loop
kono
parents:
diff changeset
687 if Item (J) > 9 then
kono
parents:
diff changeset
688 return False;
kono
parents:
diff changeset
689 end if;
kono
parents:
diff changeset
690 end loop;
kono
parents:
diff changeset
691
kono
parents:
diff changeset
692 -- For unsigned, sign digit must be F
kono
parents:
diff changeset
693
kono
parents:
diff changeset
694 if Format = Packed_Unsigned then
kono
parents:
diff changeset
695 return Item (Item'Last) = 16#F#;
kono
parents:
diff changeset
696
kono
parents:
diff changeset
697 -- For signed, accept all standard and non-standard signs
kono
parents:
diff changeset
698
kono
parents:
diff changeset
699 else
kono
parents:
diff changeset
700 return Item (Item'Last) in 16#A# .. 16#F#;
kono
parents:
diff changeset
701 end if;
kono
parents:
diff changeset
702 end case;
kono
parents:
diff changeset
703 end Valid_Packed;
kono
parents:
diff changeset
704
kono
parents:
diff changeset
705 -------------------------
kono
parents:
diff changeset
706 -- Decimal_Conversions --
kono
parents:
diff changeset
707 -------------------------
kono
parents:
diff changeset
708
kono
parents:
diff changeset
709 package body Decimal_Conversions is
kono
parents:
diff changeset
710
kono
parents:
diff changeset
711 ---------------------
kono
parents:
diff changeset
712 -- Length (binary) --
kono
parents:
diff changeset
713 ---------------------
kono
parents:
diff changeset
714
kono
parents:
diff changeset
715 -- Note that the tests here are all compile time tests
kono
parents:
diff changeset
716
kono
parents:
diff changeset
717 function Length (Format : Binary_Format) return Natural is
kono
parents:
diff changeset
718 pragma Unreferenced (Format);
kono
parents:
diff changeset
719 begin
kono
parents:
diff changeset
720 if Num'Digits <= 2 then
kono
parents:
diff changeset
721 return 1;
kono
parents:
diff changeset
722 elsif Num'Digits <= 4 then
kono
parents:
diff changeset
723 return 2;
kono
parents:
diff changeset
724 elsif Num'Digits <= 9 then
kono
parents:
diff changeset
725 return 4;
kono
parents:
diff changeset
726 else -- Num'Digits in 10 .. 18
kono
parents:
diff changeset
727 return 8;
kono
parents:
diff changeset
728 end if;
kono
parents:
diff changeset
729 end Length;
kono
parents:
diff changeset
730
kono
parents:
diff changeset
731 ----------------------
kono
parents:
diff changeset
732 -- Length (display) --
kono
parents:
diff changeset
733 ----------------------
kono
parents:
diff changeset
734
kono
parents:
diff changeset
735 function Length (Format : Display_Format) return Natural is
kono
parents:
diff changeset
736 begin
kono
parents:
diff changeset
737 if Format = Leading_Separate or else Format = Trailing_Separate then
kono
parents:
diff changeset
738 return Num'Digits + 1;
kono
parents:
diff changeset
739 else
kono
parents:
diff changeset
740 return Num'Digits;
kono
parents:
diff changeset
741 end if;
kono
parents:
diff changeset
742 end Length;
kono
parents:
diff changeset
743
kono
parents:
diff changeset
744 ---------------------
kono
parents:
diff changeset
745 -- Length (packed) --
kono
parents:
diff changeset
746 ---------------------
kono
parents:
diff changeset
747
kono
parents:
diff changeset
748 -- Note that the tests here are all compile time checks
kono
parents:
diff changeset
749
kono
parents:
diff changeset
750 function Length
kono
parents:
diff changeset
751 (Format : Packed_Format) return Natural
kono
parents:
diff changeset
752 is
kono
parents:
diff changeset
753 pragma Unreferenced (Format);
kono
parents:
diff changeset
754 begin
kono
parents:
diff changeset
755 case Packed_Representation is
kono
parents:
diff changeset
756 when IBM =>
kono
parents:
diff changeset
757 return (Num'Digits + 2) / 2 * 2;
kono
parents:
diff changeset
758 end case;
kono
parents:
diff changeset
759 end Length;
kono
parents:
diff changeset
760
kono
parents:
diff changeset
761 ---------------
kono
parents:
diff changeset
762 -- To_Binary --
kono
parents:
diff changeset
763 ---------------
kono
parents:
diff changeset
764
kono
parents:
diff changeset
765 function To_Binary
kono
parents:
diff changeset
766 (Item : Num;
kono
parents:
diff changeset
767 Format : Binary_Format) return Byte_Array
kono
parents:
diff changeset
768 is
kono
parents:
diff changeset
769 begin
kono
parents:
diff changeset
770 -- Note: all these tests are compile time tests
kono
parents:
diff changeset
771
kono
parents:
diff changeset
772 if Num'Digits <= 2 then
kono
parents:
diff changeset
773 return To_B1 (Integer_8'Integer_Value (Item));
kono
parents:
diff changeset
774
kono
parents:
diff changeset
775 elsif Num'Digits <= 4 then
kono
parents:
diff changeset
776 declare
kono
parents:
diff changeset
777 R : B2 := To_B2 (Integer_16'Integer_Value (Item));
kono
parents:
diff changeset
778
kono
parents:
diff changeset
779 begin
kono
parents:
diff changeset
780 Swap (R, Format);
kono
parents:
diff changeset
781 return R;
kono
parents:
diff changeset
782 end;
kono
parents:
diff changeset
783
kono
parents:
diff changeset
784 elsif Num'Digits <= 9 then
kono
parents:
diff changeset
785 declare
kono
parents:
diff changeset
786 R : B4 := To_B4 (Integer_32'Integer_Value (Item));
kono
parents:
diff changeset
787
kono
parents:
diff changeset
788 begin
kono
parents:
diff changeset
789 Swap (R, Format);
kono
parents:
diff changeset
790 return R;
kono
parents:
diff changeset
791 end;
kono
parents:
diff changeset
792
kono
parents:
diff changeset
793 else -- Num'Digits in 10 .. 18
kono
parents:
diff changeset
794 declare
kono
parents:
diff changeset
795 R : B8 := To_B8 (Integer_64'Integer_Value (Item));
kono
parents:
diff changeset
796
kono
parents:
diff changeset
797 begin
kono
parents:
diff changeset
798 Swap (R, Format);
kono
parents:
diff changeset
799 return R;
kono
parents:
diff changeset
800 end;
kono
parents:
diff changeset
801 end if;
kono
parents:
diff changeset
802
kono
parents:
diff changeset
803 exception
kono
parents:
diff changeset
804 when Constraint_Error =>
kono
parents:
diff changeset
805 raise Conversion_Error;
kono
parents:
diff changeset
806 end To_Binary;
kono
parents:
diff changeset
807
kono
parents:
diff changeset
808 ---------------------------------
kono
parents:
diff changeset
809 -- To_Binary (internal binary) --
kono
parents:
diff changeset
810 ---------------------------------
kono
parents:
diff changeset
811
kono
parents:
diff changeset
812 function To_Binary (Item : Num) return Binary is
kono
parents:
diff changeset
813 pragma Unsuppress (Range_Check);
kono
parents:
diff changeset
814 begin
kono
parents:
diff changeset
815 return Binary'Integer_Value (Item);
kono
parents:
diff changeset
816 exception
kono
parents:
diff changeset
817 when Constraint_Error =>
kono
parents:
diff changeset
818 raise Conversion_Error;
kono
parents:
diff changeset
819 end To_Binary;
kono
parents:
diff changeset
820
kono
parents:
diff changeset
821 -------------------------
kono
parents:
diff changeset
822 -- To_Decimal (binary) --
kono
parents:
diff changeset
823 -------------------------
kono
parents:
diff changeset
824
kono
parents:
diff changeset
825 function To_Decimal
kono
parents:
diff changeset
826 (Item : Byte_Array;
kono
parents:
diff changeset
827 Format : Binary_Format) return Num
kono
parents:
diff changeset
828 is
kono
parents:
diff changeset
829 pragma Unsuppress (Range_Check);
kono
parents:
diff changeset
830 begin
kono
parents:
diff changeset
831 return Num'Fixed_Value (Binary_To_Decimal (Item, Format));
kono
parents:
diff changeset
832 exception
kono
parents:
diff changeset
833 when Constraint_Error =>
kono
parents:
diff changeset
834 raise Conversion_Error;
kono
parents:
diff changeset
835 end To_Decimal;
kono
parents:
diff changeset
836
kono
parents:
diff changeset
837 ----------------------------------
kono
parents:
diff changeset
838 -- To_Decimal (internal binary) --
kono
parents:
diff changeset
839 ----------------------------------
kono
parents:
diff changeset
840
kono
parents:
diff changeset
841 function To_Decimal (Item : Binary) return Num is
kono
parents:
diff changeset
842 pragma Unsuppress (Range_Check);
kono
parents:
diff changeset
843 begin
kono
parents:
diff changeset
844 return Num'Fixed_Value (Item);
kono
parents:
diff changeset
845 exception
kono
parents:
diff changeset
846 when Constraint_Error =>
kono
parents:
diff changeset
847 raise Conversion_Error;
kono
parents:
diff changeset
848 end To_Decimal;
kono
parents:
diff changeset
849
kono
parents:
diff changeset
850 --------------------------
kono
parents:
diff changeset
851 -- To_Decimal (display) --
kono
parents:
diff changeset
852 --------------------------
kono
parents:
diff changeset
853
kono
parents:
diff changeset
854 function To_Decimal
kono
parents:
diff changeset
855 (Item : Numeric;
kono
parents:
diff changeset
856 Format : Display_Format) return Num
kono
parents:
diff changeset
857 is
kono
parents:
diff changeset
858 pragma Unsuppress (Range_Check);
kono
parents:
diff changeset
859
kono
parents:
diff changeset
860 begin
kono
parents:
diff changeset
861 return Num'Fixed_Value (Numeric_To_Decimal (Item, Format));
kono
parents:
diff changeset
862 exception
kono
parents:
diff changeset
863 when Constraint_Error =>
kono
parents:
diff changeset
864 raise Conversion_Error;
kono
parents:
diff changeset
865 end To_Decimal;
kono
parents:
diff changeset
866
kono
parents:
diff changeset
867 ---------------------------------------
kono
parents:
diff changeset
868 -- To_Decimal (internal long binary) --
kono
parents:
diff changeset
869 ---------------------------------------
kono
parents:
diff changeset
870
kono
parents:
diff changeset
871 function To_Decimal (Item : Long_Binary) return Num is
kono
parents:
diff changeset
872 pragma Unsuppress (Range_Check);
kono
parents:
diff changeset
873 begin
kono
parents:
diff changeset
874 return Num'Fixed_Value (Item);
kono
parents:
diff changeset
875 exception
kono
parents:
diff changeset
876 when Constraint_Error =>
kono
parents:
diff changeset
877 raise Conversion_Error;
kono
parents:
diff changeset
878 end To_Decimal;
kono
parents:
diff changeset
879
kono
parents:
diff changeset
880 -------------------------
kono
parents:
diff changeset
881 -- To_Decimal (packed) --
kono
parents:
diff changeset
882 -------------------------
kono
parents:
diff changeset
883
kono
parents:
diff changeset
884 function To_Decimal
kono
parents:
diff changeset
885 (Item : Packed_Decimal;
kono
parents:
diff changeset
886 Format : Packed_Format) return Num
kono
parents:
diff changeset
887 is
kono
parents:
diff changeset
888 pragma Unsuppress (Range_Check);
kono
parents:
diff changeset
889 begin
kono
parents:
diff changeset
890 return Num'Fixed_Value (Packed_To_Decimal (Item, Format));
kono
parents:
diff changeset
891 exception
kono
parents:
diff changeset
892 when Constraint_Error =>
kono
parents:
diff changeset
893 raise Conversion_Error;
kono
parents:
diff changeset
894 end To_Decimal;
kono
parents:
diff changeset
895
kono
parents:
diff changeset
896 ----------------
kono
parents:
diff changeset
897 -- To_Display --
kono
parents:
diff changeset
898 ----------------
kono
parents:
diff changeset
899
kono
parents:
diff changeset
900 function To_Display
kono
parents:
diff changeset
901 (Item : Num;
kono
parents:
diff changeset
902 Format : Display_Format) return Numeric
kono
parents:
diff changeset
903 is
kono
parents:
diff changeset
904 pragma Unsuppress (Range_Check);
kono
parents:
diff changeset
905 begin
kono
parents:
diff changeset
906 return
kono
parents:
diff changeset
907 To_Display
kono
parents:
diff changeset
908 (Integer_64'Integer_Value (Item),
kono
parents:
diff changeset
909 Format,
kono
parents:
diff changeset
910 Length (Format));
kono
parents:
diff changeset
911 exception
kono
parents:
diff changeset
912 when Constraint_Error =>
kono
parents:
diff changeset
913 raise Conversion_Error;
kono
parents:
diff changeset
914 end To_Display;
kono
parents:
diff changeset
915
kono
parents:
diff changeset
916 --------------------
kono
parents:
diff changeset
917 -- To_Long_Binary --
kono
parents:
diff changeset
918 --------------------
kono
parents:
diff changeset
919
kono
parents:
diff changeset
920 function To_Long_Binary (Item : Num) return Long_Binary is
kono
parents:
diff changeset
921 pragma Unsuppress (Range_Check);
kono
parents:
diff changeset
922 begin
kono
parents:
diff changeset
923 return Long_Binary'Integer_Value (Item);
kono
parents:
diff changeset
924 exception
kono
parents:
diff changeset
925 when Constraint_Error =>
kono
parents:
diff changeset
926 raise Conversion_Error;
kono
parents:
diff changeset
927 end To_Long_Binary;
kono
parents:
diff changeset
928
kono
parents:
diff changeset
929 ---------------
kono
parents:
diff changeset
930 -- To_Packed --
kono
parents:
diff changeset
931 ---------------
kono
parents:
diff changeset
932
kono
parents:
diff changeset
933 function To_Packed
kono
parents:
diff changeset
934 (Item : Num;
kono
parents:
diff changeset
935 Format : Packed_Format) return Packed_Decimal
kono
parents:
diff changeset
936 is
kono
parents:
diff changeset
937 pragma Unsuppress (Range_Check);
kono
parents:
diff changeset
938 begin
kono
parents:
diff changeset
939 return
kono
parents:
diff changeset
940 To_Packed
kono
parents:
diff changeset
941 (Integer_64'Integer_Value (Item),
kono
parents:
diff changeset
942 Format,
kono
parents:
diff changeset
943 Length (Format));
kono
parents:
diff changeset
944 exception
kono
parents:
diff changeset
945 when Constraint_Error =>
kono
parents:
diff changeset
946 raise Conversion_Error;
kono
parents:
diff changeset
947 end To_Packed;
kono
parents:
diff changeset
948
kono
parents:
diff changeset
949 --------------------
kono
parents:
diff changeset
950 -- Valid (binary) --
kono
parents:
diff changeset
951 --------------------
kono
parents:
diff changeset
952
kono
parents:
diff changeset
953 function Valid
kono
parents:
diff changeset
954 (Item : Byte_Array;
kono
parents:
diff changeset
955 Format : Binary_Format) return Boolean
kono
parents:
diff changeset
956 is
kono
parents:
diff changeset
957 Val : Num;
kono
parents:
diff changeset
958 pragma Unreferenced (Val);
kono
parents:
diff changeset
959 begin
kono
parents:
diff changeset
960 Val := To_Decimal (Item, Format);
kono
parents:
diff changeset
961 return True;
kono
parents:
diff changeset
962 exception
kono
parents:
diff changeset
963 when Conversion_Error =>
kono
parents:
diff changeset
964 return False;
kono
parents:
diff changeset
965 end Valid;
kono
parents:
diff changeset
966
kono
parents:
diff changeset
967 ---------------------
kono
parents:
diff changeset
968 -- Valid (display) --
kono
parents:
diff changeset
969 ---------------------
kono
parents:
diff changeset
970
kono
parents:
diff changeset
971 function Valid
kono
parents:
diff changeset
972 (Item : Numeric;
kono
parents:
diff changeset
973 Format : Display_Format) return Boolean
kono
parents:
diff changeset
974 is
kono
parents:
diff changeset
975 begin
kono
parents:
diff changeset
976 return Valid_Numeric (Item, Format);
kono
parents:
diff changeset
977 end Valid;
kono
parents:
diff changeset
978
kono
parents:
diff changeset
979 --------------------
kono
parents:
diff changeset
980 -- Valid (packed) --
kono
parents:
diff changeset
981 --------------------
kono
parents:
diff changeset
982
kono
parents:
diff changeset
983 function Valid
kono
parents:
diff changeset
984 (Item : Packed_Decimal;
kono
parents:
diff changeset
985 Format : Packed_Format) return Boolean
kono
parents:
diff changeset
986 is
kono
parents:
diff changeset
987 begin
kono
parents:
diff changeset
988 return Valid_Packed (Item, Format);
kono
parents:
diff changeset
989 end Valid;
kono
parents:
diff changeset
990
kono
parents:
diff changeset
991 end Decimal_Conversions;
kono
parents:
diff changeset
992
kono
parents:
diff changeset
993 end Interfaces.COBOL;