File : 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 --                                                                          --
  19 --                                                                          --
  20 --                                                                          --
  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;