2015-03-04 Robert Dewar <dewar@adacore.com>
[official-gcc.git] / gcc / ada / i-cobol.adb
blobed5b0ab6a3706a11d277c0cb4b895d791dcf7a6d
1 ------------------------------------------------------------------------------
2 -- --
3 -- GNAT RUN-TIME COMPONENTS --
4 -- --
5 -- I N T E R F A C E S . C O B O L --
6 -- --
7 -- B o d y --
8 -- --
9 -- Copyright (C) 1992-2009, Free Software Foundation, Inc. --
10 -- --
11 -- GNAT is free software; you can redistribute it and/or modify it under --
12 -- terms of the GNU General Public License as published by the Free Soft- --
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
16 -- or FITNESS FOR A PARTICULAR PURPOSE. --
17 -- --
18 -- As a special exception under Section 7 of GPL version 3, you are granted --
19 -- additional permissions described in the GCC Runtime Library Exception, --
20 -- version 3.1, as published by the Free Software Foundation. --
21 -- --
22 -- You should have received a copy of the GNU General Public License and --
23 -- a copy of the GCC Runtime Library Exception along with this program; --
24 -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
25 -- <http://www.gnu.org/licenses/>. --
26 -- --
27 -- GNAT was originally developed by the GNAT team at New York University. --
28 -- Extensive contributions were provided by Ada Core Technologies Inc. --
29 -- --
30 ------------------------------------------------------------------------------
32 -- The body of Interfaces.COBOL is implementation independent (i.e. the same
33 -- version is used with all versions of GNAT). The specialization to a
34 -- particular COBOL format is completely contained in the private part of
35 -- the spec.
37 with Interfaces; use Interfaces;
38 with System; use System;
39 with Ada.Unchecked_Conversion;
41 package body Interfaces.COBOL is
43 -----------------------------------------------
44 -- Declarations for External Binary Handling --
45 -----------------------------------------------
47 subtype B1 is Byte_Array (1 .. 1);
48 subtype B2 is Byte_Array (1 .. 2);
49 subtype B4 is Byte_Array (1 .. 4);
50 subtype B8 is Byte_Array (1 .. 8);
51 -- Representations for 1,2,4,8 byte binary values
53 function To_B1 is new Ada.Unchecked_Conversion (Integer_8, B1);
54 function To_B2 is new Ada.Unchecked_Conversion (Integer_16, B2);
55 function To_B4 is new Ada.Unchecked_Conversion (Integer_32, B4);
56 function To_B8 is new Ada.Unchecked_Conversion (Integer_64, B8);
57 -- Conversions from native binary to external binary
59 function From_B1 is new Ada.Unchecked_Conversion (B1, Integer_8);
60 function From_B2 is new Ada.Unchecked_Conversion (B2, Integer_16);
61 function From_B4 is new Ada.Unchecked_Conversion (B4, Integer_32);
62 function From_B8 is new Ada.Unchecked_Conversion (B8, Integer_64);
63 -- Conversions from external binary to signed native binary
65 function From_B1U is new Ada.Unchecked_Conversion (B1, Unsigned_8);
66 function From_B2U is new Ada.Unchecked_Conversion (B2, Unsigned_16);
67 function From_B4U is new Ada.Unchecked_Conversion (B4, Unsigned_32);
68 function From_B8U is new Ada.Unchecked_Conversion (B8, Unsigned_64);
69 -- Conversions from external binary to unsigned native binary
71 -----------------------
72 -- Local Subprograms --
73 -----------------------
75 function Binary_To_Decimal
76 (Item : Byte_Array;
77 Format : Binary_Format) return Integer_64;
78 -- This function converts a numeric value in the given format to its
79 -- corresponding integer value. This is the non-generic implementation
80 -- of Decimal_Conversions.To_Decimal. The generic routine does the
81 -- final conversion to the fixed-point format.
83 function Numeric_To_Decimal
84 (Item : Numeric;
85 Format : Display_Format) return Integer_64;
86 -- This function converts a numeric value in the given format to its
87 -- corresponding integer value. This is the non-generic implementation
88 -- of Decimal_Conversions.To_Decimal. The generic routine does the
89 -- final conversion to the fixed-point format.
91 function Packed_To_Decimal
92 (Item : Packed_Decimal;
93 Format : Packed_Format) return Integer_64;
94 -- This function converts a packed value in the given format to its
95 -- corresponding integer value. This is the non-generic implementation
96 -- of Decimal_Conversions.To_Decimal. The generic routine does the
97 -- final conversion to the fixed-point format.
99 procedure Swap (B : in out Byte_Array; F : Binary_Format);
100 -- Swaps the bytes if required by the binary format F
102 function To_Display
103 (Item : Integer_64;
104 Format : Display_Format;
105 Length : Natural) return Numeric;
106 -- This function converts the given integer value into display format,
107 -- using the given format, with the length in bytes of the result given
108 -- by the last parameter. This is the non-generic implementation of
109 -- Decimal_Conversions.To_Display. The conversion of the item from its
110 -- original decimal format to Integer_64 is done by the generic routine.
112 function To_Packed
113 (Item : Integer_64;
114 Format : Packed_Format;
115 Length : Natural) return Packed_Decimal;
116 -- This function converts the given integer value into packed format,
117 -- using the given format, with the length in digits of the result given
118 -- by the last parameter. This is the non-generic implementation of
119 -- Decimal_Conversions.To_Display. The conversion of the item from its
120 -- original decimal format to Integer_64 is done by the generic routine.
122 function Valid_Numeric
123 (Item : Numeric;
124 Format : Display_Format) return Boolean;
125 -- This is the non-generic implementation of Decimal_Conversions.Valid
126 -- for the display case.
128 function Valid_Packed
129 (Item : Packed_Decimal;
130 Format : Packed_Format) return Boolean;
131 -- This is the non-generic implementation of Decimal_Conversions.Valid
132 -- for the packed case.
134 -----------------------
135 -- Binary_To_Decimal --
136 -----------------------
138 function Binary_To_Decimal
139 (Item : Byte_Array;
140 Format : Binary_Format) return Integer_64
142 Len : constant Natural := Item'Length;
144 begin
145 if Len = 1 then
146 if Format in Binary_Unsigned_Format then
147 return Integer_64 (From_B1U (Item));
148 else
149 return Integer_64 (From_B1 (Item));
150 end if;
152 elsif Len = 2 then
153 declare
154 R : B2 := Item;
156 begin
157 Swap (R, Format);
159 if Format in Binary_Unsigned_Format then
160 return Integer_64 (From_B2U (R));
161 else
162 return Integer_64 (From_B2 (R));
163 end if;
164 end;
166 elsif Len = 4 then
167 declare
168 R : B4 := Item;
170 begin
171 Swap (R, Format);
173 if Format in Binary_Unsigned_Format then
174 return Integer_64 (From_B4U (R));
175 else
176 return Integer_64 (From_B4 (R));
177 end if;
178 end;
180 elsif Len = 8 then
181 declare
182 R : B8 := Item;
184 begin
185 Swap (R, Format);
187 if Format in Binary_Unsigned_Format then
188 return Integer_64 (From_B8U (R));
189 else
190 return Integer_64 (From_B8 (R));
191 end if;
192 end;
194 -- Length is not 1, 2, 4 or 8
196 else
197 raise Conversion_Error;
198 end if;
199 end Binary_To_Decimal;
201 ------------------------
202 -- Numeric_To_Decimal --
203 ------------------------
205 -- The following assumptions are made in the coding of this routine:
207 -- The range of COBOL_Digits is compact and the ten values
208 -- represent the digits 0-9 in sequence
210 -- The range of COBOL_Plus_Digits is compact and the ten values
211 -- represent the digits 0-9 in sequence with a plus sign.
213 -- The range of COBOL_Minus_Digits is compact and the ten values
214 -- represent the digits 0-9 in sequence with a minus sign.
216 -- The COBOL_Minus_Digits set is disjoint from COBOL_Digits
218 -- These assumptions are true for all COBOL representations we know of
220 function Numeric_To_Decimal
221 (Item : Numeric;
222 Format : Display_Format) return Integer_64
224 pragma Unsuppress (Range_Check);
225 Sign : COBOL_Character := COBOL_Plus;
226 Result : Integer_64 := 0;
228 begin
229 if not Valid_Numeric (Item, Format) then
230 raise Conversion_Error;
231 end if;
233 for J in Item'Range loop
234 declare
235 K : constant COBOL_Character := Item (J);
237 begin
238 if K in COBOL_Digits then
239 Result := Result * 10 +
240 (COBOL_Character'Pos (K) -
241 COBOL_Character'Pos (COBOL_Digits'First));
243 elsif K in COBOL_Plus_Digits then
244 Result := Result * 10 +
245 (COBOL_Character'Pos (K) -
246 COBOL_Character'Pos (COBOL_Plus_Digits'First));
248 elsif K in COBOL_Minus_Digits then
249 Result := Result * 10 +
250 (COBOL_Character'Pos (K) -
251 COBOL_Character'Pos (COBOL_Minus_Digits'First));
252 Sign := COBOL_Minus;
254 -- Only remaining possibility is COBOL_Plus or COBOL_Minus
256 else
257 Sign := K;
258 end if;
259 end;
260 end loop;
262 if Sign = COBOL_Plus then
263 return Result;
264 else
265 return -Result;
266 end if;
268 exception
269 when Constraint_Error =>
270 raise Conversion_Error;
272 end Numeric_To_Decimal;
274 -----------------------
275 -- Packed_To_Decimal --
276 -----------------------
278 function Packed_To_Decimal
279 (Item : Packed_Decimal;
280 Format : Packed_Format) return Integer_64
282 pragma Unsuppress (Range_Check);
283 Result : Integer_64 := 0;
284 Sign : constant Decimal_Element := Item (Item'Last);
286 begin
287 if not Valid_Packed (Item, Format) then
288 raise Conversion_Error;
289 end if;
291 case Packed_Representation is
292 when IBM =>
293 for J in Item'First .. Item'Last - 1 loop
294 Result := Result * 10 + Integer_64 (Item (J));
295 end loop;
297 if Sign = 16#0B# or else Sign = 16#0D# then
298 return -Result;
299 else
300 return +Result;
301 end if;
302 end case;
304 exception
305 when Constraint_Error =>
306 raise Conversion_Error;
307 end Packed_To_Decimal;
309 ----------
310 -- Swap --
311 ----------
313 procedure Swap (B : in out Byte_Array; F : Binary_Format) is
314 Little_Endian : constant Boolean :=
315 System.Default_Bit_Order = System.Low_Order_First;
317 begin
318 -- Return if no swap needed
320 case F is
321 when H | HU =>
322 if not Little_Endian then
323 return;
324 end if;
326 when L | LU =>
327 if Little_Endian then
328 return;
329 end if;
331 when N | NU =>
332 return;
333 end case;
335 -- Here a swap is needed
337 declare
338 Len : constant Natural := B'Length;
340 begin
341 for J in 1 .. Len / 2 loop
342 declare
343 Temp : constant Byte := B (J);
345 begin
346 B (J) := B (Len + 1 - J);
347 B (Len + 1 - J) := Temp;
348 end;
349 end loop;
350 end;
351 end Swap;
353 -----------------------
354 -- To_Ada (function) --
355 -----------------------
357 function To_Ada (Item : Alphanumeric) return String is
358 Result : String (Item'Range);
360 begin
361 for J in Item'Range loop
362 Result (J) := COBOL_To_Ada (Item (J));
363 end loop;
365 return Result;
366 end To_Ada;
368 ------------------------
369 -- To_Ada (procedure) --
370 ------------------------
372 procedure To_Ada
373 (Item : Alphanumeric;
374 Target : out String;
375 Last : out Natural)
377 Last_Val : Integer;
379 begin
380 if Item'Length > Target'Length then
381 raise Constraint_Error;
382 end if;
384 Last_Val := Target'First - 1;
385 for J in Item'Range loop
386 Last_Val := Last_Val + 1;
387 Target (Last_Val) := COBOL_To_Ada (Item (J));
388 end loop;
390 Last := Last_Val;
391 end To_Ada;
393 -------------------------
394 -- To_COBOL (function) --
395 -------------------------
397 function To_COBOL (Item : String) return Alphanumeric is
398 Result : Alphanumeric (Item'Range);
400 begin
401 for J in Item'Range loop
402 Result (J) := Ada_To_COBOL (Item (J));
403 end loop;
405 return Result;
406 end To_COBOL;
408 --------------------------
409 -- To_COBOL (procedure) --
410 --------------------------
412 procedure To_COBOL
413 (Item : String;
414 Target : out Alphanumeric;
415 Last : out Natural)
417 Last_Val : Integer;
419 begin
420 if Item'Length > Target'Length then
421 raise Constraint_Error;
422 end if;
424 Last_Val := Target'First - 1;
425 for J in Item'Range loop
426 Last_Val := Last_Val + 1;
427 Target (Last_Val) := Ada_To_COBOL (Item (J));
428 end loop;
430 Last := Last_Val;
431 end To_COBOL;
433 ----------------
434 -- To_Display --
435 ----------------
437 function To_Display
438 (Item : Integer_64;
439 Format : Display_Format;
440 Length : Natural) return Numeric
442 Result : Numeric (1 .. Length);
443 Val : Integer_64 := Item;
445 procedure Convert (First, Last : Natural);
446 -- Convert the number in Val into COBOL_Digits, storing the result
447 -- in Result (First .. Last). Raise Conversion_Error if too large.
449 procedure Embed_Sign (Loc : Natural);
450 -- Used for the nonseparate formats to embed the appropriate sign
451 -- at the specified location (i.e. at Result (Loc))
453 -------------
454 -- Convert --
455 -------------
457 procedure Convert (First, Last : Natural) is
458 J : Natural;
460 begin
461 J := Last;
462 while J >= First loop
463 Result (J) :=
464 COBOL_Character'Val
465 (COBOL_Character'Pos (COBOL_Digits'First) +
466 Integer (Val mod 10));
467 Val := Val / 10;
469 if Val = 0 then
470 for K in First .. J - 1 loop
471 Result (J) := COBOL_Digits'First;
472 end loop;
474 return;
476 else
477 J := J - 1;
478 end if;
479 end loop;
481 raise Conversion_Error;
482 end Convert;
484 ----------------
485 -- Embed_Sign --
486 ----------------
488 procedure Embed_Sign (Loc : Natural) is
489 Digit : Natural range 0 .. 9;
491 begin
492 Digit := COBOL_Character'Pos (Result (Loc)) -
493 COBOL_Character'Pos (COBOL_Digits'First);
495 if Item >= 0 then
496 Result (Loc) :=
497 COBOL_Character'Val
498 (COBOL_Character'Pos (COBOL_Plus_Digits'First) + Digit);
499 else
500 Result (Loc) :=
501 COBOL_Character'Val
502 (COBOL_Character'Pos (COBOL_Minus_Digits'First) + Digit);
503 end if;
504 end Embed_Sign;
506 -- Start of processing for To_Display
508 begin
509 case Format is
510 when Unsigned =>
511 if Val < 0 then
512 raise Conversion_Error;
513 else
514 Convert (1, Length);
515 end if;
517 when Leading_Separate =>
518 if Val < 0 then
519 Result (1) := COBOL_Minus;
520 Val := -Val;
521 else
522 Result (1) := COBOL_Plus;
523 end if;
525 Convert (2, Length);
527 when Trailing_Separate =>
528 if Val < 0 then
529 Result (Length) := COBOL_Minus;
530 Val := -Val;
531 else
532 Result (Length) := COBOL_Plus;
533 end if;
535 Convert (1, Length - 1);
537 when Leading_Nonseparate =>
538 Val := abs Val;
539 Convert (1, Length);
540 Embed_Sign (1);
542 when Trailing_Nonseparate =>
543 Val := abs Val;
544 Convert (1, Length);
545 Embed_Sign (Length);
547 end case;
549 return Result;
550 end To_Display;
552 ---------------
553 -- To_Packed --
554 ---------------
556 function To_Packed
557 (Item : Integer_64;
558 Format : Packed_Format;
559 Length : Natural) return Packed_Decimal
561 Result : Packed_Decimal (1 .. Length);
562 Val : Integer_64;
564 procedure Convert (First, Last : Natural);
565 -- Convert the number in Val into a sequence of Decimal_Element values,
566 -- storing the result in Result (First .. Last). Raise Conversion_Error
567 -- if the value is too large to fit.
569 -------------
570 -- Convert --
571 -------------
573 procedure Convert (First, Last : Natural) is
574 J : Natural := Last;
576 begin
577 while J >= First loop
578 Result (J) := Decimal_Element (Val mod 10);
580 Val := Val / 10;
582 if Val = 0 then
583 for K in First .. J - 1 loop
584 Result (K) := 0;
585 end loop;
587 return;
589 else
590 J := J - 1;
591 end if;
592 end loop;
594 raise Conversion_Error;
595 end Convert;
597 -- Start of processing for To_Packed
599 begin
600 case Packed_Representation is
601 when IBM =>
602 if Format = Packed_Unsigned then
603 if Item < 0 then
604 raise Conversion_Error;
605 else
606 Result (Length) := 16#F#;
607 Val := Item;
608 end if;
610 elsif Item >= 0 then
611 Result (Length) := 16#C#;
612 Val := Item;
614 else -- Item < 0
615 Result (Length) := 16#D#;
616 Val := -Item;
617 end if;
619 Convert (1, Length - 1);
620 return Result;
621 end case;
622 end To_Packed;
624 -------------------
625 -- Valid_Numeric --
626 -------------------
628 function Valid_Numeric
629 (Item : Numeric;
630 Format : Display_Format) return Boolean
632 begin
633 if Item'Length = 0 then
634 return False;
635 end if;
637 -- All character positions except first and last must be Digits.
638 -- This is true for all the formats.
640 for J in Item'First + 1 .. Item'Last - 1 loop
641 if Item (J) not in COBOL_Digits then
642 return False;
643 end if;
644 end loop;
646 case Format is
647 when Unsigned =>
648 return Item (Item'First) in COBOL_Digits
649 and then Item (Item'Last) in COBOL_Digits;
651 when Leading_Separate =>
652 return (Item (Item'First) = COBOL_Plus or else
653 Item (Item'First) = COBOL_Minus)
654 and then Item (Item'Last) in COBOL_Digits;
656 when Trailing_Separate =>
657 return Item (Item'First) in COBOL_Digits
658 and then
659 (Item (Item'Last) = COBOL_Plus or else
660 Item (Item'Last) = COBOL_Minus);
662 when Leading_Nonseparate =>
663 return (Item (Item'First) in COBOL_Plus_Digits or else
664 Item (Item'First) in COBOL_Minus_Digits)
665 and then Item (Item'Last) in COBOL_Digits;
667 when Trailing_Nonseparate =>
668 return Item (Item'First) in COBOL_Digits
669 and then
670 (Item (Item'Last) in COBOL_Plus_Digits or else
671 Item (Item'Last) in COBOL_Minus_Digits);
673 end case;
674 end Valid_Numeric;
676 ------------------
677 -- Valid_Packed --
678 ------------------
680 function Valid_Packed
681 (Item : Packed_Decimal;
682 Format : Packed_Format) return Boolean
684 begin
685 case Packed_Representation is
686 when IBM =>
687 for J in Item'First .. Item'Last - 1 loop
688 if Item (J) > 9 then
689 return False;
690 end if;
691 end loop;
693 -- For unsigned, sign digit must be F
695 if Format = Packed_Unsigned then
696 return Item (Item'Last) = 16#F#;
698 -- For signed, accept all standard and non-standard signs
700 else
701 return Item (Item'Last) in 16#A# .. 16#F#;
702 end if;
703 end case;
704 end Valid_Packed;
706 -------------------------
707 -- Decimal_Conversions --
708 -------------------------
710 package body Decimal_Conversions is
712 ---------------------
713 -- Length (binary) --
714 ---------------------
716 -- Note that the tests here are all compile time tests
718 function Length (Format : Binary_Format) return Natural is
719 pragma Unreferenced (Format);
720 begin
721 if Num'Digits <= 2 then
722 return 1;
723 elsif Num'Digits <= 4 then
724 return 2;
725 elsif Num'Digits <= 9 then
726 return 4;
727 else -- Num'Digits in 10 .. 18
728 return 8;
729 end if;
730 end Length;
732 ----------------------
733 -- Length (display) --
734 ----------------------
736 function Length (Format : Display_Format) return Natural is
737 begin
738 if Format = Leading_Separate or else Format = Trailing_Separate then
739 return Num'Digits + 1;
740 else
741 return Num'Digits;
742 end if;
743 end Length;
745 ---------------------
746 -- Length (packed) --
747 ---------------------
749 -- Note that the tests here are all compile time checks
751 function Length
752 (Format : Packed_Format) return Natural
754 pragma Unreferenced (Format);
755 begin
756 case Packed_Representation is
757 when IBM =>
758 return (Num'Digits + 2) / 2 * 2;
759 end case;
760 end Length;
762 ---------------
763 -- To_Binary --
764 ---------------
766 function To_Binary
767 (Item : Num;
768 Format : Binary_Format) return Byte_Array
770 begin
771 -- Note: all these tests are compile time tests
773 if Num'Digits <= 2 then
774 return To_B1 (Integer_8'Integer_Value (Item));
776 elsif Num'Digits <= 4 then
777 declare
778 R : B2 := To_B2 (Integer_16'Integer_Value (Item));
780 begin
781 Swap (R, Format);
782 return R;
783 end;
785 elsif Num'Digits <= 9 then
786 declare
787 R : B4 := To_B4 (Integer_32'Integer_Value (Item));
789 begin
790 Swap (R, Format);
791 return R;
792 end;
794 else -- Num'Digits in 10 .. 18
795 declare
796 R : B8 := To_B8 (Integer_64'Integer_Value (Item));
798 begin
799 Swap (R, Format);
800 return R;
801 end;
802 end if;
804 exception
805 when Constraint_Error =>
806 raise Conversion_Error;
807 end To_Binary;
809 ---------------------------------
810 -- To_Binary (internal binary) --
811 ---------------------------------
813 function To_Binary (Item : Num) return Binary is
814 pragma Unsuppress (Range_Check);
815 begin
816 return Binary'Integer_Value (Item);
817 exception
818 when Constraint_Error =>
819 raise Conversion_Error;
820 end To_Binary;
822 -------------------------
823 -- To_Decimal (binary) --
824 -------------------------
826 function To_Decimal
827 (Item : Byte_Array;
828 Format : Binary_Format) return Num
830 pragma Unsuppress (Range_Check);
831 begin
832 return Num'Fixed_Value (Binary_To_Decimal (Item, Format));
833 exception
834 when Constraint_Error =>
835 raise Conversion_Error;
836 end To_Decimal;
838 ----------------------------------
839 -- To_Decimal (internal binary) --
840 ----------------------------------
842 function To_Decimal (Item : Binary) return Num is
843 pragma Unsuppress (Range_Check);
844 begin
845 return Num'Fixed_Value (Item);
846 exception
847 when Constraint_Error =>
848 raise Conversion_Error;
849 end To_Decimal;
851 --------------------------
852 -- To_Decimal (display) --
853 --------------------------
855 function To_Decimal
856 (Item : Numeric;
857 Format : Display_Format) return Num
859 pragma Unsuppress (Range_Check);
861 begin
862 return Num'Fixed_Value (Numeric_To_Decimal (Item, Format));
863 exception
864 when Constraint_Error =>
865 raise Conversion_Error;
866 end To_Decimal;
868 ---------------------------------------
869 -- To_Decimal (internal long binary) --
870 ---------------------------------------
872 function To_Decimal (Item : Long_Binary) return Num is
873 pragma Unsuppress (Range_Check);
874 begin
875 return Num'Fixed_Value (Item);
876 exception
877 when Constraint_Error =>
878 raise Conversion_Error;
879 end To_Decimal;
881 -------------------------
882 -- To_Decimal (packed) --
883 -------------------------
885 function To_Decimal
886 (Item : Packed_Decimal;
887 Format : Packed_Format) return Num
889 pragma Unsuppress (Range_Check);
890 begin
891 return Num'Fixed_Value (Packed_To_Decimal (Item, Format));
892 exception
893 when Constraint_Error =>
894 raise Conversion_Error;
895 end To_Decimal;
897 ----------------
898 -- To_Display --
899 ----------------
901 function To_Display
902 (Item : Num;
903 Format : Display_Format) return Numeric
905 pragma Unsuppress (Range_Check);
906 begin
907 return
908 To_Display
909 (Integer_64'Integer_Value (Item),
910 Format,
911 Length (Format));
912 exception
913 when Constraint_Error =>
914 raise Conversion_Error;
915 end To_Display;
917 --------------------
918 -- To_Long_Binary --
919 --------------------
921 function To_Long_Binary (Item : Num) return Long_Binary is
922 pragma Unsuppress (Range_Check);
923 begin
924 return Long_Binary'Integer_Value (Item);
925 exception
926 when Constraint_Error =>
927 raise Conversion_Error;
928 end To_Long_Binary;
930 ---------------
931 -- To_Packed --
932 ---------------
934 function To_Packed
935 (Item : Num;
936 Format : Packed_Format) return Packed_Decimal
938 pragma Unsuppress (Range_Check);
939 begin
940 return
941 To_Packed
942 (Integer_64'Integer_Value (Item),
943 Format,
944 Length (Format));
945 exception
946 when Constraint_Error =>
947 raise Conversion_Error;
948 end To_Packed;
950 --------------------
951 -- Valid (binary) --
952 --------------------
954 function Valid
955 (Item : Byte_Array;
956 Format : Binary_Format) return Boolean
958 Val : Num;
959 pragma Unreferenced (Val);
960 begin
961 Val := To_Decimal (Item, Format);
962 return True;
963 exception
964 when Conversion_Error =>
965 return False;
966 end Valid;
968 ---------------------
969 -- Valid (display) --
970 ---------------------
972 function Valid
973 (Item : Numeric;
974 Format : Display_Format) return Boolean
976 begin
977 return Valid_Numeric (Item, Format);
978 end Valid;
980 --------------------
981 -- Valid (packed) --
982 --------------------
984 function Valid
985 (Item : Packed_Decimal;
986 Format : Packed_Format) return Boolean
988 begin
989 return Valid_Packed (Item, Format);
990 end Valid;
992 end Decimal_Conversions;
994 end Interfaces.COBOL;