------------------------------------------------------------------------------
--                                                                          --
--                         GNAT COMPILER COMPONENTS                         --
--                                                                          --
--                              S T Y L E S W                               --
--                                                                          --
--                                 B o d y                                  --
--                                                                          --
--          Copyright (C) 1992-2018, Free Software Foundation, Inc.         --
--                                                                          --
-- GNAT is free software;  you can  redistribute it  and/or modify it under --
-- terms of the  GNU General Public License as published  by the Free Soft- --
-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
-- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
-- for  more details.  You should have  received  a copy of the GNU General --
-- Public License  distributed with GNAT; see file COPYING3.  If not, go to --
-- http://www.gnu.org/licenses for a complete copy of the license.          --
--                                                                          --
-- GNAT was originally developed  by the GNAT team at  New York University. --
-- Extensive contributions were provided by Ada Core Technologies Inc.      --
--                                                                          --
------------------------------------------------------------------------------

with Hostparm; use Hostparm;
with Opt;      use Opt;
with Output;   use Output;

package body Stylesw is

   --  The following constant defines the default style options for -gnaty

   Default_Style : constant String :=
                     "3" &  -- indentation level is 3
                     "a" &  -- check attribute casing
                     "A" &  -- check array attribute indexes
                     "b" &  -- check no blanks at end of lines
                     "c" &  -- check comment formats
                     "e" &  -- check end/exit labels present
                     "f" &  -- check no form/feeds vertical tabs in source
                     "h" &  -- check no horizontal tabs in source
                     "i" &  -- check if-then layout
                     "k" &  -- check casing rules for keywords
                     "l" &  -- check reference manual layout
                     "m" &  -- check line length <= 79 characters
                     "n" &  -- check casing of package Standard idents
                     "p" &  -- check pragma casing
                     "r" &  -- check casing for identifier references
                     "s" &  -- check separate subprogram specs present
                     "t";   -- check token separation rules

   --  The following constant defines the GNAT style options, showing them
   --  as additions to the standard default style check options.

   GNAT_Style    : constant String := Default_Style &
                     "d" &  -- check no DOS line terminators
                     "I" &  -- check mode IN
                     "S" &  -- check separate lines after THEN or ELSE
                     "u" &  -- check no unnecessary blank lines
                     "x";   -- check extra parentheses around conditionals

   --  Note: we intend GNAT_Style to also include the following, but we do
   --  not yet have the whole tool suite clean with respect to this.

   --                "B" &  -- check boolean operators

   -------------------------------
   -- Reset_Style_Check_Options --
   -------------------------------

   procedure Reset_Style_Check_Options is
   begin
      Style_Check_Indentation           := 0;
      Style_Check_Array_Attribute_Index := False;
      Style_Check_Attribute_Casing      := False;
      Style_Check_Blanks_At_End         := False;
      Style_Check_Blank_Lines           := False;
      Style_Check_Boolean_And_Or        := False;
      Style_Check_Comments              := False;
      Style_Check_DOS_Line_Terminator   := False;
      Style_Check_End_Labels            := False;
      Style_Check_Form_Feeds            := False;
      Style_Check_Horizontal_Tabs       := False;
      Style_Check_If_Then_Layout        := False;
      Style_Check_Keyword_Casing        := False;
      Style_Check_Layout                := False;
      Style_Check_Max_Line_Length       := False;
      Style_Check_Max_Nesting_Level     := False;
      Style_Check_Missing_Overriding    := False;
      Style_Check_Mode_In               := False;
      Style_Check_Order_Subprograms     := False;
      Style_Check_Pragma_Casing         := False;
      Style_Check_References            := False;
      Style_Check_Separate_Stmt_Lines   := False;
      Style_Check_Specs                 := False;
      Style_Check_Standard              := False;
      Style_Check_Tokens                := False;
      Style_Check_Xtra_Parens           := False;
   end Reset_Style_Check_Options;

   ---------------------
   -- RM_Column_Check --
   ---------------------

   function RM_Column_Check return Boolean is
   begin
      return Style_Check and Style_Check_Layout;
   end RM_Column_Check;

   ------------------------------
   -- Save_Style_Check_Options --
   ------------------------------

   procedure Save_Style_Check_Options (Options : out Style_Check_Options) is
      P : Natural := 0;

      procedure Add (C : Character; S : Boolean);
      --  Add given character C to string if switch S is true

      procedure Add_Nat (N : Nat);
      --  Add given natural number to string

      ---------
      -- Add --
      ---------

      procedure Add (C : Character; S : Boolean) is
      begin
         if S then
            P := P + 1;
            Options (P) := C;
         end if;
      end Add;

      -------------
      -- Add_Nat --
      -------------

      procedure Add_Nat (N : Nat) is
      begin
         if N > 9 then
            Add_Nat (N / 10);
         end if;

         P := P + 1;
         Options (P) := Character'Val (Character'Pos ('0') + N mod 10);
      end Add_Nat;

   --  Start of processing for Save_Style_Check_Options

   begin
      Add (Character'Val (Style_Check_Indentation + Character'Pos ('0')),
           Style_Check_Indentation /= 0);

      Add ('a', Style_Check_Attribute_Casing);
      Add ('A', Style_Check_Array_Attribute_Index);
      Add ('b', Style_Check_Blanks_At_End);
      Add ('B', Style_Check_Boolean_And_Or);

      if Style_Check_Comments then
         if Style_Check_Comments_Spacing = 2 then
            Add ('c', Style_Check_Comments);
         else
            pragma Assert (Style_Check_Comments_Spacing = 1);
            Add ('C', Style_Check_Comments);
         end if;
      end if;

      Add ('d', Style_Check_DOS_Line_Terminator);
      Add ('e', Style_Check_End_Labels);
      Add ('f', Style_Check_Form_Feeds);
      Add ('h', Style_Check_Horizontal_Tabs);
      Add ('i', Style_Check_If_Then_Layout);
      Add ('I', Style_Check_Mode_In);
      Add ('k', Style_Check_Keyword_Casing);
      Add ('l', Style_Check_Layout);
      Add ('n', Style_Check_Standard);
      Add ('o', Style_Check_Order_Subprograms);
      Add ('O', Style_Check_Missing_Overriding);
      Add ('p', Style_Check_Pragma_Casing);
      Add ('r', Style_Check_References);
      Add ('s', Style_Check_Specs);
      Add ('S', Style_Check_Separate_Stmt_Lines);
      Add ('t', Style_Check_Tokens);
      Add ('u', Style_Check_Blank_Lines);
      Add ('x', Style_Check_Xtra_Parens);

      if Style_Check_Max_Line_Length then
         P := P + 1;
         Options (P) := 'M';
         Add_Nat (Style_Max_Line_Length);
      end if;

      if Style_Check_Max_Nesting_Level then
         P := P + 1;
         Options (P) := 'L';
         Add_Nat (Style_Max_Nesting_Level);
      end if;

      pragma Assert (P <= Options'Last);

      while P < Options'Last loop
         P := P + 1;
         Options (P) := ' ';
      end loop;
   end Save_Style_Check_Options;

   -------------------------------------
   -- Set_Default_Style_Check_Options --
   -------------------------------------

   procedure Set_Default_Style_Check_Options is
   begin
      Reset_Style_Check_Options;
      Set_Style_Check_Options (Default_Style);
   end Set_Default_Style_Check_Options;

   ----------------------------------
   -- Set_GNAT_Style_Check_Options --
   ----------------------------------

   procedure Set_GNAT_Style_Check_Options is
   begin
      Reset_Style_Check_Options;
      Set_Style_Check_Options (GNAT_Style);
   end Set_GNAT_Style_Check_Options;

   -----------------------------
   -- Set_Style_Check_Options --
   -----------------------------

   --  Version used when no error checking is required

   procedure Set_Style_Check_Options (Options : String) is
      OK : Boolean;
      EC : Natural;
      pragma Warnings (Off, EC);
   begin
      Set_Style_Check_Options (Options, OK, EC);
      pragma Assert (OK);
   end Set_Style_Check_Options;

   --  Normal version with error checking

   procedure Set_Style_Check_Options
     (Options  : String;
      OK       : out Boolean;
      Err_Col  : out Natural)
   is
      C : Character;

      On : Boolean := True;
      --  Set to False if minus encountered
      --  Set to True if plus encountered

      Last_Option : Character := ' ';
      --  Set to last character encountered

      procedure Add_Img (N : Natural);
      --  Concatenates image of N at end of Style_Msg_Buf

      procedure Bad_Style_Switch (Msg : String);
      --  Called if bad style switch found. Msg is set in Style_Msg_Buf and
      --  Style_Msg_Len. OK is set False.

      -------------
      -- Add_Img --
      -------------

      procedure Add_Img (N : Natural) is
      begin
         if N >= 10 then
            Add_Img (N / 10);
         end if;

         Style_Msg_Len := Style_Msg_Len + 1;
         Style_Msg_Buf (Style_Msg_Len) :=
           Character'Val (N mod 10 + Character'Pos ('0'));
      end Add_Img;

      ----------------------
      -- Bad_Style_Switch --
      ----------------------

      procedure Bad_Style_Switch (Msg : String) is
      begin
         OK := False;
         Style_Msg_Len := Msg'Length;
         Style_Msg_Buf (1 .. Style_Msg_Len) := Msg;
      end Bad_Style_Switch;

   --  Start of processing for Set_Style_Check_Options

   begin
      Err_Col := Options'First;
      while Err_Col <= Options'Last loop
         C := Options (Err_Col);
         Last_Option := C;
         Err_Col := Err_Col + 1;

         --  Turning switches on

         if On then
            case C is
            when '+' =>
               null;

            when '-' =>
               On := False;

            when '0' .. '9' =>
               Style_Check_Indentation :=
                 Character'Pos (C) - Character'Pos ('0');

            when 'a' =>
               Style_Check_Attribute_Casing      := True;

            when 'A' =>
               Style_Check_Array_Attribute_Index := True;

            when 'b' =>
               Style_Check_Blanks_At_End         := True;

            when 'B' =>
               Style_Check_Boolean_And_Or        := True;

            when 'c' =>
               Style_Check_Comments              := True;
               Style_Check_Comments_Spacing      := 2;

            when 'C' =>
               Style_Check_Comments              := True;
               Style_Check_Comments_Spacing      := 1;

            when 'd' =>
               Style_Check_DOS_Line_Terminator   := True;

            when 'e' =>
               Style_Check_End_Labels            := True;

            when 'f' =>
               Style_Check_Form_Feeds            := True;

            when 'g' =>
               Set_GNAT_Style_Check_Options;

            when 'h' =>
               Style_Check_Horizontal_Tabs       := True;

            when 'i' =>
               Style_Check_If_Then_Layout        := True;

            when 'I' =>
               Style_Check_Mode_In               := True;

            when 'k' =>
               Style_Check_Keyword_Casing        := True;

            when 'l' =>
               Style_Check_Layout                := True;

            when 'L' =>
               Style_Max_Nesting_Level := 0;

               if Err_Col > Options'Last
                 or else Options (Err_Col) not in '0' .. '9'
               then
                  Bad_Style_Switch ("invalid nesting level");
                  return;
               end if;

               loop
                  Style_Max_Nesting_Level :=
                    Style_Max_Nesting_Level * 10 +
                      Character'Pos (Options (Err_Col)) - Character'Pos ('0');

                  if Style_Max_Nesting_Level > 999 then
                     Bad_Style_Switch
                       ("max nesting level (999) exceeded in style check");
                     return;
                  end if;

                  Err_Col := Err_Col + 1;
                  exit when Err_Col > Options'Last
                    or else Options (Err_Col) not in '0' .. '9';
               end loop;

               Style_Check_Max_Nesting_Level := Style_Max_Nesting_Level /= 0;

            when 'm' =>
               Style_Check_Max_Line_Length       := True;
               Style_Max_Line_Length             := 79;

            when 'M' =>
               Style_Max_Line_Length             := 0;

               if Err_Col > Options'Last
                 or else Options (Err_Col) not in '0' .. '9'
               then
                  Bad_Style_Switch
                    ("invalid line length in style check");
                  return;
               end if;

               loop
                  Style_Max_Line_Length :=
                    Style_Max_Line_Length * 10 +
                      Character'Pos (Options (Err_Col)) - Character'Pos ('0');

                  if Style_Max_Line_Length > Int (Max_Line_Length) then
                     OK := False;
                     Style_Msg_Buf (1 .. 27) := "max line length allowed is ";
                     Style_Msg_Len := 27;
                     Add_Img (Natural (Max_Line_Length));
                     return;
                  end if;

                  Err_Col := Err_Col + 1;
                  exit when Err_Col > Options'Last
                    or else Options (Err_Col) not in '0' .. '9';
               end loop;

               Style_Check_Max_Line_Length       := Style_Max_Line_Length /= 0;

            when 'n' =>
               Style_Check_Standard              := True;

            when 'N' =>
               Reset_Style_Check_Options;

            when 'o' =>
               Style_Check_Order_Subprograms     := True;

            when 'O' =>
               Style_Check_Missing_Overriding    := True;

            when 'p' =>
               Style_Check_Pragma_Casing         := True;

            when 'r' =>
               Style_Check_References            := True;

            when 's' =>
               Style_Check_Specs                 := True;

            when 'S' =>
               Style_Check_Separate_Stmt_Lines   := True;

            when 't' =>
               Style_Check_Tokens                := True;

            when 'u' =>
               Style_Check_Blank_Lines           := True;

            when 'x' =>
               Style_Check_Xtra_Parens           := True;

            when 'y' =>
               Set_Default_Style_Check_Options;

            when ' ' =>
               null;

            when others =>
               if Ignore_Unrecognized_VWY_Switches then
                  Write_Line ("unrecognized switch -gnaty" & C & " ignored");
               else
                  Err_Col := Err_Col - 1;
                  Bad_Style_Switch ("invalid style switch");
                  return;
               end if;
            end case;

         --  Turning switches off

         else
            case C is
            when '+' =>
               On := True;

            when '-' =>
               null;

            when '0' .. '9' =>
               Style_Check_Indentation := 0;

            when 'a' =>
               Style_Check_Attribute_Casing      := False;

            when 'A' =>
               Style_Check_Array_Attribute_Index := False;

            when 'b' =>
               Style_Check_Blanks_At_End         := False;

            when 'B' =>
               Style_Check_Boolean_And_Or        := False;

            when 'c' | 'C' =>
               Style_Check_Comments              := False;

            when 'd' =>
               Style_Check_DOS_Line_Terminator   := False;

            when 'e' =>
               Style_Check_End_Labels            := False;

            when 'f' =>
               Style_Check_Form_Feeds            := False;

            when 'g' =>
               Reset_Style_Check_Options;

            when 'h' =>
               Style_Check_Horizontal_Tabs       := False;

            when 'i' =>
               Style_Check_If_Then_Layout        := False;

            when 'I' =>
               Style_Check_Mode_In               := False;

            when 'k' =>
               Style_Check_Keyword_Casing        := False;

            when 'l' =>
               Style_Check_Layout                := False;

            when 'L' =>
               Style_Max_Nesting_Level := 0;

            when 'm' =>
               Style_Check_Max_Line_Length       := False;

            when 'M' =>
               Style_Max_Line_Length             := 0;
               Style_Check_Max_Line_Length       := False;

            when 'n' =>
               Style_Check_Standard              := False;

            when 'o' =>
               Style_Check_Order_Subprograms     := False;

            when 'O' =>
               Style_Check_Missing_Overriding    := False;

            when 'p' =>
               Style_Check_Pragma_Casing         := False;

            when 'r' =>
               Style_Check_References            := False;

            when 's' =>
               Style_Check_Specs                 := False;

            when 'S' =>
               Style_Check_Separate_Stmt_Lines   := False;

            when 't' =>
               Style_Check_Tokens                := False;

            when 'u' =>
               Style_Check_Blank_Lines           := False;

            when 'x' =>
               Style_Check_Xtra_Parens           := False;

            when ' ' =>
               null;

            when others =>
               if Ignore_Unrecognized_VWY_Switches then
                  Write_Line ("unrecognized switch -gnaty-" & C & " ignored");
               else
                  Err_Col := Err_Col - 1;
                  Bad_Style_Switch ("invalid style switch");
                  return;
               end if;
            end case;
         end if;
      end loop;

      --  Turn on style checking if other than N at end of string

      Style_Check := (Last_Option /= 'N');
      OK := True;
   end Set_Style_Check_Options;
end Stylesw;
