* put ("i = " & x);
@ 1985-09-20 5:43 Doug Bryan
0 siblings, 0 replies; only message in thread
From: Doug Bryan @ 1985-09-20 5:43 UTC (permalink / raw)
As usual, Dr. Helfinger has brought up some very good points.
When Ada cannot do what you want it to do, explain the problem
better (implement a package - extensability).
The following package and demo main-line demonstrates his ideas.
To "fully" implement this capability, the package should also contain
the full capabilities of Text_Io so that default aft, exp, file_type...
may be used.
The output version here is fairly trivial. Anybody have any ideas
on the input version keeping 4.3(7) in mind??????
doug
----------------------------------------------------------
with Text_Io;
generic
type Int is range <>;
type Enum is (<>);
type Fl is digits <>;
type Fx is delta <>;
package Poly_Images is
function "&" (Left : String; Right : Int) return String;
function "&" (Left : Int; Right : String) return String;
function Fmt (I : Int;
Width : Text_Io.Field;
Base : Text_Io.Number_Base) return String;
function "&" (Left : String; Right : Enum) return String;
function "&" (Left : Enum; Right : String) return String;
function Fmt (E : Enum;
Width : Text_Io.Field;
Set : Text_Io.Type_Set) return String;
function "&" (Left : String; Right : Fl) return String;
function "&" (Left : Fl; Right : String) return String;
function Fmt (F : Fl;
Width, Aft, Exp : Text_Io.Field) return String;
function "&" (Left : String; Right : Fx) return String;
function "&" (Left : Fx; Right : String) return String;
function Fmt (F : Fx;
Width, Aft, Exp : Text_Io.Field) return String;
end Poly_Images;
----------------------------------------------------------
with Text_Io;
package body Poly_Images is
package Int_Io is new Text_Io.Integer_Io (Int);
package Enum_Io is new Text_Io.Enumeration_Io (Enum);
package Fl_Io is new Text_Io.Float_Io (Fl);
package Fx_Io is new Text_Io.Fixed_Io (Fx);
function "&" (Left : String; Right : Int) return String is
begin
return Left & Int'Image (Right);
end "&";
function "&" (Left : Int; Right : String) return String is
begin
return Int'Image (Left) & Right;
end "&";
function "&" (Left : String; Right : Enum) return String is
begin
return Left & Enum'Image (Right);
end "&";
function "&" (Left : Enum; Right : String) return String is
begin
return Enum'Image (Left) & Right;
end "&";
function Strip_Leading_Blanks (Within : String) return String is
begin
for I in Within'Range loop
if Within (I) /= ' ' then
if Within (I) = '-' or
Within (I) = '+' or
Within (I) not in '0' .. '9' then
return Within (I .. Within'Last);
else
return Within (I - 1 .. Within'Last);
end if;
end if;
end loop;
return "";
exception
when Constraint_Error =>
return Within;
end Strip_Leading_Blanks;
function "&" (Left : String; Right : Fl) return String is
Image : String (1 .. 300);
begin
Fl_Io.Put (To => Image, Item => Right);
return Left & Strip_Leading_Blanks (Image);
end "&";
function "&" (Left : Fl; Right : String) return String is
Image : String (1 .. 300);
begin
Fl_Io.Put (To => Image, Item => Left);
return Strip_Leading_Blanks (Image) & Right;
end "&";
function "&" (Left : String; Right : Fx) return String is
Image : String (1 .. 300);
begin
Fx_Io.Put (To => Image, Item => Right);
return Left & Strip_Leading_Blanks (Image);
end "&";
function "&" (Left : Fx; Right : String) return String is
Image : String (1 .. 300);
begin
Fx_Io.Put (To => Image, Item => Left);
return Strip_Leading_Blanks (Image) & Right;
end "&";
function Fmt (I : Int;
Width : Text_Io.Field;
Base : Text_Io.Number_Base) return String is
Image : String (1 .. 300);
begin
if Width = 0 then
Int_Io.Put (Image, I, Base);
return Strip_Leading_Blanks (Image);
else
Int_Io.Put (Image (1 .. Width), I, Base);
return Image (1 .. Width);
end if;
end Fmt;
function Fmt (E : Enum;
Width : Text_Io.Field;
Set : Text_Io.Type_Set) return String is
Image : String (1 .. 300);
begin
if Width = 0 then
Enum_Io.Put (Image, E, Set);
return Strip_Leading_Blanks (Image);
else
Enum_Io.Put (Image (1 .. Width), E, Set);
return Image (1 .. Width);
end if;
end Fmt;
function Fmt (F : Fl;
Width, Aft, Exp : Text_Io.Field) return String is
Image : String (1 .. 300);
begin
if Width = 0 then
Fl_Io.Put (Image, F, Aft, Exp);
return Strip_Leading_Blanks (Image);
else
Fl_Io.Put (Image (1 .. Width), F, Aft, Exp);
return Image (1 .. Width);
end if;
end Fmt;
function Fmt (F : Fx;
Width, Aft, Exp : Text_Io.Field) return String is
Image : String (1 .. 300);
begin
if Width = 0 then
Fx_Io.Put (Image, F, Aft, Exp);
return Strip_Leading_Blanks (Image);
else
Fx_Io.Put (Image (1 .. Width), F, Aft, Exp);
return Image (1 .. Width);
end if;
end Fmt;
end Poly_Images;
----------------------------------------------------------
with Text_Io,
Poly_Images;
use Text_Io;
procedure Poly_Images_Test is
package Images is new Poly_Images
(Int => Integer,
Enum => Boolean,
Fl => Float,
Fx => Duration);
use Images;
I : Integer;
Fp : Float;
Fd : Duration;
E : Boolean;
begin
I := 12; Fp := 12.12; Fd := 1.0102; E := True;
Put_Line ("integer = " & I & ", floating = " & Fp &
", fixed = " & Fd & ", enumation = " & E);
I := -12; Fp := -12.12; Fd := -1.0102; E := False;
Put_Line ("integer = " & I & ", floating = " & Fp &
", fixed = " & Fd & ", enumeration = " & E);
Put_Line ("integer = " & Fmt (I, 10, 8) & ", floating = " &
Fmt (Fp, 10, 2, 0) & "," );
Put_Line (" fixed = " &
Fmt (Fd, 10, 4, 0) & ", enumeration = " &
Fmt (E, 10, Lower_Case));
exception
when others =>
New_Line;
Put_Line ("Fatal exception propagation.");
end Poly_Images_Test;
pragma Main;
-------
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~1985-09-20 5:43 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1985-09-20 5:43 put ("i = " & x); Doug Bryan
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox