OSDN Git Service

* gcc-interface/trans.c (Call_to_gnu): Robustify test for function case
[pf3gnuchains/gcc-fork.git] / gcc / ada / g-cgideb.adb
1 ------------------------------------------------------------------------------
2 --                                                                          --
3 --                         GNAT COMPILER COMPONENTS                         --
4 --                                                                          --
5 --                        G N A T . C G I . D E B U G                       --
6 --                                                                          --
7 --                                 B o d y                                  --
8 --                                                                          --
9 --                     Copyright (C) 2000-2010, AdaCore                     --
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.                                     --
17 --                                                                          --
18 -- As a special exception under Section 7 of GPL version 3, you are granted --
19 -- additional permissions described in the GCC Runtime Library Exception,   --
20 -- version 3.1, as published by the Free Software Foundation.               --
21 --                                                                          --
22 -- You should have received a copy of the GNU General Public License and    --
23 -- a copy of the GCC Runtime Library Exception along with this program;     --
24 -- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
25 -- <http://www.gnu.org/licenses/>.                                          --
26 --                                                                          --
27 -- GNAT was originally developed  by the GNAT team at  New York University. --
28 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
29 --                                                                          --
30 ------------------------------------------------------------------------------
31
32 with Ada.Strings.Unbounded;
33
34 package body GNAT.CGI.Debug is
35
36    use Ada.Strings.Unbounded;
37
38    --  Define the abstract type which act as a template for all debug IO modes.
39    --  To create a new IO mode you must:
40    --     1. create a new package spec
41    --     2. create a new type derived from IO.Format
42    --     3. implement all the abstract routines in IO
43
44    package IO is
45
46       type Format is abstract tagged null record;
47
48       function Output (Mode : Format'Class) return String;
49
50       function Variable
51         (Mode  : Format;
52          Name  : String;
53          Value : String) return String is abstract;
54       --  Returns variable Name and its associated value
55
56       function New_Line (Mode : Format) return String is abstract;
57       --  Returns a new line such as this concatenated between two strings
58       --  will display the strings on two lines.
59
60       function Title (Mode : Format; Str : String) return String is abstract;
61       --  Returns Str as a Title. A title must be alone and centered on a
62       --  line. Next output will be on the following line.
63
64       function Header
65         (Mode : Format;
66          Str  : String) return String is abstract;
67       --  Returns Str as an Header. An header must be alone on its line. Next
68       --  output will be on the following line.
69
70    end IO;
71
72    ----------------------
73    -- IO for HTML Mode --
74    ----------------------
75
76    package HTML_IO is
77
78       --  See IO for comments about these routines
79
80       type Format is new IO.Format with null record;
81
82       function Variable
83         (IO    : Format;
84          Name  : String;
85          Value : String) return String;
86
87       function New_Line (IO : Format) return String;
88
89       function Title (IO : Format; Str : String) return String;
90
91       function Header (IO : Format; Str : String) return String;
92
93    end HTML_IO;
94
95    ----------------------------
96    -- IO for Plain Text Mode --
97    ----------------------------
98
99    package Text_IO is
100
101       --  See IO for comments about these routines
102
103       type Format is new IO.Format with null record;
104
105       function Variable
106         (IO    : Format;
107          Name  : String;
108          Value : String) return String;
109
110       function New_Line (IO : Format) return String;
111
112       function Title (IO : Format; Str : String) return String;
113
114       function Header (IO : Format; Str : String) return String;
115
116    end Text_IO;
117
118    --------------
119    -- Debug_IO --
120    --------------
121
122    package body IO is
123
124       ------------
125       -- Output --
126       ------------
127
128       function Output (Mode : Format'Class) return String is
129          Result : Unbounded_String;
130
131       begin
132          Result :=
133            To_Unbounded_String
134              (Title (Mode, "CGI complete runtime environment")
135               & Header (Mode, "CGI parameters:")
136               & New_Line (Mode));
137
138          for K in 1 .. Argument_Count loop
139             Result := Result
140               & Variable (Mode, Key (K), Value (K))
141               & New_Line (Mode);
142          end loop;
143
144          Result := Result
145            & New_Line (Mode)
146            & Header (Mode, "CGI environment variables (Metavariables):")
147            & New_Line (Mode);
148
149          for P in Metavariable_Name'Range loop
150             if Metavariable_Exists (P) then
151                Result := Result
152                  & Variable (Mode,
153                              Metavariable_Name'Image (P),
154                              Metavariable (P))
155                  & New_Line (Mode);
156             end if;
157          end loop;
158
159          return To_String (Result);
160       end Output;
161
162    end IO;
163
164    -------------
165    -- HTML_IO --
166    -------------
167
168    package body HTML_IO is
169
170       NL : constant String := (1 => ASCII.LF);
171
172       function Bold (S : String) return String;
173       --  Returns S as an HTML bold string
174
175       function Italic (S : String) return String;
176       --  Returns S as an HTML italic string
177
178       ----------
179       -- Bold --
180       ----------
181
182       function Bold (S : String) return String is
183       begin
184          return "<b>" & S & "</b>";
185       end Bold;
186
187       ------------
188       -- Header --
189       ------------
190
191       function Header (IO : Format; Str : String) return String is
192          pragma Unreferenced (IO);
193       begin
194          return "<h2>" & Str & "</h2>" & NL;
195       end Header;
196
197       ------------
198       -- Italic --
199       ------------
200
201       function Italic (S : String) return String is
202       begin
203          return "<i>" & S & "</i>";
204       end Italic;
205
206       --------------
207       -- New_Line --
208       --------------
209
210       function New_Line (IO : Format) return String is
211          pragma Unreferenced (IO);
212       begin
213          return "<br>" & NL;
214       end New_Line;
215
216       -----------
217       -- Title --
218       -----------
219
220       function Title (IO : Format; Str : String) return String is
221          pragma Unreferenced (IO);
222       begin
223          return "<p align=center><font size=+2>" & Str & "</font></p>" & NL;
224       end Title;
225
226       --------------
227       -- Variable --
228       --------------
229
230       function Variable
231         (IO    : Format;
232          Name  : String;
233          Value : String) return String
234       is
235          pragma Unreferenced (IO);
236       begin
237          return Bold (Name) & " = " & Italic (Value);
238       end Variable;
239
240    end HTML_IO;
241
242    -------------
243    -- Text_IO --
244    -------------
245
246    package body Text_IO is
247
248       ------------
249       -- Header --
250       ------------
251
252       function Header (IO : Format; Str : String) return String is
253       begin
254          return "*** " & Str & New_Line (IO);
255       end Header;
256
257       --------------
258       -- New_Line --
259       --------------
260
261       function New_Line (IO : Format) return String is
262          pragma Unreferenced (IO);
263       begin
264          return String'(1 => ASCII.LF);
265       end New_Line;
266
267       -----------
268       -- Title --
269       -----------
270
271       function Title (IO : Format; Str : String) return String is
272          Spaces : constant Natural := (80 - Str'Length) / 2;
273          Indent : constant String (1 .. Spaces) := (others => ' ');
274       begin
275          return Indent & Str & New_Line (IO);
276       end Title;
277
278       --------------
279       -- Variable --
280       --------------
281
282       function Variable
283         (IO    : Format;
284          Name  : String;
285          Value : String) return String
286       is
287          pragma Unreferenced (IO);
288       begin
289          return "   " & Name & " = " & Value;
290       end Variable;
291
292    end Text_IO;
293
294    -----------------
295    -- HTML_Output --
296    -----------------
297
298    function HTML_Output return String is
299       HTML : HTML_IO.Format;
300    begin
301       return IO.Output (Mode => HTML);
302    end HTML_Output;
303
304    -----------------
305    -- Text_Output --
306    -----------------
307
308    function Text_Output return String is
309       Text : Text_IO.Format;
310    begin
311       return IO.Output (Mode => Text);
312    end Text_Output;
313
314 end GNAT.CGI.Debug;