1------------------------------------------------------------------------------
2--                                                                          --
3--                         GNAT COMPILER COMPONENTS                         --
4--                                                                          --
5--                      I N T E R F A C E S . C O B O L                     --
6--                                                                          --
7--                                 S p e c                                  --
8--                             (ASCII Version)                              --
9--                                                                          --
10--          Copyright (C) 1993-2000 Free Software Foundation, Inc.          --
11--                                                                          --
12-- This specification is derived from the Ada Reference Manual for use with --
13-- GNAT. The copyright notice above, and the license provisions that follow --
14-- apply solely to the  contents of the part following the private keyword. --
15--                                                                          --
16-- GNAT is free software;  you can  redistribute it  and/or modify it under --
17-- terms of the  GNU General Public License as published  by the Free Soft- --
18-- ware  Foundation;  either version 2,  or (at your option) any later ver- --
19-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
20-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
21-- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
22-- for  more details.  You should have  received  a copy of the GNU General --
23-- Public License  distributed with GNAT;  see file COPYING.  If not, write --
24-- to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, --
25-- MA 02111-1307, USA.                                                      --
26--                                                                          --
27-- As a special exception,  if other files  instantiate  generics from this --
28-- unit, or you link  this unit with other files  to produce an executable, --
29-- this  unit  does not  by itself cause  the resulting  executable  to  be --
30-- covered  by the  GNU  General  Public  License.  This exception does not --
31-- however invalidate  any other reasons why  the executable file  might be --
32-- covered by the  GNU Public License.                                      --
33--                                                                          --
34-- GNAT was originally developed  by the GNAT team at  New York University. --
35-- Extensive contributions were provided by Ada Core Technologies Inc.      --
36--                                                                          --
37------------------------------------------------------------------------------
38
39--  This version of the COBOL interfaces package assumes that the COBOL
40--  compiler uses ASCII as its internal representation of characters, i.e.
41--  that the type COBOL_Character has the same representation as the Ada
42--  type Standard.Character.
43
44package Interfaces.COBOL is
45
46   ------------------------------------------------------------
47   -- Types And Operations For Internal Data Representations --
48   ------------------------------------------------------------
49
50   type Floating      is new Float;
51   type Long_Floating is new Long_Float;
52
53   type Binary        is new Integer;
54   type Long_Binary   is new Long_Long_Integer;
55
56   Max_Digits_Binary      : constant := 9;
57   Max_Digits_Long_Binary : constant := 18;
58
59   type Decimal_Element is mod 16;
60   type Packed_Decimal is array (Positive range <>) of Decimal_Element;
61   pragma Pack (Packed_Decimal);
62
63   type COBOL_Character is new Character;
64
65   Ada_To_COBOL : array (Standard.Character) of COBOL_Character := (
66     COBOL_Character'Val (000), COBOL_Character'Val (001),
67     COBOL_Character'Val (002), COBOL_Character'Val (003),
68     COBOL_Character'Val (004), COBOL_Character'Val (005),
69     COBOL_Character'Val (006), COBOL_Character'Val (007),
70     COBOL_Character'Val (008), COBOL_Character'Val (009),
71     COBOL_Character'Val (010), COBOL_Character'Val (011),
72     COBOL_Character'Val (012), COBOL_Character'Val (013),
73     COBOL_Character'Val (014), COBOL_Character'Val (015),
74     COBOL_Character'Val (016), COBOL_Character'Val (017),
75     COBOL_Character'Val (018), COBOL_Character'Val (019),
76     COBOL_Character'Val (020), COBOL_Character'Val (021),
77     COBOL_Character'Val (022), COBOL_Character'Val (023),
78     COBOL_Character'Val (024), COBOL_Character'Val (025),
79     COBOL_Character'Val (026), COBOL_Character'Val (027),
80     COBOL_Character'Val (028), COBOL_Character'Val (029),
81     COBOL_Character'Val (030), COBOL_Character'Val (031),
82     COBOL_Character'Val (032), COBOL_Character'Val (033),
83     COBOL_Character'Val (034), COBOL_Character'Val (035),
84     COBOL_Character'Val (036), COBOL_Character'Val (037),
85     COBOL_Character'Val (038), COBOL_Character'Val (039),
86     COBOL_Character'Val (040), COBOL_Character'Val (041),
87     COBOL_Character'Val (042), COBOL_Character'Val (043),
88     COBOL_Character'Val (044), COBOL_Character'Val (045),
89     COBOL_Character'Val (046), COBOL_Character'Val (047),
90     COBOL_Character'Val (048), COBOL_Character'Val (049),
91     COBOL_Character'Val (050), COBOL_Character'Val (051),
92     COBOL_Character'Val (052), COBOL_Character'Val (053),
93     COBOL_Character'Val (054), COBOL_Character'Val (055),
94     COBOL_Character'Val (056), COBOL_Character'Val (057),
95     COBOL_Character'Val (058), COBOL_Character'Val (059),
96     COBOL_Character'Val (060), COBOL_Character'Val (061),
97     COBOL_Character'Val (062), COBOL_Character'Val (063),
98     COBOL_Character'Val (064), COBOL_Character'Val (065),
99     COBOL_Character'Val (066), COBOL_Character'Val (067),
100     COBOL_Character'Val (068), COBOL_Character'Val (069),
101     COBOL_Character'Val (070), COBOL_Character'Val (071),
102     COBOL_Character'Val (072), COBOL_Character'Val (073),
103     COBOL_Character'Val (074), COBOL_Character'Val (075),
104     COBOL_Character'Val (076), COBOL_Character'Val (077),
105     COBOL_Character'Val (078), COBOL_Character'Val (079),
106     COBOL_Character'Val (080), COBOL_Character'Val (081),
107     COBOL_Character'Val (082), COBOL_Character'Val (083),
108     COBOL_Character'Val (084), COBOL_Character'Val (085),
109     COBOL_Character'Val (086), COBOL_Character'Val (087),
110     COBOL_Character'Val (088), COBOL_Character'Val (089),
111     COBOL_Character'Val (090), COBOL_Character'Val (091),
112     COBOL_Character'Val (092), COBOL_Character'Val (093),
113     COBOL_Character'Val (094), COBOL_Character'Val (095),
114     COBOL_Character'Val (096), COBOL_Character'Val (097),
115     COBOL_Character'Val (098), COBOL_Character'Val (099),
116     COBOL_Character'Val (100), COBOL_Character'Val (101),
117     COBOL_Character'Val (102), COBOL_Character'Val (103),
118     COBOL_Character'Val (104), COBOL_Character'Val (105),
119     COBOL_Character'Val (106), COBOL_Character'Val (107),
120     COBOL_Character'Val (108), COBOL_Character'Val (109),
121     COBOL_Character'Val (110), COBOL_Character'Val (111),
122     COBOL_Character'Val (112), COBOL_Character'Val (113),
123     COBOL_Character'Val (114), COBOL_Character'Val (115),
124     COBOL_Character'Val (116), COBOL_Character'Val (117),
125     COBOL_Character'Val (118), COBOL_Character'Val (119),
126     COBOL_Character'Val (120), COBOL_Character'Val (121),
127     COBOL_Character'Val (122), COBOL_Character'Val (123),
128     COBOL_Character'Val (124), COBOL_Character'Val (125),
129     COBOL_Character'Val (126), COBOL_Character'Val (127),
130     COBOL_Character'Val (128), COBOL_Character'Val (129),
131     COBOL_Character'Val (130), COBOL_Character'Val (131),
132     COBOL_Character'Val (132), COBOL_Character'Val (133),
133     COBOL_Character'Val (134), COBOL_Character'Val (135),
134     COBOL_Character'Val (136), COBOL_Character'Val (137),
135     COBOL_Character'Val (138), COBOL_Character'Val (139),
136     COBOL_Character'Val (140), COBOL_Character'Val (141),
137     COBOL_Character'Val (142), COBOL_Character'Val (143),
138     COBOL_Character'Val (144), COBOL_Character'Val (145),
139     COBOL_Character'Val (146), COBOL_Character'Val (147),
140     COBOL_Character'Val (148), COBOL_Character'Val (149),
141     COBOL_Character'Val (150), COBOL_Character'Val (151),
142     COBOL_Character'Val (152), COBOL_Character'Val (153),
143     COBOL_Character'Val (154), COBOL_Character'Val (155),
144     COBOL_Character'Val (156), COBOL_Character'Val (157),
145     COBOL_Character'Val (158), COBOL_Character'Val (159),
146     COBOL_Character'Val (160), COBOL_Character'Val (161),
147     COBOL_Character'Val (162), COBOL_Character'Val (163),
148     COBOL_Character'Val (164), COBOL_Character'Val (165),
149     COBOL_Character'Val (166), COBOL_Character'Val (167),
150     COBOL_Character'Val (168), COBOL_Character'Val (169),
151     COBOL_Character'Val (170), COBOL_Character'Val (171),
152     COBOL_Character'Val (172), COBOL_Character'Val (173),
153     COBOL_Character'Val (174), COBOL_Character'Val (175),
154     COBOL_Character'Val (176), COBOL_Character'Val (177),
155     COBOL_Character'Val (178), COBOL_Character'Val (179),
156     COBOL_Character'Val (180), COBOL_Character'Val (181),
157     COBOL_Character'Val (182), COBOL_Character'Val (183),
158     COBOL_Character'Val (184), COBOL_Character'Val (185),
159     COBOL_Character'Val (186), COBOL_Character'Val (187),
160     COBOL_Character'Val (188), COBOL_Character'Val (189),
161     COBOL_Character'Val (190), COBOL_Character'Val (191),
162     COBOL_Character'Val (192), COBOL_Character'Val (193),
163     COBOL_Character'Val (194), COBOL_Character'Val (195),
164     COBOL_Character'Val (196), COBOL_Character'Val (197),
165     COBOL_Character'Val (198), COBOL_Character'Val (199),
166     COBOL_Character'Val (200), COBOL_Character'Val (201),
167     COBOL_Character'Val (202), COBOL_Character'Val (203),
168     COBOL_Character'Val (204), COBOL_Character'Val (205),
169     COBOL_Character'Val (206), COBOL_Character'Val (207),
170     COBOL_Character'Val (208), COBOL_Character'Val (209),
171     COBOL_Character'Val (210), COBOL_Character'Val (211),
172     COBOL_Character'Val (212), COBOL_Character'Val (213),
173     COBOL_Character'Val (214), COBOL_Character'Val (215),
174     COBOL_Character'Val (216), COBOL_Character'Val (217),
175     COBOL_Character'Val (218), COBOL_Character'Val (219),
176     COBOL_Character'Val (220), COBOL_Character'Val (221),
177     COBOL_Character'Val (222), COBOL_Character'Val (223),
178     COBOL_Character'Val (224), COBOL_Character'Val (225),
179     COBOL_Character'Val (226), COBOL_Character'Val (227),
180     COBOL_Character'Val (228), COBOL_Character'Val (229),
181     COBOL_Character'Val (230), COBOL_Character'Val (231),
182     COBOL_Character'Val (232), COBOL_Character'Val (233),
183     COBOL_Character'Val (234), COBOL_Character'Val (235),
184     COBOL_Character'Val (236), COBOL_Character'Val (237),
185     COBOL_Character'Val (238), COBOL_Character'Val (239),
186     COBOL_Character'Val (240), COBOL_Character'Val (241),
187     COBOL_Character'Val (242), COBOL_Character'Val (243),
188     COBOL_Character'Val (244), COBOL_Character'Val (245),
189     COBOL_Character'Val (246), COBOL_Character'Val (247),
190     COBOL_Character'Val (248), COBOL_Character'Val (249),
191     COBOL_Character'Val (250), COBOL_Character'Val (251),
192     COBOL_Character'Val (252), COBOL_Character'Val (253),
193     COBOL_Character'Val (254), COBOL_Character'Val (255));
194
195   COBOL_To_Ada : array (COBOL_Character) of Standard.Character := (
196     Standard.Character'Val (000), Standard.Character'Val (001),
197     Standard.Character'Val (002), Standard.Character'Val (003),
198     Standard.Character'Val (004), Standard.Character'Val (005),
199     Standard.Character'Val (006), Standard.Character'Val (007),
200     Standard.Character'Val (008), Standard.Character'Val (009),
201     Standard.Character'Val (010), Standard.Character'Val (011),
202     Standard.Character'Val (012), Standard.Character'Val (013),
203     Standard.Character'Val (014), Standard.Character'Val (015),
204     Standard.Character'Val (016), Standard.Character'Val (017),
205     Standard.Character'Val (018), Standard.Character'Val (019),
206     Standard.Character'Val (020), Standard.Character'Val (021),
207     Standard.Character'Val (022), Standard.Character'Val (023),
208     Standard.Character'Val (024), Standard.Character'Val (025),
209     Standard.Character'Val (026), Standard.Character'Val (027),
210     Standard.Character'Val (028), Standard.Character'Val (029),
211     Standard.Character'Val (030), Standard.Character'Val (031),
212     Standard.Character'Val (032), Standard.Character'Val (033),
213     Standard.Character'Val (034), Standard.Character'Val (035),
214     Standard.Character'Val (036), Standard.Character'Val (037),
215     Standard.Character'Val (038), Standard.Character'Val (039),
216     Standard.Character'Val (040), Standard.Character'Val (041),
217     Standard.Character'Val (042), Standard.Character'Val (043),
218     Standard.Character'Val (044), Standard.Character'Val (045),
219     Standard.Character'Val (046), Standard.Character'Val (047),
220     Standard.Character'Val (048), Standard.Character'Val (049),
221     Standard.Character'Val (050), Standard.Character'Val (051),
222     Standard.Character'Val (052), Standard.Character'Val (053),
223     Standard.Character'Val (054), Standard.Character'Val (055),
224     Standard.Character'Val (056), Standard.Character'Val (057),
225     Standard.Character'Val (058), Standard.Character'Val (059),
226     Standard.Character'Val (060), Standard.Character'Val (061),
227     Standard.Character'Val (062), Standard.Character'Val (063),
228     Standard.Character'Val (064), Standard.Character'Val (065),
229     Standard.Character'Val (066), Standard.Character'Val (067),
230     Standard.Character'Val (068), Standard.Character'Val (069),
231     Standard.Character'Val (070), Standard.Character'Val (071),
232     Standard.Character'Val (072), Standard.Character'Val (073),
233     Standard.Character'Val (074), Standard.Character'Val (075),
234     Standard.Character'Val (076), Standard.Character'Val (077),
235     Standard.Character'Val (078), Standard.Character'Val (079),
236     Standard.Character'Val (080), Standard.Character'Val (081),
237     Standard.Character'Val (082), Standard.Character'Val (083),
238     Standard.Character'Val (084), Standard.Character'Val (085),
239     Standard.Character'Val (086), Standard.Character'Val (087),
240     Standard.Character'Val (088), Standard.Character'Val (089),
241     Standard.Character'Val (090), Standard.Character'Val (091),
242     Standard.Character'Val (092), Standard.Character'Val (093),
243     Standard.Character'Val (094), Standard.Character'Val (095),
244     Standard.Character'Val (096), Standard.Character'Val (097),
245     Standard.Character'Val (098), Standard.Character'Val (099),
246     Standard.Character'Val (100), Standard.Character'Val (101),
247     Standard.Character'Val (102), Standard.Character'Val (103),
248     Standard.Character'Val (104), Standard.Character'Val (105),
249     Standard.Character'Val (106), Standard.Character'Val (107),
250     Standard.Character'Val (108), Standard.Character'Val (109),
251     Standard.Character'Val (110), Standard.Character'Val (111),
252     Standard.Character'Val (112), Standard.Character'Val (113),
253     Standard.Character'Val (114), Standard.Character'Val (115),
254     Standard.Character'Val (116), Standard.Character'Val (117),
255     Standard.Character'Val (118), Standard.Character'Val (119),
256     Standard.Character'Val (120), Standard.Character'Val (121),
257     Standard.Character'Val (122), Standard.Character'Val (123),
258     Standard.Character'Val (124), Standard.Character'Val (125),
259     Standard.Character'Val (126), Standard.Character'Val (127),
260     Standard.Character'Val (128), Standard.Character'Val (129),
261     Standard.Character'Val (130), Standard.Character'Val (131),
262     Standard.Character'Val (132), Standard.Character'Val (133),
263     Standard.Character'Val (134), Standard.Character'Val (135),
264     Standard.Character'Val (136), Standard.Character'Val (137),
265     Standard.Character'Val (138), Standard.Character'Val (139),
266     Standard.Character'Val (140), Standard.Character'Val (141),
267     Standard.Character'Val (142), Standard.Character'Val (143),
268     Standard.Character'Val (144), Standard.Character'Val (145),
269     Standard.Character'Val (146), Standard.Character'Val (147),
270     Standard.Character'Val (148), Standard.Character'Val (149),
271     Standard.Character'Val (150), Standard.Character'Val (151),
272     Standard.Character'Val (152), Standard.Character'Val (153),
273     Standard.Character'Val (154), Standard.Character'Val (155),
274     Standard.Character'Val (156), Standard.Character'Val (157),
275     Standard.Character'Val (158), Standard.Character'Val (159),
276     Standard.Character'Val (160), Standard.Character'Val (161),
277     Standard.Character'Val (162), Standard.Character'Val (163),
278     Standard.Character'Val (164), Standard.Character'Val (165),
279     Standard.Character'Val (166), Standard.Character'Val (167),
280     Standard.Character'Val (168), Standard.Character'Val (169),
281     Standard.Character'Val (170), Standard.Character'Val (171),
282     Standard.Character'Val (172), Standard.Character'Val (173),
283     Standard.Character'Val (174), Standard.Character'Val (175),
284     Standard.Character'Val (176), Standard.Character'Val (177),
285     Standard.Character'Val (178), Standard.Character'Val (179),
286     Standard.Character'Val (180), Standard.Character'Val (181),
287     Standard.Character'Val (182), Standard.Character'Val (183),
288     Standard.Character'Val (184), Standard.Character'Val (185),
289     Standard.Character'Val (186), Standard.Character'Val (187),
290     Standard.Character'Val (188), Standard.Character'Val (189),
291     Standard.Character'Val (190), Standard.Character'Val (191),
292     Standard.Character'Val (192), Standard.Character'Val (193),
293     Standard.Character'Val (194), Standard.Character'Val (195),
294     Standard.Character'Val (196), Standard.Character'Val (197),
295     Standard.Character'Val (198), Standard.Character'Val (199),
296     Standard.Character'Val (200), Standard.Character'Val (201),
297     Standard.Character'Val (202), Standard.Character'Val (203),
298     Standard.Character'Val (204), Standard.Character'Val (205),
299     Standard.Character'Val (206), Standard.Character'Val (207),
300     Standard.Character'Val (208), Standard.Character'Val (209),
301     Standard.Character'Val (210), Standard.Character'Val (211),
302     Standard.Character'Val (212), Standard.Character'Val (213),
303     Standard.Character'Val (214), Standard.Character'Val (215),
304     Standard.Character'Val (216), Standard.Character'Val (217),
305     Standard.Character'Val (218), Standard.Character'Val (219),
306     Standard.Character'Val (220), Standard.Character'Val (221),
307     Standard.Character'Val (222), Standard.Character'Val (223),
308     Standard.Character'Val (224), Standard.Character'Val (225),
309     Standard.Character'Val (226), Standard.Character'Val (227),
310     Standard.Character'Val (228), Standard.Character'Val (229),
311     Standard.Character'Val (230), Standard.Character'Val (231),
312     Standard.Character'Val (232), Standard.Character'Val (233),
313     Standard.Character'Val (234), Standard.Character'Val (235),
314     Standard.Character'Val (236), Standard.Character'Val (237),
315     Standard.Character'Val (238), Standard.Character'Val (239),
316     Standard.Character'Val (240), Standard.Character'Val (241),
317     Standard.Character'Val (242), Standard.Character'Val (243),
318     Standard.Character'Val (244), Standard.Character'Val (245),
319     Standard.Character'Val (246), Standard.Character'Val (247),
320     Standard.Character'Val (248), Standard.Character'Val (249),
321     Standard.Character'Val (250), Standard.Character'Val (251),
322     Standard.Character'Val (252), Standard.Character'Val (253),
323     Standard.Character'Val (254), Standard.Character'Val (255));
324
325   type Alphanumeric is array (Positive range <>) of COBOL_Character;
326   --  pragma Pack (Alphanumeric);
327
328   function To_COBOL (Item : String) return Alphanumeric;
329   function To_Ada   (Item : Alphanumeric) return String;
330
331   procedure To_COBOL
332     (Item   : String;
333      Target : out Alphanumeric;
334      Last   : out Natural);
335
336   procedure To_Ada
337     (Item   : Alphanumeric;
338      Target : out String;
339      Last   : out Natural);
340
341   type Numeric is array (Positive range <>) of COBOL_Character;
342   --  pragma Pack (Numeric);
343
344   --------------------------------------------
345   -- Formats For COBOL Data Representations --
346   --------------------------------------------
347
348   type Display_Format is private;
349
350   Unsigned             : constant Display_Format;
351   Leading_Separate     : constant Display_Format;
352   Trailing_Separate    : constant Display_Format;
353   Leading_Nonseparate  : constant Display_Format;
354   Trailing_Nonseparate : constant Display_Format;
355
356   type Binary_Format is private;
357
358   High_Order_First          : constant Binary_Format;
359   Low_Order_First           : constant Binary_Format;
360   Native_Binary             : constant Binary_Format;
361   High_Order_First_Unsigned : constant Binary_Format;
362   Low_Order_First_Unsigned  : constant Binary_Format;
363   Native_Binary_Unsigned    : constant Binary_Format;
364
365   type Packed_Format is private;
366
367   Packed_Unsigned   : constant Packed_Format;
368   Packed_Signed     : constant Packed_Format;
369
370   ------------------------------------------------------------
371   -- Types For External Representation Of COBOL Binary Data --
372   ------------------------------------------------------------
373
374   type Byte is mod 2 ** COBOL_Character'Size;
375   type Byte_Array is array (Positive range <>) of Byte;
376   --  pragma Pack (Byte_Array);
377
378   Conversion_Error : exception;
379
380   generic
381      type Num is delta <> digits <>;
382
383   package Decimal_Conversions is
384
385      --  Display Formats: data values are represented as Numeric
386
387      function Valid
388        (Item   : Numeric;
389         Format : Display_Format)
390         return   Boolean;
391
392      function Length
393        (Format : Display_Format)
394         return   Natural;
395
396      function To_Decimal
397        (Item   : Numeric;
398         Format : Display_Format)
399         return   Num;
400
401      function To_Display
402        (Item   : Num;
403         Format : Display_Format)
404         return   Numeric;
405
406      --  Packed Formats: data values are represented as Packed_Decimal
407
408      function Valid
409        (Item   : Packed_Decimal;
410         Format : Packed_Format)
411         return   Boolean;
412
413      function Length
414        (Format : Packed_Format)
415         return   Natural;
416
417      function To_Decimal
418        (Item   : Packed_Decimal;
419         Format : Packed_Format)
420         return   Num;
421
422      function To_Packed
423        (Item   : Num;
424         Format : Packed_Format)
425         return   Packed_Decimal;
426
427      --  Binary Formats: external data values are represented as Byte_Array
428
429      function Valid
430        (Item   : Byte_Array;
431         Format : Binary_Format)
432         return   Boolean;
433
434      function Length
435        (Format : Binary_Format)
436         return   Natural;
437
438      function To_Decimal
439        (Item   : Byte_Array;
440         Format : Binary_Format) return Num;
441
442      function To_Binary
443        (Item   : Num;
444         Format : Binary_Format)
445         return   Byte_Array;
446
447      --  Internal Binary formats: data values are of type Binary/Long_Binary
448
449      function To_Decimal (Item : Binary)      return Num;
450      function To_Decimal (Item : Long_Binary) return Num;
451
452      function To_Binary      (Item : Num)  return Binary;
453      function To_Long_Binary (Item : Num)  return Long_Binary;
454
455   private
456      pragma Inline (Length);
457      pragma Inline (To_Binary);
458      pragma Inline (To_Decimal);
459      pragma Inline (To_Display);
460      pragma Inline (To_Decimal);
461      pragma Inline (To_Long_Binary);
462      pragma Inline (Valid);
463
464   end Decimal_Conversions;
465
466   ------------------------------------------
467   -- Implementation Dependent Definitions --
468   ------------------------------------------
469
470   --  The implementation dependent definitions are wholly contained in the
471   --  private part of this spec (the body is implementation independent)
472
473private
474   -------------------
475   -- Binary Format --
476   -------------------
477
478   type Binary_Format is (H, L, N, HU, LU, NU);
479
480   subtype Binary_Unsigned_Format is Binary_Format range HU .. NU;
481
482   High_Order_First          : constant Binary_Format := H;
483   Low_Order_First           : constant Binary_Format := L;
484   Native_Binary             : constant Binary_Format := N;
485   High_Order_First_Unsigned : constant Binary_Format := HU;
486   Low_Order_First_Unsigned  : constant Binary_Format := LU;
487   Native_Binary_Unsigned    : constant Binary_Format := NU;
488
489   ---------------------------
490   -- Packed Decimal Format --
491   ---------------------------
492
493   --  Packed decimal numbers use the IBM mainframe format:
494
495   --     dd dd ... dd dd ds
496
497   --  where d are the Digits, in natural left to right order, and s is
498   --  the sign digit. If the number of Digits os even, then the high
499   --  order (leftmost) Digits is always a 0. For example, a six digit
500   --  number has the format:
501
502   --     0d dd dd ds
503
504   --  The sign digit has the possible values
505
506   --     16#0A#     non-standard plus sign
507   --     16#0B#     non-standard minus sign
508   --     16#0C#     standard plus sign
509   --     16#0D#     standard minus sign
510   --     16#0E#     non-standard plus sign
511   --     16#0F#     standard unsigned sign
512
513   --  The non-standard signs are recognized on input, but never generated
514   --  for output numbers. The 16#0F# distinguishes unsigned numbers from
515   --  signed positive numbers, but is treated as positive for computational
516   --  purposes. This format provides distinguished positive and negative
517   --  zero values, which behave the same in all operations.
518
519   type Packed_Format is (U, S);
520
521   Packed_Unsigned   : constant Packed_Format := U;
522   Packed_Signed     : constant Packed_Format := S;
523
524   type Packed_Representation_Type is (IBM);
525   --  Indicator for format used for packed decimal
526
527   Packed_Representation : constant Packed_Representation_Type := IBM;
528   --  This version of the spec uses IBM internal format, as described above.
529
530   -----------------------------
531   -- Display Decimal Formats --
532   -----------------------------
533
534   --  Display numbers are stored in standard ASCII format, as ASCII strings.
535   --  For the embedded signs, the following codes are used:
536
537   --     0-9 positive:  16#30# .. 16#39# (i.e. natural ASCII digit code)
538   --     0-9 negative:  16#20# .. 16#29# (ASCII digit code - 16#10#)
539
540   type Display_Format is (U, LS, TS, LN, TN);
541
542   Unsigned             : constant Display_Format := U;
543   Leading_Separate     : constant Display_Format := LS;
544   Trailing_Separate    : constant Display_Format := TS;
545   Leading_Nonseparate  : constant Display_Format := LN;
546   Trailing_Nonseparate : constant Display_Format := TN;
547
548   subtype COBOL_Digits is COBOL_Character range '0' .. '9';
549   --  Digit values in display decimal
550
551   COBOL_Space : constant COBOL_Character := ' ';
552   COBOL_Plus  : constant COBOL_Character := '+';
553   COBOL_Minus : constant COBOL_Character := '-';
554   --  Sign values for Leading_Separate and Trailing_Separate formats
555
556   subtype COBOL_Plus_Digits is COBOL_Character
557     range COBOL_Character'Val (16#30#) .. COBOL_Character'Val (16#39#);
558   --  Values used for embedded plus signs in nonseparate formats
559
560   subtype COBOL_Minus_Digits is COBOL_Character
561     range COBOL_Character'Val (16#20#) .. COBOL_Character'Val (16#29#);
562   --  Values used for embedded minus signs in nonseparate formats
563
564end Interfaces.COBOL;
565