------------------------------------------------------------------------------
--                                                                          --
--                         GNAT COMPILER COMPONENTS                         --
--                                                                          --
--                             S W I T C H - M                              --
--                                                                          --
--                                 B o d y                                  --
--                                                                          --
--          Copyright (C) 2001-2021, 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 Debug;    use Debug;
with Osint;    use Osint;
with Opt;      use Opt;
with Table;

with System.Multiprocessors; use System.Multiprocessors;

package body Switch.M is

   package Normalized_Switches is new Table.Table
     (Table_Component_Type => String_Access,
      Table_Index_Type     => Integer,
      Table_Low_Bound      => 1,
      Table_Initial        => 20,
      Table_Increment      => 100,
      Table_Name           => "Switch.M.Normalized_Switches");
   --  This table is used to keep the normalized switches, so that they may be
   --  reused for subsequent invocations of Normalize_Compiler_Switches with
   --  similar switches.

   Initial_Number_Of_Switches : constant := 10;

   Global_Switches : Argument_List_Access := null;
   --  Used by function Normalize_Compiler_Switches

   Subdirs_Option : constant String := "--subdirs=";

   ---------------------------------
   -- Normalize_Compiler_Switches --
   ---------------------------------

   procedure Normalize_Compiler_Switches
     (Switch_Chars : String;
      Switches     : in out Argument_List_Access;
      Last         : out Natural)
   is
      Switch_Starts_With_Gnat : Boolean;

      Ptr : Integer := Switch_Chars'First;
      Max : constant Integer := Switch_Chars'Last;
      C   : Character := ' ';

      Storing      : String := Switch_Chars;
      First_Stored : Positive := Ptr + 1;
      Last_Stored  : Positive := First_Stored;

      procedure Add_Switch_Component (S : String);
      --  Add a new String_Access component in Switches. If a string equal
      --  to S is already stored in the table Normalized_Switches, use it.
      --  Otherwise add a new component to the table.

      --------------------------
      -- Add_Switch_Component --
      --------------------------

      procedure Add_Switch_Component (S : String) is
      begin
         --  If Switches is null, allocate a new array

         if Switches = null then
            Switches := new Argument_List (1 .. Initial_Number_Of_Switches);

         --  Otherwise, if Switches is full, extend it

         elsif Last = Switches'Last then
            declare
               New_Switches : constant Argument_List_Access :=
                                new Argument_List
                                      (1 .. Switches'Length + Switches'Length);
            begin
               New_Switches (1 .. Switches'Length) := Switches.all;
               Last := Switches'Length;
               Switches := New_Switches;
            end;
         end if;

         --  If this is the first switch, Last designates the first component

         if Last = 0 then
            Last := Switches'First;
         else
            Last := Last + 1;
         end if;

         --  Look into the table Normalized_Switches for a similar string.
         --  If one is found, put it at the added component, and return.

         for Index in 1 .. Normalized_Switches.Last loop
            if S = Normalized_Switches.Table (Index).all then
               Switches (Last) := Normalized_Switches.Table (Index);
               return;
            end if;
         end loop;

         --  No string equal to S was found in the table Normalized_Switches.
         --  Add a new component in the table.

         Switches (Last) := new String'(S);
         Normalized_Switches.Append (Switches (Last));
      end Add_Switch_Component;

   --  Start of processing for Normalize_Compiler_Switches

   begin
      Last := 0;

      if Ptr = Max or else Switch_Chars (Ptr) /= '-' then
         return;
      end if;

      Ptr := Ptr + 1;

      Switch_Starts_With_Gnat :=
         Ptr + 3 <= Max and then Switch_Chars (Ptr .. Ptr + 3) = "gnat";

      if Switch_Starts_With_Gnat then
         Ptr := Ptr + 4;
         First_Stored := Ptr;
      end if;

      while Ptr <= Max loop
         C := Switch_Chars (Ptr);

         --  Processing for a switch

         case Switch_Starts_With_Gnat is
            when False =>

               --  All switches that don't start with -gnat stay as is,
               --  except -pg, -Wall, -k8, -w

               if Switch_Chars = "-pg" or else Switch_Chars = "-p" then

                  --  The gcc driver converts -pg to -p, so that is what
                  --  is stored in the ALI file.

                  Add_Switch_Component ("-p");

               elsif Switch_Chars = "-Wall" then

                  --  The gcc driver adds -gnatwa when -Wall is used

                  Add_Switch_Component ("-gnatwa");
                  Add_Switch_Component ("-Wall");

               elsif Switch_Chars = "-k8" then

                  --  The gcc driver transforms -k8 into -gnatk8

                  Add_Switch_Component ("-gnatk8");

               elsif Switch_Chars = "-w" then

                  --  The gcc driver adds -gnatws when -w is used

                  Add_Switch_Component ("-gnatws");
                  Add_Switch_Component ("-w");

               elsif Switch_Chars'Length > 6
                 and then
                   Switch_Chars (Switch_Chars'First .. Switch_Chars'First + 5)
                                                             = "--RTS="
               then
                  Add_Switch_Component (Switch_Chars);

                  --  When --RTS=mtp is used, the gcc driver adds -mrtp

                  if Switch_Chars = "--RTS=mtp" then
                     Add_Switch_Component ("-mrtp");
                  end if;

               --  Special case for -fstack-check (alias for
               --  -fstack-check=specific)

               elsif Switch_Chars = "-fstack-check" then
                  Add_Switch_Component ("-fstack-check=specific");

               --  Take only into account switches that are transmitted to
               --  gnat1 by the gcc driver and stored by gnat1 in the ALI file.

               else
                  case C is
                     when 'O' | 'W' | 'w' | 'f' | 'd' | 'g' | 'm' =>
                        Add_Switch_Component (Switch_Chars);

                     when others =>
                        null;
                  end case;
               end if;

               return;

            when True =>
               case C is

                  --  One-letter switches

                  when 'a' | 'A' | 'b' | 'B' | 'c' | 'C' | 'E' | 'f' | 'F'
                     | 'g' | 'h' | 'H' | 'I' | 'L' | 'N' | 'p' | 'P' | 'q'
                     | 'Q' | 'r' | 's' | 'S' | 't' | 'u' | 'U' | 'v' | 'x'
                     | 'X' | 'Z'
                  =>
                     Storing (First_Stored) := C;
                     Add_Switch_Component
                       (Storing (Storing'First .. First_Stored));
                     Ptr := Ptr + 1;

                  --  One-letter switches followed by a positive number

                  when 'D' | 'G' | 'j' | 'k' | 'm' | 'T' =>
                     Storing (First_Stored) := C;
                     Last_Stored := First_Stored;

                     if Ptr <= Max and then Switch_Chars (Ptr) = '=' then
                        Ptr := Ptr + 1;
                     end if;

                     loop
                        Ptr := Ptr + 1;
                        exit when Ptr > Max
                          or else Switch_Chars (Ptr) not in '0' .. '9';
                        Last_Stored := Last_Stored + 1;
                        Storing (Last_Stored) := Switch_Chars (Ptr);
                     end loop;

                     Add_Switch_Component
                       (Storing (Storing'First .. Last_Stored));

                  when 'd' =>
                     Storing (First_Stored) := 'd';

                     while Ptr < Max loop
                        Ptr := Ptr + 1;
                        C := Switch_Chars (Ptr);
                        exit when C = ASCII.NUL or else C = '/'
                          or else C = '-';

                        if C in '1' .. '9' or else
                           C in 'a' .. 'z' or else
                           C in 'A' .. 'Z'
                        then
                           Storing (First_Stored + 1) := C;
                           Add_Switch_Component
                             (Storing (Storing'First .. First_Stored + 1));

                        else
                           Last := 0;
                           return;
                        end if;
                     end loop;

                     return;

                  when 'e' =>

                     --  Some of the gnate... switches are not stored

                     Storing (First_Stored) := 'e';
                     Ptr := Ptr + 1;

                     if Ptr > Max then
                        Last := 0;
                        return;

                     else
                        case Switch_Chars (Ptr) is
                           when 'A' =>
                              Ptr := Ptr + 1;
                              Add_Switch_Component ("-gnateA");

                           when 'D' =>
                              Storing (First_Stored + 1 ..
                                         First_Stored + Max - Ptr + 1) :=
                                  Switch_Chars (Ptr .. Max);
                              Add_Switch_Component
                                (Storing (Storing'First ..
                                   First_Stored + Max - Ptr + 1));
                              Ptr := Max + 1;

                           when 'E' | 'F' | 'G' | 'S' | 'u' | 'V' | 'Y' =>
                              Add_Switch_Component
                                ("-gnate" & Switch_Chars (Ptr));
                              Ptr := Ptr + 1;

                           when 'i' | 'I' =>
                              declare
                                 First : constant Positive := Ptr;

                              begin
                                 Ptr := Ptr + 1;

                                 if Ptr <= Max and then
                                   Switch_Chars (Ptr) = '='
                                 then
                                    Ptr := Ptr + 1;
                                 end if;

                                 while Ptr <= Max and then
                                       Switch_Chars (Ptr) in '0' .. '9'
                                 loop
                                    Ptr := Ptr + 1;
                                 end loop;

                                 Storing (First_Stored + 1 ..
                                            First_Stored + Ptr - First) :=
                                     Switch_Chars (First .. Ptr - 1);
                                 Add_Switch_Component
                                   (Storing (Storing'First ..
                                      First_Stored + Ptr - First));
                              end;

                           when 'l' =>
                              Ptr := Ptr + 1;
                              Add_Switch_Component ("-gnatel");

                           when 'L' =>
                              Ptr := Ptr + 1;
                              Add_Switch_Component ("-gnateL");

                           when 'p' =>
                              Ptr := Ptr + 1;

                              if Ptr = Max then
                                 Last := 0;
                                 return;
                              end if;

                              if Switch_Chars (Ptr) = '=' then
                                 Ptr := Ptr + 1;
                              end if;

                                 --  To normalize, always put a '=' after
                                 --  -gnatep. Because that could lengthen the
                                 --  switch string, declare a local variable.

                              declare
                                 To_Store : String (1 .. Max - Ptr + 9);
                              begin
                                 To_Store (1 .. 8) := "-gnatep=";
                                 To_Store (9 .. Max - Ptr + 9) :=
                                   Switch_Chars (Ptr .. Max);
                                 Add_Switch_Component (To_Store);
                              end;

                              return;

                           when others =>
                              Last := 0;
                              return;
                        end case;
                     end if;

                  when 'i' =>
                     Storing (First_Stored) := 'i';

                     Ptr := Ptr + 1;

                     if Ptr > Max then
                        Last := 0;
                        return;
                     end if;

                     C := Switch_Chars (Ptr);

                     if C in '1' .. '5'
                       or else C = '8'
                       or else C = 'p'
                       or else C = 'f'
                       or else C = 'n'
                       or else C = 'w'
                     then
                        Storing (First_Stored + 1) := C;
                        Add_Switch_Component
                          (Storing (Storing'First .. First_Stored + 1));
                        Ptr := Ptr + 1;

                     else
                        Last := 0;
                        return;
                     end if;

                  --  -gnatl may be -gnatl=<file name>

                  when 'l' =>
                     Ptr := Ptr + 1;

                     if Ptr > Max or else Switch_Chars (Ptr) /= '=' then
                        Add_Switch_Component ("-gnatl");

                     else
                        Add_Switch_Component
                          ("-gnatl" & Switch_Chars (Ptr .. Max));
                        return;
                     end if;

                  --  -gnatn may be -gnatn, -gnatn1, or -gnatn2

                  when 'n' =>
                     Last_Stored := First_Stored;
                     Storing (Last_Stored) := 'n';
                     Ptr := Ptr + 1;

                     if Ptr <= Max
                       and then Switch_Chars (Ptr) in '1' .. '2'
                     then
                        Last_Stored := Last_Stored + 1;
                        Storing (Last_Stored) := Switch_Chars (Ptr);
                        Ptr := Ptr + 1;
                     end if;

                     Add_Switch_Component
                       (Storing (Storing'First .. Last_Stored));

                  --  -gnato may be -gnatox or -gnatoxx, with x=0/1/2/3

                  when 'o' =>
                     Last_Stored := First_Stored;
                     Storing (Last_Stored) := 'o';
                     Ptr := Ptr + 1;

                     if Ptr <= Max
                       and then Switch_Chars (Ptr) in '0' .. '3'
                     then
                        Last_Stored := Last_Stored + 1;
                        Storing (Last_Stored) := Switch_Chars (Ptr);
                        Ptr := Ptr + 1;

                        if Ptr <= Max
                          and then Switch_Chars (Ptr) in '0' .. '3'
                        then
                           Last_Stored := Last_Stored + 1;
                           Storing (Last_Stored) := Switch_Chars (Ptr);
                           Ptr := Ptr + 1;
                        end if;
                     end if;

                     Add_Switch_Component
                       (Storing (Storing'First .. Last_Stored));

                  --  -gnatR may be followed by '0', '1', '2', '3' or '4',
                  --  then by 'e', 'j', 'm' or 's'.

                  when 'R' =>
                     Last_Stored := First_Stored;
                     Storing (Last_Stored) := 'R';
                     Ptr := Ptr + 1;

                     while Ptr <= Max loop
                        C := Switch_Chars (Ptr);

                        case C is

                        when '0' .. '4' | 'e' | 'j' | 'm' | 's' =>
                           Last_Stored := Last_Stored + 1;
                           Storing (Last_Stored) := C;
                           Ptr := Ptr + 1;

                        when others =>
                           Last := 0;
                           return;
                        end case;
                     end loop;

                     Add_Switch_Component
                       (Storing (Storing'First .. Last_Stored));

                  --  -gnatWx, x = 'h'. 'u', 's', 'e', '8' or 'b'

                  when 'W' =>
                     Storing (First_Stored) := 'W';
                     Ptr := Ptr + 1;

                     if Ptr <= Max then
                        case Switch_Chars (Ptr) is
                           when 'h' | 'u' | 's' | 'e' | '8' | 'b' =>
                              Storing (First_Stored + 1) := Switch_Chars (Ptr);
                              Add_Switch_Component
                                (Storing (Storing'First .. First_Stored + 1));
                              Ptr := Ptr + 1;

                           when others =>
                              Last := 0;
                              return;
                        end case;
                     end if;

                  --  Multiple switches

                  when 'V' | 'w' | 'y' =>
                     Storing (First_Stored) := C;
                     Ptr := Ptr + 1;

                     if Ptr > Max then
                        if C = 'y' then
                           Add_Switch_Component
                             (Storing (Storing'First .. First_Stored));

                        else
                           Last := 0;
                           return;
                        end if;
                     end if;

                     --  Loop through remaining switch characters in string

                     while Ptr <= Max loop
                        C := Switch_Chars (Ptr);
                        Ptr := Ptr + 1;

                        --  -gnatyMxxx

                        if C = 'M' and then Storing (First_Stored) = 'y' then
                           Last_Stored := First_Stored + 1;
                           Storing (Last_Stored) := 'M';
                           while Ptr <= Max loop
                              C := Switch_Chars (Ptr);
                              exit when C not in '0' .. '9';
                              Last_Stored := Last_Stored + 1;
                              Storing (Last_Stored) := C;
                              Ptr := Ptr + 1;
                           end loop;

                           --  If there is no digit after -gnatyM,
                           --  the switch is invalid.

                           if Last_Stored = First_Stored + 1 then
                              Last := 0;
                              return;

                           else
                              Add_Switch_Component
                                (Storing (Storing'First .. Last_Stored));
                           end if;

                        --  --gnatx.x

                        elsif C = '.' and then Ptr <= Max then
                           Storing (First_Stored + 1) := '.';
                           Storing (First_Stored + 2) := Switch_Chars (Ptr);
                           Ptr := Ptr + 1;
                           Add_Switch_Component
                             (Storing (Storing'First .. First_Stored + 2));

                        --  All other switches are -gnatxx

                        else
                           Storing (First_Stored + 1) := C;
                           Add_Switch_Component
                             (Storing (Storing'First .. First_Stored + 1));
                        end if;
                     end loop;

                  --  -gnat95 -gnat05

                  when '0' | '9' =>
                     Last_Stored := First_Stored;
                     Storing (Last_Stored) := C;
                     Ptr := Ptr + 1;

                     if Ptr /= Max or else Switch_Chars (Ptr) /= '5' then

                        --  Invalid switch

                        Last := 0;
                        return;

                     else
                        Last_Stored := Last_Stored + 1;
                        Storing (Last_Stored) := '5';
                        Add_Switch_Component
                          (Storing (Storing'First .. Last_Stored));
                        Ptr := Ptr + 1;
                     end if;

                     --  -gnat12

                  when '1' =>
                     Last_Stored := First_Stored;
                     Storing (Last_Stored) := C;
                     Ptr := Ptr + 1;

                     if Ptr /= Max or else Switch_Chars (Ptr) /= '2' then

                        --  Invalid switch

                        Last := 0;
                        return;

                     else
                        Last_Stored := Last_Stored + 1;
                        Storing (Last_Stored) := '2';
                        Add_Switch_Component
                          (Storing (Storing'First .. Last_Stored));
                        Ptr := Ptr + 1;
                     end if;

                     --  -gnat2005 -gnat2012

                  when '2' =>
                     if Ptr + 3 /= Max then
                        Last := 0;
                        return;

                     elsif Switch_Chars (Ptr + 1 .. Ptr + 3) = "005" then
                        Last_Stored := First_Stored + 3;
                        Storing (First_Stored .. Last_Stored) := "2005";
                        Add_Switch_Component
                          (Storing (Storing'First .. Last_Stored));
                        Ptr := Max + 1;

                     elsif Switch_Chars (Ptr + 1 .. Ptr + 3) = "012" then
                        Last_Stored := First_Stored + 3;
                        Storing (First_Stored .. Last_Stored) := "2012";
                        Add_Switch_Component
                          (Storing (Storing'First .. Last_Stored));
                        Ptr := Max + 1;

                     else

                        --  Invalid switch

                        Last := 0;
                        return;

                     end if;

                  --  -gnat83

                  when '8' =>
                     Last_Stored := First_Stored;
                     Storing (Last_Stored) := '8';
                     Ptr := Ptr + 1;

                     if Ptr /= Max or else Switch_Chars (Ptr) /= '3' then

                        --  Invalid switch

                        Last := 0;
                        return;

                     else
                        Last_Stored := Last_Stored + 1;
                        Storing (Last_Stored) := '3';
                        Add_Switch_Component
                          (Storing (Storing'First .. Last_Stored));
                        Ptr := Ptr + 1;
                     end if;

                  --  Not a valid switch

                  when others =>
                     Last := 0;
                     return;
               end case;
         end case;
      end loop;
   end Normalize_Compiler_Switches;

   function Normalize_Compiler_Switches
     (Switch_Chars : String) return Argument_List
   is
      Last : Natural;

   begin
      Normalize_Compiler_Switches (Switch_Chars, Global_Switches, Last);

      if Last = 0 then
         return (1 .. 0 => null);
      else
         return Global_Switches (Global_Switches'First .. Last);
      end if;
   end Normalize_Compiler_Switches;

   ------------------------
   -- Scan_Make_Switches --
   ------------------------

   procedure Scan_Make_Switches
     (Switch_Chars      : String;
      Success           : out Boolean)
   is
      Ptr : Integer          := Switch_Chars'First;
      Max : constant Integer := Switch_Chars'Last;
      C   : Character        := ' ';

   begin
      --  Assume a good switch

      Success := True;

      --  Skip past the initial character (must be the switch character)

      if Ptr = Max then
         Bad_Switch (Switch_Chars);

      else
         Ptr := Ptr + 1;
      end if;

      --  A little check, "gnat" at the start of a switch is for the compiler

      if Switch_Chars'Length >= Ptr + 3
        and then Switch_Chars (Ptr .. Ptr + 3) = "gnat"
      then
         Success := False;
         return;
      end if;

      C := Switch_Chars (Ptr);

      --  Multiple character switches

      --  To preserve building gnat_util, it is not possible to use the
      --  constant Strings declare in Make_Util, as Make_Util is not in
      --  gnat_util.

      if Switch_Chars'Length > 2 then
         if Switch_Chars = "--create-missing-dirs" then
            Setup_Projects := True;

         elsif Switch_Chars'Length > Subdirs_Option'Length
           and then
             Switch_Chars
               (Switch_Chars'First ..
                Switch_Chars'First + Subdirs_Option'Length - 1) =
                                                            Subdirs_Option
         then
            Subdirs :=
              new String'(Switch_Chars
                           (Switch_Chars'First + Subdirs_Option'Length ..
                            Switch_Chars'Last));

         elsif Switch_Chars = "--unchecked-shared-lib-imports" then
            Opt.Unchecked_Shared_Lib_Imports := True;

         elsif Switch_Chars = "--single-compile-per-obj-dir" then
            Opt.One_Compilation_Per_Obj_Dir := True;

         elsif Switch_Chars = "--no-exit-message" then
            Opt.No_Exit_Message := True;

         elsif Switch_Chars = "--keep-temp-files" then
            Opt.Keep_Temporary_Files := True;

         elsif Switch_Chars (Ptr) = '-' then
            Bad_Switch (Switch_Chars);

         elsif Switch_Chars'Length > 3
           and then Switch_Chars (Ptr .. Ptr + 1) = "aP"
         then
            null;
            --  This is only used by gprbuild

         elsif C = 'v' and then Switch_Chars'Length = 3 then
            Ptr := Ptr + 1;
            Verbose_Mode := True;

            case Switch_Chars (Ptr) is
            when 'l'    => Verbosity_Level := Opt.Low;
            when 'm'    => Verbosity_Level := Opt.Medium;
            when 'h'    => Verbosity_Level := Opt.High;
            when others => Success := False;
            end case;

         elsif C = 'd' then

            --  Note: for the debug switch, the remaining characters in this
            --  switch field must all be debug flags, since all valid switch
            --  characters are also valid debug characters. This switch is not
            --  documented on purpose because it is only used by the
            --  implementors.

            --  Loop to scan out debug flags

            while Ptr < Max loop
               Ptr := Ptr + 1;
               C := Switch_Chars (Ptr);

               if C in 'a' .. 'z' or else C in 'A' .. 'Z' then
                  Set_Debug_Flag (C);
               else
                  Bad_Switch (Switch_Chars);
               end if;
            end loop;

         elsif C = 'e' then
            Ptr := Ptr + 1;

            case Switch_Chars (Ptr) is

               --  Processing for eI switch

            when 'I' =>
               Ptr := Ptr + 1;
               Scan_Pos (Switch_Chars, Max, Ptr, Main_Index, C);

               if Ptr <= Max then
                  Bad_Switch (Switch_Chars);
               end if;

               --  Processing for eL switch

            when 'L' =>
               if Ptr /= Max then
                  Bad_Switch (Switch_Chars);

               else
                  Follow_Links_For_Files := True;
                  Follow_Links_For_Dirs  := True;
               end if;

               --  Processing for eS switch

            when 'S' =>
               if Ptr /= Max then
                  Bad_Switch (Switch_Chars);

               else
                  Commands_To_Stdout := True;
               end if;

            when others =>
               Bad_Switch (Switch_Chars);
            end case;

         elsif C = 'j' then
            Ptr := Ptr + 1;

            declare
               Max_Proc : Nat;

            begin
               Scan_Nat (Switch_Chars, Max, Ptr, Max_Proc, C);

               if Ptr <= Max then
                  Bad_Switch (Switch_Chars);

               else
                  if Max_Proc = 0 then
                     Max_Proc := Nat (Number_Of_CPUs);

                     if Max_Proc = 0 then
                        Max_Proc := 1;
                     end if;
                  end if;

                  Maximum_Processes := Positive (Max_Proc);
               end if;
            end;

         elsif C = 'w' and then Switch_Chars'Length = 3 then
            Ptr := Ptr + 1;

            if Switch_Chars = "-we" then
               Warning_Mode := Treat_As_Error;

            elsif Switch_Chars = "-wn" then
               Warning_Mode := Normal;

            elsif Switch_Chars = "-ws" then
               Warning_Mode  := Suppress;

            else
               Success := False;
            end if;

         else
            Success := False;
         end if;

      --  Single-character switches

      else
         Check_Switch : begin
            case C is
               when 'a' =>
                  Check_Readonly_Files := True;

               --  Processing for b switch

               when 'b' =>
                  Bind_Only  := True;
                  Make_Steps := True;

               --  Processing for B switch

               when 'B' =>
                  Build_Bind_And_Link_Full_Project := True;

               --  Processing for c switch

               when 'c' =>
                  Compile_Only := True;
                  Make_Steps   := True;

               --  Processing for C switch

               when 'C' =>
                  Opt.Create_Mapping_File := True;

               --  Processing for D switch

               when 'D' =>
                  if Object_Directory_Present then
                     Osint.Fail ("duplicate -D switch");

                  else
                     Object_Directory_Present := True;
                  end if;

               --  Processing for f switch

               when 'f' =>
                  Force_Compilations := True;

               --  Processing for F switch

               when 'F' =>
                  Full_Path_Name_For_Brief_Errors := True;

               --  Processing for h switch

               when 'h' =>
                  Usage_Requested := True;

               --  Processing for i switch

               when 'i' =>
                  In_Place_Mode := True;

               --  Processing for j switch

               when 'j' =>
                  --  -j not followed by a number is an error

                  Bad_Switch (Switch_Chars);

               --  Processing for k switch

               when 'k' =>
                  Keep_Going := True;

               --  Processing for l switch

               when 'l' =>
                  Link_Only  := True;
                  Make_Steps := True;

               --  Processing for M switch

               when 'M' =>
                  List_Dependencies := True;

               --  Processing for n switch

               when 'n' =>
                  Do_Not_Execute := True;

               --  Processing for o switch

               when 'o' =>
                  if Output_File_Name_Present then
                     Osint.Fail ("duplicate -o switch");
                  else
                     Output_File_Name_Present := True;
                  end if;

               --  Processing for p switch

               when 'p' =>
                  Setup_Projects := True;

               --  Processing for q switch

               when 'q' =>
                  Quiet_Output := True;

               --  Processing for R switch

               when 'R' =>
                  Run_Path_Option := False;

               --  Processing for s switch

               when 's' =>
                  Ptr := Ptr + 1;
                  Check_Switches := True;

               --  Processing for v switch

               when 'v' =>
                  Verbose_Mode := True;
                  Verbosity_Level := Opt.High;

                  --  Processing for x switch

               when 'x' =>
                  External_Unit_Compilation_Allowed := True;
                  Use_Include_Path_File := True;

                  --  Processing for z switch

               when 'z' =>
                  No_Main_Subprogram := True;

                  --  Any other small letter is an illegal switch

               when others =>
                  if C in 'a' .. 'z' then
                     Bad_Switch (Switch_Chars);

                  else
                     Success := False;
                  end if;
            end case;
         end Check_Switch;
      end if;
   end Scan_Make_Switches;

end Switch.M;
