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 / sprint.adb < prev    next >
Text File  |  1996-09-28  |  83KB  |  2,594 lines

  1. ------------------------------------------------------------------------------
  2. --                                                                          --
  3. --                         GNAT COMPILER COMPONENTS                         --
  4. --                                                                          --
  5. --                               S P R I N T                                --
  6. --                                                                          --
  7. --                                 B o d y                                  --
  8. --                                                                          --
  9. --                            $Revision: 1.143 $                            --
  10. --                                                                          --
  11. --        Copyright (c) 1992,1993,1994,1995 NYU, All Rights Reserved        --
  12. --                                                                          --
  13. -- GNAT is free software;  you can  redistribute it  and/or modify it under --
  14. -- terms of the  GNU General Public License as published  by the Free Soft- --
  15. -- ware  Foundation;  either version 2,  or (at your option) any later ver- --
  16. -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
  17. -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
  18. -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
  19. -- for  more details.  You should have  received  a copy of the GNU General --
  20. -- Public License  distributed with GNAT;  see file COPYING.  If not, write --
  21. -- to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. --
  22. --                                                                          --
  23. ------------------------------------------------------------------------------
  24.  
  25. with Atree;   use Atree;
  26. with Casing;  use Casing;
  27. with Debug;   use Debug;
  28. with Einfo;   use Einfo;
  29. with Itypes;  use Itypes;
  30. with Lib;     use Lib;
  31. with Namet;   use Namet;
  32. with Nlists;  use Nlists;
  33. with Output;  use Output;
  34. with Sinfo;   use Sinfo;
  35. with Snames;  use Snames;
  36. with Stand;   use Stand;
  37. with Stringt; use Stringt;
  38. with Uintp;   use Uintp;
  39. with Uname;   use Uname;
  40. with Urealp;  use Urealp;
  41.  
  42. package body Sprint is
  43.  
  44.    Indent : Int := 0;
  45.    --  Number of columns for current line output indentation
  46.  
  47.    Indent_Annull_Flag : Boolean := False;
  48.    --  Set True if subsequent Write_Indent call to be ignored, gets reset
  49.    --  by this call, so it is only active to suppress a single indent call.
  50.  
  51.    Dump_Original_Only : Boolean;
  52.    --  Set True if the -do (dump original tree) flag is set
  53.  
  54.    Dump_Generated_Only : Boolean;
  55.    --  Set True if the -dg (dump generated tree) flag is set
  56.  
  57.    Line_Limit : constant := 72;
  58.    --  Limit value for chopping long lines
  59.  
  60.    Freeze_Indent : Int := 0;
  61.    --  Keep track of freeze indent level (controls blank lines before
  62.    --  procedures within expression freeze actions)
  63.  
  64.    Pure_Ada : Boolean := False;
  65.    --  True if Sprint_Node_Pure_Ada was called
  66.  
  67.    -----------------------
  68.    --  Local Procedures --
  69.    -----------------------
  70.  
  71.    procedure Indent_Annull;
  72.    --  Causes following call to Write_Indent to be ignored. This is used when
  73.    --  a higher level node wants to stop a lower level node from starting a
  74.    --  new line, when it would otherwise be inclined to do so (e.g. the case
  75.    --  of an accept statement called from an accept alternative with a guard)
  76.  
  77.    procedure Indent_Begin;
  78.    --  Increase indentation level
  79.  
  80.    procedure Indent_End;
  81.    --  Decrease indentation level
  82.  
  83.    procedure Sprint_Bar_List (List : List_Id);
  84.    --  Print the given list with items separated by vertical bars
  85.  
  86.    procedure Sprint_Itypes (N : Node_Id);
  87.    --  Print the list of implicit types attached to N.
  88.  
  89.    procedure Sprint_Node_Actual (Node : Node_Id);
  90.    --  This routine prints its node argument. It is a lower level routine than
  91.    --  Sprint_Node, in that it does not bother about rewritten trees.
  92.  
  93.    procedure Write_Ekind (E : Entity_Id);
  94.    --  Write the String corresponding to the Ekind without "E_".
  95.  
  96.    procedure Write_Id (N : Node_Id);
  97.    --  Write Chars field of given node
  98.  
  99.    function Write_Identifiers (Node : Node_Id) return Boolean;
  100.    --  Handle node where the grammar has a list of defining identifiers, but
  101.    --  the tree has a separate declaration for each identifier. Handles the
  102.    --  printing of the defining identifier, and returns True if the type and
  103.    --  initialization information is to be printed, False if it is to be
  104.    --  skipped (the latter case happens when printing defining identifiers
  105.    --  other than the first in the original tree output case).
  106.  
  107.    procedure Write_Implicit_Def (E : Entity_Id);
  108.    --  Write the definition of the implicit type E according to its Ekind
  109.  
  110.    procedure Write_Indent;
  111.    --  Start a new line and write indentation spacing
  112.  
  113.    function Write_Indent_Identifiers (Node : Node_Id) return Boolean;
  114.    --  Like Write_Identifiers except that each new printed declaration
  115.    --  is at the start of a new line.
  116.  
  117.    procedure Write_Indent_Str (S : String);
  118.    --  Start a new line and write indent spacing followed by given string
  119.  
  120.    procedure Write_Name_With_Col_Check (N : Name_Id);
  121.    --  Write name (using Write_Name) with initial column check, and possible
  122.    --  initial Write_Indent (to get new line) if current line is too full.
  123.  
  124.    procedure Write_Operator_Symbol_With_Col_Check (N : Name_Id);
  125.    --  Write operator symbol that corresponds to the Name_Id, for example
  126.    --  Name_Op_Eq and "=", with initial column check, and possible initial
  127.    --  Write_Indent (to get new line) if current line is too full.
  128.  
  129.    procedure Write_Param_Specs (N : Node_Id);
  130.    --  Output parameter specifications for node (which is either a function
  131.    --  or procedure specification with a Parameter_Specifications field
  132.  
  133.    procedure Write_Rewrite_Str (S : String);
  134.    --  Writes out a string (typically containing { or }) for a node created
  135.    --  by rewriting the tree. Suppressed if Debug_Flag_G is set, since in this
  136.    --  case we don't specially mark nodes created by rewriting).
  137.  
  138.    procedure Write_Str_With_Col_Check (S : String);
  139.    --  Write string (using Write_Str) with initial column check, and possible
  140.    --  initial Write_Indent (to get new line) if current line is too full.
  141.  
  142.    procedure Write_Uint_With_Col_Check (U : Uint);
  143.    --  Write Uint (using UI_Write) with initial column check, and possible
  144.    --  initial Write_Indent (to get new line) if current line is too full.
  145.  
  146.    procedure Write_Ureal_With_Col_Check (U : Ureal);
  147.    --  Write Ureal (using same output format as UR_Write) with column checks
  148.    --  initial Write_Indent (to get new line) if current line is too full.
  149.  
  150.    -------------------
  151.    -- Indent_Annull --
  152.    -------------------
  153.  
  154.    procedure Indent_Annull is
  155.    begin
  156.       Indent_Annull_Flag := True;
  157.    end Indent_Annull;
  158.  
  159.    ------------------
  160.    -- Indent_Begin --
  161.    ------------------
  162.  
  163.    procedure Indent_Begin is
  164.    begin
  165.       Indent := Indent + 3;
  166.    end Indent_Begin;
  167.  
  168.    ----------------
  169.    -- Indent_End --
  170.    ----------------
  171.  
  172.    procedure Indent_End is
  173.    begin
  174.       Indent := Indent - 3;
  175.    end Indent_End;
  176.  
  177.    -----------------
  178.    -- Source_Dump --
  179.    -----------------
  180.  
  181.    procedure Source_Dump is
  182.       Max_Unit : Unit_Number_Type;
  183.  
  184.       procedure Underline;
  185.       --  Put underline under string we just printed
  186.  
  187.       procedure Underline is
  188.          Col : constant Int := Column;
  189.  
  190.       begin
  191.          Write_Eol;
  192.  
  193.          while Col > Column loop
  194.             Write_Char ('-');
  195.          end loop;
  196.  
  197.          Write_Eol;
  198.       end Underline;
  199.  
  200.    --  Start of processing for Tree_Dump.
  201.  
  202.    begin
  203.       Dump_Generated_Only := Debug_Flag_G;
  204.       Dump_Original_Only  := Debug_Flag_O;
  205.  
  206.       --  Note that we turn off the tree dump flags immediately, before
  207.       --  starting the dump. This avoids generating two copies of the dump
  208.       --  if an abort occurs after printing the dump, and more importantly,
  209.       --  avoids an infinite loop if an abort occurs during the dump.
  210.  
  211.       if Debug_Flag_Z then
  212.          Debug_Flag_Z := False;
  213.          Write_Eol;
  214.          Write_Eol;
  215.          Write_Str ("Source recreated from tree of Standard (spec)");
  216.          Underline;
  217.          Sprint_Node (Standard_Package_Node);
  218.          Write_Eol;
  219.          Write_Eol;
  220.       end if;
  221.  
  222.       if Debug_Flag_S or Debug_Flag_G or Debug_Flag_O then
  223.          Debug_Flag_G := False;
  224.          Debug_Flag_O := False;
  225.          Debug_Flag_S := False;
  226.  
  227.          if Debug_Flag_F then
  228.             Max_Unit := Last_Unit;
  229.          else
  230.             Max_Unit := Main_Unit;
  231.          end if;
  232.  
  233.          for U in Main_Unit .. Max_Unit loop
  234.             Write_Str ("Source recreated from tree for ");
  235.             Write_Unit_Name (Unit_Name (U));
  236.             Underline;
  237.             Sprint_Node (Cunit (U));
  238.             Write_Eol;
  239.             Write_Eol;
  240.          end loop;
  241.       end if;
  242.    end Source_Dump;
  243.  
  244.    ---------------------
  245.    -- Sprint_Bar_List --
  246.    ---------------------
  247.  
  248.    procedure Sprint_Bar_List (List : List_Id) is
  249.       Node : Node_Id;
  250.  
  251.    begin
  252.       if Is_Non_Empty_List (List) then
  253.          Node := First (List);
  254.  
  255.          loop
  256.             Sprint_Node (Node);
  257.             Node := Next (Node);
  258.             exit when Node = Empty;
  259.             Write_Str (" | ");
  260.          end loop;
  261.       end if;
  262.    end Sprint_Bar_List;
  263.  
  264.    -----------------------
  265.    -- Sprint_Comma_List --
  266.    -----------------------
  267.  
  268.    procedure Sprint_Comma_List (List : List_Id) is
  269.       Node : Node_Id;
  270.  
  271.    begin
  272.       if Is_Non_Empty_List (List) then
  273.          Node := First (List);
  274.  
  275.          loop
  276.             Sprint_Node (Node);
  277.             Node := Next (Node);
  278.             exit when Node = Empty;
  279.             Write_Str (", ");
  280.          end loop;
  281.       end if;
  282.    end Sprint_Comma_List;
  283.  
  284.    --------------------------
  285.    -- Sprint_Indented_List --
  286.    --------------------------
  287.  
  288.    procedure Sprint_Indented_List (List : List_Id) is
  289.    begin
  290.       Indent_Begin;
  291.       Sprint_Node_List (List);
  292.       Indent_End;
  293.    end Sprint_Indented_List;
  294.  
  295.    -------------------
  296.    -- Sprint_Itypes --
  297.    -------------------
  298.  
  299.    procedure Sprint_Itypes (N : Node_Id) is
  300.       Ityp : Entity_Id;
  301.  
  302.    begin
  303.       pragma Assert (not Pure_Ada);
  304.  
  305.       if Debug_Flag_J then
  306.          Write_Rewrite_Str ("{");
  307.  
  308.          Ityp := First_Itype (N);
  309.          while Present (Ityp) loop
  310.             Write_Indent;
  311.             Write_Str_With_Col_Check ("implicit ");
  312.             Write_Implicit_Def (Ityp);
  313.             Ityp := Next_Itype (Ityp);
  314.          end loop;
  315.  
  316.          Write_Rewrite_Str ("}");
  317.       end if;
  318.    end Sprint_Itypes;
  319.  
  320.    -----------------
  321.    -- Sprint_Node --
  322.    -----------------
  323.  
  324.    procedure Sprint_Node (Node : Node_Id) is
  325.    begin
  326.       if Is_Rewrite_Insertion (Node) then
  327.          if not Dump_Original_Only then
  328.             Write_Rewrite_Str ("{");
  329.             Sprint_Node_Actual (Node);
  330.             Write_Rewrite_Str ("}");
  331.          end if;
  332.  
  333.       elsif Is_Rewrite_Substitution (Node) then
  334.          if Dump_Generated_Only then
  335.             Sprint_Node_Actual (Node);
  336.          elsif Dump_Original_Only then
  337.             Sprint_Node_Actual (Original_Node (Node));
  338.          else
  339.             Sprint_Node_Actual (Original_Node (Node));
  340.             Write_Rewrite_Str ("{");
  341.             Sprint_Node_Actual (Node);
  342.             Write_Rewrite_Str ("}");
  343.          end if;
  344.  
  345.       else
  346.          Sprint_Node_Actual (Node);
  347.       end if;
  348.    end Sprint_Node;
  349.  
  350.    ------------------------
  351.    -- Sprint_Node_Actual --
  352.    ------------------------
  353.  
  354.    procedure Sprint_Node_Actual (Node : Node_Id)
  355.    is
  356.    begin
  357.       if Node = Empty then
  358.          return;
  359.       end if;
  360.  
  361.       for J in 1 .. Paren_Count (Node) loop
  362.          Write_Str_With_Col_Check ("(");
  363.       end loop;
  364.  
  365.       if not Dump_Original_Only
  366.         and then Nkind (Node) in N_Has_Itypes
  367.         and then Present (First_Itype (Node))
  368.       then
  369.          Sprint_Itypes (Node);
  370.       end if;
  371.  
  372.       case Nkind (Node) is
  373.  
  374.          when N_Abort_Statement =>
  375.             Write_Indent_Str ("abort ");
  376.             Sprint_Comma_List (Names (Node));
  377.             Write_Char (';');
  378.  
  379.          when N_Abortable_Part =>
  380.             Sprint_Indented_List (Statements (Node));
  381.  
  382.          when N_Abstract_Subprogram_Declaration =>
  383.             Write_Indent;
  384.             Sprint_Node (Specification (Node));
  385.             Write_Str_With_Col_Check (" is abstract;");
  386.  
  387.          when N_Accept_Alternative =>
  388.             if Present (Condition (Node)) then
  389.                Write_Indent;
  390.                Write_Str_With_Col_Check ("when ");
  391.                Sprint_Node (Condition (Node));
  392.                Write_Str (" => ");
  393.                Indent_Annull;
  394.             end if;
  395.  
  396.             Sprint_Node (Accept_Statement (Node));
  397.             Sprint_Node_List (Statements (Node));
  398.  
  399.          when N_Accept_Statement =>
  400.             Write_Indent_Str ("accept ");
  401.             Write_Id (Entry_Direct_Name (Node));
  402.  
  403.             if Present (Entry_Index (Node)) then
  404.                Write_Str_With_Col_Check (" (");
  405.                Sprint_Node (Entry_Index (Node));
  406.                Write_Char (')');
  407.             end if;
  408.  
  409.             Write_Param_Specs (Node);
  410.  
  411.             if Present (Handled_Statement_Sequence (Node)) then
  412.                Write_Str_With_Col_Check (" do");
  413.                Sprint_Node (Handled_Statement_Sequence (Node));
  414.                Write_Indent_Str ("end ");
  415.                Write_Id (Entry_Direct_Name (Node));
  416.             end if;
  417.  
  418.             Write_Char (';');
  419.  
  420.          when N_Access_Definition =>
  421.             Write_Str_With_Col_Check ("access ");
  422.             Sprint_Node (Subtype_Mark (Node));
  423.  
  424.          when N_Access_Function_Definition =>
  425.             Write_Str_With_Col_Check ("access ");
  426.  
  427.             if Protected_Present (Node) then
  428.                Write_Str_With_Col_Check ("protected ");
  429.             end if;
  430.  
  431.             Write_Str_With_Col_Check ("function");
  432.             Write_Param_Specs (Node);
  433.             Write_Str_With_Col_Check (" return ");
  434.             Sprint_Node (Subtype_Mark (Node));
  435.  
  436.          when N_Access_Procedure_Definition =>
  437.             Write_Str_With_Col_Check ("access ");
  438.  
  439.             if Protected_Present (Node) then
  440.                Write_Str_With_Col_Check ("protected ");
  441.             end if;
  442.  
  443.             Write_Str_With_Col_Check ("procedure");
  444.             Write_Param_Specs (Node);
  445.  
  446.          when N_Access_To_Object_Definition =>
  447.             Write_Str_With_Col_Check ("access ");
  448.  
  449.             if All_Present (Node) then
  450.                Write_Str_With_Col_Check ("all ");
  451.             elsif Constant_Present (Node) then
  452.                Write_Str_With_Col_Check ("constant ");
  453.             end if;
  454.  
  455.             Sprint_Node (Subtype_Indication (Node));
  456.  
  457.          when N_And_Then =>
  458.             Sprint_Node (Left_Opnd (Node));
  459.             Write_Str (" and then ");
  460.             Sprint_Node (Right_Opnd (Node));
  461.  
  462.          when N_At_Clause =>
  463.             Write_Indent_Str ("for ");
  464.             Write_Id (Identifier (Node));
  465.             Write_Str_With_Col_Check (" use at ");
  466.             Sprint_Node (Expression (Node));
  467.             Write_Char (';');
  468.  
  469.          when N_Aggregate =>
  470.             if Null_Record_Present (Node) then
  471.                Write_Str_With_Col_Check ("(null record)");
  472.  
  473.             else
  474.                Write_Str_With_Col_Check ("(");
  475.  
  476.                if Present (Expressions (Node)) then
  477.                   Sprint_Comma_List (Expressions (Node));
  478.  
  479.                   if Present (Component_Associations (Node)) then
  480.                      Write_Str (", ");
  481.                   end if;
  482.                end if;
  483.  
  484.                if Present (Component_Associations (Node)) then
  485.                   Sprint_Comma_List (Component_Associations (Node));
  486.                end if;
  487.  
  488.                Write_Char (')');
  489.             end if;
  490.  
  491.          when N_Mod_Clause =>
  492.             Write_Str_With_Col_Check ("at mod ");
  493.             Sprint_Node (Expression (Node));
  494.  
  495.          when N_Allocator =>
  496.             Write_Str_With_Col_Check ("new ");
  497.             Sprint_Node (Expression (Node));
  498.  
  499.             if Present (Storage_Pool (Node)) then
  500.                pragma Assert (not Pure_Ada);
  501.                Write_Str_With_Col_Check ("[storage_pool = ");
  502.                Sprint_Node (Storage_Pool (Node));
  503.                Write_Char (']');
  504.             end if;
  505.  
  506.          when N_Assignment_Statement =>
  507.             Write_Indent;
  508.             Sprint_Node (Name (Node));
  509.             Write_Str (" := ");
  510.             Sprint_Node (Expression (Node));
  511.             Write_Char (';');
  512.  
  513.          when N_Asynchronous_Select =>
  514.             Write_Indent_Str ("select");
  515.             Indent_Begin;
  516.             Sprint_Node (Triggering_Alternative (Node));
  517.             Indent_End;
  518.             Write_Indent_Str ("then abort");
  519.             Sprint_Node (Abortable_Part (Node));
  520.             Write_Indent_Str ("end select;");
  521.  
  522.          when N_Attribute_Definition_Clause =>
  523.             Write_Indent_Str ("for ");
  524.             Sprint_Node (Name (Node));
  525.             Write_Char (''');
  526.             Write_Name_With_Col_Check (Chars (Node));
  527.             Write_Str_With_Col_Check (" use ");
  528.             Sprint_Node (Expression (Node));
  529.             Write_Char (';');
  530.  
  531.          when N_Attribute_Reference =>
  532.             Sprint_Node (Prefix (Node));
  533.             Write_Char (''');
  534.             Write_Name_With_Col_Check (Attribute_Name (Node));
  535.             Sprint_Paren_Comma_List (Expressions (Node));
  536.  
  537.          when N_Block_Statement =>
  538.             Write_Indent;
  539.  
  540.             if Present (Identifier (Node))
  541.               and then (not Has_Created_Identifier (Node)
  542.                           or else not Dump_Original_Only)
  543.             then
  544.                Write_Rewrite_Str ("{");
  545.                Write_Id (Identifier (Node));
  546.                Write_Str (" : ");
  547.                Write_Rewrite_Str ("}");
  548.             end if;
  549.  
  550.             if Present (Declarations (Node)) then
  551.                Write_Str_With_Col_Check ("declare");
  552.                Sprint_Indented_List (Declarations (Node));
  553.                Write_Indent;
  554.             end if;
  555.  
  556.             Write_Str_With_Col_Check ("begin");
  557.             Sprint_Node (Handled_Statement_Sequence (Node));
  558.             Write_Indent_Str ("end");
  559.  
  560.             if Present (Identifier (Node))
  561.               and then (not Has_Created_Identifier (Node)
  562.                           or else not Dump_Original_Only)
  563.             then
  564.                Write_Rewrite_Str ("{");
  565.                Write_Char (' ');
  566.                Write_Id (Identifier (Node));
  567.                Write_Rewrite_Str ("}");
  568.             end if;
  569.  
  570.             Write_Char (';');
  571.  
  572.          when N_Case_Statement =>
  573.             Write_Indent_Str ("case ");
  574.             Sprint_Node (Expression (Node));
  575.             Write_Str (" is");
  576.             Sprint_Indented_List (Alternatives (Node));
  577.             Write_Indent_Str ("end case;");
  578.  
  579.          when N_Case_Statement_Alternative =>
  580.             Write_Indent_Str ("when ");
  581.             Sprint_Bar_List (Discrete_Choices (Node));
  582.             Write_Str (" =>");
  583.             Sprint_Indented_List (Statements (Node));
  584.  
  585.          when N_Character_Literal =>
  586.             if Column > 70 then
  587.                Write_Indent_Str ("  ");
  588.             end if;
  589.  
  590.             Write_Char (''');
  591.             Write_Char_Code (Char_Literal_Value (Node));
  592.             Write_Char (''');
  593.  
  594.          when N_Code_Statement =>
  595.             Write_Indent;
  596.             Sprint_Node (Expression (Node));
  597.             Write_Char (';');
  598.  
  599.          when N_Compilation_Unit =>
  600.             Sprint_Node_List (Context_Items (Node));
  601.  
  602.             if Private_Present (Node) then
  603.                Write_Indent_Str ("private ");
  604.                Indent_Annull;
  605.             end if;
  606.  
  607.             Sprint_Node (Unit (Node));
  608.             Sprint_Opt_Node_List (Following_Pragmas (Node));
  609.  
  610.          when N_Component_Association =>
  611.             Sprint_Bar_List (Choices (Node));
  612.             Write_Str (" => ");
  613.             Sprint_Node (Expression (Node));
  614.  
  615.          when N_Component_Clause =>
  616.             Write_Indent;
  617.             Sprint_Node (Component_Name (Node));
  618.             Write_Str (" at ");
  619.             Sprint_Node (Position (Node));
  620.             Write_Char (' ');
  621.             Write_Str_With_Col_Check ("range ");
  622.             Sprint_Node (First_Bit (Node));
  623.             Write_Str (" .. ");
  624.             Sprint_Node (Last_Bit (Node));
  625.             Write_Char (';');
  626.  
  627.          when N_Component_Declaration =>
  628.             if Write_Indent_Identifiers (Node) then
  629.                Write_Str (" : ");
  630.  
  631.                if Aliased_Present (Node) then
  632.                   Write_Str_With_Col_Check ("aliased ");
  633.                end if;
  634.  
  635.                Sprint_Node (Subtype_Indication (Node));
  636.  
  637.                if Present (Expression (Node)) then
  638.                   Write_Str (" := ");
  639.                   Sprint_Node (Expression (Node));
  640.                end if;
  641.  
  642.                Write_Char (';');
  643.             end if;
  644.  
  645.          when N_Component_List =>
  646.             if Null_Present (Node) then
  647.                Indent_Begin;
  648.                Write_Indent_Str ("null");
  649.                Write_Char (';');
  650.                Indent_End;
  651.  
  652.             else
  653.                Sprint_Indented_List (Component_Items (Node));
  654.                Sprint_Node (Variant_Part (Node));
  655.             end if;
  656.  
  657.          when N_Concat_Multiple =>
  658.             declare
  659.                Expr : Node_Id;
  660.  
  661.             begin
  662.                pragma Assert (not Pure_Ada);
  663.                Expr := First (Expressions (Node));
  664.  
  665.                loop
  666.                   Sprint_Node (Expr);
  667.                   Expr := Next (Expr);
  668.                   exit when No (Expr);
  669.                   Write_Str (" && ");
  670.                end loop;
  671.             end;
  672.  
  673.          when N_Conditional_Entry_Call =>
  674.             Write_Indent_Str ("select");
  675.             Indent_Begin;
  676.             Sprint_Node (Entry_Call_Alternative (Node));
  677.             Indent_End;
  678.             Write_Indent_Str ("else");
  679.             Sprint_Indented_List (Else_Statements (Node));
  680.             Write_Indent_Str ("end select;");
  681.  
  682.          when N_Conditional_Expression =>
  683.             declare
  684.                Condition : constant Node_Id := First (Expressions (Node));
  685.                Then_Expr : constant Node_Id := Next (Condition);
  686.                Else_Expr : constant Node_Id := Next (Then_Expr);
  687.  
  688.             begin
  689.                pragma Assert (not Pure_Ada);
  690.                Write_Str_With_Col_Check ("(if ");
  691.                Sprint_Node (Condition);
  692.                Write_Str_With_Col_Check (" then ");
  693.                Sprint_Node (Then_Expr);
  694.                Write_Str_With_Col_Check (" else ");
  695.                Sprint_Node (Else_Expr);
  696.                Write_Char (')');
  697.             end;
  698.  
  699.          when N_Constrained_Array_Definition =>
  700.             Write_Str_With_Col_Check ("array ");
  701.             Sprint_Paren_Comma_List (Discrete_Subtype_Definitions (Node));
  702.             Write_Str (" of ");
  703.  
  704.             if Aliased_Present (Node) then
  705.                Write_Str_With_Col_Check ("aliased ");
  706.             end if;
  707.  
  708.             Sprint_Node (Subtype_Indication (Node));
  709.  
  710.          when N_Decimal_Fixed_Point_Definition =>
  711.             Write_Str_With_Col_Check ("digits ");
  712.             Sprint_Node (Digits_Expression (Node));
  713.             Write_Str_With_Col_Check (" delta ");
  714.             Sprint_Node (Delta_Expression (Node));
  715.             Sprint_Opt_Node (Real_Range_Specification (Node));
  716.  
  717.          when N_Defining_Character_Literal =>
  718.             Write_Name_With_Col_Check (Chars (Node));
  719.  
  720.          when N_Defining_Identifier =>
  721.             Write_Id (Node);
  722.  
  723.          when N_Defining_Operator_Symbol =>
  724.             if Pure_Ada then
  725.                Write_Operator_Symbol_With_Col_Check (Chars (Node));
  726.             else
  727.                Write_Name_With_Col_Check (Chars (Node));
  728.             end if;
  729.  
  730.          when N_Defining_Program_Unit_Name =>
  731.             Sprint_Node (Name (Node));
  732.             Write_Char ('.');
  733.             Write_Id (Defining_Identifier (Node));
  734.  
  735.          when N_Delay_Alternative =>
  736.             if Present (Condition (Node)) then
  737.                Write_Indent;
  738.                Write_Str_With_Col_Check ("when ");
  739.                Sprint_Node (Condition (Node));
  740.                Write_Str (" => ");
  741.                Indent_Annull;
  742.             end if;
  743.  
  744.             Sprint_Node (Delay_Statement (Node));
  745.             Sprint_Node_List (Statements (Node));
  746.  
  747.          when N_Delay_Relative_Statement =>
  748.             Write_Indent_Str ("delay ");
  749.             Sprint_Node (Expression (Node));
  750.             Write_Char (';');
  751.  
  752.          when N_Delay_Until_Statement =>
  753.             Write_Indent_Str ("delay until ");
  754.             Sprint_Node (Expression (Node));
  755.             Write_Char (';');
  756.  
  757.          when N_Delta_Constraint =>
  758.             Write_Str_With_Col_Check ("delta ");
  759.             Sprint_Node (Delta_Expression (Node));
  760.             Sprint_Opt_Node (Range_Constraint (Node));
  761.  
  762.          when N_Derived_Type_Definition =>
  763.             if Abstract_Present (Node) then
  764.                Write_Str_With_Col_Check ("abstract ");
  765.             end if;
  766.  
  767.             Write_Str_With_Col_Check ("new ");
  768.             Sprint_Node (Subtype_Indication (Node));
  769.  
  770.             if Present (Record_Extension_Part (Node)) then
  771.                Write_Str_With_Col_Check (" with ");
  772.                Sprint_Node (Record_Extension_Part (Node));
  773.             end if;
  774.  
  775.          when N_Designator =>
  776.             Sprint_Node (Name (Node));
  777.             Write_Char ('.');
  778.             Write_Id (Identifier (Node));
  779.  
  780.          when N_Digits_Constraint =>
  781.             Write_Str_With_Col_Check ("digits ");
  782.             Sprint_Node (Digits_Expression (Node));
  783.             Sprint_Opt_Node (Range_Constraint (Node));
  784.  
  785.          when N_Discriminant_Association =>
  786.             if Present (Selector_Names (Node)) then
  787.                Sprint_Bar_List (Selector_Names (Node));
  788.                Write_Str (" => ");
  789.             end if;
  790.  
  791.             Sprint_Node (Expression (Node));
  792.  
  793.          when N_Discriminant_Specification =>
  794.             if Write_Identifiers (Node) then
  795.                Write_Str (" : ");
  796.                Sprint_Node (Discriminant_Type (Node));
  797.  
  798.                if Present (Expression (Node)) then
  799.                   Write_Str (" := ");
  800.                   Sprint_Node (Expression (Node));
  801.                end if;
  802.             end if;
  803.  
  804.          when N_Elsif_Part =>
  805.             Write_Indent_Str ("elsif ");
  806.             Sprint_Node (Condition (Node));
  807.             Write_Str_With_Col_Check (" then");
  808.             Sprint_Indented_List (Then_Statements (Node));
  809.  
  810.          when N_Empty =>
  811.             null;
  812.  
  813.          when N_Entry_Body =>
  814.             Write_Indent_Str ("entry ");
  815.             Write_Id (Defining_Identifier (Node));
  816.             Sprint_Node (Entry_Body_Formal_Part (Node));
  817.             Write_Str_With_Col_Check (" is");
  818.             Sprint_Indented_List (Declarations (Node));
  819.             Write_Indent_Str ("begin");
  820.             Sprint_Node (Handled_Statement_Sequence (Node));
  821.             Write_Indent_Str ("end ");
  822.             Write_Id (Defining_Identifier (Node));
  823.             Write_Char (';');
  824.  
  825.          when N_Entry_Body_Formal_Part =>
  826.             if Present (Entry_Index_Specification (Node)) then
  827.                Write_Str_With_Col_Check (" (");
  828.                Sprint_Node (Entry_Index_Specification (Node));
  829.                Write_Char (')');
  830.             end if;
  831.  
  832.             Write_Param_Specs (Node);
  833.             Write_Str_With_Col_Check (" when ");
  834.             Sprint_Node (Condition (Node));
  835.  
  836.          when N_Entry_Call_Alternative =>
  837.             Sprint_Node (Entry_Call_Statement (Node));
  838.             Sprint_Node_List (Statements (Node));
  839.  
  840.          when N_Entry_Call_Statement =>
  841.             Write_Indent;
  842.             Sprint_Node (Name (Node));
  843.             Sprint_Opt_Paren_Comma_List (Parameter_Associations (Node));
  844.             Write_Char (';');
  845.  
  846.          when N_Entry_Declaration =>
  847.             Write_Indent_Str ("entry ");
  848.             Write_Id (Defining_Identifier (Node));
  849.  
  850.             if Present (Discrete_Subtype_Definition (Node)) then
  851.                Write_Str_With_Col_Check (" (");
  852.                Sprint_Node (Discrete_Subtype_Definition (Node));
  853.                Write_Char (')');
  854.             end if;
  855.  
  856.             Write_Param_Specs (Node);
  857.             Write_Char (';');
  858.  
  859.          when N_Entry_Index_Specification =>
  860.             Write_Str_With_Col_Check ("for ");
  861.             Write_Id (Defining_Identifier (Node));
  862.             Write_Str_With_Col_Check (" in ");
  863.             Sprint_Node (Discrete_Subtype_Definition (Node));
  864.  
  865.          when N_Enumeration_Representation_Clause =>
  866.             Write_Indent_Str ("for ");
  867.             Write_Id (Identifier (Node));
  868.             Write_Str_With_Col_Check (" use ");
  869.             Sprint_Node (Array_Aggregate (Node));
  870.             Write_Char (';');
  871.  
  872.          when N_Enumeration_Type_Definition =>
  873.  
  874.             --  Skip attempt to print Literals field if it's not there and
  875.             --  we are in package Standard (case of Character, which is
  876.             --  handled specially (without an explicit literals list).
  877.  
  878.             if Sloc (Node) > Standard_Location
  879.               or else Present (Literals (Node))
  880.             then
  881.                Sprint_Paren_Comma_List (Literals (Node));
  882.             end if;
  883.  
  884.          when N_Error =>
  885.             Write_Str_With_Col_Check ("<error>");
  886.  
  887.          when N_Exception_Declaration =>
  888.             if Write_Indent_Identifiers (Node) then
  889.                Write_Str_With_Col_Check (" : exception;");
  890.             end if;
  891.  
  892.          when N_Exception_Handler =>
  893.             Write_Indent_Str ("when ");
  894.  
  895.             if Present (Choice_Parameter (Node)) then
  896.                Sprint_Node (Choice_Parameter (Node));
  897.                Write_Str (" : ");
  898.             end if;
  899.  
  900.             Sprint_Bar_List (Exception_Choices (Node));
  901.             Write_Str (" => ");
  902.             Sprint_Indented_List (Statements (Node));
  903.  
  904.          when N_Exception_Renaming_Declaration =>
  905.             Write_Indent;
  906.             Sprint_Node (Defining_Identifier (Node));
  907.             Write_Str_With_Col_Check (" : exception renames ");
  908.             Sprint_Node (Name (Node));
  909.             Write_Char (';');
  910.  
  911.          when N_Exit_Statement =>
  912.             Write_Indent_Str ("exit");
  913.             Sprint_Opt_Node (Name (Node));
  914.  
  915.             if Present (Condition (Node)) then
  916.                Write_Str_With_Col_Check (" when ");
  917.                Sprint_Node (Condition (Node));
  918.             end if;
  919.  
  920.             Write_Char (';');
  921.  
  922.          when N_Explicit_Dereference =>
  923.             Sprint_Node (Prefix (Node));
  924.             Write_Str (".all");
  925.  
  926.          when N_Expression_Actions =>
  927.             pragma Assert (not Pure_Ada);
  928.             Write_Str_With_Col_Check (" [");
  929.             Sprint_Indented_List (Actions (Node));
  930.             Indent_Begin;
  931.             Write_Indent;
  932.             Sprint_Node (Expression (Node));
  933.             Indent_End;
  934.             Write_Char (']');
  935.  
  936.          when N_Extension_Aggregate =>
  937.             Write_Str_With_Col_Check ("(");
  938.             Sprint_Node (Ancestor_Part (Node));
  939.             Write_Str_With_Col_Check (" with ");
  940.  
  941.             if Null_Record_Present (Node) then
  942.                Write_Str_With_Col_Check ("null record");
  943.             else
  944.                if Present (Expressions (Node)) then
  945.                   Sprint_Comma_List (Expressions (Node));
  946.  
  947.                   if Present (Component_Associations (Node)) then
  948.                      Write_Str (", ");
  949.                   end if;
  950.                end if;
  951.  
  952.                if Present (Component_Associations (Node)) then
  953.                   Sprint_Comma_List (Component_Associations (Node));
  954.                end if;
  955.             end if;
  956.  
  957.             Write_Char (')');
  958.  
  959.          when N_Floating_Point_Definition =>
  960.             Write_Str_With_Col_Check ("digits ");
  961.             Sprint_Node (Digits_Expression (Node));
  962.             Sprint_Opt_Node (Real_Range_Specification (Node));
  963.  
  964.          when N_Formal_Decimal_Fixed_Point_Definition =>
  965.             Write_Str_With_Col_Check ("delta <> digits <>");
  966.  
  967.          when N_Formal_Derived_Type_Definition =>
  968.             Write_Str_With_Col_Check ("new ");
  969.             Sprint_Node (Subtype_Mark (Node));
  970.  
  971.             if Private_Present (Node) then
  972.                Write_Str_With_Col_Check (" with private");
  973.             end if;
  974.  
  975.          when N_Formal_Discrete_Type_Definition =>
  976.             Write_Str_With_Col_Check ("<>");
  977.  
  978.          when N_Formal_Floating_Point_Definition =>
  979.             Write_Str_With_Col_Check ("digits <>");
  980.  
  981.          when N_Formal_Modular_Type_Definition =>
  982.             Write_Str_With_Col_Check ("mod <>");
  983.  
  984.          when N_Formal_Object_Declaration =>
  985.             if Write_Indent_Identifiers (Node) then
  986.                Write_Str (" : ");
  987.  
  988.                if In_Present (Node) then
  989.                   Write_Str_With_Col_Check ("in ");
  990.                end if;
  991.  
  992.                if Out_Present (Node) then
  993.                   Write_Str_With_Col_Check ("out ");
  994.                end if;
  995.  
  996.                Sprint_Node (Subtype_Mark (Node));
  997.  
  998.                if Present (Expression (Node)) then
  999.                   Write_Str (" := ");
  1000.                   Sprint_Node (Expression (Node));
  1001.                end if;
  1002.  
  1003.                Write_Char (';');
  1004.             end if;
  1005.  
  1006.          when N_Formal_Ordinary_Fixed_Point_Definition =>
  1007.             Write_Str_With_Col_Check ("delta <>");
  1008.  
  1009.          when N_Formal_Package_Declaration =>
  1010.             Write_Indent_Str ("with package ");
  1011.             Write_Id (Defining_Identifier (Node));
  1012.             Write_Str_With_Col_Check (" is new ");
  1013.             Sprint_Node (Name (Node));
  1014.             Write_Str_With_Col_Check (" (<>);");
  1015.  
  1016.          when N_Formal_Private_Type_Definition =>
  1017.             if Abstract_Present (Node) then
  1018.                Write_Str_With_Col_Check ("abstract ");
  1019.             end if;
  1020.  
  1021.             if Tagged_Present (Node) then
  1022.                Write_Str_With_Col_Check ("tagged ");
  1023.             end if;
  1024.  
  1025.             if Limited_Present (Node) then
  1026.                Write_Str_With_Col_Check ("limited ");
  1027.             end if;
  1028.  
  1029.             Write_Str_With_Col_Check ("private");
  1030.  
  1031.          when N_Formal_Signed_Integer_Type_Definition =>
  1032.             Write_Str_With_Col_Check ("range <>");
  1033.  
  1034.          when N_Formal_Subprogram_Declaration =>
  1035.             Write_Indent_Str ("with ");
  1036.             Sprint_Node (Specification (Node));
  1037.  
  1038.             if Box_Present (Node) then
  1039.                Write_Str_With_Col_Check (" is <>");
  1040.             elsif Present (Default_Name (Node)) then
  1041.                Write_Str_With_Col_Check (" is ");
  1042.                Sprint_Node (Default_Name (Node));
  1043.             end if;
  1044.  
  1045.             Write_Char (';');
  1046.  
  1047.          when N_Formal_Type_Declaration =>
  1048.             Write_Indent_Str ("type ");
  1049.             Write_Id (Defining_Identifier (Node));
  1050.  
  1051.             if Present (Discriminant_Specifications (Node)) then
  1052.                Sprint_Paren_Comma_List
  1053.                  (Discriminant_Specifications (Node));
  1054.             elsif Unknown_Discriminants_Present (Node) then
  1055.                Write_Str_With_Col_Check ("(<>)");
  1056.             end if;
  1057.  
  1058.             Write_Str_With_Col_Check (" is ");
  1059.             Sprint_Node (Formal_Type_Definition (Node));
  1060.             Write_Char (';');
  1061.  
  1062.          when N_Free_Statement =>
  1063.             pragma Assert (not Pure_Ada);
  1064.             Write_Str_With_Col_Check ("free ");
  1065.             Sprint_Node (Expression (Node));
  1066.  
  1067.          when N_Freeze_Entity =>
  1068.             if not Dump_Original_Only then
  1069.                pragma Assert (not Pure_Ada);
  1070.                Write_Indent;
  1071.                Write_Rewrite_Str ("{");
  1072.                Write_Str_With_Col_Check ("freeze ");
  1073.                Write_Id (Entity (Node));
  1074.                Write_Str (" [");
  1075.  
  1076.                if No (Actions (Node)) then
  1077.                   Write_Char (']');
  1078.  
  1079.                else
  1080.                   Freeze_Indent := Freeze_Indent + 1;
  1081.                   Sprint_Indented_List (Actions (Node));
  1082.                   Freeze_Indent := Freeze_Indent - 1;
  1083.                   Write_Indent_Str ("]");
  1084.                   Write_Rewrite_Str ("}");
  1085.                end if;
  1086.             end if;
  1087.  
  1088.          when N_Full_Type_Declaration =>
  1089.             Write_Indent_Str ("type ");
  1090.             Write_Id (Defining_Identifier (Node));
  1091.             Sprint_Opt_Paren_Comma_List
  1092.               (Discriminant_Specifications (Node));
  1093.             Write_Str_With_Col_Check (" is ");
  1094.             Sprint_Node (Type_Definition (Node));
  1095.             Write_Char (';');
  1096.  
  1097.          when N_Function_Call =>
  1098.             Sprint_Node (Name (Node));
  1099.             Sprint_Opt_Paren_Comma_List (Parameter_Associations (Node));
  1100.  
  1101.          when N_Function_Instantiation =>
  1102.             Write_Indent_Str ("function ");
  1103.             Sprint_Node (Defining_Unit_Name (Node));
  1104.             Write_Str_With_Col_Check (" is new ");
  1105.             Sprint_Node (Name (Node));
  1106.             Sprint_Opt_Paren_Comma_List (Generic_Associations (Node));
  1107.             Write_Char (';');
  1108.  
  1109.          when N_Function_Specification =>
  1110.             Write_Str_With_Col_Check ("function ");
  1111.             Sprint_Node (Defining_Unit_Name (Node));
  1112.             Write_Param_Specs (Node);
  1113.             Write_Str_With_Col_Check (" return ");
  1114.             Sprint_Node (Subtype_Mark (Node));
  1115.  
  1116.          when N_Generic_Association =>
  1117.             if Present (Selector_Name (Node)) then
  1118.                Sprint_Node (Selector_Name (Node));
  1119.                Write_Str (" => ");
  1120.             end if;
  1121.  
  1122.             Sprint_Node (Explicit_Generic_Actual_Parameter (Node));
  1123.  
  1124.          when N_Generic_Function_Renaming_Declaration =>
  1125.             Write_Indent_Str ("generic function ");
  1126.             Sprint_Node (Defining_Unit_Name (Node));
  1127.             Write_Str_With_Col_Check (" renames ");
  1128.             Sprint_Node (Name (Node));
  1129.             Write_Char (';');
  1130.  
  1131.          when N_Generic_Package_Declaration =>
  1132.             Write_Indent;
  1133.             Write_Indent_Str ("generic ");
  1134.             Sprint_Indented_List (Generic_Formal_Declarations (Node));
  1135.             Write_Indent;
  1136.             Sprint_Node (Specification (Node));
  1137.             Write_Char (';');
  1138.  
  1139.          when N_Generic_Package_Renaming_Declaration =>
  1140.             Write_Indent_Str ("generic package ");
  1141.             Sprint_Node (Defining_Unit_Name (Node));
  1142.             Write_Str_With_Col_Check (" renames ");
  1143.             Sprint_Node (Name (Node));
  1144.             Write_Char (';');
  1145.  
  1146.          when N_Generic_Procedure_Renaming_Declaration =>
  1147.             Write_Indent_Str ("generic procedure ");
  1148.             Sprint_Node (Defining_Unit_Name (Node));
  1149.             Write_Str_With_Col_Check (" renames ");
  1150.             Sprint_Node (Name (Node));
  1151.             Write_Char (';');
  1152.  
  1153.          when N_Generic_Subprogram_Declaration =>
  1154.             Write_Indent;
  1155.             Write_Indent_Str ("generic ");
  1156.             Sprint_Indented_List (Generic_Formal_Declarations (Node));
  1157.             Write_Indent;
  1158.             Sprint_Node (Specification (Node));
  1159.             Write_Char (';');
  1160.  
  1161.          when N_Goto_Statement =>
  1162.             Write_Indent_Str ("goto ");
  1163.             Sprint_Node (Name (Node));
  1164.             Write_Char (';');
  1165.  
  1166.          when N_Handled_Sequence_Of_Statements =>
  1167.             Sprint_Indented_List (Statements (Node));
  1168.  
  1169.             if Present (Exception_Handlers (Node)) then
  1170.                Write_Indent_Str ("exception");
  1171.                Indent_Begin;
  1172.                Sprint_Node_List (Exception_Handlers (Node));
  1173.                Indent_End;
  1174.             end if;
  1175.  
  1176.             if Present (Identifier (Node)) then
  1177.                pragma Assert (not Pure_Ada);
  1178.                Write_Indent_Str ("at end");
  1179.                Indent_Begin;
  1180.                Write_Indent;
  1181.                Sprint_Node (Identifier (Node));
  1182.                Write_Char (';');
  1183.                Indent_End;
  1184.             end if;
  1185.  
  1186.          when N_Identifier =>
  1187.             Write_Id (Node);
  1188.  
  1189.          when N_If_Statement =>
  1190.             Write_Indent_Str ("if ");
  1191.             Sprint_Node (Condition (Node));
  1192.             Write_Str_With_Col_Check (" then");
  1193.             Sprint_Indented_List (Then_Statements (Node));
  1194.             Sprint_Opt_Node_List (Elsif_Parts (Node));
  1195.  
  1196.             if Present (Else_Statements (Node)) then
  1197.                Write_Indent_Str ("else");
  1198.                Sprint_Indented_List (Else_Statements (Node));
  1199.             end if;
  1200.  
  1201.             Write_Indent_Str ("end if;");
  1202.  
  1203.          when N_Implicit_Label_Declaration =>
  1204.             if not Dump_Original_Only then
  1205.                pragma Assert (not Pure_Ada);
  1206.                Write_Indent;
  1207.                Write_Rewrite_Str ("{");
  1208.                Write_Id (Defining_Identifier (Node));
  1209.                Write_Str (" : ");
  1210.                Write_Str_With_Col_Check ("label");
  1211.                Write_Rewrite_Str ("}");
  1212.             end if;
  1213.  
  1214.          when N_Implicit_Types =>
  1215.  
  1216.             --  Implicit types are printed by the standard mechanism that
  1217.             --  outputs itypes attached to a node, and this node itself is
  1218.             --  simply a special case of that general processing, so there
  1219.             --  is nothing extra to be done.
  1220.  
  1221.             null;
  1222.  
  1223.          when N_In =>
  1224.             Sprint_Node (Left_Opnd (Node));
  1225.             Write_Str (" in ");
  1226.             Sprint_Node (Right_Opnd (Node));
  1227.  
  1228.          when N_Incomplete_Type_Declaration =>
  1229.             Write_Indent_Str ("type ");
  1230.             Write_Id (Defining_Identifier (Node));
  1231.  
  1232.             if Present (Discriminant_Specifications (Node)) then
  1233.                Sprint_Paren_Comma_List
  1234.                  (Discriminant_Specifications (Node));
  1235.             elsif Unknown_Discriminants_Present (Node) then
  1236.                Write_Str_With_Col_Check ("(<>)");
  1237.             end if;
  1238.  
  1239.             Write_Char (';');
  1240.  
  1241.          when N_Index_Or_Discriminant_Constraint =>
  1242.             Sprint_Paren_Comma_List (Constraints (Node));
  1243.  
  1244.          when N_Indexed_Component =>
  1245.             Sprint_Node (Prefix (Node));
  1246.             Sprint_Opt_Paren_Comma_List (Expressions (Node));
  1247.  
  1248.          when N_Integer_Literal =>
  1249.             Write_Uint_With_Col_Check (Intval (Node));
  1250.  
  1251.          when N_Interpretation =>
  1252.             pragma Assert (not Pure_Ada);
  1253.             Write_Indent_Str ("interpretation ");
  1254.             Sprint_Node (Etype (Node));
  1255.  
  1256.             if Present (Entity (Node)) then
  1257.                Write_Str (", ");
  1258.                Sprint_Node (Entity (Node));
  1259.             end if;
  1260.  
  1261.          when N_Iteration_Scheme =>
  1262.             if Present (Condition (Node)) then
  1263.                Write_Str_With_Col_Check ("while ");
  1264.                Sprint_Node (Condition (Node));
  1265.             else
  1266.                Write_Str_With_Col_Check ("for ");
  1267.                Sprint_Node (Loop_Parameter_Specification (Node));
  1268.             end if;
  1269.  
  1270.             Write_Char (' ');
  1271.  
  1272.          when N_Label =>
  1273.             Write_Indent_Str ("<<");
  1274.             Write_Id (Identifier (Node));
  1275.             Write_Str (">>");
  1276.  
  1277.          when N_Loop_Parameter_Specification =>
  1278.             Write_Id (Defining_Identifier (Node));
  1279.             Write_Str_With_Col_Check (" in ");
  1280.  
  1281.             if Reverse_Present (Node) then
  1282.                Write_Str_With_Col_Check ("reverse ");
  1283.             end if;
  1284.  
  1285.             Sprint_Node (Discrete_Subtype_Definition (Node));
  1286.  
  1287.          when N_Loop_Statement =>
  1288.             Write_Indent;
  1289.  
  1290.             if Present (Identifier (Node))
  1291.               and then (not Has_Created_Identifier (Node)
  1292.                           or else not Dump_Original_Only)
  1293.             then
  1294.                Write_Rewrite_Str ("{");
  1295.                Write_Id (Identifier (Node));
  1296.                Write_Str (" : ");
  1297.                Write_Rewrite_Str ("}");
  1298.                Sprint_Node (Iteration_Scheme (Node));
  1299.                Write_Str_With_Col_Check ("loop");
  1300.                Sprint_Indented_List (Statements (Node));
  1301.                Write_Indent_Str ("end loop ");
  1302.                Write_Rewrite_Str ("{");
  1303.                Write_Id (Identifier (Node));
  1304.                Write_Rewrite_Str ("}");
  1305.                Write_Char (';');
  1306.  
  1307.             else
  1308.                Sprint_Node (Iteration_Scheme (Node));
  1309.                Write_Str_With_Col_Check ("loop");
  1310.                Sprint_Indented_List (Statements (Node));
  1311.                Write_Indent_Str ("end loop;");
  1312.             end if;
  1313.  
  1314.          when N_Modular_Type_Definition =>
  1315.             Write_Str_With_Col_Check ("mod ");
  1316.             Sprint_Node (Expression (Node));
  1317.  
  1318.          when N_Not_In =>
  1319.             Sprint_Node (Left_Opnd (Node));
  1320.             Write_Str (" not in ");
  1321.             Sprint_Node (Right_Opnd (Node));
  1322.  
  1323.          when N_Null =>
  1324.             Write_Str_With_Col_Check ("null");
  1325.  
  1326.          when N_Null_Statement =>
  1327.             Write_Indent_Str ("null;");
  1328.  
  1329.          when N_Number_Declaration =>
  1330.             if Write_Indent_Identifiers (Node) then
  1331.                Write_Str_With_Col_Check (" : constant ");
  1332.                Write_Str (" := ");
  1333.                Sprint_Node (Expression (Node));
  1334.                Write_Char (';');
  1335.             end if;
  1336.  
  1337.          when N_Object_Declaration =>
  1338.             if Write_Indent_Identifiers (Node) then
  1339.                Write_Str (" : ");
  1340.  
  1341.                if Aliased_Present (Node) then
  1342.                   Write_Str_With_Col_Check ("aliased ");
  1343.                end if;
  1344.  
  1345.                if Constant_Present (Node) then
  1346.                   Write_Str_With_Col_Check ("constant ");
  1347.                end if;
  1348.  
  1349.                Sprint_Node (Object_Definition (Node));
  1350.  
  1351.                if Present (Expression (Node)) then
  1352.                   Write_Str (" := ");
  1353.                   Sprint_Node (Expression (Node));
  1354.                end if;
  1355.  
  1356.                Write_Char (';');
  1357.             end if;
  1358.  
  1359.          when N_Object_Renaming_Declaration =>
  1360.             Write_Indent;
  1361.             Sprint_Node (Defining_Identifier (Node));
  1362.             Write_Str (" : ");
  1363.             Sprint_Node (Subtype_Mark (Node));
  1364.             Write_Str_With_Col_Check (" renames ");
  1365.             Sprint_Node (Name (Node));
  1366.             Write_Char (';');
  1367.  
  1368.          when N_Op_Abs =>
  1369.             Write_Str ("abs ");
  1370.             Sprint_Node (Right_Opnd (Node));
  1371.  
  1372.          when N_Op_Add =>
  1373.             Sprint_Node (Left_Opnd (Node));
  1374.             Write_Str (" + ");
  1375.             Sprint_Node (Right_Opnd (Node));
  1376.  
  1377.          when N_Op_And =>
  1378.             Sprint_Node (Left_Opnd (Node));
  1379.             Write_Str (" and ");
  1380.             Sprint_Node (Right_Opnd (Node));
  1381.  
  1382.          when N_Op_Concat =>
  1383.             Sprint_Node (Left_Opnd (Node));
  1384.             Write_Str (" & ");
  1385.             Sprint_Node (Right_Opnd (Node));
  1386.  
  1387.          when N_Op_Divide =>
  1388.             Sprint_Node (Left_Opnd (Node));
  1389.  
  1390.             if Treat_Fixed_As_Integer (Node) then
  1391.                pragma Assert (not Pure_Ada);
  1392.                Write_Str (" #/ ");
  1393.             else
  1394.                Write_Str (" / ");
  1395.             end if;
  1396.  
  1397.             Sprint_Node (Right_Opnd (Node));
  1398.  
  1399.          when N_Op_Eq =>
  1400.             Sprint_Node (Left_Opnd (Node));
  1401.             Write_Str (" = ");
  1402.             Sprint_Node (Right_Opnd (Node));
  1403.  
  1404.          when N_Op_Expon =>
  1405.             Sprint_Node (Left_Opnd (Node));
  1406.             Write_Str (" ** ");
  1407.             Sprint_Node (Right_Opnd (Node));
  1408.  
  1409.          when N_Op_Ge =>
  1410.             Sprint_Node (Left_Opnd (Node));
  1411.             Write_Str (" >= ");
  1412.             Sprint_Node (Right_Opnd (Node));
  1413.  
  1414.          when N_Op_Gt =>
  1415.             Sprint_Node (Left_Opnd (Node));
  1416.             Write_Str (" > ");
  1417.             Sprint_Node (Right_Opnd (Node));
  1418.  
  1419.          when N_Op_Le =>
  1420.             Sprint_Node (Left_Opnd (Node));
  1421.             Write_Str (" <= ");
  1422.             Sprint_Node (Right_Opnd (Node));
  1423.  
  1424.          when N_Op_Lt =>
  1425.             Sprint_Node (Left_Opnd (Node));
  1426.             Write_Str (" < ");
  1427.             Sprint_Node (Right_Opnd (Node));
  1428.  
  1429.          when N_Op_Minus =>
  1430.             Write_Str ("-");
  1431.             Sprint_Node (Right_Opnd (Node));
  1432.  
  1433.          when N_Op_Mod =>
  1434.             Sprint_Node (Left_Opnd (Node));
  1435.  
  1436.             if Treat_Fixed_As_Integer (Node) then
  1437.                pragma Assert (not Pure_Ada);
  1438.                Write_Str (" #mod ");
  1439.             else
  1440.                Write_Str (" mod ");
  1441.             end if;
  1442.  
  1443.             Sprint_Node (Right_Opnd (Node));
  1444.  
  1445.          when N_Op_Multiply =>
  1446.             Sprint_Node (Left_Opnd (Node));
  1447.  
  1448.             if Treat_Fixed_As_Integer (Node) then
  1449.                pragma Assert (not Pure_Ada);
  1450.                Write_Str (" #* ");
  1451.             else
  1452.                Write_Str (" * ");
  1453.             end if;
  1454.  
  1455.             Sprint_Node (Right_Opnd (Node));
  1456.  
  1457.          when N_Op_Ne =>
  1458.             Sprint_Node (Left_Opnd (Node));
  1459.             Write_Str (" /= ");
  1460.             Sprint_Node (Right_Opnd (Node));
  1461.  
  1462.          when N_Op_Not =>
  1463.             Write_Str ("not ");
  1464.             Sprint_Node (Right_Opnd (Node));
  1465.  
  1466.          when N_Op_Or =>
  1467.             Sprint_Node (Left_Opnd (Node));
  1468.             Write_Str (" or ");
  1469.             Sprint_Node (Right_Opnd (Node));
  1470.  
  1471.          when N_Op_Plus =>
  1472.             Write_Str ("+");
  1473.             Sprint_Node (Right_Opnd (Node));
  1474.  
  1475.          when N_Op_Rem =>
  1476.             Sprint_Node (Left_Opnd (Node));
  1477.  
  1478.             if Treat_Fixed_As_Integer (Node) then
  1479.                pragma Assert (not Pure_Ada);
  1480.                Write_Str (" #rem ");
  1481.             else
  1482.                Write_Str (" rem ");
  1483.             end if;
  1484.  
  1485.             Sprint_Node (Right_Opnd (Node));
  1486.  
  1487.          when N_Op_Shift =>
  1488.             pragma Assert (not Pure_Ada);
  1489.             Write_Id (Node);
  1490.             Write_Char ('!');
  1491.             Write_Str_With_Col_Check ("(");
  1492.             Sprint_Node (Left_Opnd (Node));
  1493.             Write_Str (", ");
  1494.             Sprint_Node (Right_Opnd (Node));
  1495.             Write_Char (')');
  1496.  
  1497.          when N_Op_Subtract =>
  1498.             Sprint_Node (Left_Opnd (Node));
  1499.             Write_Str (" - ");
  1500.             Sprint_Node (Right_Opnd (Node));
  1501.  
  1502.          when N_Op_Xor =>
  1503.             Sprint_Node (Left_Opnd (Node));
  1504.             Write_Str (" xor ");
  1505.             Sprint_Node (Right_Opnd (Node));
  1506.  
  1507.          when N_Operator_Symbol =>
  1508.             if Pure_Ada then
  1509.                Write_Operator_Symbol_With_Col_Check (Chars (Node));
  1510.             else
  1511.                Write_Name_With_Col_Check (Chars (Node));
  1512.             end if;
  1513.  
  1514.          when N_Ordinary_Fixed_Point_Definition =>
  1515.             Write_Str_With_Col_Check ("delta ");
  1516.             Sprint_Node (Delta_Expression (Node));
  1517.             Sprint_Opt_Node (Real_Range_Specification (Node));
  1518.  
  1519.          when N_Or_Else =>
  1520.             Sprint_Node (Left_Opnd (Node));
  1521.             Write_Str (" or else ");
  1522.             Sprint_Node (Right_Opnd (Node));
  1523.  
  1524.          when N_Others_Choice =>
  1525.             Write_Str_With_Col_Check ("others");
  1526.  
  1527.          when N_Package_Body =>
  1528.             Write_Indent;
  1529.             Write_Indent_Str ("package body ");
  1530.             Sprint_Node (Defining_Unit_Name (Node));
  1531.             Write_Str (" is");
  1532.             Sprint_Indented_List (Declarations (Node));
  1533.  
  1534.             if Present (Handled_Statement_Sequence (Node)) then
  1535.                Write_Indent_Str ("begin");
  1536.                Sprint_Node (Handled_Statement_Sequence (Node));
  1537.             end if;
  1538.  
  1539.             Write_Indent_Str ("end ");
  1540.             Sprint_Node (Defining_Unit_Name (Node));
  1541.             Write_Char (';');
  1542.  
  1543.          when N_Package_Body_Stub =>
  1544.             Write_Indent_Str ("package_body ");
  1545.             Sprint_Node (Defining_Identifier (Node));
  1546.             Write_Str_With_Col_Check (" is separate;");
  1547.  
  1548.          when N_Package_Declaration =>
  1549.             Write_Indent;
  1550.             Write_Indent;
  1551.             Sprint_Node (Specification (Node));
  1552.             Write_Char (';');
  1553.  
  1554.          when N_Package_Instantiation =>
  1555.             Write_Indent;
  1556.             Write_Indent_Str ("package ");
  1557.             Sprint_Node (Defining_Unit_Name (Node));
  1558.             Write_Str (" is new ");
  1559.             Sprint_Node (Name (Node));
  1560.             Sprint_Opt_Paren_Comma_List (Generic_Associations (Node));
  1561.             Write_Char (';');
  1562.  
  1563.          when N_Package_Renaming_Declaration =>
  1564.             Write_Indent_Str ("package ");
  1565.             Sprint_Node (Defining_Unit_Name (Node));
  1566.             Write_Str_With_Col_Check (" renames ");
  1567.             Sprint_Node (Name (Node));
  1568.             Write_Char (';');
  1569.  
  1570.          when N_Package_Specification =>
  1571.             Write_Str_With_Col_Check ("package ");
  1572.             Sprint_Node (Defining_Unit_Name (Node));
  1573.             Write_Str (" is");
  1574.             Sprint_Indented_List (Visible_Declarations (Node));
  1575.  
  1576.             if Present (Private_Declarations (Node)) then
  1577.                Write_Indent_Str ("private");
  1578.                Sprint_Indented_List (Private_Declarations (Node));
  1579.             end if;
  1580.  
  1581.             Write_Indent_Str ("end ");
  1582.             Sprint_Node (Defining_Unit_Name (Node));
  1583.  
  1584.          when N_Parameter_Association =>
  1585.             Sprint_Node (Selector_Name (Node));
  1586.             Write_Str (" =>");
  1587.             Sprint_Node (Explicit_Actual_Parameter (Node));
  1588.  
  1589.          when N_Parameter_Specification =>
  1590.             if Write_Identifiers (Node) then
  1591.                Write_Str (" : ");
  1592.  
  1593.                if In_Present (Node) then
  1594.                   Write_Str_With_Col_Check ("in ");
  1595.                end if;
  1596.  
  1597.                if Out_Present (Node) then
  1598.                   Write_Str_With_Col_Check ("out ");
  1599.                end if;
  1600.  
  1601.                Sprint_Node (Parameter_Type (Node));
  1602.  
  1603.                if Present (Expression (Node)) then
  1604.                   Write_Str (" := ");
  1605.                   Sprint_Node (Expression (Node));
  1606.                end if;
  1607.             end if;
  1608.  
  1609.          when N_Pragma =>
  1610.             Write_Indent_Str ("pragma ");
  1611.             Write_Name_With_Col_Check (Chars (Node));
  1612.  
  1613.             if Present (Pragma_Argument_Associations (Node)) then
  1614.                Sprint_Opt_Paren_Comma_List
  1615.                  (Pragma_Argument_Associations (Node));
  1616.             end if;
  1617.  
  1618.             Write_Char (';');
  1619.  
  1620.          when N_Pragma_Argument_Association =>
  1621.             if Chars (Node) /= No_Name then
  1622.                Write_Name_With_Col_Check (Chars (Node));
  1623.                Write_Str (" => ");
  1624.             end if;
  1625.  
  1626.             Sprint_Node (Expression (Node));
  1627.  
  1628.          when N_Private_Type_Declaration =>
  1629.             Write_Indent_Str ("type ");
  1630.             Write_Id (Defining_Identifier (Node));
  1631.  
  1632.             if Present (Discriminant_Specifications (Node)) then
  1633.                Sprint_Paren_Comma_List
  1634.                  (Discriminant_Specifications (Node));
  1635.             elsif Unknown_Discriminants_Present (Node) then
  1636.                Write_Str_With_Col_Check ("(<>)");
  1637.             end if;
  1638.  
  1639.             Write_Str (" is ");
  1640.  
  1641.             if Tagged_Present (Node) then
  1642.                Write_Str_With_Col_Check ("tagged ");
  1643.             end if;
  1644.  
  1645.             if Limited_Present (Node) then
  1646.                Write_Str_With_Col_Check ("limited ");
  1647.             end if;
  1648.  
  1649.             Write_Str_With_Col_Check ("private;");
  1650.  
  1651.          when N_Private_Extension_Declaration =>
  1652.             Write_Indent_Str ("type ");
  1653.             Write_Id (Defining_Identifier (Node));
  1654.  
  1655.             if Present (Discriminant_Specifications (Node)) then
  1656.                Sprint_Paren_Comma_List
  1657.                  (Discriminant_Specifications (Node));
  1658.             elsif Unknown_Discriminants_Present (Node) then
  1659.                Write_Str_With_Col_Check ("(<>)");
  1660.             end if;
  1661.  
  1662.             Write_Str_With_Col_Check (" is new ");
  1663.             Sprint_Node (Subtype_Indication (Node));
  1664.             Write_Str_With_Col_Check (" with private;");
  1665.  
  1666.          when N_Procedure_Call_Statement =>
  1667.             Write_Indent;
  1668.             Sprint_Node (Name (Node));
  1669.             Sprint_Opt_Paren_Comma_List (Parameter_Associations (Node));
  1670.             Write_Char (';');
  1671.  
  1672.          when N_Procedure_Instantiation =>
  1673.             Write_Indent_Str ("procedure ");
  1674.             Sprint_Node (Defining_Unit_Name (Node));
  1675.             Write_Str_With_Col_Check (" is new ");
  1676.             Sprint_Node (Name (Node));
  1677.             Sprint_Opt_Paren_Comma_List (Generic_Associations (Node));
  1678.             Write_Char (';');
  1679.  
  1680.          when N_Procedure_Specification =>
  1681.             Write_Str_With_Col_Check ("procedure ");
  1682.             Sprint_Node (Defining_Unit_Name (Node));
  1683.             Write_Param_Specs (Node);
  1684.  
  1685.          when N_Protected_Body =>
  1686.             Write_Indent_Str ("protected body ");
  1687.             Write_Id (Defining_Identifier (Node));
  1688.             Write_Str (" is");
  1689.             Sprint_Indented_List (Declarations (Node));
  1690.             Write_Indent_Str ("end ");
  1691.             Write_Id (Defining_Identifier (Node));
  1692.             Write_Char (';');
  1693.  
  1694.          when N_Protected_Body_Stub =>
  1695.             Write_Indent_Str ("protected body ");
  1696.             Write_Id (Defining_Identifier (Node));
  1697.             Write_Str_With_Col_Check (" is separate;");
  1698.  
  1699.          when N_Protected_Definition =>
  1700.             Sprint_Indented_List (Visible_Declarations (Node));
  1701.  
  1702.             if Present (Private_Declarations (Node)) then
  1703.                Write_Indent_Str ("private");
  1704.                Sprint_Indented_List (Private_Declarations (Node));
  1705.             end if;
  1706.  
  1707.             Write_Indent_Str ("end ");
  1708.  
  1709.          when N_Protected_Type_Declaration =>
  1710.             Write_Indent_Str ("protected type ");
  1711.             Write_Id (Defining_Identifier (Node));
  1712.             Sprint_Opt_Paren_Comma_List
  1713.               (Discriminant_Specifications (Node));
  1714.             Write_Str (" is");
  1715.             Sprint_Node (Protected_Definition (Node));
  1716.             Write_Id (Defining_Identifier (Node));
  1717.             Write_Char (';');
  1718.  
  1719.          when N_Qualified_Expression =>
  1720.             Sprint_Node (Subtype_Mark (Node));
  1721.             Write_Char (''');
  1722.             Sprint_Node (Expression (Node));
  1723.  
  1724.          when N_Raise_Constraint_Error =>
  1725.             pragma Assert (not Pure_Ada);
  1726.             Write_Str_With_Col_Check ("[constraint_error]");
  1727.  
  1728.          when N_Raise_Statement =>
  1729.             Write_Indent_Str ("raise ");
  1730.             Sprint_Node (Name (Node));
  1731.             Write_Char (';');
  1732.  
  1733.          when N_Range =>
  1734.             Sprint_Node (Low_Bound (Node));
  1735.             Write_Str (" .. ");
  1736.             Sprint_Node (High_Bound (Node));
  1737.  
  1738.          when N_Range_Constraint =>
  1739.             Write_Str_With_Col_Check ("range ");
  1740.             Sprint_Node (Range_Expression (Node));
  1741.  
  1742.          when N_Real_Literal =>
  1743.             Write_Ureal_With_Col_Check (Realval (Node));
  1744.  
  1745.          when N_Real_Range_Specification =>
  1746.             Write_Str_With_Col_Check ("range ");
  1747.             Sprint_Node (Low_Bound (Node));
  1748.             Write_Str (" .. ");
  1749.             Sprint_Node (High_Bound (Node));
  1750.  
  1751.          when N_Record_Definition =>
  1752.             if Abstract_Present (Node) then
  1753.                Write_Str_With_Col_Check ("abstract ");
  1754.             end if;
  1755.  
  1756.             if Tagged_Present (Node) then
  1757.                Write_Str_With_Col_Check ("tagged ");
  1758.             end if;
  1759.  
  1760.             if Limited_Present (Node) then
  1761.                Write_Str_With_Col_Check ("limited ");
  1762.             end if;
  1763.  
  1764.             if Null_Present (Node) then
  1765.                Write_Str_With_Col_Check ("null record");
  1766.  
  1767.             else
  1768.                Write_Str_With_Col_Check ("record");
  1769.                Sprint_Node (Component_List (Node));
  1770.                Write_Indent_Str ("end record");
  1771.             end if;
  1772.  
  1773.          when N_Record_Representation_Clause =>
  1774.             Write_Indent_Str ("for ");
  1775.             Sprint_Node (Identifier (Node));
  1776.             Write_Str_With_Col_Check (" use record ");
  1777.  
  1778.             if Present (Mod_Clause (Node)) then
  1779.                Sprint_Node (Mod_Clause (Node));
  1780.             end if;
  1781.  
  1782.             Sprint_Indented_List (Component_Clauses (Node));
  1783.             Write_Indent_Str ("end record;");
  1784.  
  1785.          when N_Reference =>
  1786.             pragma Assert (not Pure_Ada);
  1787.             Sprint_Node (Prefix (Node));
  1788.             Write_Str_With_Col_Check ("'reference");
  1789.  
  1790.          when N_Requeue_Statement =>
  1791.             Write_Indent_Str ("requeue ");
  1792.             Sprint_Node (Name (Node));
  1793.  
  1794.             if Abort_Present (Node) then
  1795.                Write_Str_With_Col_Check (" with abort");
  1796.             end if;
  1797.  
  1798.             Write_Char (';');
  1799.  
  1800.          when N_Return_Statement =>
  1801.             if Present (Expression (Node)) then
  1802.                Write_Indent_Str ("return ");
  1803.                Sprint_Node (Expression (Node));
  1804.                Write_Char (';');
  1805.             else
  1806.                Write_Indent_Str ("return;");
  1807.             end if;
  1808.  
  1809.          when N_Selective_Accept =>
  1810.             Write_Indent_Str ("select");
  1811.  
  1812.             declare
  1813.                Alt_Node : Node_Id;
  1814.  
  1815.             begin
  1816.                Alt_Node := First (Select_Alternatives (Node));
  1817.                loop
  1818.                   Indent_Begin;
  1819.                   Sprint_Node (Alt_Node);
  1820.                   Indent_End;
  1821.                   Alt_Node := Next (Alt_Node);
  1822.                   exit when No (Alt_Node);
  1823.                   Write_Indent_Str ("or");
  1824.                end loop;
  1825.             end;
  1826.  
  1827.             if Present (Else_Statements (Node)) then
  1828.                Write_Indent_Str ("else");
  1829.                Sprint_Indented_List (Else_Statements (Node));
  1830.             end if;
  1831.  
  1832.             Write_Indent_Str ("end select;");
  1833.  
  1834.          when N_Signed_Integer_Type_Definition =>
  1835.             Write_Str_With_Col_Check ("range ");
  1836.             Sprint_Node (Low_Bound (Node));
  1837.             Write_Str (" .. ");
  1838.             Sprint_Node (High_Bound (Node));
  1839.  
  1840.          when N_Single_Protected_Declaration =>
  1841.             Write_Indent_Str ("protected ");
  1842.             Write_Id (Defining_Identifier (Node));
  1843.             Write_Str (" is");
  1844.             Sprint_Node (Protected_Definition (Node));
  1845.             Write_Id (Defining_Identifier (Node));
  1846.             Write_Char (';');
  1847.  
  1848.          when N_Single_Task_Declaration =>
  1849.             Write_Indent_Str ("task ");
  1850.             Write_Id (Defining_Identifier (Node));
  1851.  
  1852.             if Present (Task_Definition (Node)) then
  1853.                Write_Str (" is");
  1854.                Sprint_Node (Task_Definition (Node));
  1855.                Write_Id (Defining_Identifier (Node));
  1856.             end if;
  1857.  
  1858.             Write_Char (';');
  1859.  
  1860.          when N_Selected_Component | N_Expanded_Name =>
  1861.             Sprint_Node (Prefix (Node));
  1862.             Write_Char ('.');
  1863.             Sprint_Node (Selector_Name (Node));
  1864.  
  1865.          when N_Slice =>
  1866.             Sprint_Node (Prefix (Node));
  1867.             Write_Str_With_Col_Check (" (");
  1868.             Sprint_Node (Discrete_Range (Node));
  1869.             Write_Char (')');
  1870.  
  1871.          when N_String_Literal =>
  1872.             if String_Length (Strval (Node)) + Column > 75 then
  1873.                Write_Indent_Str ("  ");
  1874.             end if;
  1875.  
  1876.             Write_String_Table_Entry (Strval (Node));
  1877.  
  1878.          when N_Subprogram_Body =>
  1879.             if Freeze_Indent = 0 then
  1880.                Write_Indent;
  1881.             end if;
  1882.  
  1883.             Write_Indent;
  1884.             Sprint_Node (Specification (Node));
  1885.             Write_Str (" is");
  1886.             Sprint_Indented_List (Declarations (Node));
  1887.             Write_Indent_Str ("begin");
  1888.             Sprint_Node (Handled_Statement_Sequence (Node));
  1889.             Write_Indent_Str ("end ");
  1890.             Sprint_Node
  1891.               (Defining_Unit_Name (Specification (Node)));
  1892.             Write_Char (';');
  1893.  
  1894.             if Is_List_Member (Node)
  1895.               and then Present (Next (Node))
  1896.               and then Nkind (Next (Node)) /= N_Subprogram_Body
  1897.             then
  1898.                Write_Indent;
  1899.             end if;
  1900.  
  1901.          when N_Subprogram_Body_Stub =>
  1902.             Write_Indent;
  1903.             Sprint_Node (Specification (Node));
  1904.             Write_Str_With_Col_Check (" is separate;");
  1905.  
  1906.          when N_Subprogram_Declaration =>
  1907.             Write_Indent;
  1908.             Sprint_Node (Specification (Node));
  1909.             Write_Char (';');
  1910.  
  1911.          when N_Subprogram_Renaming_Declaration =>
  1912.             Write_Indent;
  1913.             Sprint_Node (Specification (Node));
  1914.             Write_Str_With_Col_Check (" renames ");
  1915.             Sprint_Node (Name (Node));
  1916.             Write_Char (';');
  1917.  
  1918.          when N_Subtype_Declaration =>
  1919.             Write_Indent_Str ("subtype ");
  1920.             Write_Id (Defining_Identifier (Node));
  1921.             Write_Str (" is ");
  1922.             Sprint_Node (Subtype_Indication (Node));
  1923.             Write_Char (';');
  1924.  
  1925.          when N_Subtype_Indication =>
  1926.             Sprint_Node (Subtype_Mark (Node));
  1927.             Write_Char (' ');
  1928.             Sprint_Node (Constraint (Node));
  1929.  
  1930.          when N_Subunit =>
  1931.             Write_Indent_Str ("separate (");
  1932.             Sprint_Node (Name (Node));
  1933.             Write_Char (')');
  1934.             Write_Eol;
  1935.             Sprint_Node (Proper_Body (Node));
  1936.  
  1937.          when N_Task_Body =>
  1938.             Write_Indent_Str ("task body ");
  1939.             Write_Id (Defining_Identifier (Node));
  1940.             Write_Str (" is");
  1941.             Sprint_Indented_List (Declarations (Node));
  1942.             Write_Indent_Str ("begin");
  1943.             Sprint_Node (Handled_Statement_Sequence (Node));
  1944.             Write_Indent_Str ("end ");
  1945.             Write_Id (Defining_Identifier (Node));
  1946.             Write_Char (';');
  1947.  
  1948.          when N_Task_Body_Stub =>
  1949.             Write_Indent_Str ("task body ");
  1950.             Write_Id (Defining_Identifier (Node));
  1951.             Write_Str_With_Col_Check (" is separate;");
  1952.  
  1953.          when N_Task_Definition =>
  1954.             Sprint_Indented_List (Visible_Declarations (Node));
  1955.  
  1956.             if Present (Private_Declarations (Node)) then
  1957.                Write_Indent_Str ("private");
  1958.                Sprint_Indented_List (Private_Declarations (Node));
  1959.             end if;
  1960.  
  1961.             Write_Indent_Str ("end ");
  1962.  
  1963.          when N_Task_Type_Declaration =>
  1964.             Write_Indent_Str ("task type ");
  1965.             Write_Id (Defining_Identifier (Node));
  1966.             Sprint_Opt_Paren_Comma_List
  1967.               (Discriminant_Specifications (Node));
  1968.             if Present (Task_Definition (Node)) then
  1969.                Write_Str (" is");
  1970.                Sprint_Node (Task_Definition (Node));
  1971.                Write_Id (Defining_Identifier (Node));
  1972.             end if;
  1973.  
  1974.             Write_Char (';');
  1975.  
  1976.          when N_Terminate_Alternative =>
  1977.             Write_Indent;
  1978.  
  1979.             if Present (Condition (Node)) then
  1980.                Write_Str_With_Col_Check ("when ");
  1981.                Sprint_Node (Condition (Node));
  1982.                Write_Str (" => ");
  1983.             end if;
  1984.  
  1985.             Write_Str_With_Col_Check ("terminate;");
  1986.  
  1987.          when N_Timed_Entry_Call =>
  1988.             Write_Indent_Str ("select");
  1989.             Indent_Begin;
  1990.             Sprint_Node (Entry_Call_Alternative (Node));
  1991.             Indent_End;
  1992.             Write_Indent_Str ("or");
  1993.             Indent_Begin;
  1994.             Sprint_Node (Delay_Alternative (Node));
  1995.             Indent_End;
  1996.             Write_Indent_Str ("end select;");
  1997.  
  1998.          when N_Triggering_Alternative =>
  1999.             Sprint_Node (Triggering_Statement (Node));
  2000.             Sprint_Node_List (Statements (Node));
  2001.  
  2002.          when N_Type_Conversion =>
  2003.             Sprint_Node (Subtype_Mark (Node));
  2004.  
  2005.             if Float_Truncate (Node) then
  2006.                pragma Assert (not Pure_Ada);
  2007.  
  2008.                if Conversion_OK (Node) then
  2009.                   Write_Str_With_Col_Check ("?^(");
  2010.                else
  2011.                   Write_Str_With_Col_Check ("^(");
  2012.                end if;
  2013.  
  2014.             elsif Conversion_OK (Node) then
  2015.                pragma Assert (not Pure_Ada);
  2016.                Write_Str_With_Col_Check ("?(");
  2017.  
  2018.             else
  2019.                Write_Str_With_Col_Check (" (");
  2020.             end if;
  2021.  
  2022.             Sprint_Node (Expression (Node));
  2023.             Write_Char (')');
  2024.  
  2025.          when N_Unchecked_Type_Conversion =>
  2026.             pragma Assert (not Pure_Ada);
  2027.             Sprint_Node (Subtype_Mark (Node));
  2028.             Write_Char ('!');
  2029.             Write_Str_With_Col_Check ("(");
  2030.             Sprint_Node (Expression (Node));
  2031.             Write_Char (')');
  2032.  
  2033.          when N_Unconstrained_Array_Definition =>
  2034.             Write_Str_With_Col_Check ("array (");
  2035.  
  2036.             declare
  2037.                Node1 : Node_Id := First (Subtype_Marks (Node));
  2038.             begin
  2039.                loop
  2040.                   Sprint_Node (Node1);
  2041.                   Write_Str_With_Col_Check (" range <>");
  2042.                   Node1 := Next (Node1);
  2043.                   exit when Node1 = Empty;
  2044.                   Write_Str (", ");
  2045.                end loop;
  2046.             end;
  2047.  
  2048.             Write_Str (") of ");
  2049.  
  2050.             if Aliased_Present (Node) then
  2051.                Write_Str_With_Col_Check ("aliased ");
  2052.             end if;
  2053.  
  2054.             Sprint_Node (Subtype_Indication (Node));
  2055.  
  2056.          when N_Unused_At_Start | N_Unused_At_End =>
  2057.             Write_Indent_Str ("***** Error, unused node encountered *****");
  2058.             Write_Eol;
  2059.  
  2060.          when N_Use_Package_Clause =>
  2061.             Write_Indent_Str ("use ");
  2062.             Sprint_Comma_List (Names (Node));
  2063.             Write_Char (';');
  2064.  
  2065.          when N_Use_Type_Clause =>
  2066.             Write_Indent_Str ("use type ");
  2067.             Sprint_Comma_List (Subtype_Marks (Node));
  2068.             Write_Char (';');
  2069.  
  2070.          when N_Variant =>
  2071.             Write_Indent_Str ("when ");
  2072.             Sprint_Bar_List (Discrete_Choices (Node));
  2073.             Write_Str (" => ");
  2074.             Sprint_Node (Component_List (Node));
  2075.  
  2076.          when N_Variant_Part =>
  2077.             Indent_Begin;
  2078.             Write_Indent_Str ("case ");
  2079.             Sprint_Node (Name (Node));
  2080.             Write_Str (" is ");
  2081.             Sprint_Indented_List (Variants (Node));
  2082.  
  2083.          when N_With_Clause =>
  2084.             if First_Name (Node) or else not Dump_Original_Only then
  2085.                Write_Indent_Str ("with ");
  2086.             else
  2087.                Write_Str (", ");
  2088.             end if;
  2089.  
  2090.             Sprint_Node (Name (Node));
  2091.  
  2092.             if Last_Name (Node) or else not Dump_Original_Only then
  2093.                Write_Char (';');
  2094.             end if;
  2095.  
  2096.       end case;
  2097.  
  2098.       for J in 1 .. Paren_Count (Node) loop
  2099.          Write_Char (')');
  2100.       end loop;
  2101.  
  2102.    end Sprint_Node_Actual;
  2103.  
  2104.    ----------------------
  2105.    -- Sprint_Node_List --
  2106.    ----------------------
  2107.  
  2108.    procedure Sprint_Node_List (List : List_Id) is
  2109.       Node : Node_Id;
  2110.  
  2111.    begin
  2112.       if Is_Non_Empty_List (List) then
  2113.          Node := First (List);
  2114.  
  2115.          loop
  2116.             Sprint_Node (Node);
  2117.             Node := Next (Node);
  2118.             exit when Node = Empty;
  2119.          end loop;
  2120.       end if;
  2121.    end Sprint_Node_List;
  2122.  
  2123.    --------------------------
  2124.    -- Sprint_Node_Pure_Ada --
  2125.    --------------------------
  2126.  
  2127.    procedure Sprint_Node_Pure_Ada (Node : Node_Id) is
  2128.       Saved_Dump_Original_Only : constant Boolean := Dump_Original_Only;
  2129.  
  2130.    begin
  2131.       Pure_Ada := True;
  2132.       Dump_Original_Only := True;
  2133.       Sprint_Node (Node);
  2134.       Dump_Original_Only := Saved_Dump_Original_Only;
  2135.       Pure_Ada := False;
  2136.    end Sprint_Node_Pure_Ada;
  2137.  
  2138.    ---------------------
  2139.    -- Sprint_Opt_Node --
  2140.    ---------------------
  2141.  
  2142.    procedure Sprint_Opt_Node (Node : Node_Id) is
  2143.    begin
  2144.       if Present (Node) then
  2145.          Write_Char (' ');
  2146.          Sprint_Node (Node);
  2147.       end if;
  2148.    end Sprint_Opt_Node;
  2149.  
  2150.    --------------------------
  2151.    -- Sprint_Opt_Node_List --
  2152.    --------------------------
  2153.  
  2154.    procedure Sprint_Opt_Node_List (List : List_Id) is
  2155.    begin
  2156.       if Present (List) then
  2157.          Sprint_Node_List (List);
  2158.       end if;
  2159.    end Sprint_Opt_Node_List;
  2160.  
  2161.    ---------------------------------
  2162.    -- Sprint_Opt_Paren_Comma_List --
  2163.    ---------------------------------
  2164.  
  2165.    procedure Sprint_Opt_Paren_Comma_List (List : List_Id) is
  2166.    begin
  2167.       if Present (List) then
  2168.          Write_Char (' ');
  2169.          Sprint_Paren_Comma_List (List);
  2170.       end if;
  2171.    end Sprint_Opt_Paren_Comma_List;
  2172.  
  2173.    -----------------------------
  2174.    -- Sprint_Paren_Comma_List --
  2175.    -----------------------------
  2176.  
  2177.    procedure Sprint_Paren_Comma_List (List : List_Id) is
  2178.    begin
  2179.       if Is_Non_Empty_List (List) then
  2180.          Write_Str_With_Col_Check ("(");
  2181.          Sprint_Comma_List (List);
  2182.          Write_Char (')');
  2183.       end if;
  2184.    end Sprint_Paren_Comma_List;
  2185.  
  2186.    -----------------
  2187.    -- Write_Ekind --
  2188.    -----------------
  2189.  
  2190.    procedure Write_Ekind (E : Entity_Id) is
  2191.       S : constant String := Entity_Kind'Image (Ekind (E));
  2192.  
  2193.    begin
  2194.       Name_Len := S'Length;
  2195.       Name_Buffer (1 .. Name_Len) := S;
  2196.       Set_Casing (Mixed_Case);
  2197.       Write_Str_With_Col_Check (Name_Buffer (1 .. Name_Len));
  2198.    end Write_Ekind;
  2199.  
  2200.    --------------
  2201.    -- Write_Id --
  2202.    --------------
  2203.  
  2204.    procedure Write_Id (N : Node_Id) is
  2205.    begin
  2206.       Write_Name_With_Col_Check (Chars (N));
  2207.    end Write_Id;
  2208.  
  2209.    -----------------------
  2210.    -- Write_Identifiers --
  2211.    -----------------------
  2212.  
  2213.    function Write_Identifiers (Node : Node_Id) return Boolean is
  2214.    begin
  2215.       --  If we are printing the original tree, and this is not the first
  2216.       --  defining identifier in the list, then we must output a comma to
  2217.       --  separate this name from the list.
  2218.  
  2219.       if Dump_Original_Only and then Prev_Ids (Node) then
  2220.          Write_Str (", ");
  2221.       end if;
  2222.  
  2223.       Sprint_Node (Defining_Identifier (Node));
  2224.  
  2225.       --  The remainder of the declaration must be printed unless we are
  2226.       --  printing the original tree and this is not the last identifier
  2227.  
  2228.       return
  2229.          not Dump_Original_Only or else not More_Ids (Node);
  2230.  
  2231.    end Write_Identifiers;
  2232.  
  2233.    ------------------------
  2234.    -- Write_Implicit_Def --
  2235.    ------------------------
  2236.  
  2237.    procedure Write_Implicit_Def (E : Entity_Id) is
  2238.       Ind : Node_Id;
  2239.  
  2240.    begin
  2241.       case Ekind (E) is
  2242.          when E_Array_Subtype =>
  2243.             Write_Str_With_Col_Check ("subtype ");
  2244.             Write_Id (E);
  2245.             Write_Str_With_Col_Check (" is ");
  2246.             Write_Id (Base_Type (E));
  2247.             Write_Str_With_Col_Check (" (");
  2248.  
  2249.             Ind := First_Index (E);
  2250.  
  2251.             while Present (Ind) loop
  2252.                Sprint_Node (Ind);
  2253.                Ind := Next_Index (Ind);
  2254.  
  2255.                if Present (Ind) then
  2256.                   Write_Str (", ");
  2257.                end if;
  2258.             end loop;
  2259.  
  2260.             Write_Str (");");
  2261.  
  2262.          when E_Signed_Integer_Subtype | E_Enumeration_Subtype =>
  2263.             Write_Str_With_Col_Check ("subtype ");
  2264.             Write_Id (E);
  2265.             Write_Str (" is ");
  2266.             Write_Id (Etype (E));
  2267.             Write_Str_With_Col_Check (" range ");
  2268.             Sprint_Node (Scalar_Range (E));
  2269.             Write_Str (";");
  2270.  
  2271.          when others =>
  2272.             Write_Str_With_Col_Check ("type ");
  2273.             Write_Id (E);
  2274.             Write_Str_With_Col_Check (" is <");
  2275.             Write_Ekind (E);
  2276.             Write_Str (">;");
  2277.       end case;
  2278.  
  2279.    end Write_Implicit_Def;
  2280.  
  2281.    ------------------
  2282.    -- Write_Indent --
  2283.    ------------------
  2284.  
  2285.    procedure Write_Indent is
  2286.    begin
  2287.       if Indent_Annull_Flag then
  2288.          Indent_Annull_Flag := False;
  2289.       else
  2290.          Write_Eol;
  2291.          for I in 1 .. Indent loop
  2292.             Write_Char (' ');
  2293.          end loop;
  2294.       end if;
  2295.    end Write_Indent;
  2296.  
  2297.    ------------------------------
  2298.    -- Write_Indent_Identifiers --
  2299.    ------------------------------
  2300.  
  2301.    function Write_Indent_Identifiers (Node : Node_Id)
  2302.      return Boolean is
  2303.    begin
  2304.       --  We need to start a new line for every node, except in the case
  2305.       --  where we are printing the original tree and this is not the first
  2306.       --  defining identifier in the list.
  2307.  
  2308.       if not Dump_Original_Only or else not Prev_Ids (Node) then
  2309.          Write_Indent;
  2310.  
  2311.       --  If printing original tree and this is not the first defining
  2312.       --  identifier in the list, then the previous call to this procedure
  2313.       --  printed only the name, and we add a comma to separate the names.
  2314.  
  2315.       else
  2316.          Write_Str (", ");
  2317.       end if;
  2318.  
  2319.       Sprint_Node (Defining_Identifier (Node));
  2320.  
  2321.       --  The remainder of the declaration must be printed unless we are
  2322.       --  printing the original tree and this is not the last identifier
  2323.  
  2324.       return
  2325.          not Dump_Original_Only or else not More_Ids (Node);
  2326.  
  2327.    end Write_Indent_Identifiers;
  2328.  
  2329.    ----------------------
  2330.    -- Write_Indent_Str --
  2331.    ----------------------
  2332.  
  2333.    procedure Write_Indent_Str (S : String) is
  2334.    begin
  2335.       Write_Indent;
  2336.       Write_Str (S);
  2337.    end Write_Indent_Str;
  2338.  
  2339.    -------------------------------
  2340.    -- Write_Name_With_Col_Check --
  2341.    -------------------------------
  2342.  
  2343.    procedure Write_Name_With_Col_Check (N : Name_Id) is
  2344.    begin
  2345.       Get_Name_String (N);
  2346.       Write_Str_With_Col_Check (Name_Buffer (1 .. Name_Len));
  2347.    end Write_Name_With_Col_Check;
  2348.  
  2349.    ------------------------------------------
  2350.    -- Write_Operator_Symbol_With_Col_Check --
  2351.    ------------------------------------------
  2352.  
  2353.    procedure Write_Operator_Symbol_With_Col_Check (N : Name_Id) is
  2354.    begin
  2355.       case N is
  2356.          when Name_Op_Abs =>
  2357.             Name_Buffer (1) := '"';
  2358.             Name_Buffer (2) := 'a';
  2359.             Name_Buffer (3) := 'b';
  2360.             Name_Buffer (4) := 's';
  2361.             Name_Buffer (5) := '"';
  2362.             Name_Len := 5;
  2363.  
  2364.          when Name_Op_And =>
  2365.             Name_Buffer (1) := '"';
  2366.             Name_Buffer (2) := 'a';
  2367.             Name_Buffer (3) := 'n';
  2368.             Name_Buffer (4) := 'd';
  2369.             Name_Buffer (5) := '"';
  2370.             Name_Len := 5;
  2371.  
  2372.          when Name_Op_Mod =>
  2373.             Name_Buffer (1) := '"';
  2374.             Name_Buffer (2) := 'm';
  2375.             Name_Buffer (3) := 'o';
  2376.             Name_Buffer (4) := 'd';
  2377.             Name_Buffer (5) := '"';
  2378.             Name_Len := 5;
  2379.  
  2380.          when Name_Op_Not =>
  2381.             Name_Buffer (1) := '"';
  2382.             Name_Buffer (2) := 'n';
  2383.             Name_Buffer (3) := 'o';
  2384.             Name_Buffer (4) := 't';
  2385.             Name_Buffer (5) := '"';
  2386.             Name_Len := 5;
  2387.  
  2388.          when Name_Op_Or =>
  2389.             Name_Buffer (1) := '"';
  2390.             Name_Buffer (2) := 'o';
  2391.             Name_Buffer (3) := 'r';
  2392.             Name_Buffer (4) := '"';
  2393.             Name_Len := 4;
  2394.  
  2395.          when Name_Op_Rem =>
  2396.             Name_Buffer (1) := '"';
  2397.             Name_Buffer (2) := 'r';
  2398.             Name_Buffer (3) := 'e';
  2399.             Name_Buffer (4) := 'm';
  2400.             Name_Buffer (5) := '"';
  2401.             Name_Len := 5;
  2402.  
  2403.          when Name_Op_Xor =>
  2404.             Name_Buffer (1) := '"';
  2405.             Name_Buffer (2) := 'x';
  2406.             Name_Buffer (3) := 'o';
  2407.             Name_Buffer (4) := 'r';
  2408.             Name_Buffer (5) := '"';
  2409.             Name_Len := 5;
  2410.  
  2411.          when Name_Op_Eq =>
  2412.             Name_Buffer (1) := '"';
  2413.             Name_Buffer (2) := '=';
  2414.             Name_Buffer (3) := '"';
  2415.             Name_Len := 3;
  2416.  
  2417.          when Name_Op_Ne =>
  2418.             Name_Buffer (1) := '"';
  2419.             Name_Buffer (2) := '/';
  2420.             Name_Buffer (3) := '=';
  2421.             Name_Buffer (4) := '"';
  2422.             Name_Len := 4;
  2423.  
  2424.          when Name_Op_Lt =>
  2425.             Name_Buffer (1) := '"';
  2426.             Name_Buffer (2) := '<';
  2427.             Name_Buffer (3) := '"';
  2428.             Name_Len := 3;
  2429.  
  2430.          when Name_Op_Le =>
  2431.             Name_Buffer (1) := '"';
  2432.             Name_Buffer (2) := '<';
  2433.             Name_Buffer (3) := '=';
  2434.             Name_Buffer (4) := '"';
  2435.             Name_Len := 4;
  2436.  
  2437.          when Name_Op_Gt =>
  2438.             Name_Buffer (1) := '"';
  2439.             Name_Buffer (2) := '>';
  2440.             Name_Buffer (3) := '"';
  2441.             Name_Len := 3;
  2442.  
  2443.          when Name_Op_Ge =>
  2444.             Name_Buffer (1) := '"';
  2445.             Name_Buffer (2) := '>';
  2446.             Name_Buffer (3) := '=';
  2447.             Name_Buffer (4) := '"';
  2448.             Name_Len := 4;
  2449.  
  2450.          when Name_Op_Add =>
  2451.             Name_Buffer (1) := '"';
  2452.             Name_Buffer (2) := '+';
  2453.             Name_Buffer (3) := '"';
  2454.             Name_Len := 3;
  2455.  
  2456.          when Name_Op_Subtract =>
  2457.             Name_Buffer (1) := '"';
  2458.             Name_Buffer (2) := '-';
  2459.             Name_Buffer (3) := '"';
  2460.             Name_Len := 3;
  2461.  
  2462.          when Name_Op_Concat =>
  2463.             Name_Buffer (1) := '"';
  2464.             Name_Buffer (2) := '&';
  2465.             Name_Buffer (3) := '"';
  2466.             Name_Len := 3;
  2467.  
  2468.          when Name_Op_Multiply =>
  2469.             Name_Buffer (1) := '"';
  2470.             Name_Buffer (2) := '*';
  2471.             Name_Buffer (3) := '"';
  2472.             Name_Len := 3;
  2473.  
  2474.          when Name_Op_Divide =>
  2475.             Name_Buffer (1) := '"';
  2476.             Name_Buffer (2) := '/';
  2477.             Name_Buffer (3) := '"';
  2478.             Name_Len := 3;
  2479.  
  2480.          when Name_Op_Expon =>
  2481.             Name_Buffer (1) := '"';
  2482.             Name_Buffer (2) := '*';
  2483.             Name_Buffer (3) := '*';
  2484.             Name_Buffer (4) := '"';
  2485.             Name_Len := 4;
  2486.  
  2487.          when others =>
  2488.             Get_Name_String (N);
  2489.       end case;
  2490.  
  2491.       Write_Str_With_Col_Check (Name_Buffer (1 .. Name_Len));
  2492.    end Write_Operator_Symbol_With_Col_Check;
  2493.  
  2494.    -----------------------
  2495.    -- Write_Param_Specs --
  2496.    -----------------------
  2497.  
  2498.    procedure Write_Param_Specs (N : Node_Id) is
  2499.       Specs : List_Id;
  2500.       Spec  : Node_Id;
  2501.  
  2502.    begin
  2503.       Specs := Parameter_Specifications (N);
  2504.  
  2505.       if Present (Specs) then
  2506.          Write_Str_With_Col_Check (" (");
  2507.          Spec := First (Specs);
  2508.  
  2509.          loop
  2510.             Sprint_Node (Spec);
  2511.             Spec := Next (Spec);
  2512.             exit when Spec = Empty;
  2513.  
  2514.             --  Add semicolon, unless we are printing original tree and the
  2515.             --  next specification is part of a list (but not the first
  2516.             --  element of that list)
  2517.  
  2518.             if not Dump_Original_Only or else not Prev_Ids (Spec) then
  2519.                Write_Str ("; ");
  2520.             end if;
  2521.          end loop;
  2522.  
  2523.          Write_Char (')');
  2524.       end if;
  2525.    end Write_Param_Specs;
  2526.  
  2527.    --------------------------
  2528.    -- Write_Rewrite_Str --
  2529.    --------------------------
  2530.  
  2531.    procedure Write_Rewrite_Str (S : String) is
  2532.    begin
  2533.       if not Dump_Generated_Only then
  2534.          if S'Length = 1 and then S (1) = '}' then
  2535.             Write_Char ('}');
  2536.          else
  2537.             Write_Str_With_Col_Check (S);
  2538.          end if;
  2539.       end if;
  2540.    end Write_Rewrite_Str;
  2541.  
  2542.    ------------------------------
  2543.    -- Write_Str_With_Col_Check --
  2544.    ------------------------------
  2545.  
  2546.    procedure Write_Str_With_Col_Check (S : String) is
  2547.    begin
  2548.       if Int (S'Last) + Column > Line_Limit then
  2549.          Write_Indent_Str ("  ");
  2550.  
  2551.          if S (1) = ' ' then
  2552.             Write_Str (S (2 .. S'Length));
  2553.          else
  2554.             Write_Str (S);
  2555.          end if;
  2556.  
  2557.       else
  2558.          Write_Str (S);
  2559.       end if;
  2560.    end Write_Str_With_Col_Check;
  2561.  
  2562.    -------------------------------
  2563.    -- Write_Uint_With_Col_Check --
  2564.    -------------------------------
  2565.  
  2566.    procedure Write_Uint_With_Col_Check (U : Uint) is
  2567.    begin
  2568.       if Column + UI_Decimal_Digits_Hi (U) > Line_Limit then
  2569.          Write_Indent_Str ("  ");
  2570.       end if;
  2571.  
  2572.       UI_Write (U);
  2573.    end Write_Uint_With_Col_Check;
  2574.  
  2575.    --------------------------------
  2576.    -- Write_Ureal_With_Col_Check --
  2577.    --------------------------------
  2578.  
  2579.    procedure Write_Ureal_With_Col_Check (U : Ureal) is
  2580.       D : constant Uint := Denominator (U);
  2581.       N : constant Uint := Numerator (U);
  2582.  
  2583.    begin
  2584.       if Column + UI_Decimal_Digits_Hi (D) +
  2585.         UI_Decimal_Digits_Hi (N) > Line_Limit
  2586.       then
  2587.          Write_Indent_Str ("  ");
  2588.       end if;
  2589.  
  2590.       UR_Write (U);
  2591.    end Write_Ureal_With_Col_Check;
  2592.  
  2593. end Sprint;
  2594.