376 lines
15 KiB
Ada
376 lines
15 KiB
Ada
------------------------------------------------------------------------------
|
|
-- --
|
|
-- GNAT SYSTEM UTILITIES --
|
|
-- --
|
|
-- G N A T P S T A --
|
|
-- --
|
|
-- B o d y --
|
|
-- --
|
|
-- $Revision: 1.10 $
|
|
-- --
|
|
-- Copyright (C) 1997-2001 Free Software Foundation, Inc. --
|
|
-- --
|
|
-- GNAT is free software; you can redistribute it and/or modify it under --
|
|
-- terms of the GNU General Public License as published by the Free Soft- --
|
|
-- ware Foundation; either version 2, or (at your option) any later ver- --
|
|
-- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
|
|
-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
|
|
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
|
|
-- for more details. You should have received a copy of the GNU General --
|
|
-- Public License distributed with GNAT; see file COPYING. If not, write --
|
|
-- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, --
|
|
-- MA 02111-1307, USA. --
|
|
-- --
|
|
-- GNAT was originally developed by the GNAT team at New York University. --
|
|
-- It is now maintained by Ada Core Technologies Inc (http://www.gnat.com). --
|
|
-- --
|
|
------------------------------------------------------------------------------
|
|
|
|
-- Program to print out listing of Standard package for the target (not
|
|
-- the host) with all constants appearing explicitly. This is not really
|
|
-- valid Ada, since one cannot really define new base types, but it is a
|
|
-- helpful listing from a documentation point of view.
|
|
|
|
-- Note that special care has been taken to use the host parameters for
|
|
-- integer and floating point sizes.
|
|
|
|
with Ada.Text_IO; use Ada.Text_IO;
|
|
with Gnatvsn;
|
|
with Ttypef; use Ttypef;
|
|
with Ttypes; use Ttypes;
|
|
with Types; use Types;
|
|
|
|
procedure GnatPsta is
|
|
pragma Ident (Gnatvsn.Gnat_Version_String);
|
|
|
|
procedure P (Item : String) renames Ada.Text_IO.Put_Line;
|
|
|
|
procedure P_Int_Range (Size : Pos; Put_First : Boolean := True);
|
|
-- Prints the range of an integer based on its Size. If Put_First is
|
|
-- False, then skip the first bound.
|
|
|
|
procedure P_Float_Range (Nb_Digits : Pos);
|
|
-- Prints the maximum range of a Float whose 'Digits is given by Nb_Digits
|
|
|
|
-------------------
|
|
-- P_Float_Range --
|
|
-------------------
|
|
|
|
procedure P_Float_Range (Nb_Digits : Pos) is
|
|
begin
|
|
-- This routine assumes only IEEE floats.
|
|
-- ??? Should the following be adapted for OpenVMS ?
|
|
|
|
case Nb_Digits is
|
|
when IEEES_Digits =>
|
|
P (" range " & IEEES_First'Universal_Literal_String & " .. " &
|
|
IEEES_Last'Universal_Literal_String & ";");
|
|
when IEEEL_Digits =>
|
|
P (" range " & IEEEL_First'Universal_Literal_String & " .. " &
|
|
IEEEL_Last'Universal_Literal_String & ";");
|
|
when IEEEX_Digits =>
|
|
P (" range " & IEEEX_First'Universal_Literal_String & " .. " &
|
|
IEEEX_Last'Universal_Literal_String & ";");
|
|
|
|
when others =>
|
|
P (";");
|
|
end case;
|
|
|
|
-- If one of the floating point types of the host computer has the
|
|
-- same digits as the target float we are processing, then print out
|
|
-- the float range using the host computer float type.
|
|
|
|
if Nb_Digits = Short_Float'Digits then
|
|
P (" -- " &
|
|
Short_Float'First'Img & " .. " & Short_Float'Last'Img);
|
|
|
|
elsif Nb_Digits = Float'Digits then
|
|
P (" -- " &
|
|
Float'First'Img & " .. " & Float'Last'Img);
|
|
|
|
elsif Nb_Digits = Long_Float'Digits then
|
|
P (" -- " &
|
|
Long_Float'First'Img & " .. " & Long_Float'Last'Img);
|
|
|
|
elsif Nb_Digits = Long_Long_Float'Digits then
|
|
P (" -- " &
|
|
Long_Long_Float'First'Img & " .. " & Long_Long_Float'Last'Img);
|
|
end if;
|
|
|
|
New_Line;
|
|
end P_Float_Range;
|
|
|
|
-----------------
|
|
-- P_Int_Range --
|
|
-----------------
|
|
|
|
procedure P_Int_Range (Size : Pos; Put_First : Boolean := True) is
|
|
begin
|
|
if Put_First then
|
|
Put (" is range -(2 **" & Pos'Image (Size - 1) & ")");
|
|
end if;
|
|
P (" .. +(2 **" & Pos'Image (Size - 1) & " - 1);");
|
|
end P_Int_Range;
|
|
|
|
-- Start of processing for GnatPsta
|
|
|
|
begin
|
|
P ("package Standard is");
|
|
P ("pragma Pure(Standard);");
|
|
New_Line;
|
|
|
|
P (" type Boolean is (False, True);");
|
|
New_Line;
|
|
|
|
-- Integer types
|
|
|
|
Put (" type Integer");
|
|
P_Int_Range (Standard_Integer_Size);
|
|
New_Line;
|
|
|
|
Put (" subtype Natural is Integer range 0");
|
|
P_Int_Range (Standard_Integer_Size, Put_First => False);
|
|
|
|
Put (" subtype Positive is Integer range 1");
|
|
P_Int_Range (Standard_Integer_Size, Put_First => False);
|
|
New_Line;
|
|
|
|
Put (" type Short_Short_Integer");
|
|
P_Int_Range (Standard_Short_Short_Integer_Size);
|
|
|
|
Put (" type Short_Integer ");
|
|
P_Int_Range (Standard_Short_Integer_Size);
|
|
|
|
Put (" type Long_Integer ");
|
|
P_Int_Range (Standard_Long_Integer_Size);
|
|
|
|
Put (" type Long_Long_Integer ");
|
|
P_Int_Range (Standard_Long_Long_Integer_Size);
|
|
New_Line;
|
|
|
|
-- Floating point types
|
|
|
|
P (" type Short_Float is digits"
|
|
& Standard_Short_Float_Digits'Img);
|
|
P_Float_Range (Standard_Short_Float_Digits);
|
|
|
|
P (" type Float is digits"
|
|
& Standard_Float_Digits'Img);
|
|
P_Float_Range (Standard_Float_Digits);
|
|
|
|
P (" type Long_Float is digits"
|
|
& Standard_Long_Float_Digits'Img);
|
|
P_Float_Range (Standard_Long_Float_Digits);
|
|
|
|
P (" type Long_Long_Float is digits"
|
|
& Standard_Long_Long_Float_Digits'Img);
|
|
P_Float_Range (Standard_Long_Long_Float_Digits);
|
|
|
|
P (" -- function ""*"" (Left : root_integer; Right : root_real)");
|
|
P (" -- return root_real;");
|
|
New_Line;
|
|
|
|
P (" -- function ""*"" (Left : root_real; Right : root_integer)");
|
|
P (" -- return root_real;");
|
|
New_Line;
|
|
|
|
P (" -- function ""/"" (Left : root_real; Right : root_integer)");
|
|
P (" -- return root_real;");
|
|
New_Line;
|
|
|
|
P (" -- function ""*"" (Left : universal_fixed; " &
|
|
"Right : universal_fixed)");
|
|
P (" -- return universal_fixed;");
|
|
New_Line;
|
|
|
|
P (" -- function ""/"" (Left : universal_fixed; " &
|
|
"Right : universal_fixed)");
|
|
P (" -- return universal_fixed;");
|
|
New_Line;
|
|
|
|
P (" -- The declaration of type Character is based on the standard");
|
|
P (" -- ISO 8859-1 character set.");
|
|
New_Line;
|
|
|
|
P (" -- There are no character literals corresponding to the positions");
|
|
P (" -- for control characters. They are indicated by lower case");
|
|
P (" -- identifiers in the following list.");
|
|
New_Line;
|
|
|
|
P (" -- Note: this type cannot be represented accurately in Ada");
|
|
New_Line;
|
|
|
|
P (" -- type Character is");
|
|
New_Line;
|
|
|
|
P (" -- (nul, soh, stx, etx, eot, enq, ack, bel,");
|
|
P (" -- bs, ht, lf, vt, ff, cr, so, si,");
|
|
New_Line;
|
|
|
|
P (" -- dle, dc1, dc2, dc3, dc4, nak, syn, etb,");
|
|
P (" -- can, em, sub, esc, fs, gs, rs, us,");
|
|
New_Line;
|
|
|
|
P (" -- ' ', '!', '""', '#', '$', '%', '&', ''',");
|
|
P (" -- '(', ')', '*', '+', ',', '-', '.', '/',");
|
|
New_Line;
|
|
|
|
P (" -- '0', '1', '2', '3', '4', '5', '6', '7',");
|
|
P (" -- '8', '9', ':', ';', '<', '=', '>', '?',");
|
|
New_Line;
|
|
|
|
P (" -- '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G',");
|
|
P (" -- 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',");
|
|
New_Line;
|
|
|
|
P (" -- 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',");
|
|
P (" -- 'X', 'Y', 'Z', '[', '\', ']', '^', '_',");
|
|
New_Line;
|
|
|
|
P (" -- '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g',");
|
|
P (" -- 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',");
|
|
New_Line;
|
|
|
|
P (" -- 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',");
|
|
P (" -- 'x', 'y', 'z', '{', '|', '}', '~', del,");
|
|
New_Line;
|
|
|
|
P (" -- reserved_128, reserved_129, bph, nbh,");
|
|
P (" -- reserved_132, nel, ssa, esa,");
|
|
New_Line;
|
|
|
|
P (" -- hts, htj, vts, pld, plu, ri, ss2, ss3,");
|
|
New_Line;
|
|
|
|
P (" -- dcs, pu1, pu2, sts, cch, mw, spa, epa,");
|
|
New_Line;
|
|
|
|
P (" -- sos, reserved_153, sci, csi,");
|
|
P (" -- st, osc, pm, apc,");
|
|
New_Line;
|
|
|
|
P (" -- ... );");
|
|
New_Line;
|
|
|
|
P (" -- The declaration of type Wide_Character is based " &
|
|
"on the standard");
|
|
P (" -- ISO 10646 BMP character set.");
|
|
New_Line;
|
|
|
|
P (" -- Note: this type cannot be represented accurately in Ada");
|
|
New_Line;
|
|
|
|
P (" -- The first 256 positions have the same contents as " &
|
|
"type Character");
|
|
New_Line;
|
|
|
|
P (" -- type Wide_Character is (nul, soh ... FFFE, FFFF);");
|
|
New_Line;
|
|
|
|
P (" package ASCII is");
|
|
New_Line;
|
|
|
|
P (" -- Control characters:");
|
|
New_Line;
|
|
|
|
P (" NUL : constant Character := Character'Val (16#00#);");
|
|
P (" SOH : constant Character := Character'Val (16#01#);");
|
|
P (" STX : constant Character := Character'Val (16#02#);");
|
|
P (" ETX : constant Character := Character'Val (16#03#);");
|
|
P (" EOT : constant Character := Character'Val (16#04#);");
|
|
P (" ENQ : constant Character := Character'Val (16#05#);");
|
|
P (" ACK : constant Character := Character'Val (16#06#);");
|
|
P (" BEL : constant Character := Character'Val (16#07#);");
|
|
P (" BS : constant Character := Character'Val (16#08#);");
|
|
P (" HT : constant Character := Character'Val (16#09#);");
|
|
P (" LF : constant Character := Character'Val (16#0A#);");
|
|
P (" VT : constant Character := Character'Val (16#0B#);");
|
|
P (" FF : constant Character := Character'Val (16#0C#);");
|
|
P (" CR : constant Character := Character'Val (16#0D#);");
|
|
P (" SO : constant Character := Character'Val (16#0E#);");
|
|
P (" SI : constant Character := Character'Val (16#0F#);");
|
|
P (" DLE : constant Character := Character'Val (16#10#);");
|
|
P (" DC1 : constant Character := Character'Val (16#11#);");
|
|
P (" DC2 : constant Character := Character'Val (16#12#);");
|
|
P (" DC3 : constant Character := Character'Val (16#13#);");
|
|
P (" DC4 : constant Character := Character'Val (16#14#);");
|
|
P (" NAK : constant Character := Character'Val (16#15#);");
|
|
P (" SYN : constant Character := Character'Val (16#16#);");
|
|
P (" ETB : constant Character := Character'Val (16#17#);");
|
|
P (" CAN : constant Character := Character'Val (16#18#);");
|
|
P (" EM : constant Character := Character'Val (16#19#);");
|
|
P (" SUB : constant Character := Character'Val (16#1A#);");
|
|
P (" ESC : constant Character := Character'Val (16#1B#);");
|
|
P (" FS : constant Character := Character'Val (16#1C#);");
|
|
P (" GS : constant Character := Character'Val (16#1D#);");
|
|
P (" RS : constant Character := Character'Val (16#1E#);");
|
|
P (" US : constant Character := Character'Val (16#1F#);");
|
|
P (" DEL : constant Character := Character'Val (16#7F#);");
|
|
New_Line;
|
|
|
|
P (" -- Other characters:");
|
|
New_Line;
|
|
|
|
P (" Exclam : constant Character := '!';");
|
|
P (" Quotation : constant Character := '""';");
|
|
P (" Sharp : constant Character := '#';");
|
|
P (" Dollar : constant Character := '$';");
|
|
P (" Percent : constant Character := '%';");
|
|
P (" Ampersand : constant Character := '&';");
|
|
P (" Colon : constant Character := ':';");
|
|
P (" Semicolon : constant Character := ';';");
|
|
P (" Query : constant Character := '?';");
|
|
P (" At_Sign : constant Character := '@';");
|
|
P (" L_Bracket : constant Character := '[';");
|
|
P (" Back_Slash : constant Character := '\';");
|
|
P (" R_Bracket : constant Character := ']';");
|
|
P (" Circumflex : constant Character := '^';");
|
|
P (" Underline : constant Character := '_';");
|
|
P (" Grave : constant Character := '`';");
|
|
P (" L_Brace : constant Character := '{';");
|
|
P (" Bar : constant Character := '|';");
|
|
P (" R_Brace : constant Character := '}';");
|
|
P (" Tilde : constant Character := '~';");
|
|
New_Line;
|
|
|
|
P (" -- Lower case letters:");
|
|
New_Line;
|
|
|
|
for C in Character range 'a' .. 'z' loop
|
|
P (" LC_" & Character'Val (Character'Pos (C) - 32) &
|
|
" : constant Character := '" & C & "';");
|
|
end loop;
|
|
New_Line;
|
|
|
|
P (" end ASCII;");
|
|
New_Line;
|
|
|
|
P (" type String is array (Positive range <>) of Character;");
|
|
P (" pragma Pack (String);");
|
|
New_Line;
|
|
|
|
P (" type Wide_String is array (Positive range <>) of Wide_Character;");
|
|
P (" pragma Pack (Wide_String);");
|
|
New_Line;
|
|
|
|
-- Here it's OK to use the Duration type of the host compiler since
|
|
-- the implementation of Duration in GNAT is target independent.
|
|
|
|
P (" type Duration is delta" &
|
|
Duration'Image (Duration'Delta));
|
|
P (" range -((2 **" & Natural'Image (Duration'Size - 1) &
|
|
" - 1) *" & Duration'Image (Duration'Delta) & ") ..");
|
|
P (" +((2 **" & Natural'Image (Duration'Size - 1) &
|
|
" - 1) *" & Duration'Image (Duration'Delta) & ");");
|
|
P (" for Duration'Small use" & Duration'Image (Duration'Small) & ";");
|
|
New_Line;
|
|
|
|
P (" Constraint_Error : exception;");
|
|
P (" Program_Error : exception;");
|
|
P (" Storage_Error : exception;");
|
|
P (" Tasking_Error : exception;");
|
|
New_Line;
|
|
|
|
P ("end Standard;");
|
|
end GnatPsta;
|