home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / gnat-2.06-src.tgz / tar.out / fsf / gnat / ada / a-textio.adb < prev    next >
Text File  |  1996-09-28  |  41KB  |  1,601 lines

  1. ------------------------------------------------------------------------------
  2. --                                                                          --
  3. --                         GNAT RUNTIME COMPONENTS                          --
  4. --                                                                          --
  5. --                          A D A . T E X T _ I O                           --
  6. --                                                                          --
  7. --                                 B o d y                                  --
  8. --                                                                          --
  9. --                            $Revision: 1.47 $                             --
  10. --                                                                          --
  11. --        Copyright (c) 1992,1993,1994,1995 NYU, All Rights Reserved        --
  12. --                                                                          --
  13. -- The GNAT library is free software; you can redistribute it and/or modify --
  14. -- it under terms of the GNU Library General Public License as published by --
  15. -- the Free Software  Foundation; either version 2, or (at your option) any --
  16. -- later version.  The GNAT library is distributed in the hope that it will --
  17. -- be useful, but WITHOUT ANY WARRANTY;  without even  the implied warranty --
  18. -- of MERCHANTABILITY  or  FITNESS FOR  A PARTICULAR PURPOSE.  See the  GNU --
  19. -- Library  General  Public  License for  more  details.  You  should  have --
  20. -- received  a copy of the GNU  Library  General Public License  along with --
  21. -- the GNAT library;  see the file  COPYING.LIB.  If not, write to the Free --
  22. -- Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.        --
  23. --                                                                          --
  24. ------------------------------------------------------------------------------
  25.  
  26. with Ada.Streams;          use Ada.Streams;
  27. with Interfaces.C_Streams; use Interfaces.C_Streams;
  28. with System;
  29. with System.File_IO;
  30. with Unchecked_Conversion;
  31. with Unchecked_Deallocation;
  32.  
  33. pragma Elaborate_All (System.File_IO);
  34. --  Needed because of calls to Chain_File in package body elaboration
  35.  
  36. package body Ada.Text_IO is
  37.  
  38.    package FIO renames System.File_IO;
  39.  
  40.    subtype AP is FCB.AFCB_Ptr;
  41.  
  42.    function To_FCB is new Unchecked_Conversion (File_Mode, FCB.File_Mode);
  43.    function To_TIO is new Unchecked_Conversion (FCB.File_Mode, File_Mode);
  44.  
  45.    -------------------
  46.    -- AFCB_Allocate --
  47.    -------------------
  48.  
  49.    function AFCB_Allocate (Control_Block : Text_AFCB) return FCB.AFCB_Ptr is
  50.    begin
  51.       return new Text_AFCB;
  52.    end AFCB_Allocate;
  53.  
  54.    ----------------
  55.    -- AFCB_Close --
  56.    ----------------
  57.  
  58.    procedure AFCB_Close (File : access Text_AFCB) is
  59.    begin
  60.       --  If the file being closed is one of the current files, then close
  61.       --  the corresponding current file. It is not clear that this action
  62.       --  is required (RM A.10.3(23)) but it seems reasonable, and besides
  63.       --  ACVC test CE3208A expects this behavior).
  64.  
  65.       if File = Current_In then
  66.          Current_In := null;
  67.       elsif File = Current_Out then
  68.          Current_Out := null;
  69.       elsif File = Current_Err then
  70.          Current_Err := null;
  71.       end if;
  72.  
  73.       --  Output line terminator if needed, but page terminator is implied
  74.  
  75.       if File.Mode /= FCB.In_File and then File.Col /= 1 then
  76.          New_Line (File);
  77.       end if;
  78.    end AFCB_Close;
  79.  
  80.    ---------------
  81.    -- AFCB_Free --
  82.    ---------------
  83.  
  84.    procedure AFCB_Free (File : access Text_AFCB) is
  85.       type FCB_Ptr is access all Text_AFCB;
  86.       FT : FCB_Ptr := File;
  87.  
  88.       procedure Free is new Unchecked_Deallocation (Text_AFCB, FCB_Ptr);
  89.  
  90.    begin
  91.       Free (FT);
  92.    end AFCB_Free;
  93.  
  94.    -----------
  95.    -- Close --
  96.    -----------
  97.  
  98.    procedure Close (File : in out File_Type) is
  99.    begin
  100.       FIO.Close (AP (File));
  101.    end Close;
  102.  
  103.    ---------
  104.    -- Col --
  105.    ---------
  106.  
  107.    --  Note: we assume that it is impossible in practice for the column
  108.    --  to exceed the value of Count'Last, i.e. no check is required for
  109.    --  overflow raising layout error.
  110.  
  111.    function Col (File : in File_Type) return Positive_Count is
  112.    begin
  113.       FIO.Check_File_Open (AP (File));
  114.       return File.Col;
  115.    end Col;
  116.  
  117.    function Col return Positive_Count is
  118.    begin
  119.       return Col (Current_Out);
  120.    end Col;
  121.  
  122.    ------------
  123.    -- Create --
  124.    ------------
  125.  
  126.    procedure Create
  127.      (File : in out File_Type;
  128.       Mode : in File_Mode := Out_File;
  129.       Name : in String := "";
  130.       Form : in String := "")
  131.    is
  132.       File_Control_Block : Text_AFCB;
  133.  
  134.    begin
  135.       FIO.Open (File_Ptr  => AP (File),
  136.                 Dummy_FCB => File_Control_Block,
  137.                 Mode      => To_FCB (Mode),
  138.                 Name      => Name,
  139.                 Form      => Form,
  140.                 Amethod   => 'T',
  141.                 Creat     => True,
  142.                 Text      => True);
  143.    end Create;
  144.  
  145.    -------------------
  146.    -- Current_Error --
  147.    -------------------
  148.  
  149.    function Current_Error return File_Type is
  150.    begin
  151.       return Current_Err;
  152.    end Current_Error;
  153.  
  154.    function Current_Error return File_Access is
  155.    begin
  156.       return Current_Err'Access;
  157.    end Current_Error;
  158.  
  159.    -------------------
  160.    -- Current_Input --
  161.    -------------------
  162.  
  163.    function Current_Input return File_Type is
  164.    begin
  165.       return Current_In;
  166.    end Current_Input;
  167.  
  168.    function Current_Input return File_Access is
  169.    begin
  170.       return Current_In'Access;
  171.    end Current_Input;
  172.  
  173.    --------------------
  174.    -- Current_Output --
  175.    --------------------
  176.  
  177.    function Current_Output return File_Type is
  178.    begin
  179.       return Current_Out;
  180.    end Current_Output;
  181.  
  182.    function Current_Output return File_Access is
  183.    begin
  184.       return Current_Out'Access;
  185.    end Current_Output;
  186.  
  187.    ------------
  188.    -- Delete --
  189.    ------------
  190.  
  191.    procedure Delete (File : in out File_Type) is
  192.    begin
  193.       FIO.Delete (AP (File));
  194.    end Delete;
  195.  
  196.    -----------------
  197.    -- End_Of_File --
  198.    -----------------
  199.  
  200.    function End_Of_File (File : in File_Type) return Boolean is
  201.       loc : long;
  202.       ch  : int;
  203.  
  204.    begin
  205.       FIO.Check_Read_Status (AP (File));
  206.  
  207.       if File.Before_LM then
  208.  
  209.          if File.Before_LM_PM then
  210.             return Nextc (File) = EOF;
  211.          end if;
  212.  
  213.       else
  214.          ch := Getc (File);
  215.  
  216.          if ch = EOF then
  217.             return True;
  218.  
  219.          elsif ch /= LM then
  220.             Ungetc (ch, File);
  221.             return False;
  222.  
  223.          else -- ch = LM
  224.             File.Before_LM := True;
  225.          end if;
  226.       end if;
  227.  
  228.       --  Here we are just past the line mark with Before_LM set so that we
  229.       --  do not have to try to back up past the LM, thus avoiding the need
  230.       --  to back up more than one character.
  231.  
  232.       ch := Getc (File);
  233.  
  234.       if ch = EOF then
  235.          return True;
  236.  
  237.       elsif ch = PM and then File.Is_Regular_File then
  238.          File.Before_LM_PM := True;
  239.          return Nextc (File) = EOF;
  240.  
  241.       --  Here if neither EOF nor PM followed end of line
  242.  
  243.       else
  244.          Ungetc (ch, File);
  245.          return False;
  246.       end if;
  247.  
  248.    end End_Of_File;
  249.  
  250.    function End_Of_File return Boolean is
  251.    begin
  252.       return End_Of_File (Current_In);
  253.    end End_Of_File;
  254.  
  255.    -----------------
  256.    -- End_Of_Line --
  257.    -----------------
  258.  
  259.    function End_Of_Line (File : in File_Type) return Boolean is
  260.       ch : int;
  261.  
  262.    begin
  263.       FIO.Check_Read_Status (AP (File));
  264.  
  265.       if File.Before_LM then
  266.          return True;
  267.  
  268.       else
  269.          ch := Getc (File);
  270.  
  271.          if ch = EOF then
  272.             return True;
  273.  
  274.          else
  275.             Ungetc (ch, File);
  276.             return (ch = LM);
  277.          end if;
  278.       end if;
  279.    end End_Of_Line;
  280.  
  281.    function End_Of_Line return Boolean is
  282.    begin
  283.       return End_Of_Line (Current_In);
  284.    end End_Of_Line;
  285.  
  286.    -----------------
  287.    -- End_Of_Page --
  288.    -----------------
  289.  
  290.    function End_Of_Page (File : in File_Type) return Boolean is
  291.       loc : long;
  292.       ch  : int;
  293.  
  294.    begin
  295.       FIO.Check_Read_Status (AP (File));
  296.  
  297.       if not File.Is_Regular_File then
  298.          return False;
  299.  
  300.       elsif File.Before_LM then
  301.          if File.Before_LM_PM then
  302.             return True;
  303.          end if;
  304.  
  305.       else
  306.          ch := Getc (File);
  307.  
  308.          if ch = EOF then
  309.             return True;
  310.  
  311.          elsif ch /= LM then
  312.             Ungetc (ch, File);
  313.             return False;
  314.  
  315.          else -- ch = LM
  316.             File.Before_LM := True;
  317.          end if;
  318.       end if;
  319.  
  320.       --  Here we are just past the line mark with Before_LM set so that we
  321.       --  do not have to try to back up past the LM, thus avoiding the need
  322.       --  to back up more than one character.
  323.  
  324.       ch := Nextc (File);
  325.  
  326.       return ch = PM or else ch = EOF;
  327.    end End_Of_Page;
  328.  
  329.    function End_Of_Page return Boolean is
  330.    begin
  331.       return End_Of_Page (Current_In);
  332.    end End_Of_Page;
  333.  
  334.    -----------
  335.    -- Flush --
  336.    -----------
  337.  
  338.    procedure Flush (File : in out File_Type) is
  339.    begin
  340.       FIO.Flush (AP (File));
  341.    end Flush;
  342.  
  343.    procedure Flush is
  344.    begin
  345.       Flush (Current_Out);
  346.    end Flush;
  347.  
  348.    ----------
  349.    -- Form --
  350.    ----------
  351.  
  352.    function Form (File : in File_Type) return String is
  353.    begin
  354.       return FIO.Form (AP (File));
  355.    end Form;
  356.  
  357.    ---------
  358.    -- Get --
  359.    ---------
  360.  
  361.    procedure Get
  362.      (File : in File_Type;
  363.       Item : out Character)
  364.    is
  365.       ch : int;
  366.  
  367.    begin
  368.       FIO.Check_Read_Status (AP (File));
  369.  
  370.       if File.Before_LM then
  371.          File.Before_LM := False;
  372.          File.Before_LM_PM := False;
  373.          File.Col := 1;
  374.  
  375.          if File.Before_LM_PM then
  376.             File.Line := 1;
  377.             File.Page := File.Page + 1;
  378.             File.Before_LM_PM := False;
  379.  
  380.          else
  381.             File.Line := File.Line + 1;
  382.          end if;
  383.       end if;
  384.  
  385.       loop
  386.          ch := Getc (File);
  387.  
  388.          if ch = EOF then
  389.             raise End_Error;
  390.  
  391.          elsif ch = LM then
  392.             File.Line := File.Line + 1;
  393.             File.Col := 1;
  394.  
  395.          elsif ch = PM and then File.Is_Regular_File then
  396.             File.Page := File.Page + 1;
  397.             File.Line := 1;
  398.  
  399.          else
  400.             Item := Character'Val (ch);
  401.             File.Col := File.Col + 1;
  402.             return;
  403.          end if;
  404.       end loop;
  405.    end Get;
  406.  
  407.    procedure Get (Item : out Character) is
  408.    begin
  409.       Get (Current_In, Item);
  410.    end Get;
  411.  
  412.    procedure Get
  413.      (File : in File_Type;
  414.       Item : out String)
  415.    is
  416.       ch : int;
  417.       J  : Natural;
  418.  
  419.    begin
  420.       FIO.Check_Read_Status (AP (File));
  421.  
  422.       if File.Before_LM then
  423.          File.Before_LM := False;
  424.          File.Before_LM_PM := False;
  425.          File.Col := 1;
  426.  
  427.          if File.Before_LM_PM then
  428.             File.Line := 1;
  429.             File.Page := File.Page + 1;
  430.             File.Before_LM_PM := False;
  431.  
  432.          else
  433.             File.Line := File.Line + 1;
  434.          end if;
  435.       end if;
  436.  
  437.       J := Item'First;
  438.       while J <= Item'Last loop
  439.          ch := Getc (File);
  440.  
  441.          if ch = EOF then
  442.             raise End_Error;
  443.  
  444.          elsif ch = LM then
  445.             File.Line := File.Line + 1;
  446.             File.Col := 1;
  447.  
  448.          elsif ch = PM and then File.Is_Regular_File then
  449.             File.Page := File.Page + 1;
  450.             File.Line := 1;
  451.  
  452.          else
  453.             Item (J) := Character'Val (ch);
  454.             J := J + 1;
  455.             File.Col := File.Col + 1;
  456.          end if;
  457.       end loop;
  458.    end Get;
  459.  
  460.    procedure Get (Item : out String) is
  461.    begin
  462.       Get (Current_In, Item);
  463.    end Get;
  464.  
  465.    ----------
  466.    -- Getc --
  467.    ----------
  468.  
  469.    function Getc (File : File_Type) return int is
  470.       ch : int;
  471.  
  472.    begin
  473.       ch := fgetc (File.Stream);
  474.  
  475.       if ch = EOF and then ferror (File.Stream) /= 0 then
  476.          raise Device_Error;
  477.       else
  478.          return ch;
  479.       end if;
  480.    end Getc;
  481.  
  482.    -------------------
  483.    -- Get_Immediate --
  484.    -------------------
  485.  
  486.    --  More work required here ???
  487.  
  488.    procedure Get_Immediate
  489.      (File : in File_Type;
  490.       Item : out Character)
  491.    is
  492.       ch : int;
  493.  
  494.    begin
  495.       FIO.Check_Read_Status (AP (File));
  496.  
  497.       if File.Before_LM then
  498.          File.Before_LM := False;
  499.          File.Before_LM_PM := False;
  500.          ch := LM;
  501.  
  502.       else
  503.          ch := Getc (File);
  504.  
  505.          if ch = EOF then
  506.             raise End_Error;
  507.          end if;
  508.       end if;
  509.  
  510.       Item := Character'Val (ch);
  511.  
  512.    end Get_Immediate;
  513.  
  514.    procedure Get_Immediate
  515.      (Item : out Character)
  516.    is
  517.    begin
  518.       Get_Immediate (Current_In, Item);
  519.    end Get_Immediate;
  520.  
  521.    procedure Get_Immediate
  522.      (File      : in File_Type;
  523.       Item      : out Character;
  524.       Available : out Boolean)
  525.    is
  526.       ch : int;
  527.  
  528.    begin
  529.       FIO.Check_Read_Status (AP (File));
  530.  
  531.       if File.Before_LM then
  532.          File.Before_LM := False;
  533.          File.Before_LM_PM := False;
  534.          ch := LM;
  535.  
  536.       else
  537.          ch := Getc (File);
  538.  
  539.          if ch = EOF then
  540.             raise End_Error;
  541.          end if;
  542.       end if;
  543.  
  544.       Item := Character'Val (ch);
  545.       Available := True;
  546.    end Get_Immediate;
  547.  
  548.    procedure Get_Immediate
  549.      (Item      : out Character;
  550.       Available : out Boolean)
  551.    is
  552.    begin
  553.       Get_Immediate (Current_In, Item, Available);
  554.    end Get_Immediate;
  555.  
  556.    --------------
  557.    -- Get_Line --
  558.    --------------
  559.  
  560.    procedure Get_Line
  561.      (File : in File_Type;
  562.       Item : out String;
  563.       Last : out Natural)
  564.    is
  565.       ch : int;
  566.  
  567.    begin
  568.       FIO.Check_Read_Status (AP (File));
  569.       Last := Item'First - 1;
  570.  
  571.       --  Immediate exit for null string, this is a case in which we do not
  572.       --  need to test for end of file and we do not skip a line mark under
  573.       --  any circumstances.
  574.  
  575.       if Last >= Item'Last then
  576.          return;
  577.       end if;
  578.  
  579.       --  Here we have at least one character, if we are immediately before
  580.       --  a line mark, then we will just skip past it storing no characters.
  581.  
  582.       if File.Before_LM then
  583.          File.Before_LM := False;
  584.          File.Before_LM_PM := False;
  585.  
  586.       --  Otherwise we need to read some characters
  587.  
  588.       else
  589.          ch := Getc (File);
  590.  
  591.          --  If we are at the end of file now, it means we are trying to
  592.          --  skip a file terminator and we raise End_Error (RM A.10.7(20))
  593.  
  594.          if ch = EOF then
  595.             raise End_Error;
  596.          end if;
  597.  
  598.          --  Loop through characters. Don't bother if we hit a page mark,
  599.          --  since in normal files, page marks can only follow line marks
  600.          --  in any case and we only promise to treat the page nonsense
  601.          --  correctly in the absense of such rogue page marks.
  602.  
  603.          loop
  604.             --  Exit the loop if read is terminated by encountering line mark
  605.  
  606.             exit when ch = LM;
  607.  
  608.             --  Otherwise store the character, note that we know that ch is
  609.             --  something other than LM or EOF. It could possibly be a page
  610.             --  mark if there is a stray page mark in the middle of a line,
  611.             --  but this is not an official page mark in any case, since
  612.             --  official page marks can only follow a line mark. The whole
  613.             --  page business is pretty much nonsense anyway, so we do not
  614.             --  want to waste time trying to make sense out of non-standard
  615.             --  page marks in the file! This means that the behavior of
  616.             --  Get_Line is different from repeated Get of a character, but
  617.             --  that's too bad. We only promise that page numbers etc make
  618.             --  sense if the file is formatted in a standard manner.
  619.  
  620.             --  Note: we do not adjust the column number because it is quicker
  621.             --  to adjust it once at the end of the operation than incrementing
  622.             --  it each time around the loop.
  623.  
  624.             Last := Last + 1;
  625.             Item (Last) := Character'Val (ch);
  626.  
  627.             --  All done if the string is full, this is the case in which
  628.             --  we do not skip the following line mark. We need to adjust
  629.             --  the column number in this case.
  630.  
  631.             if Last = Item'Last then
  632.                File.Col := File.Col + Count (Item'Length);
  633.                return;
  634.             end if;
  635.  
  636.             --  Otherwise read next character. We also exit from the loop if
  637.             --  we read an end of file. This is the case where the last line
  638.             --  is not terminated with a line mark, and we consider that there
  639.             --  is an implied line mark in this case (this is a non-standard
  640.             --  file, but it is nice to treat it reasonably).
  641.  
  642.             ch := Getc (File);
  643.             exit when ch = EOF;
  644.          end loop;
  645.       end if;
  646.  
  647.       --  We have skipped past, but not stored, a line mark. Skip following
  648.       --  page mark if one follows, but do not do this for a non-regular
  649.       --  file (since otherwise we get annoying wait for an extra character)
  650.  
  651.       File.Line := File.Line + 1;
  652.       File.Col := 1;
  653.  
  654.       if File.Before_LM_PM then
  655.          File.Line := 1;
  656.          File.Before_LM_PM := False;
  657.          File.Page := File.Page + 1;
  658.  
  659.       elsif File.Is_Regular_File then
  660.          ch := Getc (File);
  661.  
  662.          if ch = PM and then File.Is_Regular_File then
  663.             File.Line := 1;
  664.             File.Page := File.Page + 1;
  665.          else
  666.             Ungetc (ch, File);
  667.          end if;
  668.       end if;
  669.    end Get_Line;
  670.  
  671.    procedure Get_Line
  672.      (Item : out String;
  673.       Last : out Natural)
  674.    is
  675.    begin
  676.       Get_Line (Current_In, Item, Last);
  677.    end Get_Line;
  678.  
  679.    -------------
  680.    -- Is_Open --
  681.    -------------
  682.  
  683.    function Is_Open (File : in File_Type) return Boolean is
  684.    begin
  685.       return FIO.Is_Open (AP (File));
  686.    end Is_Open;
  687.  
  688.    ----------
  689.    -- Line --
  690.    ----------
  691.  
  692.    --  Note: we assume that it is impossible in practice for the line
  693.    --  to exceed the value of Count'Last, i.e. no check is required for
  694.    --  overflow raising layout error.
  695.  
  696.    function Line (File : in File_Type) return Positive_Count is
  697.    begin
  698.       FIO.Check_File_Open (AP (File));
  699.       return File.Line;
  700.    end Line;
  701.  
  702.    function Line return Positive_Count is
  703.    begin
  704.       return Line (Current_Out);
  705.    end Line;
  706.  
  707.    -----------------
  708.    -- Line_Length --
  709.    -----------------
  710.  
  711.    function Line_Length (File : in File_Type) return Count is
  712.    begin
  713.       FIO.Check_Write_Status (AP (File));
  714.       return File.Line_Length;
  715.    end Line_Length;
  716.  
  717.    function Line_Length return Count is
  718.    begin
  719.       return Line_Length (Current_Out);
  720.    end Line_Length;
  721.  
  722.    ----------------
  723.    -- Look_Ahead --
  724.    ----------------
  725.  
  726.    procedure Look_Ahead
  727.      (File        : in File_Type;
  728.       Item        : out Character;
  729.       End_Of_Line : out Boolean)
  730.    is
  731.       ch : int;
  732.  
  733.    begin
  734.       FIO.Check_Read_Status (AP (File));
  735.  
  736.       if File.Before_LM then
  737.          End_Of_Line := True;
  738.          Item := Ascii.NUL;
  739.  
  740.       else
  741.          ch := Nextc (File);
  742.  
  743.          if ch = LM
  744.            or else ch = EOF
  745.            or else (ch = PM and then File.Is_Regular_File)
  746.          then
  747.             End_Of_Line := True;
  748.             Item := Ascii.NUL;
  749.          else
  750.             End_Of_Line := False;
  751.             Item := Character'Val (ch);
  752.          end if;
  753.       end if;
  754.    end Look_Ahead;
  755.  
  756.    procedure Look_Ahead
  757.      (Item        : out Character;
  758.       End_Of_Line : out Boolean)
  759.    is
  760.    begin
  761.       Look_Ahead (Standard_In, Item, End_Of_Line);
  762.    end Look_Ahead;
  763.  
  764.    ----------
  765.    -- Mode --
  766.    ----------
  767.  
  768.    function Mode (File : in File_Type) return File_Mode is
  769.    begin
  770.       return To_TIO (FIO.Mode (AP (File)));
  771.    end Mode;
  772.  
  773.    ----------
  774.    -- Name --
  775.    ----------
  776.  
  777.    function Name (File : in File_Type) return String is
  778.    begin
  779.       return FIO.Name (AP (File));
  780.    end Name;
  781.  
  782.    --------------
  783.    -- New_Line --
  784.    --------------
  785.  
  786.    procedure New_Line
  787.      (File    : in File_Type;
  788.       Spacing : in Positive_Count := 1)
  789.    is
  790.    begin
  791.       --  Raise Constraint_Error if out of range value. The reason for this
  792.       --  explicit test is that we don't want junk values around, even if
  793.       --  checks are off in the caller.
  794.  
  795.       if Spacing not in Positive_Count then
  796.          raise Constraint_Error;
  797.       end if;
  798.  
  799.       FIO.Check_Write_Status (AP (File));
  800.  
  801.       for K in 1 .. Spacing loop
  802.          Putc (LM, File);
  803.          File.Line := File.Line + 1;
  804.  
  805.          if File.Page_Length /= 0
  806.            and then File.Line > File.Page_Length
  807.          then
  808.             Putc (PM, File);
  809.             File.Line := 1;
  810.             File.Page := File.Page + 1;
  811.          end if;
  812.       end loop;
  813.  
  814.       File.Col := 1;
  815.    end New_Line;
  816.  
  817.    procedure New_Line (Spacing : in Positive_Count := 1) is
  818.    begin
  819.       New_Line (Current_Out, Spacing);
  820.    end New_Line;
  821.  
  822.    --------------
  823.    -- New_Page --
  824.    --------------
  825.  
  826.    procedure New_Page (File : in File_Type) is
  827.    begin
  828.       FIO.Check_Write_Status (AP (File));
  829.  
  830.       if File.Col /= 1 or else File.Line = 1 then
  831.          Putc (LM, File);
  832.       end if;
  833.  
  834.       Putc (PM, File);
  835.       File.Page := File.Page + 1;
  836.       File.Line := 1;
  837.       File.Col := 1;
  838.    end New_Page;
  839.  
  840.    procedure New_Page is
  841.    begin
  842.       New_Page (Current_Out);
  843.    end New_Page;
  844.  
  845.    -----------
  846.    -- Nextc --
  847.    -----------
  848.  
  849.    function Nextc (File : File_Type) return int is
  850.       ch : int;
  851.  
  852.    begin
  853.       ch := fgetc (File.Stream);
  854.  
  855.       if ch = EOF then
  856.          if ferror (File.Stream) /= 0 then
  857.             raise Device_Error;
  858.          end if;
  859.  
  860.       else
  861.          if ungetc (ch, File.Stream) = EOF then
  862.             raise Device_Error;
  863.          end if;
  864.       end if;
  865.  
  866.       return ch;
  867.    end Nextc;
  868.  
  869.    ----------
  870.    -- Open --
  871.    ----------
  872.  
  873.    procedure Open
  874.      (File : in out File_Type;
  875.       Mode : in File_Mode;
  876.       Name : in String;
  877.       Form : in String := "")
  878.    is
  879.       File_Control_Block : Text_AFCB;
  880.  
  881.    begin
  882.       FIO.Open (File_Ptr  => AP (File),
  883.                 Dummy_FCB => File_Control_Block,
  884.                 Mode      => To_FCB (Mode),
  885.                 Name      => Name,
  886.                 Form      => Form,
  887.                 Amethod   => 'T',
  888.                 Creat     => False,
  889.                 Text      => True);
  890.    end Open;
  891.  
  892.    ----------
  893.    -- Page --
  894.    ----------
  895.  
  896.    --  Note: we assume that it is impossible in practice for the page
  897.    --  to exceed the value of Count'Last, i.e. no check is required for
  898.    --  overflow raising layout error.
  899.  
  900.    function Page (File : in File_Type) return Positive_Count is
  901.    begin
  902.       FIO.Check_File_Open (AP (File));
  903.       return File.Page;
  904.    end Page;
  905.  
  906.    function Page return Positive_Count is
  907.    begin
  908.       return Page (Current_Out);
  909.    end Page;
  910.  
  911.    -----------------
  912.    -- Page_Length --
  913.    -----------------
  914.  
  915.    function Page_Length (File : in File_Type) return Count is
  916.    begin
  917.       FIO.Check_Write_Status (AP (File));
  918.       return File.Page_Length;
  919.    end Page_Length;
  920.  
  921.    function Page_Length return Count is
  922.    begin
  923.       return Page_Length (Current_Out);
  924.    end Page_Length;
  925.  
  926.    ---------
  927.    -- Put --
  928.    ---------
  929.  
  930.    procedure Put
  931.      (File : in File_Type;
  932.       Item : in Character)
  933.    is
  934.    begin
  935.       FIO.Check_Write_Status (AP (File));
  936.  
  937.       if File.Line_Length /= 0 and then File.Col > File.Line_Length then
  938.          New_Line (File);
  939.       end if;
  940.  
  941.       if fputc (Character'Pos (Item), File.Stream) = EOF then
  942.          raise Device_Error;
  943.       end if;
  944.  
  945.       File.Col := File.Col + 1;
  946.    end Put;
  947.  
  948.    procedure Put (Item : in Character) is
  949.    begin
  950.       FIO.Check_Write_Status (AP (Current_Out));
  951.  
  952.       if Current_Out.Line_Length /= 0
  953.         and then Current_Out.Col > Current_Out.Line_Length
  954.       then
  955.          New_Line (Current_Out);
  956.       end if;
  957.  
  958.       if fputc (Character'Pos (Item), Current_Out.Stream) = EOF then
  959.          raise Device_Error;
  960.       end if;
  961.  
  962.       Current_Out.Col := Current_Out.Col + 1;
  963.    end Put;
  964.  
  965.    ---------
  966.    -- Put --
  967.    ---------
  968.  
  969.    procedure Put
  970.      (File : in File_Type;
  971.       Item : in String)
  972.    is
  973.    begin
  974.       FIO.Check_Write_Status (AP (File));
  975.  
  976.       --  If we have bounded lines, then do things character by
  977.       --  character (this seems a rare case anyway!)
  978.  
  979.       if File.Line_Length /= 0 then
  980.          for J in Item'Range loop
  981.             Put (File, Item (J));
  982.          end loop;
  983.  
  984.       --  Otherwise we can output the entire string at once. Note that if
  985.       --  there are LF or FF characters in the string, we do not bother to
  986.       --  count them as line or page terminators.
  987.  
  988.       else
  989.          FIO.Write_Buf (AP (File), Item'Address, Item'Length);
  990.          File.Col := File.Col + Item'Length;
  991.       end if;
  992.    end Put;
  993.  
  994.    procedure Put (Item : in String) is
  995.    begin
  996.       Put (Current_Out, Item);
  997.    end Put;
  998.  
  999.    --------------
  1000.    -- Put_Line --
  1001.    --------------
  1002.  
  1003.    procedure Put_Line
  1004.      (File : in File_Type;
  1005.       Item : in String)
  1006.    is
  1007.    begin
  1008.       Put (File, Item);
  1009.       New_Line (File);
  1010.    end Put_Line;
  1011.  
  1012.    procedure Put_Line (Item : in String) is
  1013.    begin
  1014.       Put (Current_Out, Item);
  1015.       New_Line (Current_Out);
  1016.    end Put_Line;
  1017.  
  1018.    ----------
  1019.    -- Putc --
  1020.    ----------
  1021.  
  1022.    procedure Putc (ch : int; File : File_Type) is
  1023.    begin
  1024.       if fputc (ch, File.Stream) = EOF then
  1025.          raise Device_Error;
  1026.       end if;
  1027.    end Putc;
  1028.  
  1029.    ----------
  1030.    -- Read --
  1031.    ----------
  1032.  
  1033.    --  This is the primitive Stream Read routine, used when a Text_IO file
  1034.    --  is treated directly as a stream using Text_IO.Streams.Stream.
  1035.  
  1036.    procedure Read
  1037.      (File : in out Text_AFCB;
  1038.       Item : out Stream_Element_Array;
  1039.       Last : out Stream_Element_Offset)
  1040.    is
  1041.    begin
  1042.       if File.Mode /= FCB.In_File then
  1043.          raise Mode_Error;
  1044.       end if;
  1045.  
  1046.       --  Now we do the read. Since this is a text file, it is normally in
  1047.       --  text mode, but stream data must be read in binary mode, so we
  1048.       --  temporarily set binary mode for the read, resetting it after.
  1049.       --  These calls have no effect in a system (like Unix) where there is
  1050.       --  no distinction between text and binary files.
  1051.  
  1052.       set_binary_mode (fileno (File.Stream));
  1053.  
  1054.       Last :=
  1055.         Item'First +
  1056.         Stream_Element_Offset
  1057.           (fread (Item'Address, 1, Item'Length, File.Stream)) - 1;
  1058.  
  1059.       if Last < Item'Last then
  1060.          if ferror (File.Stream) /= 0 then
  1061.             raise Device_Error;
  1062.          end if;
  1063.       end if;
  1064.  
  1065.       set_text_mode (fileno (File.Stream));
  1066.    end Read;
  1067.  
  1068.    -----------
  1069.    -- Reset --
  1070.    -----------
  1071.  
  1072.    procedure Reset
  1073.      (File : in out File_Type;
  1074.       Mode : in File_Mode)
  1075.    is
  1076.    begin
  1077.       --  Don't allow change of mode for current file (RM A.10.2(5))
  1078.  
  1079.       if (File = Current_In or else
  1080.           File = Current_Out  or else
  1081.           File = Current_Error)
  1082.         and then To_FCB (Mode) /= File.Mode
  1083.       then
  1084.          raise Mode_Error;
  1085.       end if;
  1086.  
  1087.       Terminate_Line (File);
  1088.       FIO.Reset (AP (File), To_FCB (Mode));
  1089.       File.Page := 1;
  1090.       File.Line := 1;
  1091.       File.Col  := 1;
  1092.       File.Line_Length := 0;
  1093.       File.Page_Length := 0;
  1094.       File.Before_LM := False;
  1095.       File.Before_LM_PM := False;
  1096.    end Reset;
  1097.  
  1098.    procedure Reset (File : in out File_Type) is
  1099.    begin
  1100.       Terminate_Line (File);
  1101.       FIO.Reset (AP (File));
  1102.       File.Page := 1;
  1103.       File.Line := 1;
  1104.       File.Col  := 1;
  1105.       File.Line_Length := 0;
  1106.       File.Page_Length := 0;
  1107.       File.Before_LM := False;
  1108.       File.Before_LM_PM := False;
  1109.    end Reset;
  1110.  
  1111.    -------------
  1112.    -- Set_Col --
  1113.    -------------
  1114.  
  1115.    procedure Set_Col
  1116.      (File : in File_Type;
  1117.       To   : in Positive_Count)
  1118.    is
  1119.       ch : int;
  1120.  
  1121.    begin
  1122.       --  Raise Constraint_Error if out of range value. The reason for this
  1123.       --  explicit test is that we don't want junk values around, even if
  1124.       --  checks are off in the caller.
  1125.  
  1126.       if To not in Positive_Count then
  1127.          raise Constraint_Error;
  1128.       end if;
  1129.  
  1130.       FIO.Check_File_Open (AP (File));
  1131.  
  1132.       if To = File.Col then
  1133.          return;
  1134.       end if;
  1135.  
  1136.       if Mode (File) >= Out_File then
  1137.          if File.Line_Length /= 0 and then To > File.Line_Length then
  1138.             raise Layout_Error;
  1139.          end if;
  1140.  
  1141.          if To < File.Col then
  1142.             New_Line (File);
  1143.          end if;
  1144.  
  1145.          while File.Col < To loop
  1146.             Put (File, ' ');
  1147.          end loop;
  1148.  
  1149.       else
  1150.          loop
  1151.             ch := Getc (File);
  1152.  
  1153.             if ch = EOF then
  1154.                raise End_Error;
  1155.  
  1156.             elsif ch = LM then
  1157.                File.Line := File.Line + 1;
  1158.                File.Col := 1;
  1159.  
  1160.             elsif ch = PM and then File.Is_Regular_File then
  1161.                File.Page := File.Page + 1;
  1162.                File.Line := 1;
  1163.                File.Col := 1;
  1164.  
  1165.             elsif To = File.Col then
  1166.                Ungetc (ch, File);
  1167.                return;
  1168.  
  1169.             else
  1170.                File.Col := File.Col + 1;
  1171.             end if;
  1172.          end loop;
  1173.       end if;
  1174.    end Set_Col;
  1175.  
  1176.    procedure Set_Col (To : in Positive_Count) is
  1177.    begin
  1178.       Set_Col (Current_Out, To);
  1179.    end Set_Col;
  1180.  
  1181.    ---------------
  1182.    -- Set_Error --
  1183.    ---------------
  1184.  
  1185.    procedure Set_Error (File : in File_Type) is
  1186.    begin
  1187.       FIO.Check_Write_Status (AP (File));
  1188.       Current_Err := File;
  1189.    end Set_Error;
  1190.  
  1191.    ---------------
  1192.    -- Set_Input --
  1193.    ---------------
  1194.  
  1195.    procedure Set_Input (File : in File_Type) is
  1196.    begin
  1197.       FIO.Check_Read_Status (AP (File));
  1198.       Current_In := File;
  1199.    end Set_Input;
  1200.  
  1201.    --------------
  1202.    -- Set_Line --
  1203.    --------------
  1204.  
  1205.    procedure Set_Line
  1206.      (File : in File_Type;
  1207.       To   : in Positive_Count)
  1208.    is
  1209.    begin
  1210.       --  Raise Constraint_Error if out of range value. The reason for this
  1211.       --  explicit test is that we don't want junk values around, even if
  1212.       --  checks are off in the caller.
  1213.  
  1214.       if To not in Positive_Count then
  1215.          raise Constraint_Error;
  1216.       end if;
  1217.  
  1218.       FIO.Check_File_Open (AP (File));
  1219.  
  1220.       if To = File.Line then
  1221.          return;
  1222.       end if;
  1223.  
  1224.       if Mode (File) >= Out_File then
  1225.          if File.Page_Length /= 0 and then To > File.Page_Length then
  1226.             raise Layout_Error;
  1227.          end if;
  1228.  
  1229.          if To < File.Line then
  1230.             New_Page (File);
  1231.          end if;
  1232.  
  1233.          while File.Line < To loop
  1234.             New_Line (File);
  1235.          end loop;
  1236.  
  1237.       else
  1238.          while To /= File.Line loop
  1239.             Skip_Line (File);
  1240.          end loop;
  1241.       end if;
  1242.    end Set_Line;
  1243.  
  1244.    procedure Set_Line (To : in Positive_Count) is
  1245.    begin
  1246.       Set_Line (Current_Out, To);
  1247.    end Set_Line;
  1248.  
  1249.    ---------------------
  1250.    -- Set_Line_Length --
  1251.    ---------------------
  1252.  
  1253.    procedure Set_Line_Length (File : in File_Type; To : in Count) is
  1254.    begin
  1255.       --  Raise Constraint_Error if out of range value. The reason for this
  1256.       --  explicit test is that we don't want junk values around, even if
  1257.       --  checks are off in the caller.
  1258.  
  1259.       if To not in Count then
  1260.          raise Constraint_Error;
  1261.       end if;
  1262.  
  1263.       FIO.Check_Write_Status (AP (File));
  1264.       File.Line_Length := To;
  1265.    end Set_Line_Length;
  1266.  
  1267.    procedure Set_Line_Length (To : in Count) is
  1268.    begin
  1269.       Set_Line_Length (Current_Out, To);
  1270.    end Set_Line_Length;
  1271.  
  1272.    ----------------
  1273.    -- Set_Output --
  1274.    ----------------
  1275.  
  1276.    procedure Set_Output (File : in File_Type) is
  1277.    begin
  1278.       FIO.Check_Write_Status (AP (File));
  1279.       Current_Out := File;
  1280.    end Set_Output;
  1281.  
  1282.    ---------------------
  1283.    -- Set_Page_Length --
  1284.    ---------------------
  1285.  
  1286.    procedure Set_Page_Length (File : in File_Type; To : in Count) is
  1287.    begin
  1288.       --  Raise Constraint_Error if out of range value. The reason for this
  1289.       --  explicit test is that we don't want junk values around, even if
  1290.       --  checks are off in the caller.
  1291.  
  1292.       if To not in Count then
  1293.          raise Constraint_Error;
  1294.       end if;
  1295.  
  1296.       FIO.Check_Write_Status (AP (File));
  1297.       File.Page_Length := To;
  1298.    end Set_Page_Length;
  1299.  
  1300.    procedure Set_Page_Length (To : in Count) is
  1301.    begin
  1302.       Set_Page_Length (Current_Out, To);
  1303.    end Set_Page_Length;
  1304.  
  1305.    ---------------
  1306.    -- Skip_Line --
  1307.    ---------------
  1308.  
  1309.    procedure Skip_Line
  1310.      (File    : in File_Type;
  1311.       Spacing : in Positive_Count := 1)
  1312.    is
  1313.       ch : int;
  1314.  
  1315.    begin
  1316.       --  Raise Constraint_Error if out of range value. The reason for this
  1317.       --  explicit test is that we don't want junk values around, even if
  1318.       --  checks are off in the caller.
  1319.  
  1320.       if Spacing not in Positive_Count then
  1321.          raise Constraint_Error;
  1322.       end if;
  1323.  
  1324.       FIO.Check_Read_Status (AP (File));
  1325.  
  1326.       for L in 1 .. Spacing loop
  1327.          if File.Before_LM then
  1328.             File.Before_LM := False;
  1329.             File.Before_LM_PM := False;
  1330.  
  1331.          else
  1332.             ch := Getc (File);
  1333.  
  1334.             --  If at end of file now, then immediately raise End_Error. Note
  1335.             --  that we can never be positioned between a line mark and a page
  1336.             --  mark, so if we are at the end of file, we cannot logically be
  1337.             --  before the implicit page mark that is at the end of the file.
  1338.  
  1339.             --  For the same reason, we do not need an explicit check for a
  1340.             --  page mark. If there is a FF in the middle of a line, the file
  1341.             --  is not in canonical format and we do not care about the page
  1342.             --  numbers for files other than ones in canonical format.
  1343.  
  1344.             if ch = EOF then
  1345.                raise End_Error;
  1346.             end if;
  1347.  
  1348.             --  If not at end of file, then loop till we get to an LM or EOF.
  1349.             --  The latter case happens only in non-canonical files where the
  1350.             --  last line is not terminated by LM, but we don't want to blow
  1351.             --  up for such files, so we assume an implicit LM in this case.
  1352.  
  1353.             loop
  1354.                exit when ch = LM or ch = EOF;
  1355.                ch := Getc (File);
  1356.             end loop;
  1357.          end if;
  1358.  
  1359.          --  We have got past a line mark, now, for a regular file only,
  1360.          --  see if a page mark immediately follows this line mark and
  1361.          --  if so, skip past the page mark as well. We do not do this
  1362.          --  for non-regular files, since it would cause an undesirable
  1363.          --  wait for an additional character.
  1364.  
  1365.          File.Col := 1;
  1366.          File.Line := File.Line + 1;
  1367.  
  1368.          if File.Before_LM_PM then
  1369.             File.Page := File.Page + 1;
  1370.             File.Line := 1;
  1371.             File.Before_LM_PM := False;
  1372.  
  1373.          elsif File.Is_Regular_File then
  1374.             ch := Getc (File);
  1375.  
  1376.             --  Page mark can be explicit, or implied at the end of the file
  1377.  
  1378.             if (ch = PM or else ch = EOF)
  1379.               and then File.Is_Regular_File
  1380.             then
  1381.                File.Page := File.Page + 1;
  1382.                File.Line := 1;
  1383.             else
  1384.                Ungetc (ch, File);
  1385.             end if;
  1386.          end if;
  1387.  
  1388.       end loop;
  1389.    end Skip_Line;
  1390.  
  1391.    procedure Skip_Line (Spacing : in Positive_Count := 1) is
  1392.    begin
  1393.       Skip_Line (Current_In, Spacing);
  1394.    end Skip_Line;
  1395.  
  1396.    ---------------
  1397.    -- Skip_Page --
  1398.    ---------------
  1399.  
  1400.    procedure Skip_Page (File : in File_Type) is
  1401.       ch : int;
  1402.  
  1403.    begin
  1404.       FIO.Check_Read_Status (AP (File));
  1405.  
  1406.       --  If at page mark already, just skip it
  1407.  
  1408.       if File.Before_LM_PM then
  1409.          File.Before_LM := False;
  1410.          File.Before_LM_PM := False;
  1411.          File.Page := File.Page + 1;
  1412.          File.Line := 1;
  1413.          File.Col  := 1;
  1414.          return;
  1415.       end if;
  1416.  
  1417.       --  This is a bit tricky, if we are logically before an LM then
  1418.       --  it is not an error if we are at an end of file now, since we
  1419.       --  are not really at it.
  1420.  
  1421.       if File.Before_LM then
  1422.          File.Before_LM := False;
  1423.          File.Before_LM_PM := False;
  1424.          ch := Getc (File);
  1425.  
  1426.       --  Otherwise we do raise End_Error if we are at the end of file now
  1427.  
  1428.       else
  1429.          ch := Getc (File);
  1430.  
  1431.          if ch = EOF then
  1432.             raise End_Error;
  1433.          end if;
  1434.       end if;
  1435.  
  1436.       --  Now we can just rumble along to the next page mark, or to the
  1437.       --  end of file, if that comes first. The latter case happens when
  1438.       --  the page mark is implied at the end of file.
  1439.  
  1440.       loop
  1441.          exit when ch = EOF
  1442.            or else (ch = PM and then File.Is_Regular_File);
  1443.          ch := Getc (File);
  1444.       end loop;
  1445.  
  1446.       File.Page := File.Page + 1;
  1447.       File.Line := 1;
  1448.       File.Col  := 1;
  1449.    end Skip_Page;
  1450.  
  1451.    procedure Skip_Page is
  1452.    begin
  1453.       Skip_Page (Current_In);
  1454.    end Skip_Page;
  1455.  
  1456.    --------------------
  1457.    -- Standard_Error --
  1458.    --------------------
  1459.  
  1460.    function Standard_Error return File_Type is
  1461.    begin
  1462.       return Standard_Err;
  1463.    end Standard_Error;
  1464.  
  1465.    function Standard_Error return File_Access is
  1466.    begin
  1467.       return Standard_Err'Access;
  1468.    end Standard_Error;
  1469.  
  1470.    --------------------
  1471.    -- Standard_Input --
  1472.    --------------------
  1473.  
  1474.    function Standard_Input return File_Type is
  1475.    begin
  1476.       return Standard_In;
  1477.    end Standard_Input;
  1478.  
  1479.    function Standard_Input return File_Access is
  1480.    begin
  1481.       return Standard_In'Access;
  1482.    end Standard_Input;
  1483.  
  1484.    ---------------------
  1485.    -- Standard_Output --
  1486.    ---------------------
  1487.  
  1488.    function Standard_Output return File_Type is
  1489.    begin
  1490.       return Standard_Out;
  1491.    end Standard_Output;
  1492.  
  1493.    function Standard_Output return File_Access is
  1494.    begin
  1495.       return Standard_Out'Access;
  1496.    end Standard_Output;
  1497.  
  1498.    --------------------
  1499.    -- Terminate_Line --
  1500.    --------------------
  1501.  
  1502.    procedure Terminate_Line (File : File_Type) is
  1503.    begin
  1504.       FIO.Check_File_Open (AP (File));
  1505.  
  1506.       if Mode (File) /= In_File and then File.Col /= 1 then
  1507.          New_Line (File);
  1508.       end if;
  1509.    end Terminate_Line;
  1510.  
  1511.    ------------
  1512.    -- Ungetc --
  1513.    ------------
  1514.  
  1515.    procedure Ungetc (ch : int; File : File_Type) is
  1516.    begin
  1517.       if ch /= EOF then
  1518.          if ungetc (ch, File.Stream) = EOF then
  1519.             raise Device_Error;
  1520.          end if;
  1521.       end if;
  1522.    end Ungetc;
  1523.  
  1524.    -----------
  1525.    -- Write --
  1526.    -----------
  1527.  
  1528.    --  This is the primitive Stream Write routine, used when a Text_IO file
  1529.    --  is treated directly as a stream using Text_IO.Streams.Stream.
  1530.  
  1531.    procedure Write
  1532.      (File : in out Text_AFCB;
  1533.       Item : in Stream_Element_Array)
  1534.    is
  1535.       Siz : constant size_t := Item'Length;
  1536.  
  1537.    begin
  1538.       if File.Mode = FCB.In_File then
  1539.          raise Mode_Error;
  1540.       end if;
  1541.  
  1542.       --  Now we do the write. Since this is a text file, it is normally in
  1543.       --  text mode, but stream data must be written in binary mode, so we
  1544.       --  temporarily set binary mode for the write, resetting it after.
  1545.       --  These calls have no effect in a system (like Unix) where there is
  1546.       --  no distinction between text and binary files.
  1547.  
  1548.       set_binary_mode (fileno (File.Stream));
  1549.  
  1550.       if fwrite (Item'Address, 1, Siz, File.Stream) /= Siz then
  1551.          raise Device_Error;
  1552.       end if;
  1553.  
  1554.       set_text_mode (fileno (File.Stream));
  1555.    end Write;
  1556.  
  1557. begin
  1558.    -------------------------------
  1559.    -- Initialize Standard Files --
  1560.    -------------------------------
  1561.  
  1562.    --  Note: the names in these files are bogus, and probably it would be
  1563.    --  better for these files to have no names, but the ACVC test insist!
  1564.    --  We use names that are bound to fail in open etc.
  1565.  
  1566.    Standard_In.Stream            := stdin;
  1567.    Standard_In.Name              := new String'("*stdin");
  1568.    Standard_In.Form              := Null_Str'Access;
  1569.    Standard_In.Mode              := FCB.In_File;
  1570.    Standard_In.Is_Regular_File   := is_regular_file (fileno (stdin)) /= 0;
  1571.    Standard_In.Is_Temporary_File := False;
  1572.    Standard_In.Is_System_File    := True;
  1573.    Standard_In.Is_Text_File      := True;
  1574.    Standard_In.Access_Method     := 'T';
  1575.  
  1576.    Standard_Out.Stream            := stdout;
  1577.    Standard_Out.Name              := new String'("*stdout");
  1578.    Standard_Out.Form              := Null_Str'Access;
  1579.    Standard_Out.Mode              := FCB.Out_File;
  1580.    Standard_Out.Is_Regular_File   := is_regular_file (fileno (stdout)) /= 0;
  1581.    Standard_Out.Is_Temporary_File := False;
  1582.    Standard_Out.Is_System_File    := True;
  1583.    Standard_Out.Is_Text_File      := True;
  1584.    Standard_Out.Access_Method     := 'T';
  1585.  
  1586.    Standard_Err.Stream            := stderr;
  1587.    Standard_Err.Name              := new String'("*stderr");
  1588.    Standard_Err.Form              := Null_Str'Access;
  1589.    Standard_Err.Mode              := FCB.Out_File;
  1590.    Standard_Err.Is_Regular_File   := is_regular_file (fileno (stderr)) /= 0;
  1591.    Standard_Err.Is_Temporary_File := False;
  1592.    Standard_Err.Is_System_File    := True;
  1593.    Standard_Err.Is_Text_File      := True;
  1594.    Standard_Err.Access_Method     := 'T';
  1595.  
  1596.    FIO.Chain_File (AP (Standard_In));
  1597.    FIO.Chain_File (AP (Standard_Out));
  1598.    FIO.Chain_File (AP (Standard_Err));
  1599.  
  1600. end Ada.Text_IO;
  1601.