-- --
-- 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- --
-- Blank_When_Zero --
---------------------
- function Blank_When_Zero (Pic : in Picture) return Boolean is
+ function Blank_When_Zero (Pic : Picture) return Boolean is
begin
return Pic.Contents.Original_BWZ;
end Blank_When_Zero;
-- Expand --
------------
- function Expand (Picture : in String) return String is
+ function Expand (Picture : String) return String is
Result : String (1 .. MAX_PICSIZE);
Picture_Index : Integer := Picture'First;
Result_Index : Integer := Result'First;
Result_Index := Result_Index + Count - 1;
- -- Last + 1 was a ')' throw it away too.
+ -- Last + 1 was a ')' throw it away too
Picture_Index := Last + 2;
Currency_Symbol : String;
Fill_Character : Character;
Separator_Character : Character;
- Radix_Point : Character)
- return String
+ Radix_Point : Character) return String
is
Attrs : Number_Attributes := Parse_Number_String (Number);
Position : Integer;
In_Currency : Boolean := False;
Dollar : Boolean := False;
- -- Overridden immediately if necessary.
+ -- Overridden immediately if necessary
Zero : Boolean := True;
- -- Set to False when a non-zero digit is output.
+ -- Set to False when a non-zero digit is output
begin
for J in reverse Last .. Answer'Last loop
exit when J = Pic.Radix_Position;
- -- Do this test First, Separator_Character can equal Pic.Floater.
+ -- Do this test First, Separator_Character can equal Pic.Floater
if Answer (J) = Pic.Floater then
exit;
Answer (J) := Separator_Character;
elsif Answer (J) = 'b' then
- Answer (J) := '*';
+ Answer (J) := Fill_Character;
end if;
end loop;
end if;
for J in Pic.Start_Float .. Position loop
- Answer (J) := '*';
+ Answer (J) := Fill_Character;
end loop;
else
end case;
end loop;
- -- Now get rid of Blank_when_Zero and complete Star fill.
+ -- Now get rid of Blank_when_Zero and complete Star fill
if Zero and Pic.Blank_When_Zero then
- -- Value is zero, and blank it.
+ -- Value is zero, and blank it
Last := Answer'Last;
raise Picture_Error;
end if;
- -- Two decimal points is a no-no.
+ -- Two decimal points is a no-no
Answer.Has_Fraction := True;
Answer.End_Of_Fraction := J;
Answer.Start_Of_Int := Answer.End_Of_Int + 1;
end if;
- -- No significant (intger) digits needs a null range.
+ -- No significant (integer) digits needs a null range
return Answer;
end Parse_Number_String;
-- The following ensures that we return B and not b being careful not
-- to break things which expect lower case b for blank. See CXF3A02.
- function Pic_String (Pic : in Picture) return String is
+ function Pic_String (Pic : Picture) return String is
Temp : String (1 .. Pic.Contents.Picture.Length) :=
Pic.Contents.Picture.Expanded;
begin
for J in Temp'Range loop
- if Temp (J) = 'b' then Temp (J) := 'B'; end if;
+ if Temp (J) = 'b' then
+ Temp (J) := 'B';
+ end if;
end loop;
return Temp;
type Legality is (Okay, Reject);
State : Legality := Reject;
- -- Start in reject, which will reject null strings.
+ -- Start in reject, which will reject null strings
Index : Pic_Index := Pic.Picture.Expanded'First;
procedure Debug_Start (Name : String);
pragma Inline (Debug_Start);
- procedure Debug_Integer (Value : in Integer; S : String);
+ procedure Debug_Integer (Value : Integer; S : String);
pragma Inline (Debug_Integer);
procedure Trailing_Currency;
-- Debug_Integer --
-------------------
- procedure Debug_Integer (Value : in Integer; S : String) is
+ procedure Debug_Integer (Value : Integer; S : String) is
use Ada.Text_IO; -- needed for >
begin
begin
Debug_Start ("Floating_Bracket");
- -- Two different floats not allowed.
+ -- Two different floats not allowed
if Pic.Floater /= '!' and then Pic.Floater /= '<' then
raise Picture_Error;
raise Picture_Error;
else
-- Overwrite Floater and Start_Float
+
Pic.Floater := '*';
Pic.Start_Float := Index;
Star_Suppression;
Pic.End_Float := Invalid_Position;
end if;
- -- A single dollar does not a floating make.
+ -- A single dollar does not a floating make
Number_Completion;
return;
Pic.End_Float := Invalid_Position;
end if;
- -- Only one dollar before the sign is okay,
- -- but doesn't float.
+ -- Only one dollar before the sign is okay, but doesn't
+ -- float.
Pic.Radix_Position := Index;
Skip;
-- Set to True if a '_', '0', '/', 'B', or 'b' is encountered
Must_Float : Boolean := False;
- -- Set to true if a '#' occurs after an insert.
+ -- Set to true if a '#' occurs after an insert
begin
Debug_Start ("Leading_Pound");
when '9' =>
if State /= Okay then
- -- A single '#' doesn't float.
+ -- A single '#' doesn't float
Pic.Floater := '!';
Pic.Start_Float := Invalid_Position;
Pic.End_Float := Invalid_Position;
end if;
- -- Only one pound before the sign is okay,
- -- but doesn't float.
+ -- Only one pound before the sign is okay, but doesn't
+ -- float.
Pic.Radix_Position := Index;
Skip;
return;
end if;
- -- Will return in Okay state if a '9' was seen.
+ -- Will return in Okay state if a '9' was seen
end loop;
end Number;
-- Picture --
-------------
- -- Note that Picture can be called in either State.
+ -- Note that Picture can be called in either State
-- It will set state to Valid only if a 9 is encountered or floating
-- currency is called.
Debug_Start ("Picture_Bracket");
Pic.Sign_Position := Index;
- -- Treat as a floating sign, and unwind otherwise.
+ -- Treat as a floating sign, and unwind otherwise
Pic.Floater := '<';
Pic.Start_Float := Index;
Pic.Sign_Position := Index;
- -- Treat as a floating sign, and unwind otherwise.
+ -- Treat as a floating sign, and unwind otherwise
Pic.Floater := '-';
Pic.Start_Float := Index;
when 'Z' | 'z' =>
- -- Can't have Z and a floating sign.
+ -- Can't have Z and a floating sign
if State = Okay then
Set_State (Reject);
Pic.End_Float := Invalid_Position;
end if;
- -- Don't assume that state is okay, haven't seen a digit.
+ -- Don't assume that state is okay, haven't seen a digit
Picture;
return;
Debug_Start ("Picture_Plus");
Pic.Sign_Position := Index;
- -- Treat as a floating sign, and unwind otherwise.
+ -- Treat as a floating sign, and unwind otherwise
Pic.Floater := '+';
Pic.Start_Float := Index;
Pic.Max_Leading_Digits := Pic.Max_Leading_Digits + 1;
Pic.End_Float := Index;
Skip;
- Set_State (Okay); -- "++" is enough.
+ Set_State (Okay); -- "++" is enough
Floating_Plus;
Trailing_Currency;
return;
Set_State (Reject);
end if;
- -- Can't have Z and a floating sign.
+ -- Can't have Z and a floating sign
Pic.Picture.Expanded (Index) := 'Z'; -- consistency
Pic.End_Float := Invalid_Position;
end if;
- -- Don't assume that state is okay, haven't seen a digit.
+ -- Don't assume that state is okay, haven't seen a digit
Picture;
return;
end case;
-- Blank when zero either if the PIC does not contain a '9' or if
- -- requested by the user and no '*'
+ -- requested by the user and no '*'.
Pic.Blank_When_Zero :=
(Computed_BWZ or Pic.Blank_When_Zero) and not Pic.Star_Fill;
- -- Star fill if '*' and no '9'.
+ -- Star fill if '*' and no '9'
Pic.Star_Fill := Pic.Star_Fill and Computed_BWZ;
procedure Set_State (L : Legality) is
begin
- if Debug then Ada.Text_IO.Put_Line
- (" Set state from " & Legality'Image (State) &
- " to " & Legality'Image (L));
+ if Debug then
+ Ada.Text_IO.Put_Line
+ (" Set state from " & Legality'Image (State)
+ & " to " & Legality'Image (L));
end if;
State := L;
procedure Skip is
begin
- if Debug then Ada.Text_IO.Put_Line
- (" Skip " & Pic.Picture.Expanded (Index));
+ if Debug then
+ Ada.Text_IO.Put_Line (" Skip " & Pic.Picture.Expanded (Index));
end if;
Index := Index + 1;
when Constraint_Error =>
- -- To deal with special cases like null strings.
+ -- To deal with special cases like null strings
raise Picture_Error;
end Precalculate;
----------------
function To_Picture
- (Pic_String : in String;
- Blank_When_Zero : in Boolean := False)
- return Picture
+ (Pic_String : String;
+ Blank_When_Zero : Boolean := False) return Picture
is
Result : Picture;
-----------
function Valid
- (Pic_String : in String;
- Blank_When_Zero : in Boolean := False)
- return Boolean
+ (Pic_String : String;
+ Blank_When_Zero : Boolean := False) return Boolean
is
begin
declare
-- False only if Blank_When_Zero is True but the pic string has a '*'
- return not Blank_When_Zero or
- Strings_Fixed.Index (Expanded_Pic, "*") = 0;
+ return not Blank_When_Zero
+ or else Strings_Fixed.Index (Expanded_Pic, "*") = 0;
end;
exception
-----------
function Image
- (Item : in Num;
- Pic : in Picture;
- Currency : in String := Default_Currency;
- Fill : in Character := Default_Fill;
- Separator : in Character := Default_Separator;
- Radix_Mark : in Character := Default_Radix_Mark)
- return String
+ (Item : Num;
+ Pic : Picture;
+ Currency : String := Default_Currency;
+ Fill : Character := Default_Fill;
+ Separator : Character := Default_Separator;
+ Radix_Mark : Character := Default_Radix_Mark) return String
is
begin
return Format_Number
------------
function Length
- (Pic : in Picture;
- Currency : in String := Default_Currency)
- return Natural
+ (Pic : Picture;
+ Currency : String := Default_Currency) return Natural
is
Picstr : constant String := Pic_String (Pic);
V_Adjust : Integer := 0;
---------
procedure Put
- (File : in Text_IO.File_Type;
- Item : in Num;
- Pic : in Picture;
- Currency : in String := Default_Currency;
- Fill : in Character := Default_Fill;
- Separator : in Character := Default_Separator;
- Radix_Mark : in Character := Default_Radix_Mark)
+ (File : Text_IO.File_Type;
+ Item : Num;
+ Pic : Picture;
+ Currency : String := Default_Currency;
+ Fill : Character := Default_Fill;
+ Separator : Character := Default_Separator;
+ Radix_Mark : Character := Default_Radix_Mark)
is
begin
Text_IO.Put (File, Image (Item, Pic,
end Put;
procedure Put
- (Item : in Num;
- Pic : in Picture;
- Currency : in String := Default_Currency;
- Fill : in Character := Default_Fill;
- Separator : in Character := Default_Separator;
- Radix_Mark : in Character := Default_Radix_Mark)
+ (Item : Num;
+ Pic : Picture;
+ Currency : String := Default_Currency;
+ Fill : Character := Default_Fill;
+ Separator : Character := Default_Separator;
+ Radix_Mark : Character := Default_Radix_Mark)
is
begin
Text_IO.Put (Image (Item, Pic,
procedure Put
(To : out String;
- Item : in Num;
- Pic : in Picture;
- Currency : in String := Default_Currency;
- Fill : in Character := Default_Fill;
- Separator : in Character := Default_Separator;
- Radix_Mark : in Character := Default_Radix_Mark)
+ Item : Num;
+ Pic : Picture;
+ Currency : String := Default_Currency;
+ Fill : Character := Default_Fill;
+ Separator : Character := Default_Separator;
+ Radix_Mark : Character := Default_Radix_Mark)
is
Result : constant String :=
Image (Item, Pic, Currency, Fill, Separator, Radix_Mark);
function Valid
(Item : Num;
- Pic : in Picture;
- Currency : in String := Default_Currency)
- return Boolean
+ Pic : Picture;
+ Currency : String := Default_Currency) return Boolean
is
begin
declare