File : terminal_interface-curses-text_io.adb 
package body Terminal_Interface.Curses.Text_IO is
   Default_Window : Window := Null_Window;
   procedure Set_Window (Win : Window)
   is
   begin
      Default_Window := Win;
   end Set_Window;
   function Get_Window return Window
   is
   begin
      if Default_Window = Null_Window then
         return Standard_Window;
      else
         return Default_Window;
      end if;
   end Get_Window;
   pragma Inline (Get_Window);
   procedure Flush (Win : Window)
   is
   begin
      Refresh (Win);
   end Flush;
   procedure Flush
   is
   begin
      Flush (Get_Window);
   end Flush;
   
   
   
   
   
   
   
   function Line_Length (Win : Window) return Count
   is
      N_Lines : Line_Count;
      N_Cols  : Column_Count;
   begin
      Get_Size (Win, N_Lines, N_Cols);
      
      
      
      return Count (N_Cols);
   end Line_Length;
   function Line_Length return Count
   is
   begin
      return Line_Length (Get_Window);
   end Line_Length;
   function Page_Length (Win : Window) return Count
   is
      N_Lines : Line_Count;
      N_Cols  : Column_Count;
   begin
      if Scrolling_Allowed (Win) then
         return 0;
      else
         Get_Size (Win, N_Lines, N_Cols);
         
         
         
         return Count (N_Lines);
      end if;
   end Page_Length;
   function Page_Length return Count
   is
   begin
      return Page_Length (Get_Window);
   end Page_Length;
   
   
   
   procedure New_Line (Win : Window; Spacing : Positive_Count := 1)
   is
      P_Size : constant Count := Page_Length (Win);
   begin
      if not Spacing'Valid then
         raise Constraint_Error;
      end if;
      for I in 1 .. Spacing loop
         if P_Size > 0 and then Line (Win) >= P_Size then
            New_Page (Win);
         else
            Add (Win, ASCII.LF);
         end if;
      end loop;
   end New_Line;
   procedure New_Line (Spacing : Positive_Count := 1)
   is
   begin
      New_Line (Get_Window, Spacing);
   end New_Line;
   procedure New_Page (Win : Window)
   is
   begin
      Clear (Win);
   end New_Page;
   procedure New_Page
   is
   begin
      New_Page (Get_Window);
   end New_Page;
   procedure Set_Col (Win : Window;  To : Positive_Count)
   is
      Y  : Line_Position;
      X1 : Column_Position;
      X2 : Column_Position;
      N  : Natural;
   begin
      if not To'Valid then
         raise Constraint_Error;
      end if;
      Get_Cursor_Position (Win, Y, X1);
      N  := Natural (To); N := N - 1;
      X2 := Column_Position (N);
      if X1 > X2 then
         New_Line (Win, 1);
         X1 := 0;
      end if;
      if X1 < X2 then
         declare
            Filler : constant String (Integer (X1) .. (Integer (X2) - 1))
              := (others => ' ');
         begin
            Put (Win, Filler);
         end;
      end if;
   end Set_Col;
   procedure Set_Col (To : Positive_Count)
   is
   begin
      Set_Col (Get_Window, To);
   end Set_Col;
   procedure Set_Line (Win : Window; To : Positive_Count)
   is
      Y1 : Line_Position;
      Y2 : Line_Position;
      X  : Column_Position;
      N  : Natural;
   begin
      if not To'Valid then
         raise Constraint_Error;
      end if;
      Get_Cursor_Position (Win, Y1, X);
      pragma Warnings (Off, X);         
      N  := Natural (To); N := N - 1;
      Y2 := Line_Position (N);
      if Y2 < Y1 then
         New_Page (Win);
         Y1 := 0;
      end if;
      if Y1 < Y2 then
         New_Line (Win, Positive_Count (Y2 - Y1));
      end if;
   end Set_Line;
   procedure Set_Line (To : Positive_Count)
   is
   begin
      Set_Line (Get_Window, To);
   end Set_Line;
   function Col (Win : Window) return Positive_Count
   is
      Y : Line_Position;
      X : Column_Position;
      N : Natural;
   begin
      Get_Cursor_Position (Win, Y, X);
      N := Natural (X); N := N + 1;
      
      
      
      return Positive_Count (N);
   end Col;
   function Col return Positive_Count
   is
   begin
      return Col (Get_Window);
   end Col;
   function Line (Win : Window) return Positive_Count
   is
      Y : Line_Position;
      X : Column_Position;
      N : Natural;
   begin
      Get_Cursor_Position (Win, Y, X);
      N := Natural (Y); N := N + 1;
      
      
      
      return Positive_Count (N);
   end Line;
   function Line return Positive_Count
   is
   begin
      return Line (Get_Window);
   end Line;
   
   
   
   procedure Put (Win  : Window; Item : Character)
   is
      P_Size : constant Count := Page_Length (Win);
      Y : Line_Position;
      X : Column_Position;
      L : Line_Count;
      C : Column_Count;
   begin
      if P_Size > 0 then
         Get_Cursor_Position (Win, Y, X);
         Get_Size (Win, L, C);
         if (Y + 1) = L and then (X + 1) = C then
            New_Page (Win);
         end if;
      end if;
      Add (Win, Item);
   end Put;
   procedure Put (Item : Character)
   is
   begin
      Put (Get_Window, Item);
   end Put;
   
   
   
   procedure Put (Win  : Window; Item : String)
   is
      P_Size : constant Count := Page_Length (Win);
      Y : Line_Position;
      X : Column_Position;
      L : Line_Count;
      C : Column_Count;
   begin
      if P_Size > 0 then
         Get_Cursor_Position (Win, Y, X);
         Get_Size (Win, L, C);
         if (Y + 1) = L and then (X + 1 + Item'Length) >= C then
            New_Page (Win);
         end if;
      end if;
      Add (Win, Item);
   end Put;
   procedure Put (Item : String)
   is
   begin
      Put (Get_Window, Item);
   end Put;
   procedure Put_Line
     (Win  : Window;
      Item : String)
   is
   begin
      Put (Win, Item);
      New_Line (Win, 1);
   end Put_Line;
   procedure Put_Line
     (Item : String)
   is
   begin
      Put_Line (Get_Window, Item);
   end Put_Line;
end Terminal_Interface.Curses.Text_IO;