[Ada] Add push/pop capability in Output
Add the capability to use the Write_* procedures in an environment where you want to write debugging info but still use them to write to other files (such a C source files). gcc/ada/ * output.ads (Push_Output, Pop_Output): New procedures. * output.adb (FD_Array, FD_Stack, FD_Stack_Idx): New type and vars. (Push_Output, Pop_Output): New procedures.
This commit is contained in:
parent
2949e08657
commit
0c111868b7
|
@ -45,6 +45,13 @@ package body Output is
|
||||||
Current_FD : File_Descriptor := Standout;
|
Current_FD : File_Descriptor := Standout;
|
||||||
-- File descriptor for current output
|
-- File descriptor for current output
|
||||||
|
|
||||||
|
type FD_Array is array (Nat range 1 .. 3) of File_Descriptor;
|
||||||
|
FD_Stack : FD_Array;
|
||||||
|
FD_Stack_Idx : Nat := FD_Array'First - 1;
|
||||||
|
-- Maintain a small stack for Push_Output and Pop_Output. We'd normally
|
||||||
|
-- use Table for this and allow an unlimited depth, but we're the target
|
||||||
|
-- of a pragma Elaborate_All in Table, so we can't use it here.
|
||||||
|
|
||||||
Special_Output_Proc : Output_Proc := null;
|
Special_Output_Proc : Output_Proc := null;
|
||||||
-- Record argument to last call to Set_Special_Output. If this is
|
-- Record argument to last call to Set_Special_Output. If this is
|
||||||
-- non-null, then we are in special output mode.
|
-- non-null, then we are in special output mode.
|
||||||
|
@ -228,6 +235,28 @@ package body Output is
|
||||||
(Cur_Indentation - Indentation_Amount) mod Indentation_Limit;
|
(Cur_Indentation - Indentation_Amount) mod Indentation_Limit;
|
||||||
end Outdent;
|
end Outdent;
|
||||||
|
|
||||||
|
----------------
|
||||||
|
-- Pop_Output --
|
||||||
|
----------------
|
||||||
|
|
||||||
|
procedure Pop_Output is
|
||||||
|
begin
|
||||||
|
pragma Assert (FD_Stack_Idx >= FD_Array'First);
|
||||||
|
Current_FD := FD_Stack (FD_Stack_Idx);
|
||||||
|
FD_Stack_Idx := FD_Stack_Idx - 1;
|
||||||
|
end Pop_Output;
|
||||||
|
|
||||||
|
-----------------
|
||||||
|
-- Push_Output --
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
procedure Push_Output is
|
||||||
|
begin
|
||||||
|
pragma Assert (FD_Stack_Idx < FD_Array'Last);
|
||||||
|
FD_Stack_Idx := FD_Stack_Idx + 1;
|
||||||
|
FD_Stack (FD_Stack_Idx) := Current_FD;
|
||||||
|
end Push_Output;
|
||||||
|
|
||||||
---------------------------
|
---------------------------
|
||||||
-- Restore_Output_Buffer --
|
-- Restore_Output_Buffer --
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
|
@ -95,6 +95,15 @@ package Output is
|
||||||
-- output will appear on the given file descriptor only after special
|
-- output will appear on the given file descriptor only after special
|
||||||
-- output has been cancelled.
|
-- output has been cancelled.
|
||||||
|
|
||||||
|
procedure Push_Output;
|
||||||
|
-- Saves the current output destination on a stack, but leaves it
|
||||||
|
-- unchanged. This subprogram only supports a small stack and is normally
|
||||||
|
-- used with a depth of one.
|
||||||
|
|
||||||
|
procedure Pop_Output;
|
||||||
|
-- Changes the current output destination to be the last output destination
|
||||||
|
-- popped using Push_Output.
|
||||||
|
|
||||||
procedure Indent;
|
procedure Indent;
|
||||||
-- Increases the current indentation level. Whenever a line is written
|
-- Increases the current indentation level. Whenever a line is written
|
||||||
-- (triggered by Eol), an appropriate amount of whitespace is added to the
|
-- (triggered by Eol), an appropriate amount of whitespace is added to the
|
||||||
|
|
Loading…
Reference in New Issue