OSDN Git Service

2008-05-27 Thomas Quinot <quinot@adacore.com>
[pf3gnuchains/gcc-fork.git] / gcc / ada / switch.adb
1 ------------------------------------------------------------------------------
2 --                                                                          --
3 --                         GNAT COMPILER COMPONENTS                         --
4 --                                                                          --
5 --                               S W I T C H                                --
6 --                                                                          --
7 --                                 B o d y                                  --
8 --                                                                          --
9 --          Copyright (C) 1992-2007, Free Software Foundation, Inc.         --
10 --                                                                          --
11 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
12 -- terms of the  GNU General Public License as published  by the Free Soft- --
13 -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
14 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
15 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
16 -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
17 -- for  more details.  You should have  received  a copy of the GNU General --
18 -- Public License  distributed with GNAT; see file COPYING3.  If not, go to --
19 -- http://www.gnu.org/licenses for a complete copy of the license.          --
20 --                                                                          --
21 -- GNAT was originally developed  by the GNAT team at  New York University. --
22 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
23 --                                                                          --
24 ------------------------------------------------------------------------------
25
26 with Osint;  use Osint;
27 with Output; use Output;
28
29 package body Switch is
30
31    ----------------
32    -- Bad_Switch --
33    ----------------
34
35    procedure Bad_Switch (Switch : Character) is
36    begin
37       Osint.Fail ("invalid switch: ", (1 => Switch));
38    end Bad_Switch;
39
40    procedure Bad_Switch (Switch : String) is
41    begin
42       Osint.Fail ("invalid switch: ", Switch);
43    end Bad_Switch;
44
45    ------------------------------
46    -- Check_Version_And_Help_G --
47    ------------------------------
48
49    procedure Check_Version_And_Help_G
50      (Tool_Name      : String;
51       Initial_Year   : String;
52       Version_String : String := Gnatvsn.Gnat_Version_String)
53    is
54       Version_Switch_Present : Boolean := False;
55       Help_Switch_Present    : Boolean := False;
56       Next_Arg               : Natural;
57
58    begin
59       --  First check for --version or --help
60
61       Next_Arg := 1;
62       while Next_Arg < Arg_Count loop
63          declare
64             Next_Argv : String (1 .. Len_Arg (Next_Arg));
65          begin
66             Fill_Arg (Next_Argv'Address, Next_Arg);
67
68             if Next_Argv = Version_Switch then
69                Version_Switch_Present := True;
70
71             elsif Next_Argv = Help_Switch then
72                Help_Switch_Present := True;
73             end if;
74
75             Next_Arg := Next_Arg + 1;
76          end;
77       end loop;
78
79       --  If --version was used, display version and exit
80
81       if Version_Switch_Present then
82          Set_Standard_Output;
83          Display_Version (Tool_Name, Initial_Year, Version_String);
84          Write_Str (Gnatvsn.Gnat_Free_Software);
85          Write_Eol;
86          Write_Eol;
87          Exit_Program (E_Success);
88       end if;
89
90       --  If --help was used, display help and exit
91
92       if Help_Switch_Present then
93          Set_Standard_Output;
94          Usage;
95          Write_Eol;
96          Write_Line ("Report bugs to report@adacore.com");
97          Exit_Program (E_Success);
98       end if;
99    end Check_Version_And_Help_G;
100
101    ---------------------
102    -- Display_Version --
103    ---------------------
104
105    procedure Display_Version
106      (Tool_Name      : String;
107       Initial_Year   : String;
108       Version_String : String := Gnatvsn.Gnat_Version_String)
109    is
110    begin
111       Write_Str (Tool_Name);
112       Write_Char (' ');
113       Write_Str (Version_String);
114       Write_Eol;
115
116       Write_Str ("Copyright (C) ");
117       Write_Str (Initial_Year);
118       Write_Char ('-');
119       Write_Str (Gnatvsn.Current_Year);
120       Write_Str (", ");
121       Write_Str (Gnatvsn.Copyright_Holder);
122       Write_Eol;
123    end Display_Version;
124
125    -------------------------
126    -- Is_Front_End_Switch --
127    -------------------------
128
129    function Is_Front_End_Switch (Switch_Chars : String) return Boolean is
130       Ptr : constant Positive := Switch_Chars'First;
131    begin
132       return Is_Switch (Switch_Chars)
133         and then
134           (Switch_Chars (Ptr + 1) = 'I'
135             or else (Switch_Chars'Length >= 5
136                       and then Switch_Chars (Ptr + 1 .. Ptr + 4) = "gnat")
137             or else (Switch_Chars'Length >= 5
138                       and then Switch_Chars (Ptr + 2 .. Ptr + 4) = "RTS"));
139    end Is_Front_End_Switch;
140
141    ---------------
142    -- Is_Switch --
143    ---------------
144
145    function Is_Switch (Switch_Chars : String) return Boolean is
146    begin
147       return Switch_Chars'Length > 1
148         and then Switch_Chars (Switch_Chars'First) = '-';
149    end Is_Switch;
150
151    --------------
152    -- Scan_Nat --
153    --------------
154
155    procedure Scan_Nat
156      (Switch_Chars : String;
157       Max          : Integer;
158       Ptr          : in out Integer;
159       Result       : out Nat;
160       Switch       : Character)
161    is
162    begin
163       Result := 0;
164
165       if Ptr > Max or else Switch_Chars (Ptr) not in '0' .. '9' then
166          Osint.Fail ("missing numeric value for switch: ", (1 => Switch));
167
168       else
169          while Ptr <= Max and then Switch_Chars (Ptr) in '0' .. '9' loop
170             Result := Result * 10 +
171               Character'Pos (Switch_Chars (Ptr)) - Character'Pos ('0');
172             Ptr := Ptr + 1;
173
174             if Result > Switch_Max_Value then
175                Osint.Fail
176                  ("numeric value out of range for switch: ", (1 => Switch));
177             end if;
178          end loop;
179       end if;
180    end Scan_Nat;
181
182    --------------
183    -- Scan_Pos --
184    --------------
185
186    procedure Scan_Pos
187      (Switch_Chars : String;
188       Max          : Integer;
189       Ptr          : in out Integer;
190       Result       : out Pos;
191       Switch       : Character)
192    is
193       Temp : Nat;
194
195    begin
196       Scan_Nat (Switch_Chars, Max, Ptr, Temp, Switch);
197
198       if Temp = 0 then
199          Osint.Fail ("numeric value out of range for switch: ", (1 => Switch));
200       end if;
201
202       Result := Temp;
203    end Scan_Pos;
204
205 end Switch;