OSDN Git Service

2011-12-02 Thomas Quinot <quinot@adacore.com>
[pf3gnuchains/gcc-fork.git] / gcc / ada / switch.adb
index f01e308..f871b19 100644 (file)
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2002, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2011, 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 2,  or (at your option) any later ver- --
+-- 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 COPYING.  If not, write --
--- to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, --
--- MA 02111-1307, USA.                                                      --
+-- 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 Osint;  use Osint;
+with Output; use Output;
+
 package body Switch is
 
+   ----------------
+   -- Bad_Switch --
+   ----------------
+
+   procedure Bad_Switch (Switch : Character) is
+   begin
+      Osint.Fail ("invalid switch: " & Switch);
+   end Bad_Switch;
+
+   procedure Bad_Switch (Switch : String) is
+   begin
+      Osint.Fail ("invalid switch: " & Switch);
+   end Bad_Switch;
+
+   ------------------------------
+   -- Check_Version_And_Help_G --
+   ------------------------------
+
+   procedure Check_Version_And_Help_G
+     (Tool_Name      : String;
+      Initial_Year   : String;
+      Version_String : String := Gnatvsn.Gnat_Version_String)
+   is
+      Version_Switch_Present : Boolean := False;
+      Help_Switch_Present    : Boolean := False;
+      Next_Arg               : Natural;
+
+   begin
+      --  First check for --version or --help
+
+      Next_Arg := 1;
+      while Next_Arg < Arg_Count loop
+         declare
+            Next_Argv : String (1 .. Len_Arg (Next_Arg));
+         begin
+            Fill_Arg (Next_Argv'Address, Next_Arg);
+
+            if Next_Argv = Version_Switch then
+               Version_Switch_Present := True;
+
+            elsif Next_Argv = Help_Switch then
+               Help_Switch_Present := True;
+            end if;
+
+            Next_Arg := Next_Arg + 1;
+         end;
+      end loop;
+
+      --  If --version was used, display version and exit
+
+      if Version_Switch_Present then
+         Set_Standard_Output;
+         Display_Version (Tool_Name, Initial_Year, Version_String);
+         Write_Str (Gnatvsn.Gnat_Free_Software);
+         Write_Eol;
+         Write_Eol;
+         Exit_Program (E_Success);
+      end if;
+
+      --  If --help was used, display help and exit
+
+      if Help_Switch_Present then
+         Set_Standard_Output;
+         Usage;
+         Write_Eol;
+         Write_Line ("Report bugs to report@adacore.com");
+         Exit_Program (E_Success);
+      end if;
+   end Check_Version_And_Help_G;
+
+   ------------------------------------
+   -- Display_Usage_Version_And_Help --
+   ------------------------------------
+
+   procedure Display_Usage_Version_And_Help is
+   begin
+      Write_Str ("  --version   Display version and exit");
+      Write_Eol;
+
+      Write_Str ("  --help      Display usage and exit");
+      Write_Eol;
+      Write_Eol;
+   end Display_Usage_Version_And_Help;
+
+   ---------------------
+   -- Display_Version --
+   ---------------------
+
+   procedure Display_Version
+     (Tool_Name      : String;
+      Initial_Year   : String;
+      Version_String : String := Gnatvsn.Gnat_Version_String)
+   is
+   begin
+      Write_Str (Tool_Name);
+      Write_Char (' ');
+      Write_Str (Version_String);
+      Write_Eol;
+
+      Write_Str ("Copyright (C) ");
+      Write_Str (Initial_Year);
+      Write_Char ('-');
+      Write_Str (Gnatvsn.Current_Year);
+      Write_Str (", ");
+      Write_Str (Gnatvsn.Copyright_Holder);
+      Write_Eol;
+   end Display_Version;
+
    -------------------------
    -- Is_Front_End_Switch --
    -------------------------
 
    function Is_Front_End_Switch (Switch_Chars : String) return Boolean is
       Ptr : constant Positive := Switch_Chars'First;
-
    begin
       return Is_Switch (Switch_Chars)
         and then
-        (Switch_Chars (Ptr + 1) = 'I'
-         or else (Switch_Chars'Length >= 5
-                  and then Switch_Chars (Ptr + 1 .. Ptr + 4) = "gnat")
-         or else (Switch_Chars'Length >= 5
-                  and then Switch_Chars (Ptr + 1 .. Ptr + 4) = "fRTS"));
+          (Switch_Chars (Ptr + 1) = 'I'
+            or else (Switch_Chars'Length >= 5
+                      and then Switch_Chars (Ptr + 1 .. Ptr + 4) = "gnat")
+            or else (Switch_Chars'Length >= 5
+                      and then Switch_Chars (Ptr + 2 .. Ptr + 4) = "RTS"));
    end Is_Front_End_Switch;
 
+   ----------------------------
+   -- Is_Internal_GCC_Switch --
+   ----------------------------
+
+   function Is_Internal_GCC_Switch (Switch_Chars : String) return Boolean is
+      First : constant Natural := Switch_Chars'First + 1;
+      Last  : constant Natural := Switch_Last (Switch_Chars);
+   begin
+      return Is_Switch (Switch_Chars)
+        and then
+          (Switch_Chars (First .. Last) = "-param"        or else
+           Switch_Chars (First .. Last) = "dumpbase"      or else
+           Switch_Chars (First .. Last) = "auxbase-strip" or else
+           Switch_Chars (First .. Last) = "auxbase");
+   end Is_Internal_GCC_Switch;
+
    ---------------
    -- Is_Switch --
    ---------------
@@ -53,7 +178,40 @@ package body Switch is
         and then Switch_Chars (Switch_Chars'First) = '-';
    end Is_Switch;
 
-   ------------------------
+   -----------------
+   -- Switch_last --
+   -----------------
+
+   function Switch_Last (Switch_Chars : String) return Natural is
+      Last : constant Natural := Switch_Chars'Last;
+   begin
+      if Last >= Switch_Chars'First
+        and then Switch_Chars (Last) = ASCII.NUL
+      then
+         return Last - 1;
+      else
+         return Last;
+      end if;
+   end Switch_Last;
+
+   -----------------
+   -- Nat_Present --
+   -----------------
+
+   function Nat_Present
+     (Switch_Chars : String;
+      Max          : Integer;
+      Ptr          : Integer) return Boolean
+   is
+   begin
+      return (Ptr <= Max
+                and then Switch_Chars (Ptr) in '0' .. '9')
+        or else
+             (Ptr < Max
+                and then Switch_Chars (Ptr) = '='
+                and then Switch_Chars (Ptr + 1) in '0' .. '9');
+   end Nat_Present;
+
    --------------
    -- Scan_Nat --
    --------------
@@ -62,22 +220,28 @@ package body Switch is
      (Switch_Chars : String;
       Max          : Integer;
       Ptr          : in out Integer;
-      Result       : out Nat)
+      Result       : out Nat;
+      Switch       : Character)
    is
    begin
       Result := 0;
 
-      if Ptr > Max or else Switch_Chars (Ptr) not in '0' .. '9' then
-         raise Missing_Switch_Value;
+      if not Nat_Present (Switch_Chars, Max, Ptr) then
+         Osint.Fail ("missing numeric value for switch: " & Switch);
+      end if;
+
+      if Switch_Chars (Ptr) = '=' then
+         Ptr := Ptr + 1;
       end if;
 
       while Ptr <= Max and then Switch_Chars (Ptr) in '0' .. '9' loop
-         Result := Result * 10 +
-           Character'Pos (Switch_Chars (Ptr)) - Character'Pos ('0');
+         Result :=
+           Result * 10 +
+             Character'Pos (Switch_Chars (Ptr)) - Character'Pos ('0');
          Ptr := Ptr + 1;
 
          if Result > Switch_Max_Value then
-            raise Bad_Switch_Value;
+            Osint.Fail ("numeric value out of range for switch: " & Switch);
          end if;
       end loop;
    end Scan_Nat;
@@ -90,15 +254,16 @@ package body Switch is
      (Switch_Chars : String;
       Max          : Integer;
       Ptr          : in out Integer;
-      Result       : out Pos) is
-
+      Result       : out Pos;
+      Switch       : Character)
+   is
       Temp : Nat;
 
    begin
-      Scan_Nat (Switch_Chars, Max, Ptr, Temp);
+      Scan_Nat (Switch_Chars, Max, Ptr, Temp, Switch);
 
       if Temp = 0 then
-         raise Bad_Switch_Value;
+         Osint.Fail ("numeric value out of range for switch: " & Switch);
       end if;
 
       Result := Temp;