aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada
diff options
context:
space:
mode:
authorRobert Dewar <dewar@adacore.com>2007-12-13 11:30:04 +0100
committerArnaud Charlet <charlet@gcc.gnu.org>2007-12-13 11:30:04 +0100
commit01b18343996b7145c23191fb574b3fae3e845d8d (patch)
tree723bf7b7f6c79be9da7af8b7b5180dc8dc0f63f7 /gcc/ada
parent859fd598cb7a5f449fa3ce9aaafb65ade064b2ed (diff)
downloadgcc-01b18343996b7145c23191fb574b3fae3e845d8d.zip
gcc-01b18343996b7145c23191fb574b3fae3e845d8d.tar.gz
gcc-01b18343996b7145c23191fb574b3fae3e845d8d.tar.bz2
s-imenne.adb, [...]: New files.
2007-12-06 Robert Dewar <dewar@adacore.com> * s-imenne.adb, s-imenne.ads: New files. * s-imgboo.adb, s-imgboo.ads, s-imgcha.adb, s-imgcha.ads, s-imgdec.adb, s-imgdec.ads, s-imgenu.ads, s-imgint.adb, s-imgint.ads, s-imglld.adb, s-imglld.ads, s-imglli.adb, s-imglli.ads, s-imgllu.adb, s-imgllu.ads, s-imgrea.adb, s-imgrea.ads, s-imguns.adb, s-imguns.ads, s-imgwch.adb, s-imgwch.ads: New calling sequence for Image routines to avoid sec stack usage. From-SVN: r130852
Diffstat (limited to 'gcc/ada')
-rw-r--r--gcc/ada/s-imenne.adb132
-rw-r--r--gcc/ada/s-imenne.ads89
-rw-r--r--gcc/ada/s-imgboo.adb15
-rw-r--r--gcc/ada/s-imgboo.ads9
-rw-r--r--gcc/ada/s-imgcha.adb37
-rw-r--r--gcc/ada/s-imgcha.ads11
-rw-r--r--gcc/ada/s-imgdec.adb46
-rw-r--r--gcc/ada/s-imgdec.ads23
-rw-r--r--gcc/ada/s-imgenu.ads18
-rw-r--r--gcc/ada/s-imgint.adb52
-rw-r--r--gcc/ada/s-imgint.ads24
-rw-r--r--gcc/ada/s-imglld.adb33
-rw-r--r--gcc/ada/s-imglld.ads24
-rw-r--r--gcc/ada/s-imglli.adb27
-rw-r--r--gcc/ada/s-imglli.ads24
-rw-r--r--gcc/ada/s-imgllu.adb27
-rw-r--r--gcc/ada/s-imgllu.ads26
-rw-r--r--gcc/ada/s-imgrea.adb30
-rw-r--r--gcc/ada/s-imgrea.ads43
-rw-r--r--gcc/ada/s-imguns.adb23
-rw-r--r--gcc/ada/s-imguns.ads25
-rw-r--r--gcc/ada/s-imgwch.adb45
-rw-r--r--gcc/ada/s-imgwch.ads25
23 files changed, 576 insertions, 232 deletions
diff --git a/gcc/ada/s-imenne.adb b/gcc/ada/s-imenne.adb
new file mode 100644
index 0000000..1e08b05
--- /dev/null
+++ b/gcc/ada/s-imenne.adb
@@ -0,0 +1,132 @@
+------------------------------------------------------------------------------
+-- --
+-- GNAT RUN-TIME COMPONENTS --
+-- --
+-- S Y S T E M . I M G _ E N U M _ N E W --
+-- --
+-- B o d y --
+-- --
+-- Copyright (C) 2000-2007, 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, 51 Franklin Street, Fifth Floor, --
+-- Boston, MA 02110-1301, USA. --
+-- --
+-- As a special exception, if other files instantiate generics from this --
+-- unit, or you link this unit with other files to produce an executable, --
+-- this unit does not by itself cause the resulting executable to be --
+-- covered by the GNU General Public License. This exception does not --
+-- however invalidate any other reasons why the executable file might be --
+-- covered by the GNU Public License. --
+-- --
+-- GNAT was originally developed by the GNAT team at New York University. --
+-- Extensive contributions were provided by Ada Core Technologies Inc. --
+-- --
+------------------------------------------------------------------------------
+
+pragma Warnings (Off);
+pragma Compiler_Unit;
+pragma Warnings (On);
+
+with Ada.Unchecked_Conversion;
+
+package body System.Img_Enum_New is
+
+ -------------------------
+ -- Image_Enumeration_8 --
+ -------------------------
+
+ procedure Image_Enumeration_8
+ (Pos : Natural;
+ S : in out String;
+ P : out Natural;
+ Names : String;
+ Indexes : System.Address)
+ is
+ pragma Assert (S'First = 1);
+
+ type Natural_8 is range 0 .. 2 ** 7 - 1;
+ type Index_Table is array (Natural) of Natural_8;
+ type Index_Table_Ptr is access Index_Table;
+
+ function To_Index_Table_Ptr is
+ new Ada.Unchecked_Conversion (System.Address, Index_Table_Ptr);
+
+ IndexesT : constant Index_Table_Ptr := To_Index_Table_Ptr (Indexes);
+
+ Start : constant Natural := Natural (IndexesT (Pos));
+ Next : constant Natural := Natural (IndexesT (Pos + 1));
+
+ begin
+ S (1 .. Next - Start) := Names (Start .. Next - 1);
+ P := Next - Start;
+ end Image_Enumeration_8;
+
+ --------------------------
+ -- Image_Enumeration_16 --
+ --------------------------
+
+ procedure Image_Enumeration_16
+ (Pos : Natural;
+ S : in out String;
+ P : out Natural;
+ Names : String;
+ Indexes : System.Address)
+ is
+ pragma Assert (S'First = 1);
+
+ type Natural_16 is range 0 .. 2 ** 15 - 1;
+ type Index_Table is array (Natural) of Natural_16;
+ type Index_Table_Ptr is access Index_Table;
+
+ function To_Index_Table_Ptr is
+ new Ada.Unchecked_Conversion (System.Address, Index_Table_Ptr);
+
+ IndexesT : constant Index_Table_Ptr := To_Index_Table_Ptr (Indexes);
+
+ Start : constant Natural := Natural (IndexesT (Pos));
+ Next : constant Natural := Natural (IndexesT (Pos + 1));
+
+ begin
+ S (1 .. Next - Start) := Names (Start .. Next - 1);
+ P := Next - Start;
+ end Image_Enumeration_16;
+
+ --------------------------
+ -- Image_Enumeration_32 --
+ --------------------------
+
+ procedure Image_Enumeration_32
+ (Pos : Natural;
+ S : in out String;
+ P : out Natural;
+ Names : String;
+ Indexes : System.Address)
+ is
+ pragma Assert (S'First = 1);
+
+ type Natural_32 is range 0 .. 2 ** 31 - 1;
+ type Index_Table is array (Natural) of Natural_32;
+ type Index_Table_Ptr is access Index_Table;
+
+ function To_Index_Table_Ptr is
+ new Ada.Unchecked_Conversion (System.Address, Index_Table_Ptr);
+
+ IndexesT : constant Index_Table_Ptr := To_Index_Table_Ptr (Indexes);
+
+ Start : constant Natural := Natural (IndexesT (Pos));
+ Next : constant Natural := Natural (IndexesT (Pos + 1));
+
+ begin
+ S (1 .. Next - Start) := Names (Start .. Next - 1);
+ P := Next - Start;
+ end Image_Enumeration_32;
+
+end System.Img_Enum_New;
diff --git a/gcc/ada/s-imenne.ads b/gcc/ada/s-imenne.ads
new file mode 100644
index 0000000..3be79cd
--- /dev/null
+++ b/gcc/ada/s-imenne.ads
@@ -0,0 +1,89 @@
+------------------------------------------------------------------------------
+-- --
+-- GNAT RUN-TIME COMPONENTS --
+-- --
+-- S Y S T E M . I M G _ E N U M _ N E W --
+-- --
+-- S p e c --
+-- --
+-- Copyright (C) 2000-2007, 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, 51 Franklin Street, Fifth Floor, --
+-- Boston, MA 02110-1301, USA. --
+-- --
+-- As a special exception, if other files instantiate generics from this --
+-- unit, or you link this unit with other files to produce an executable, --
+-- this unit does not by itself cause the resulting executable to be --
+-- covered by the GNU General Public License. This exception does not --
+-- however invalidate any other reasons why the executable file might be --
+-- covered by the GNU Public License. --
+-- --
+-- GNAT was originally developed by the GNAT team at New York University. --
+-- Extensive contributions were provided by Ada Core Technologies Inc. --
+-- --
+------------------------------------------------------------------------------
+
+-- Enumeration_Type'Image for all enumeration types except those in package
+-- Standard (where we have no opportunity to build image tables), and in
+-- package System (where it is too early to start building image tables).
+-- Special routines exist for the enumeration types in these packages.
+
+-- This is the new version of the package, for use by compilers built after
+-- Nov 21st, 2007, which provides procedures that avoid using the secondary
+-- stack. The original package System.Img_Enum is maintained in the sources
+-- for bootstrapping with older versions of the compiler which expect to find
+-- functions in this package.
+
+pragma Warnings (Off);
+pragma Compiler_Unit;
+pragma Warnings (On);
+
+package System.Img_Enum_New is
+ pragma Pure;
+
+ procedure Image_Enumeration_8
+ (Pos : Natural;
+ S : in out String;
+ P : out Natural;
+ Names : String;
+ Indexes : System.Address);
+ -- Used to compute Enum'Image (Str) where Enum is some enumeration type
+ -- other than those defined in package Standard. Names is a string with
+ -- a lower bound of 1 containing the characters of all the enumeration
+ -- literals concatenated together in sequence. Indexes is the address of
+ -- an array of type array (0 .. N) of Natural_8, where N is the number of
+ -- enumeration literals in the type. The Indexes values are the starting
+ -- subscript of each enumeration literal, indexed by Pos values, with an
+ -- extra entry at the end containing Names'Length + 1. The reason that
+ -- Indexes is passed by address is that the actual type is created on the
+ -- fly by the expander. The desired 'Image value is stored in S (1 .. P)
+ -- and P is set on return. The caller guarantees that S is long enough to
+ -- hold the result and that the lower bound is 1.
+
+ procedure Image_Enumeration_16
+ (Pos : Natural;
+ S : in out String;
+ P : out Natural;
+ Names : String;
+ Indexes : System.Address);
+ -- Identical to Set_Image_Enumeration_8 except that it handles types
+ -- using array (0 .. Num) of Natural_16 for the Indexes table.
+
+ procedure Image_Enumeration_32
+ (Pos : Natural;
+ S : in out String;
+ P : out Natural;
+ Names : String;
+ Indexes : System.Address);
+ -- Identical to Set_Image_Enumeration_8 except that it handles types
+ -- using array (0 .. Num) of Natural_32 for the Indexes table.
+
+end System.Img_Enum_New;
diff --git a/gcc/ada/s-imgboo.adb b/gcc/ada/s-imgboo.adb
index ee58302..8d69bac 100644
--- a/gcc/ada/s-imgboo.adb
+++ b/gcc/ada/s-imgboo.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 1992-2005 Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2007, 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- --
@@ -37,12 +37,19 @@ package body System.Img_Bool is
-- Image_Boolean --
-------------------
- function Image_Boolean (V : Boolean) return String is
+ procedure Image_Boolean
+ (V : Boolean;
+ S : in out String;
+ P : out Natural)
+ is
+ pragma Assert (S'First = 1);
begin
if V then
- return "TRUE";
+ S (1 .. 4) := "TRUE";
+ P := 4;
else
- return "FALSE";
+ S (1 .. 5) := "FALSE";
+ P := 5;
end if;
end Image_Boolean;
diff --git a/gcc/ada/s-imgboo.ads b/gcc/ada/s-imgboo.ads
index c632d4d..ec1fd06 100644
--- a/gcc/ada/s-imgboo.ads
+++ b/gcc/ada/s-imgboo.ads
@@ -36,7 +36,12 @@
package System.Img_Bool is
pragma Pure;
- function Image_Boolean (V : Boolean) return String;
- -- Computes Boolean'Image (V) and returns the result
+ procedure Image_Boolean
+ (V : Boolean;
+ S : in out String;
+ P : out Natural);
+ -- Computes Boolean'Image (V) and stores the result in S (1 .. P)
+ -- setting the resulting value of P. The caller guarantees that S
+ -- is long enough to hold the result, and that S'First is 1.
end System.Img_Bool;
diff --git a/gcc/ada/s-imgcha.adb b/gcc/ada/s-imgcha.adb
index 97ddb37..a8d7c10 100644
--- a/gcc/ada/s-imgcha.adb
+++ b/gcc/ada/s-imgcha.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 1992-2005 Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2007, 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- --
@@ -37,10 +37,14 @@ package body System.Img_Char is
-- Image_Character --
---------------------
- function Image_Character (V : Character) return String is
- subtype Cname is String (1 .. 3);
+ procedure Image_Character
+ (V : Character;
+ S : in out String;
+ P : out Natural)
+ is
+ pragma Assert (S'First = 1);
- S : Cname;
+ subtype Cname is String (1 .. 3);
subtype C0_Range is Character
range Character'Val (16#00#) .. Character'Val (16#1F#);
@@ -121,22 +125,22 @@ package body System.Img_Char is
-- Control characters are represented by their names (RM 3.5(32))
if V in C0_Range then
- S := C0 (V);
+ S (1 .. 3) := C0 (V);
if S (3) = ' ' then
- return S (1 .. 2);
+ P := 2;
else
- return S;
+ P := 3;
end if;
elsif V in C1_Range then
- S := C1 (V);
+ S (1 .. 3) := C1 (V);
if S (1) /= 'r' then
if S (3) = ' ' then
- return S (1 .. 2);
+ P := 2;
else
- return S;
+ P := 3;
end if;
-- Special case, res means RESERVED_nnn where nnn is the three digit
@@ -146,13 +150,12 @@ package body System.Img_Char is
else
declare
VP : constant Natural := Character'Pos (V);
- St : String (1 .. 12) := "RESERVED_xxx";
-
begin
- St (10) := Character'Val (48 + VP / 100);
- St (11) := Character'Val (48 + (VP / 10) mod 10);
- St (12) := Character'Val (48 + VP mod 10);
- return St;
+ S (1 .. 9) := "RESERVED_";
+ S (10) := Character'Val (48 + VP / 100);
+ S (11) := Character'Val (48 + (VP / 10) mod 10);
+ S (12) := Character'Val (48 + VP mod 10);
+ P := 12;
end;
end if;
@@ -162,7 +165,7 @@ package body System.Img_Char is
S (1) := ''';
S (2) := V;
S (3) := ''';
- return S;
+ P := 3;
end if;
end Image_Character;
diff --git a/gcc/ada/s-imgcha.ads b/gcc/ada/s-imgcha.ads
index a756dcb..8ef90d2 100644
--- a/gcc/ada/s-imgcha.ads
+++ b/gcc/ada/s-imgcha.ads
@@ -6,7 +6,7 @@
-- --
-- S p e c --
-- --
--- Copyright (C) 1992-2005 Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2007, 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- --
@@ -36,7 +36,12 @@
package System.Img_Char is
pragma Pure;
- function Image_Character (V : Character) return String;
- -- Computes Character'Image (V) and returns the result
+ procedure Image_Character
+ (V : Character;
+ S : in out String;
+ P : out Natural);
+ -- Computes Character'Image (V) and stores the result in S (1 .. P)
+ -- setting the resulting value of P. The caller guarantees that S is
+ -- long enough to hold the result, and that S'First is 1.
end System.Img_Char;
diff --git a/gcc/ada/s-imgdec.adb b/gcc/ada/s-imgdec.adb
index d57d07d..ce7365e 100644
--- a/gcc/ada/s-imgdec.adb
+++ b/gcc/ada/s-imgdec.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 1992-2006, Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2007, 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- --
@@ -39,26 +39,25 @@ package body System.Img_Dec is
-- Image_Decimal --
-------------------
- function Image_Decimal
+ procedure Image_Decimal
(V : Integer;
- Scale : Integer) return String
+ S : in out String;
+ P : out Natural;
+ Scale : Integer)
is
- P : Natural := 0;
- S : String (1 .. 64);
+ pragma Assert (S'First = 1);
begin
- Set_Image_Decimal (V, S, P, Scale, 1, Integer'Max (1, Scale), 0);
-
- -- Mess around to make sure we have the objectionable space at the
- -- start for positive numbers in accordance with the annoying rules!
+ -- Add space at start for non-negative numbers
- if S (1) /= ' ' and then S (1) /= '-' then
- S (2 .. P + 1) := S (1 .. P);
+ if V >= 0 then
S (1) := ' ';
- return S (1 .. P + 1);
+ P := 1;
else
- return S (1 .. P);
+ P := 0;
end if;
+
+ Set_Image_Decimal (V, S, P, Scale, 1, Integer'Max (1, Scale), 0);
end Image_Decimal;
------------------------
@@ -188,12 +187,20 @@ package body System.Img_Dec is
end if;
end Round;
+ ---------
+ -- Set --
+ ---------
+
procedure Set (C : Character) is
begin
P := P + 1;
S (P) := C;
end Set;
+ -------------------------
+ -- Set_Blanks_And_Sign --
+ -------------------------
+
procedure Set_Blanks_And_Sign (N : Integer) is
W : Integer := N;
@@ -214,6 +221,10 @@ package body System.Img_Dec is
end if;
end Set_Blanks_And_Sign;
+ ----------------
+ -- Set_Digits --
+ ----------------
+
procedure Set_Digits (S, E : Natural) is
begin
for J in S .. E loop
@@ -221,6 +232,10 @@ package body System.Img_Dec is
end loop;
end Set_Digits;
+ ----------------
+ -- Set_Zeroes --
+ ----------------
+
procedure Set_Zeroes (N : Integer) is
begin
for J in 1 .. N loop
@@ -330,7 +345,6 @@ package body System.Img_Dec is
end if;
end if;
end if;
-
end Set_Decimal_Digits;
-----------------------
@@ -339,14 +353,14 @@ package body System.Img_Dec is
procedure Set_Image_Decimal
(V : Integer;
- S : out String;
+ S : in out String;
P : in out Natural;
Scale : Integer;
Fore : Natural;
Aft : Natural;
Exp : Natural)
is
- Digs : String := Image_Integer (V);
+ Digs : String := Integer'Image (V);
-- Sign and digits of decimal value
begin
diff --git a/gcc/ada/s-imgdec.ads b/gcc/ada/s-imgdec.ads
index 41762e1..16a821c 100644
--- a/gcc/ada/s-imgdec.ads
+++ b/gcc/ada/s-imgdec.ads
@@ -6,7 +6,7 @@
-- --
-- S p e c --
-- --
--- Copyright (C) 1992-2006, Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2007, 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- --
@@ -35,18 +35,23 @@
-- type does not exceed Integer'Size (also used for Text_IO.Decimal_IO output)
package System.Img_Dec is
- pragma Preelaborate;
+ pragma Pure;
- function Image_Decimal
+ procedure Image_Decimal
(V : Integer;
- Scale : Integer) return String;
- -- Compute 'Image of V, the integer value (in units of delta) of a decimal
- -- type whose Scale is as given and return the result. THe image is given
- -- by the rules in RM 3.5(34) for fixed-point type image functions.
+ S : in out String;
+ P : out Natural;
+ Scale : Integer);
+ -- Computes fixed_type'Image (V), where V is the integer value (in units of
+ -- delta) of a decimal type whose Scale is as given and stores the result
+ -- S (1 .. P), updating P to the value of L. The image is given by the
+ -- rules in RM 3.5(34) for fixed-point type image functions. The caller
+ -- guarantees that S is long enough to hold the result. S need not have a
+ -- lower bound of 1.
procedure Set_Image_Decimal
(V : Integer;
- S : out String;
+ S : in out String;
P : in out Natural;
Scale : Integer;
Fore : Natural;
@@ -59,7 +64,7 @@ package System.Img_Dec is
-- will not necessarily be raised if this requirement is violated, since
-- it is perfectly valid to compile this unit with checks off. The Fore,
-- Aft and Exp values can be set to any valid values for the case of use
- -- by Text_IO.Decimal_IO.
+ -- by Text_IO.Decimal_IO. Note that there is no leading space stored.
procedure Set_Decimal_Digits
(Digs : in out String;
diff --git a/gcc/ada/s-imgenu.ads b/gcc/ada/s-imgenu.ads
index e9b01f3..2b6fbdd 100644
--- a/gcc/ada/s-imgenu.ads
+++ b/gcc/ada/s-imgenu.ads
@@ -34,7 +34,14 @@
-- Enumeration_Type'Image for all enumeration types except those in package
-- Standard (where we have no opportunity to build image tables), and in
-- package System (where it is too early to start building image tables).
--- Special routines exist for the enumeration routines in these packages.
+-- Special routines exist for the enumeration types in these packages.
+
+-- Note: this is an obsolete package, replaced by System.Img_Enum_New, which
+-- provides procedures instead of functions for these enumeration image calls.
+-- The reason we maintain this package is that when bootstrapping with old
+-- compilers, the old compiler will search for this unit, expectinng to find
+-- these functions. The new commpiler will search for procedures in the new
+-- version of the unit.
pragma Warnings (Off);
pragma Compiler_Unit;
@@ -46,8 +53,7 @@ package System.Img_Enum is
function Image_Enumeration_8
(Pos : Natural;
Names : String;
- Indexes : System.Address)
- return String;
+ Indexes : System.Address) return String;
-- Used to compute Enum'Image (Str) where Enum is some enumeration type
-- other than those defined in package Standard. Names is a string with a
-- lower bound of 1 containing the characters of all the enumeration
@@ -62,16 +68,14 @@ package System.Img_Enum is
function Image_Enumeration_16
(Pos : Natural;
Names : String;
- Indexes : System.Address)
- return String;
+ Indexes : System.Address) return String;
-- Identical to Image_Enumeration_8 except that it handles types
-- using array (0 .. Num) of Natural_16 for the Indexes table.
function Image_Enumeration_32
(Pos : Natural;
Names : String;
- Indexes : System.Address)
- return String;
+ Indexes : System.Address) return String;
-- Identical to Image_Enumeration_8 except that it handles types
-- using array (0 .. Num) of Natural_32 for the Indexes table.
diff --git a/gcc/ada/s-imgint.adb b/gcc/ada/s-imgint.adb
index e57c58d..74a5b73 100644
--- a/gcc/ada/s-imgint.adb
+++ b/gcc/ada/s-imgint.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 1992-2005 Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2007, 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- --
@@ -37,20 +37,46 @@ package body System.Img_Int is
-- Image_Integer --
-------------------
- function Image_Integer (V : Integer) return String is
- P : Natural;
- S : String (1 .. Integer'Width);
+ procedure Image_Integer
+ (V : Integer;
+ S : in out String;
+ P : out Natural)
+ is
+ pragma Assert (S'First = 1);
+
+ procedure Set_Digits (T : Integer);
+ -- Set digits of absolute value of T, which is zero or negative. We work
+ -- with the negative of the value so that the largest negative number is
+ -- not a special case.
+
+ ----------------
+ -- Set_Digits --
+ ----------------
+
+ procedure Set_Digits (T : Integer) is
+ begin
+ if T <= -10 then
+ Set_Digits (T / 10);
+ P := P + 1;
+ S (P) := Character'Val (48 - (T rem 10));
+ else
+ P := P + 1;
+ S (P) := Character'Val (48 - T);
+ end if;
+ end Set_Digits;
+
+ -- Start of processinng for Image_Integer
begin
+ P := 1;
+
if V >= 0 then
- P := 1;
S (P) := ' ';
+ Set_Digits (-V);
else
- P := 0;
+ S (P) := '-';
+ Set_Digits (V);
end if;
-
- Set_Image_Integer (V, S, P);
- return S (1 .. P);
end Image_Integer;
-----------------------
@@ -59,7 +85,7 @@ package body System.Img_Int is
procedure Set_Image_Integer
(V : Integer;
- S : out String;
+ S : in out String;
P : in out Natural)
is
procedure Set_Digits (T : Integer);
@@ -67,13 +93,16 @@ package body System.Img_Int is
-- with the negative of the value so that the largest negative number is
-- not a special case.
+ ----------------
+ -- Set_Digits --
+ ----------------
+
procedure Set_Digits (T : Integer) is
begin
if T <= -10 then
Set_Digits (T / 10);
P := P + 1;
S (P) := Character'Val (48 - (T rem 10));
-
else
P := P + 1;
S (P) := Character'Val (48 - T);
@@ -85,7 +114,6 @@ package body System.Img_Int is
begin
if V >= 0 then
Set_Digits (-V);
-
else
P := P + 1;
S (P) := '-';
diff --git a/gcc/ada/s-imgint.ads b/gcc/ada/s-imgint.ads
index a9e3521..7fe2318 100644
--- a/gcc/ada/s-imgint.ads
+++ b/gcc/ada/s-imgint.ads
@@ -6,7 +6,7 @@
-- --
-- S p e c --
-- --
--- Copyright (C) 1992-2005 Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2007, 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- --
@@ -38,18 +38,22 @@
package System.Img_Int is
pragma Pure;
- function Image_Integer (V : Integer) return String;
- -- Computes Integer'Image (V) and returns the result
+ procedure Image_Integer
+ (V : Integer;
+ S : in out String;
+ P : out Natural);
+ -- Computes Integer'Image (V) and stores the result in S (1 .. P)
+ -- setting the resulting value of P. The caller guarantees that S
+ -- is long enough to hold the result, and that S'First is 1.
procedure Set_Image_Integer
(V : Integer;
- S : out String;
+ S : in out String;
P : in out Natural);
- -- Sets the image of V starting at S (P + 1) with no leading spaces (i.e.
- -- Text_IO format where Width = 0), starting at S (P + 1), updating P
- -- to point to the last character stored. The caller promises that the
- -- buffer is large enough and no check is made for this (Constraint_Error
- -- will not be necessarily raised if this is violated since it is perfectly
- -- valid to compile this unit with checks off).
+ -- Stores the image of V in S starting at S (P + 1), P is updated to point
+ -- to the last character stored. The value stored is identical to the value
+ -- of Integer'Image (V) except that no leading space is stored when V is
+ -- non-negative. The caller guarantees that S is long enough to hold the
+ -- result. S need not have a lower bound of 1.
end System.Img_Int;
diff --git a/gcc/ada/s-imglld.adb b/gcc/ada/s-imglld.adb
index de45619..a75711b 100644
--- a/gcc/ada/s-imglld.adb
+++ b/gcc/ada/s-imglld.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 1992-2005 Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2007, 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- --
@@ -32,36 +32,33 @@
------------------------------------------------------------------------------
with System.Img_Dec; use System.Img_Dec;
-with System.Img_LLI; use System.Img_LLI;
package body System.Img_LLD is
-----------------------------
-- Image_Long_Long_Decimal --
- -----------------------------
+ ----------------------------
- function Image_Long_Long_Decimal
+ procedure Image_Long_Long_Decimal
(V : Long_Long_Integer;
+ S : in out String;
+ P : out Natural;
Scale : Integer)
- return String
is
- P : Natural := 0;
- S : String (1 .. 64);
+ pragma Assert (S'First = 1);
begin
- Set_Image_Long_Long_Decimal
- (V, S, P, Scale, 1, Integer'Max (1, Scale), 0);
-
- -- Mess around to make sure we have the objectionable space at the
- -- start for positive numbers in accordance with the annoying rules!
+ -- Add space at start for non-negative numbers
- if S (1) /= ' ' and then S (1) /= '-' then
- S (2 .. P + 1) := S (1 .. P);
+ if V >= 0 then
S (1) := ' ';
- return S (1 .. P + 1);
+ P := 1;
else
- return S (1 .. P);
+ P := 0;
end if;
+
+ Set_Image_Long_Long_Decimal
+ (V, S, P, Scale, 1, Integer'Max (1, Scale), 0);
end Image_Long_Long_Decimal;
---------------------------------
@@ -70,14 +67,14 @@ package body System.Img_LLD is
procedure Set_Image_Long_Long_Decimal
(V : Long_Long_Integer;
- S : out String;
+ S : in out String;
P : in out Natural;
Scale : Integer;
Fore : Natural;
Aft : Natural;
Exp : Natural)
is
- Digs : String := Image_Long_Long_Integer (V);
+ Digs : String := Long_Long_Integer'Image (V);
-- Sign and digits of decimal value
begin
diff --git a/gcc/ada/s-imglld.ads b/gcc/ada/s-imglld.ads
index 0ef70f4..92bc2ce 100644
--- a/gcc/ada/s-imglld.ads
+++ b/gcc/ada/s-imglld.ads
@@ -6,7 +6,7 @@
-- --
-- S p e c --
-- --
--- Copyright (C) 1992-2005 Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2007, 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- --
@@ -35,19 +35,23 @@
-- type does exceeds Integer'Size (also used for Text_IO.Decimal_IO output)
package System.Img_LLD is
- pragma Preelaborate;
+ pragma Pure;
- function Image_Long_Long_Decimal
+ procedure Image_Long_Long_Decimal
(V : Long_Long_Integer;
- Scale : Integer)
- return String;
- -- Compute 'Image of V, the integer value (in units of delta) of a decimal
- -- type whose Scale is as given and returns the result. The image is given
- -- by the rules in RM 3.5(34) for fixed-point type image functions.
+ S : in out String;
+ P : out Natural;
+ Scale : Integer);
+ -- Computes fixed_type'Image (V), where V is the integer value (in units of
+ -- delta) of a decimal type whose Scale is as given and store the result in
+ -- S (P + 1 .. L), updating P to the value of L. The image is given by the
+ -- rules in RM 3.5(34) for fixed-point type image functions. The caller
+ -- guarantees that S is long enough to hold the result. S need not have a
+ -- lower bound of 1.
procedure Set_Image_Long_Long_Decimal
(V : Long_Long_Integer;
- S : out String;
+ S : in out String;
P : in out Natural;
Scale : Integer;
Fore : Natural;
@@ -60,6 +64,6 @@ package System.Img_LLD is
-- will not necessarily be raised if this requirement is violated, since
-- it is perfectly valid to compile this unit with checks off. The Fore,
-- Aft and Exp values can be set to any valid values for the case of use
- -- by Text_IO.Decimal_IO.
+ -- by Text_IO.Decimal_IO. Note that there is no leading space stored.
end System.Img_LLD;
diff --git a/gcc/ada/s-imglli.adb b/gcc/ada/s-imglli.adb
index 5975b74..00b9b69 100644
--- a/gcc/ada/s-imglli.adb
+++ b/gcc/ada/s-imglli.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 1992-2005 Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2007, 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- --
@@ -37,29 +37,31 @@ package body System.Img_LLI is
-- Image_Long_Long_Integer --
-----------------------------
- function Image_Long_Long_Integer (V : Long_Long_Integer) return String is
- P : Natural;
- S : String (1 .. Long_Long_Integer'Width);
+ procedure Image_Long_Long_Integer
+ (V : Long_Long_Integer;
+ S : in out String;
+ P : out Natural)
+ is
+ pragma Assert (S'First = 1);
begin
if V >= 0 then
+ S (1) := ' ';
P := 1;
- S (P) := ' ';
else
P := 0;
end if;
Set_Image_Long_Long_Integer (V, S, P);
- return S (1 .. P);
end Image_Long_Long_Integer;
- ---------------------------------
+ ------------------------------
-- Set_Image_Long_Long_Integer --
- ---------------------------------
+ -----------------------------
procedure Set_Image_Long_Long_Integer
(V : Long_Long_Integer;
- S : out String;
+ S : in out String;
P : in out Natural)
is
procedure Set_Digits (T : Long_Long_Integer);
@@ -67,13 +69,16 @@ package body System.Img_LLI is
-- with the negative of the value so that the largest negative number is
-- not a special case.
+ ----------------
+ -- Set_Digits --
+ ----------------
+
procedure Set_Digits (T : Long_Long_Integer) is
begin
if T <= -10 then
Set_Digits (T / 10);
P := P + 1;
S (P) := Character'Val (48 - (T rem 10));
-
else
P := P + 1;
S (P) := Character'Val (48 - T);
@@ -85,13 +90,11 @@ package body System.Img_LLI is
begin
if V >= 0 then
Set_Digits (-V);
-
else
P := P + 1;
S (P) := '-';
Set_Digits (V);
end if;
-
end Set_Image_Long_Long_Integer;
end System.Img_LLI;
diff --git a/gcc/ada/s-imglli.ads b/gcc/ada/s-imglli.ads
index 6401674..9393ca4 100644
--- a/gcc/ada/s-imglli.ads
+++ b/gcc/ada/s-imglli.ads
@@ -36,20 +36,24 @@
-- operations required in Text_IO.Integer_IO for such types.
package System.Img_LLI is
- pragma Preelaborate;
+ pragma Pure;
- function Image_Long_Long_Integer (V : Long_Long_Integer) return String;
- -- Computes Long_Long_Integer'Image (V) and returns the result
+ procedure Image_Long_Long_Integer
+ (V : Long_Long_Integer;
+ S : in out String;
+ P : out Natural);
+ -- Computes Long_Long_Integer'Image (V) and stores the result in
+ -- S (1 .. P) setting the resulting value of P. The caller guarantees
+ -- that S is long enough to hold the result, and that S'First is 1.
procedure Set_Image_Long_Long_Integer
(V : Long_Long_Integer;
- S : out String;
+ S : in out String;
P : in out Natural);
- -- Sets the image of V starting at S (P + 1) with no leading spaces (i.e.
- -- Text_IO format where Width = 0), starting at S (P + 1), updating P
- -- to point to the last character stored. The caller promises that the
- -- buffer is large enough and no check is made for this (Constraint_Error
- -- will not be necessarily raised if this is violated since it is perfectly
- -- valid to compile this unit with checks off).
+ -- Stores the image of V in S starting at S (P + 1), P is updated to point
+ -- to the last character stored. The value stored is identical to the value
+ -- of Long_Long_Integer'Image (V) except that no leading space is stored
+ -- when V is non-negative. The caller guarantees that S is long enough to
+ -- hold the result. S need not have a lower bound of 1.
end System.Img_LLI;
diff --git a/gcc/ada/s-imgllu.adb b/gcc/ada/s-imgllu.adb
index b09881d..00e460e 100644
--- a/gcc/ada/s-imgllu.adb
+++ b/gcc/ada/s-imgllu.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 1992-2005 Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2007, 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- --
@@ -39,32 +39,34 @@ package body System.Img_LLU is
-- Image_Long_Long_Unsigned --
------------------------------
- function Image_Long_Long_Unsigned
- (V : Long_Long_Unsigned)
- return String
+ procedure Image_Long_Long_Unsigned
+ (V : System.Unsigned_Types.Long_Long_Unsigned;
+ S : in out String;
+ P : out Natural)
is
- P : Natural;
- S : String (1 .. Long_Long_Unsigned'Width);
-
+ pragma Assert (S'First = 1);
begin
+ S (1) := ' ';
P := 1;
- S (P) := ' ';
Set_Image_Long_Long_Unsigned (V, S, P);
- return S (1 .. P);
end Image_Long_Long_Unsigned;
- -----------------------
+ ----------------------------------
-- Set_Image_Long_Long_Unsigned --
- -----------------------
+ ----------------------------------
procedure Set_Image_Long_Long_Unsigned
(V : Long_Long_Unsigned;
- S : out String;
+ S : in out String;
P : in out Natural)
is
procedure Set_Digits (T : Long_Long_Unsigned);
-- Set digits of absolute value of T
+ ----------------
+ -- Set_Digits --
+ ----------------
+
procedure Set_Digits (T : Long_Long_Unsigned) is
begin
if T >= 10 then
@@ -82,7 +84,6 @@ package body System.Img_LLU is
begin
Set_Digits (V);
-
end Set_Image_Long_Long_Unsigned;
end System.Img_LLU;
diff --git a/gcc/ada/s-imgllu.ads b/gcc/ada/s-imgllu.ads
index 5c17399..1aa2b3b 100644
--- a/gcc/ada/s-imgllu.ads
+++ b/gcc/ada/s-imgllu.ads
@@ -40,20 +40,24 @@ with System.Unsigned_Types;
package System.Img_LLU is
pragma Pure;
- function Image_Long_Long_Unsigned
- (V : System.Unsigned_Types.Long_Long_Unsigned)
- return String;
- -- Computes Long_Long_Unsigned'Image (V) and returns the result
+ procedure Image_Long_Long_Unsigned
+ (V : System.Unsigned_Types.Long_Long_Unsigned;
+ S : in out String;
+ P : out Natural);
+ pragma Inline (Image_Long_Long_Unsigned);
+
+ -- Computes Long_Long_Unsigned'Image (V) and stores the result in
+ -- S (1 .. P) setting the resulting value of P. The caller guarantees
+ -- that S is long enough to hold the result, and that S'First is 1.
procedure Set_Image_Long_Long_Unsigned
(V : System.Unsigned_Types.Long_Long_Unsigned;
- S : out String;
+ S : in out String;
P : in out Natural);
- -- Sets the image of V starting at S (P + 1) with no leading spaces (i.e.
- -- Text_IO format where Width = 0), starting at S (P + 1), updating P
- -- to point to the last character stored. The caller promises that the
- -- buffer is large enough and no check is made for this (Constraint_Error
- -- will not be necessarily raised if this is violated since it is perfectly
- -- valid to compile this unit with checks off).
+ -- Stores the image of V in S starting at S (P + 1), P is updated to point
+ -- to the last character stored. The value stored is identical to the value
+ -- of Long_Long_Unsigned'Image (V) except that no leading space is stored.
+ -- The caller guarantees that S is long enough to hold the result. S need
+ -- not have a lower bound of 1.
end System.Img_LLU;
diff --git a/gcc/ada/s-imgrea.adb b/gcc/ada/s-imgrea.adb
index ae939de..e9fd560 100644
--- a/gcc/ada/s-imgrea.adb
+++ b/gcc/ada/s-imgrea.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 1992-2002 Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2007, 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- --
@@ -78,13 +78,13 @@ package body System.Img_Real is
-- Image_Floating_Point --
--------------------------
- function Image_Floating_Point
+ procedure Image_Floating_Point
(V : Long_Long_Float;
+ S : in out String;
+ P : out Natural;
Digs : Natural)
- return String
is
- P : Natural := 0;
- S : String (1 .. Long_Long_Float'Width);
+ pragma Assert (S'First = 1);
begin
-- Decide wether a blank should be prepended before the call to
@@ -101,32 +101,36 @@ package body System.Img_Real is
then
S (1) := ' ';
P := 1;
+ else
+ P := 0;
end if;
Set_Image_Real (V, S, P, 1, Digs - 1, 3);
- return S (1 .. P);
end Image_Floating_Point;
--------------------------------
-- Image_Ordinary_Fixed_Point --
--------------------------------
- function Image_Ordinary_Fixed_Point
- (V : Long_Long_Float;
- Aft : Natural)
- return String
+ procedure Image_Ordinary_Fixed_Point
+ (V : Long_Long_Float;
+ S : in out String;
+ P : out Natural;
+ Aft : Natural)
is
- P : Natural := 0;
- S : String (1 .. Long_Long_Float'Width);
+ pragma Assert (S'First = 1);
begin
+ -- Output space at start if non-negative
+
if V >= 0.0 then
S (1) := ' ';
P := 1;
+ else
+ P := 0;
end if;
Set_Image_Real (V, S, P, 1, Aft, 0);
- return S (1 .. P);
end Image_Ordinary_Fixed_Point;
--------------------
diff --git a/gcc/ada/s-imgrea.ads b/gcc/ada/s-imgrea.ads
index 0f298bf..e00b78a 100644
--- a/gcc/ada/s-imgrea.ads
+++ b/gcc/ada/s-imgrea.ads
@@ -6,7 +6,7 @@
-- --
-- S p e c --
-- --
--- Copyright (C) 1992-2005 Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2007, 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- --
@@ -34,25 +34,31 @@
-- Image for fixed and float types (also used for Float_IO/Fixed_IO output)
package System.Img_Real is
- pragma Preelaborate;
+ pragma Pure;
- function Image_Ordinary_Fixed_Point
- (V : Long_Long_Float;
- Aft : Natural)
- return String;
- -- Computes the image of V and returns the result according to the rules
- -- for image for fixed-point types (RM 3.5(34)), where Aft is the value of
- -- the Aft attribute for the fixed-point type. This function is used only
- -- for ordinary fixed point (see package System.Img_Dec for handling of
- -- decimal fixed-point).
+ procedure Image_Ordinary_Fixed_Point
+ (V : Long_Long_Float;
+ S : in out String;
+ P : out Natural;
+ Aft : Natural);
+ -- Computes fixed_type'Image (V) and returns the result in S (1 .. P)
+ -- updating P on return. The result is computed according to the rules for
+ -- image for fixed-point types (RM 3.5(34)), where Aft is the value of the
+ -- Aft attribute for the fixed-point type. This function is used only for
+ -- ordinary fixed point (see package System.Img_Dec for handling of decimal
+ -- fixed-point). The caller guarantees that S is long enough to hold the
+ -- result and has a lower bound of 1.
- function Image_Floating_Point
+ procedure Image_Floating_Point
(V : Long_Long_Float;
- Digs : Natural)
- return String;
- -- Computes the image of V and returns the result according to the rules
- -- for image for foating-point types (RM 3.5(33)), where Digs is the value
- -- of the Digits attribute for the floating-point type.
+ S : in out String;
+ P : out Natural;
+ Digs : Natural);
+ -- Computes fixed_type'Image (V) and returns the result in S (1 .. P)
+ -- updating P on return. The result is computed according to the rules for
+ -- image for floating-point types (RM 3.5(33)), where Digs is the value of
+ -- the Digits attribute for the floating-point type. The caller guarantees
+ -- that S is long enough to hold the result and has a lower bound of 1.
procedure Set_Image_Real
(V : Long_Long_Float;
@@ -66,6 +72,7 @@ package System.Img_Real is
-- enough and no check is made for this. Constraint_Error will not
-- necessarily be raised if this is violated, since it is perfectly valid
-- to compile this unit with checks off). The Fore, Aft and Exp values
- -- can be set to any valid values for the case of use from Text_IO.
+ -- can be set to any valid values for the case of use from Text_IO. Note
+ -- that no space is stored at the start for non-negative values.
end System.Img_Real;
diff --git a/gcc/ada/s-imguns.adb b/gcc/ada/s-imguns.adb
index 9a026aa..0630af1 100644
--- a/gcc/ada/s-imguns.adb
+++ b/gcc/ada/s-imguns.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 1992-2005 Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2007, 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- --
@@ -39,18 +39,16 @@ package body System.Img_Uns is
-- Image_Unsigned --
--------------------
- function Image_Unsigned
- (V : Unsigned)
- return String
+ procedure Image_Unsigned
+ (V : System.Unsigned_Types.Unsigned;
+ S : in out String;
+ P : out Natural)
is
- P : Natural;
- S : String (1 .. Unsigned'Width);
-
+ pragma Assert (S'First = 1);
begin
+ S (1) := ' ';
P := 1;
- S (P) := ' ';
Set_Image_Unsigned (V, S, P);
- return S (1 .. P);
end Image_Unsigned;
------------------------
@@ -59,12 +57,16 @@ package body System.Img_Uns is
procedure Set_Image_Unsigned
(V : Unsigned;
- S : out String;
+ S : in out String;
P : in out Natural)
is
procedure Set_Digits (T : Unsigned);
-- Set decimal digits of value of T
+ ----------------
+ -- Set_Digits --
+ ----------------
+
procedure Set_Digits (T : Unsigned) is
begin
if T >= 10 then
@@ -82,7 +84,6 @@ package body System.Img_Uns is
begin
Set_Digits (V);
-
end Set_Image_Unsigned;
end System.Img_Uns;
diff --git a/gcc/ada/s-imguns.ads b/gcc/ada/s-imguns.ads
index 6ec636b..6ed50e2 100644
--- a/gcc/ada/s-imguns.ads
+++ b/gcc/ada/s-imguns.ads
@@ -40,20 +40,23 @@ with System.Unsigned_Types;
package System.Img_Uns is
pragma Pure;
- function Image_Unsigned
- (V : System.Unsigned_Types.Unsigned)
- return String;
- -- Computes Unsigned'Image (V) and returns the result
+ procedure Image_Unsigned
+ (V : System.Unsigned_Types.Unsigned;
+ S : in out String;
+ P : out Natural);
+ pragma Inline (Image_Unsigned);
+ -- Computes Unsigned'Image (V) and stores the result in S (1 .. P)
+ -- setting the resulting value of P. The caller guarantees that S
+ -- is long enough to hold the result, and that S'First is 1.
procedure Set_Image_Unsigned
(V : System.Unsigned_Types.Unsigned;
- S : out String;
+ S : in out String;
P : in out Natural);
- -- Sets the image of V starting at S (P + 1) with no leading spaces (i.e.
- -- Text_IO format where Width = 0), starting at S (P + 1), updating P
- -- to point to the last character stored. The caller promises that the
- -- buffer is large enough and no check is made for this (Constraint_Error
- -- will not be necessarily raised if this is violated since it is perfectly
- -- valid to compile this unit with checks off).
+ -- Stores the image of V in S starting at S (P + 1), P is updated to point
+ -- to the last character stored. The value stored is identical to the value
+ -- of Unsigned'Image (V) except that no leading space is stored. The caller
+ -- guarantees that S is long enough to hold the result. S need not have a
+ -- lower bound of 1.
end System.Img_Uns;
diff --git a/gcc/ada/s-imgwch.adb b/gcc/ada/s-imgwch.adb
index a408ef6..74e3803 100644
--- a/gcc/ada/s-imgwch.adb
+++ b/gcc/ada/s-imgwch.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 1992-2005, Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2007, 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- --
@@ -41,10 +41,14 @@ package body System.Img_WChar is
-- Image_Wide_Character --
--------------------------
- function Image_Wide_Character
+ procedure Image_Wide_Character
(V : Wide_Character;
- Ada_2005 : Boolean) return String
+ S : in out String;
+ P : out Natural;
+ Ada_2005 : Boolean)
is
+ pragma Assert (S'First = 1);
+
begin
-- Annoying Ada 95 incompatibility with FFFE/FFFF
@@ -52,49 +56,56 @@ package body System.Img_WChar is
and then not Ada_2005
then
if V = Wide_Character'Val (16#FFFE#) then
- return "FFFE";
+ S (1 .. 4) := "FFFE";
else
- return "FFFF";
+ S (1 .. 4) := "FFFF";
end if;
- end if;
+
+ P := 4;
-- Normal case, same as Wide_Wide_Character
- return
- Image_Wide_Wide_Character
- (Wide_Wide_Character'Val (Wide_Character'Pos (V)));
+ else
+ Image_Wide_Wide_Character
+ (Wide_Wide_Character'Val (Wide_Character'Pos (V)), S, P);
+ end if;
end Image_Wide_Character;
-------------------------------
-- Image_Wide_Wide_Character --
-------------------------------
- function Image_Wide_Wide_Character
- (V : Wide_Wide_Character) return String
+ procedure Image_Wide_Wide_Character
+ (V : Wide_Wide_Character;
+ S : in out String;
+ P : out Natural)
is
+ pragma Assert (S'First = 1);
+
Val : Unsigned_32 := Wide_Wide_Character'Pos (V);
begin
-- If in range of standard Character, use Character routine
if Val <= 16#FF# then
- return Image_Character (Character'Val (Wide_Wide_Character'Pos (V)));
+ Image_Character (Character'Val (Wide_Wide_Character'Pos (V)), S, P);
-- Otherwise value returned is Hex_hhhhhhhh
else
declare
- Result : String (1 .. 12) := "Hex_hhhhhhhh";
- Hex : constant array (Unsigned_32 range 0 .. 15) of Character :=
- "0123456789ABCDEF";
+ Hex : constant array (Unsigned_32 range 0 .. 15) of Character :=
+ "0123456789ABCDEF";
begin
+ S (1 .. 4) := "Hex_";
+
for J in reverse 5 .. 12 loop
- Result (J) := Hex (Val mod 16);
+ S (J) := Hex (Val mod 16);
Val := Val / 16;
end loop;
- return Result;
+ P := 12;
end;
end if;
end Image_Wide_Wide_Character;
diff --git a/gcc/ada/s-imgwch.ads b/gcc/ada/s-imgwch.ads
index b827b80..17e717f 100644
--- a/gcc/ada/s-imgwch.ads
+++ b/gcc/ada/s-imgwch.ads
@@ -6,7 +6,7 @@
-- --
-- S p e c --
-- --
--- Copyright (C) 1992-2005, Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2007, 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- --
@@ -36,14 +36,23 @@
package System.Img_WChar is
pragma Pure;
- function Image_Wide_Character
+ procedure Image_Wide_Character
(V : Wide_Character;
- Ada_2005 : Boolean) return String;
- -- Computes Wide_Character'Image (V) and returns the computed result. The
- -- parameter Ada_2005 is True if operating in Ada 2005 mode (or beyond).
- -- This is needed for the annoying FFFE/FFFF incompatibility.
+ S : in out String;
+ P : out Natural;
+ Ada_2005 : Boolean);
+ -- Computes Wide_Character'Image (V) and stores the result in S (1 .. P)
+ -- setting the resulting value of P. The caller guarantees that S is long
+ -- enough to hold the result, and that S'First is 1. The parameter Ada_2005
+ -- is True if operating in Ada 2005 mode (or beyond). This is required to
+ -- deal with the annoying FFFE/FFFF incompatibility.
- function Image_Wide_Wide_Character (V : Wide_Wide_Character) return String;
- -- Computes Wide_Wide_Character'Image (V) and returns the computed result
+ procedure Image_Wide_Wide_Character
+ (V : Wide_Wide_Character;
+ S : in out String;
+ P : out Natural);
+ -- Computes Wide_Wide_Character'Image (V) and stores the result in
+ -- S (1 .. P) setting the resulting value of P. The caller guarantees
+ -- that S is long enough to hold the result, and that S'First is 1.
end System.Img_WChar;