------------------------------------------------------------------------------
--                                                                          --
--                         GNAT RUN-TIME COMPONENTS                         --
--                                                                          --
--                          A D A . T E X T _ I O                           --
--                                                                          --
--                                 S p e c                                  --
--                                                                          --
--          Copyright (C) 1992-2021, Free Software Foundation, Inc.         --
--                                                                          --
-- This specification is derived from the Ada Reference Manual for use with --
-- GNAT. The copyright notice above, and the license provisions that follow --
-- apply solely to the  contents of the part following the private keyword. --
--                                                                          --
-- 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 3,  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.                                     --
--                                                                          --
-- As a special exception under Section 7 of GPL version 3, you are granted --
-- additional permissions described in the GCC Runtime Library Exception,   --
-- version 3.1, as published by the Free Software Foundation.               --
--                                                                          --
-- You should have received a copy of the GNU General Public License and    --
-- a copy of the GCC Runtime Library Exception along with this program;     --
-- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
-- <http://www.gnu.org/licenses/>.                                          --
--                                                                          --
-- GNAT was originally developed  by the GNAT team at  New York University. --
-- Extensive contributions were provided by Ada Core Technologies Inc.      --
--                                                                          --
------------------------------------------------------------------------------

--  Preconditions in this unit are meant for analysis only, not for run-time
--  checking, so that the expected exceptions are raised. This is enforced by
--  setting the corresponding assertion policy to Ignore. These preconditions
--  are partial. They protect fully against Status_Error and Mode_Error,
--  partially against Layout_Error (see SPARK User's Guide for details), and
--  not against other types of errors.

pragma Assertion_Policy (Pre => Ignore);

--  Note: the generic subpackages of Text_IO (Integer_IO, Float_IO, Fixed_IO,
--  Modular_IO, Decimal_IO and Enumeration_IO) appear as private children in
--  GNAT. These children are with'ed automatically if they are referenced, so
--  this rearrangement is invisible to user programs, but has the advantage
--  that only the needed parts of Text_IO are processed and loaded.

with Ada.IO_Exceptions;
with Ada.Streams;

with System;
with System.File_Control_Block;
with System.WCh_Con;

package Ada.Text_IO with
  Abstract_State    => (File_System),
  Initializes       => (File_System),
  Initial_Condition => Line_Length = 0 and Page_Length = 0
is
   pragma Elaborate_Body;

   type File_Type is limited private with
     Default_Initial_Condition => (not Is_Open (File_Type));
   type File_Mode is (In_File, Out_File, Append_File);

   --  The following representation clause allows the use of unchecked
   --  conversion for rapid translation between the File_Mode type
   --  used in this package and System.File_IO.

   for File_Mode use
     (In_File     => 0,  -- System.File_IO.File_Mode'Pos (In_File)
      Out_File    => 2,  -- System.File_IO.File_Mode'Pos (Out_File)
      Append_File => 3); -- System.File_IO.File_Mode'Pos (Append_File)

   type Count is range 0 .. Natural'Last;
   --  The value of Count'Last must be large enough so that the assumption that
   --  the Line, Column and Page counts can never exceed this value is valid.

   subtype Positive_Count is Count range 1 .. Count'Last;

   Unbounded : constant Count := 0;
   --  Line and page length

   subtype Field is Integer range 0 .. 255;

   subtype Number_Base is Integer range 2 .. 16;

   type Type_Set is (Lower_Case, Upper_Case);

   ---------------------
   -- File Management --
   ---------------------

   procedure Create
     (File : in out File_Type;
      Mode : File_Mode := Out_File;
      Name : String := "";
      Form : String := "")
   with
     Pre    => not Is_Open (File),
     Post   =>
       Is_Open (File)
       and then Ada.Text_IO.Mode (File) = Mode
       and then (if Mode /= In_File
                   then (Line_Length (File) = 0
                         and then Page_Length (File) = 0)),
     Global => (In_Out => File_System);

   procedure Open
     (File : in out File_Type;
      Mode : File_Mode;
      Name : String;
      Form : String := "")
   with
     Pre    => not Is_Open (File),
     Post   =>
      Is_Open (File)
      and then Ada.Text_IO.Mode (File) = Mode
      and then (if Mode /= In_File
                  then (Line_Length (File) = 0
                        and then Page_Length (File) = 0)),
     Global => (In_Out => File_System);

   procedure Close  (File : in out File_Type) with
     Pre    => Is_Open (File),
     Post   => not Is_Open (File),
     Global => (In_Out => File_System);
   procedure Delete (File : in out File_Type) with
     Pre    => Is_Open (File),
     Post   => not Is_Open (File),
     Global => (In_Out => File_System);
   procedure Reset  (File : in out File_Type; Mode : File_Mode) with
     Pre    => Is_Open (File),
     Post   =>
       Is_Open (File)
       and then Ada.Text_IO.Mode (File) = Mode
       and then (if Mode /= In_File
                   then (Line_Length (File) = 0
                         and then Page_Length (File) = 0)),
     Global => (In_Out => File_System);
   procedure Reset  (File : in out File_Type) with
     Pre    => Is_Open (File),
     Post   =>
       Is_Open (File)
       and Mode (File)'Old = Mode (File)
       and (if Mode (File) /= In_File
                then (Line_Length (File) = 0
                      and then Page_Length (File) = 0)),
     Global => (In_Out => File_System);

   function Mode (File : File_Type) return File_Mode with
     Pre    => Is_Open (File),
     Global => null;
   function Name (File : File_Type) return String with
     Pre    => Is_Open (File),
     Global => null;
   function Form (File : File_Type) return String with
     Pre    => Is_Open (File),
     Global => null;

   function Is_Open (File : File_Type) return Boolean with
     Global => null;

   ------------------------------------------------------
   -- Control of default input, output and error files --
   ------------------------------------------------------

   procedure Set_Input  (File : File_Type) with SPARK_Mode => Off;
   procedure Set_Output (File : File_Type) with SPARK_Mode => Off;
   procedure Set_Error  (File : File_Type) with SPARK_Mode => Off;

   function Standard_Input  return File_Type with SPARK_Mode => Off;
   function Standard_Output return File_Type with SPARK_Mode => Off;
   function Standard_Error  return File_Type with SPARK_Mode => Off;

   function Current_Input  return File_Type with SPARK_Mode => Off;
   function Current_Output return File_Type with SPARK_Mode => Off;
   function Current_Error  return File_Type with SPARK_Mode => Off;

   type File_Access is access constant File_Type;

   function Standard_Input  return File_Access with SPARK_Mode => Off;
   function Standard_Output return File_Access with SPARK_Mode => Off;
   function Standard_Error  return File_Access with SPARK_Mode => Off;

   function Current_Input  return File_Access with SPARK_Mode => Off;
   function Current_Output return File_Access with SPARK_Mode => Off;
   function Current_Error  return File_Access with SPARK_Mode => Off;

   --------------------
   -- Buffer control --
   --------------------

   --  Note: The parameter file is IN OUT in the RM, but this is clearly
   --  an oversight, and was intended to be IN, see AI95-00057.

   procedure Flush (File : File_Type) with
     Pre    => Is_Open (File) and then Mode (File) /= In_File,
     Post   =>
       Line_Length (File)'Old = Line_Length (File)
       and Page_Length (File)'Old = Page_Length (File),
     Global => (In_Out => File_System);
   procedure Flush with
     Post   =>
       Line_Length'Old = Line_Length
       and Page_Length'Old = Page_Length,
     Global => (In_Out => File_System);

   --------------------------------------------
   -- Specification of line and page lengths --
   --------------------------------------------

   procedure Set_Line_Length (File : File_Type; To : Count) with
     Pre    => Is_Open (File)  and then Mode (File) /= In_File,
     Post   =>
       Line_Length (File) = To
       and Page_Length (File)'Old = Page_Length (File),
     Global => (In_Out => File_System);
   procedure Set_Line_Length (To : Count) with
     Post   =>
       Line_Length = To
       and Page_Length'Old = Page_Length,
     Global => (In_Out => File_System);

   procedure Set_Page_Length (File : File_Type; To : Count) with
     Pre    => Is_Open (File) and then Mode (File) /= In_File,
     Post   =>
       Page_Length (File) = To
       and Line_Length (File)'Old = Line_Length (File),
     Global => (In_Out => File_System);
   procedure Set_Page_Length (To : Count) with
     Post   =>
       Page_Length = To
       and Line_Length'Old = Line_Length,
     Global => (In_Out => File_System);

   function Line_Length (File : File_Type) return Count with
     Pre    => Is_Open (File) and then Mode (File) /= In_File,
     Global => (Input => File_System);
   function Line_Length return Count with
     Global => (Input => File_System);

   function Page_Length (File : File_Type) return Count with
     Pre    => Is_Open (File) and then Mode (File) /= In_File,
     Global => (Input => File_System);
   function Page_Length return Count with
     Global => (Input => File_System);

   ------------------------------------
   -- Column, Line, and Page Control --
   ------------------------------------

   procedure New_Line (File : File_Type; Spacing : Positive_Count := 1) with
     Pre    => Is_Open (File) and then Mode (File) /= In_File,
     Post   =>
       Line_Length (File)'Old = Line_Length (File)
       and Page_Length (File)'Old = Page_Length (File),
     Global => (In_Out => File_System);
   procedure New_Line (Spacing : Positive_Count := 1) with
     Post   =>
       Line_Length'Old = Line_Length
       and Page_Length'Old = Page_Length,
     Global => (In_Out => File_System);

   procedure Skip_Line (File : File_Type; Spacing : Positive_Count := 1) with
     Pre    => Is_Open (File) and then Mode (File) = In_File,
     Global => (In_Out => File_System);
   procedure Skip_Line (Spacing : Positive_Count := 1) with
     Post   =>
       Line_Length'Old = Line_Length
       and Page_Length'Old = Page_Length,
     Global => (In_Out => File_System);

   function End_Of_Line (File : File_Type) return Boolean with
     Pre    => Is_Open (File) and then Mode (File) = In_File,
     Global => (Input => File_System);
   function End_Of_Line return Boolean with
     Global => (Input => File_System);

   procedure New_Page (File : File_Type) with
     Pre    => Is_Open (File) and then Mode (File) /= In_File,
     Post   =>
       Line_Length (File)'Old = Line_Length (File)
       and Page_Length (File)'Old = Page_Length (File),
     Global => (In_Out => File_System);
   procedure New_Page with
     Post   =>
       Line_Length'Old = Line_Length
       and Page_Length'Old = Page_Length,
     Global => (In_Out => File_System);

   procedure Skip_Page (File : File_Type) with
     Pre    => Is_Open (File) and then Mode (File) = In_File,
     Global => (In_Out => File_System);
   procedure Skip_Page with
     Post   =>
       Line_Length'Old = Line_Length
       and Page_Length'Old = Page_Length,
     Global => (In_Out => File_System);

   function End_Of_Page (File : File_Type) return Boolean with
     Pre    => Is_Open (File) and then Mode (File) = In_File,
     Global => (Input => File_System);
   function End_Of_Page return Boolean with
     Global => (Input => File_System);

   function End_Of_File (File : File_Type) return Boolean with
     Pre    => Is_Open (File) and then Mode (File) = In_File,
     Global => (Input => File_System);
   function End_Of_File return Boolean with
     Global => (Input => File_System);

   procedure Set_Col (File : File_Type;  To : Positive_Count) with
     Pre            =>
       Is_Open (File)
       and then (if Mode (File) /= In_File
                     then (Line_Length (File) = 0
                           or else To <= Line_Length (File))),
     Contract_Cases =>
       (Mode (File) /= In_File =>
              Line_Length (File)'Old = Line_Length (File)
              and Page_Length (File)'Old = Page_Length (File),
        others                 => True),
     Global         => (In_Out => File_System);
   procedure Set_Col (To : Positive_Count) with
     Pre    => Line_Length = 0 or To <= Line_Length,
     Post   =>
       Line_Length'Old = Line_Length
       and Page_Length'Old = Page_Length,
     Global => (In_Out => File_System);

   procedure Set_Line (File : File_Type; To : Positive_Count) with
     Pre            =>
       Is_Open (File)
       and then (if Mode (File) /= In_File
                     then (Page_Length (File) = 0
                           or else To <= Page_Length (File))),
     Contract_Cases =>
       (Mode (File) /= In_File =>
              Line_Length (File)'Old = Line_Length (File)
              and Page_Length (File)'Old = Page_Length (File),
        others                 => True),
     Global         => (In_Out => File_System);
   procedure Set_Line (To : Positive_Count) with
     Pre    => Page_Length = 0 or To <= Page_Length,
     Post   =>
       Line_Length'Old = Line_Length
       and Page_Length'Old = Page_Length,
     Global => (In_Out => File_System);

   function Col (File : File_Type) return Positive_Count with
     Pre    => Is_Open (File),
     Global => (Input => File_System);
   function Col return Positive_Count with
     Global => (Input => File_System);

   function Line (File : File_Type) return Positive_Count with
     Pre    => Is_Open (File),
     Global => (Input => File_System);
   function Line return Positive_Count with
     Global => (Input => File_System);

   function Page (File : File_Type) return Positive_Count with
     Pre => Is_Open (File),
     Global => (Input => File_System);
   function Page return Positive_Count with
     Global => (Input => File_System);

   ----------------------------
   -- Character Input-Output --
   ----------------------------

   procedure Get (File : File_Type; Item : out Character) with
     Pre    => Is_Open (File) and then Mode (File) = In_File,
     Global => (In_Out => File_System);
   procedure Get (Item : out Character) with
     Post   =>
       Line_Length'Old = Line_Length
       and Page_Length'Old = Page_Length,
     Global => (In_Out => File_System);
   procedure Put (File : File_Type; Item : Character) with
     Pre    => Is_Open (File) and then Mode (File) /= In_File,
     Post   =>
       Line_Length (File)'Old = Line_Length (File)
       and Page_Length (File)'Old = Page_Length (File),
     Global => (In_Out => File_System);
   procedure Put (Item : Character) with
     Post   =>
       Line_Length'Old = Line_Length
       and Page_Length'Old = Page_Length,
     Global => (In_Out => File_System);

   procedure Look_Ahead
     (File        : File_Type;
      Item        : out Character;
      End_Of_Line : out Boolean)
   with
     Pre    => Is_Open (File) and then Mode (File) = In_File,
     Global => (Input => File_System);

   procedure Look_Ahead
     (Item        : out Character;
      End_Of_Line : out Boolean)
   with
     Post   =>
       Line_Length'Old = Line_Length
       and Page_Length'Old = Page_Length,
     Global => (Input => File_System);

   procedure Get_Immediate
     (File : File_Type;
      Item : out Character)
   with
     Pre    => Is_Open (File) and then Mode (File) = In_File,
     Global => (In_Out => File_System);

   procedure Get_Immediate
     (Item : out Character)
   with
     Post   =>
       Line_Length'Old = Line_Length
       and Page_Length'Old = Page_Length,
     Global => (In_Out => File_System);

   procedure Get_Immediate
     (File      : File_Type;
      Item      : out Character;
      Available : out Boolean)
   with
     Pre    => Is_Open (File) and then Mode (File) = In_File,
     Global => (In_Out => File_System);

   procedure Get_Immediate
     (Item      : out Character;
      Available : out Boolean)
   with
     Post   =>
       Line_Length'Old = Line_Length
       and Page_Length'Old = Page_Length,
     Global => (In_Out => File_System);

   -------------------------
   -- String Input-Output --
   -------------------------

   procedure Get (File : File_Type; Item : out String) with
     Pre    => Is_Open (File) and then Mode (File) = In_File,
     Global => (In_Out => File_System);
   procedure Get (Item : out String) with
     Post   =>
       Line_Length'Old = Line_Length
       and Page_Length'Old = Page_Length,
     Global => (In_Out => File_System);
   procedure Put (File : File_Type; Item : String) with
     Pre    => Is_Open (File) and then Mode (File) /= In_File,
     Post   =>
       Line_Length (File)'Old = Line_Length (File)
       and Page_Length (File)'Old = Page_Length (File),
     Global => (In_Out => File_System);
   procedure Put (Item : String) with
     Post   =>
       Line_Length'Old = Line_Length
       and Page_Length'Old = Page_Length,
     Global => (In_Out => File_System);

   procedure Get_Line
     (File : File_Type;
      Item : out String;
      Last : out Natural)
   with
     Pre    => Is_Open (File) and then Mode (File) = In_File,
     Post   => (if Item'Length > 0 then Last in Item'First - 1 .. Item'Last
               else Last = Item'First - 1),
     Global => (In_Out => File_System);

   procedure Get_Line
     (Item : out String;
      Last : out Natural)
   with
     Post   =>
       Line_Length'Old = Line_Length
       and Page_Length'Old = Page_Length
       and (if Item'Length > 0 then Last in Item'First - 1 .. Item'Last
            else Last = Item'First - 1),
     Global => (In_Out => File_System);

   function Get_Line (File : File_Type) return String with SPARK_Mode => Off;
   pragma Ada_05 (Get_Line);

   function Get_Line return String with SPARK_Mode => Off;
   pragma Ada_05 (Get_Line);

   procedure Put_Line
     (File : File_Type;
      Item : String)
   with
     Pre    => Is_Open (File) and then Mode (File) /= In_File,
     Post   =>
       Line_Length (File)'Old = Line_Length (File)
       and Page_Length (File)'Old = Page_Length (File),
     Global => (In_Out => File_System);

   procedure Put_Line
     (Item : String)
   with
     Post   =>
       Line_Length'Old = Line_Length
       and Page_Length'Old = Page_Length,
     Global => (In_Out => File_System);

   ---------------------------------------
   -- Generic packages for Input-Output --
   ---------------------------------------

   --  The generic packages:

   --    Ada.Text_IO.Integer_IO
   --    Ada.Text_IO.Modular_IO
   --    Ada.Text_IO.Float_IO
   --    Ada.Text_IO.Fixed_IO
   --    Ada.Text_IO.Decimal_IO
   --    Ada.Text_IO.Enumeration_IO

   --  are implemented as separate child packages in GNAT, so the
   --  spec and body of these packages are to be found in separate
   --  child units. This implementation detail is hidden from the
   --  Ada programmer by special circuitry in the compiler that
   --  treats these child packages as though they were nested in
   --  Text_IO. The advantage of this special processing is that
   --  the subsidiary routines needed if these generics are used
   --  are not loaded when they are not used.

   ----------------
   -- Exceptions --
   ----------------

   Status_Error : exception renames IO_Exceptions.Status_Error;
   Mode_Error   : exception renames IO_Exceptions.Mode_Error;
   Name_Error   : exception renames IO_Exceptions.Name_Error;
   Use_Error    : exception renames IO_Exceptions.Use_Error;
   Device_Error : exception renames IO_Exceptions.Device_Error;
   End_Error    : exception renames IO_Exceptions.End_Error;
   Data_Error   : exception renames IO_Exceptions.Data_Error;
   Layout_Error : exception renames IO_Exceptions.Layout_Error;

private

   --  The following procedures have a File_Type formal of mode IN OUT because
   --  they may close the original file. The Close operation may raise an
   --  exception, but in that case we want any assignment to the formal to
   --  be effective anyway, so it must be passed by reference (or the caller
   --  will be left with a dangling pointer).

   pragma Export_Procedure
     (Internal  => Close,
      External  => "",
      Mechanism => Reference);
   pragma Export_Procedure
     (Internal  => Delete,
      External  => "",
      Mechanism => Reference);
   pragma Export_Procedure
     (Internal        => Reset,
      External        => "",
      Parameter_Types => (File_Type),
      Mechanism       => Reference);
   pragma Export_Procedure
     (Internal        => Reset,
      External        => "",
      Parameter_Types => (File_Type, File_Mode),
      Mechanism       => (File => Reference));

   -----------------------------------
   -- Handling of Format Characters --
   -----------------------------------

   --  Line marks are represented by the single character ASCII.LF (16#0A#).
   --  In DOS and similar systems, underlying file translation takes care
   --  of translating this to and from the standard CR/LF sequences used in
   --  these operating systems to mark the end of a line. On output there is
   --  always a line mark at the end of the last line, but on input, this
   --  line mark can be omitted, and is implied by the end of file.

   --  Page marks are represented by the single character ASCII.FF (16#0C#),
   --  The page mark at the end of the file may be omitted, and is normally
   --  omitted on output unless an explicit New_Page call is made before
   --  closing the file. No page mark is added when a file is appended to,
   --  so, in accordance with the permission in (RM A.10.2(4)), there may
   --  or may not be a page mark separating preexisting text in the file
   --  from the new text to be written.

   --  A file mark is marked by the physical end of file. In DOS translation
   --  mode on input, an EOF character (SUB = 16#1A#) gets translated to the
   --  physical end of file, so in effect this character is recognized as
   --  marking the end of file in DOS and similar systems.

   LM : constant := Character'Pos (ASCII.LF);
   --  Used as line mark

   PM : constant := Character'Pos (ASCII.FF);
   --  Used as page mark, except at end of file where it is implied

   --------------------------------
   -- Text_IO File Control Block --
   --------------------------------

   Default_WCEM : System.WCh_Con.WC_Encoding_Method :=
                    System.WCh_Con.WCEM_UTF8;
   --  This gets modified during initialization (see body) using
   --  the default value established in the call to Set_Globals.

   package FCB renames System.File_Control_Block;

   type Text_AFCB;
   type File_Type is access all Text_AFCB;

   type Text_AFCB is new FCB.AFCB with record
      Page        : Count := 1;
      Line        : Count := 1;
      Col         : Count := 1;
      Line_Length : Count := 0;
      Page_Length : Count := 0;

      Self : aliased File_Type;
      --  Set to point to the containing Text_AFCB block. This is used to
      --  implement the Current_{Error,Input,Output} functions which return
      --  a File_Access, the file access value returned is a pointer to
      --  the Self field of the corresponding file.

      Before_LM : Boolean := False;
      --  This flag is used to deal with the anomalies introduced by the
      --  peculiar definition of End_Of_File and End_Of_Page in Ada. These
      --  functions require looking ahead more than one character. Since
      --  there is no convenient way of backing up more than one character,
      --  what we do is to leave ourselves positioned past the LM, but set
      --  this flag, so that we know that from an Ada point of view we are
      --  in front of the LM, not after it. A little odd, but it works.

      Before_LM_PM : Boolean := False;
      --  This flag similarly handles the case of being physically positioned
      --  after a LM-PM sequence when logically we are before the LM-PM. This
      --  flag can only be set if Before_LM is also set.

      WC_Method : System.WCh_Con.WC_Encoding_Method := Default_WCEM;
      --  Encoding method to be used for this file. Text_IO does not deal with
      --  wide characters, but it does deal with upper half characters in the
      --  range 16#80#-16#FF# which may need encoding, e.g. in UTF-8 mode.

      Before_Upper_Half_Character : Boolean := False;
      --  This flag is set to indicate that an encoded upper half character has
      --  been read by Text_IO.Look_Ahead. If it is set to True, then it means
      --  that the stream is logically positioned before the character but is
      --  physically positioned after it. The character involved must be in
      --  the range 16#80#-16#FF#, i.e. if the flag is set, then we know the
      --  next character has a code greater than 16#7F#, and the value of this
      --  character is saved in Saved_Upper_Half_Character.

      Saved_Upper_Half_Character : Character;
      --  This field is valid only if Before_Upper_Half_Character is set. It
      --  contains an upper-half character read by Look_Ahead. If Look_Ahead
      --  reads a character in the range 16#00# to 16#7F#, then it can use
      --  ungetc to put it back, but ungetc cannot be called more than once,
      --  so for characters above this range, we don't try to back up the
      --  file. Instead we save the character in this field and set the flag
      --  Before_Upper_Half_Character to True to indicate that we are logically
      --  positioned before this character even though the stream is physically
      --  positioned after it.

   end record;

   function AFCB_Allocate (Control_Block : Text_AFCB) return FCB.AFCB_Ptr;

   procedure AFCB_Close (File : not null access Text_AFCB);
   procedure AFCB_Free  (File : not null access Text_AFCB);

   procedure Read
     (File : in out Text_AFCB;
      Item : out Ada.Streams.Stream_Element_Array;
      Last : out Ada.Streams.Stream_Element_Offset);
   --  Read operation used when Text_IO file is treated directly as Stream

   procedure Write
     (File : in out Text_AFCB;
      Item : Ada.Streams.Stream_Element_Array);
   --  Write operation used when Text_IO file is treated directly as Stream

   ------------------------
   -- The Standard Files --
   ------------------------

   Standard_In_AFCB  : aliased Text_AFCB;
   Standard_Out_AFCB : aliased Text_AFCB;
   Standard_Err_AFCB : aliased Text_AFCB;

   Standard_In  : aliased File_Type := Standard_In_AFCB'Access with
     Part_Of => File_System;
   Standard_Out : aliased File_Type := Standard_Out_AFCB'Access with
     Part_Of => File_System;
   Standard_Err : aliased File_Type := Standard_Err_AFCB'Access with
     Part_Of => File_System;
   --  Standard files

   Current_In   : aliased File_Type := Standard_In with
     Part_Of => File_System;
   Current_Out  : aliased File_Type := Standard_Out with
     Part_Of => File_System;
   Current_Err  : aliased File_Type := Standard_Err with
     Part_Of => File_System;
   --  Current files

   function EOF_Char return Integer;
   --  Returns the system-specific character indicating the end of a text file.
   --  This is exported for use by child packages such as Enumeration_Aux to
   --  eliminate their needing to depend directly on Interfaces.C_Streams,
   --  which might not be available in certain target environments.

   procedure Initialize_Standard_Files;
   --  Initializes the file control blocks for the standard files. Called from
   --  the elaboration routine for this package, and from Reset_Standard_Files
   --  in package Ada.Text_IO.Reset_Standard_Files.

end Ada.Text_IO;
