File : aws-utils.adb
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-2003 --
-- ACT-Europe --
-- --
-- Authors: Dmitriy Anisimkov - Pascal Obry --
-- --
-- This library is free software; you can redistribute it and/or modify --
-- it under the terms of the GNU General Public License as published by --
-- the Free Software Foundation; either version 2 of the License, or (at --
-- your option) any later version. --
-- --
-- This library is distributed in the hope that it will be useful, but --
-- WITHOUT 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 --
-- along with this library; if not, write to the Free Software Foundation, --
-- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
-- $Id: aws-utils.adb,v 1.1 2003/10/05 20:00:06 Jano Exp $
with Ada.Integer_Text_IO;
with Ada.Strings.Fixed;
with Ada.Strings.Maps.Constants;
with Ada.Numerics.Discrete_Random;
package body AWS.Utils is
use Ada;
package Integer_Random is new Ada.Numerics.Discrete_Random (Random_Integer);
Random_Generator : Integer_Random.Generator;
-------------------
-- CRLF_2_Spaces --
-------------------
function CRLF_2_Spaces (Str : in String) return String is
begin
return Strings.Fixed.Trim
(Strings.Fixed.Translate
(Str, Strings.Maps.To_Mapping
(From => ASCII.CR & ASCII.LF, To => " ")),
Strings.Right);
end CRLF_2_Spaces;
-------------
-- Get_MD5 --
-------------
function Get_MD5 (Data : in String) return MD5.Digest_String is
Ctx : MD5.Context;
HA : MD5.Fingerprint;
begin
MD5.Init (Ctx);
MD5.Update (Ctx, Data);
MD5.Final (Ctx, HA);
return MD5.Digest_To_Text (HA);
end Get_MD5;
---------
-- Hex --
---------
function Hex (V : in Natural; Width : in Natural := 0) return String is
use Strings;
Hex_V : String (1 .. Integer'Size / 4 + 4);
begin
Ada.Integer_Text_IO.Put (Hex_V, V, 16);
declare
Result : constant String
:= Hex_V (Fixed.Index (Hex_V, "#") + 1
.. Fixed.Index (Hex_V, "#", Backward) - 1);
begin
if Width = 0 then
return Result;
elsif Result'Length < Width then
declare
use Ada.Strings.Fixed;
Zero : constant String := (Width - Result'Length) * '0';
begin
return Zero & Result;
end;
else
return Result (Result'Last - Width + 1 .. Result'Last);
end if;
end;
end Hex;
---------------
-- Hex_Value --
---------------
function Hex_Value (Hex : in String) return Natural is
function Value (C : in Character) return Natural;
pragma Inline (Value);
-- Return value for single character C.
function Value (C : in Character) return Natural is
begin
case C is
when '0' => return 0;
when '1' => return 1;
when '2' => return 2;
when '3' => return 3;
when '4' => return 4;
when '5' => return 5;
when '6' => return 6;
when '7' => return 7;
when '8' => return 8;
when '9' => return 9;
when 'a' | 'A' => return 10;
when 'b' | 'B' => return 11;
when 'c' | 'C' => return 12;
when 'd' | 'D' => return 13;
when 'e' | 'E' => return 14;
when 'f' | 'F' => return 15;
when others => raise Constraint_Error;
end case;
end Value;
R : Natural := 0;
Exp : Natural := 1;
begin
for K in reverse Hex'Range loop
R := R + Exp * Value (Hex (K));
Exp := Exp * 16;
end loop;
return R;
end Hex_Value;
-----------
-- Image --
-----------
function Image (N : in Natural) return String is
N_Img : constant String := Natural'Image (N);
begin
return N_Img (N_Img'First + 1 .. N_Img'Last);
end Image;
-----------
-- Image --
-----------
function Image (D : in Duration) return String is
D_Img : constant String := Duration'Image (D);
K : constant Natural := Strings.Fixed.Index (D_Img, ".");
begin
if K = 0 then
return D_Img (D_Img'First + 1 .. D_Img'Last);
else
return D_Img (D_Img'First + 1 .. K + 2);
end if;
end Image;
---------------
-- Is_Number --
---------------
function Is_Number (S : in String) return Boolean is
use Strings.Maps;
begin
return S'Length > 0
and then Is_Subset (To_Set (S), Constants.Decimal_Digit_Set);
end Is_Number;
-----------
-- Quote --
-----------
function Quote (Str : in String) return String is
begin
return '"' & Str & '"';
end Quote;
------------
-- Random --
------------
function Random return Random_Integer is
begin
return Integer_Random.Random (Random_Generator);
end Random;
------------------
-- RW_Semaphore --
------------------
protected body RW_Semaphore is
----------
-- Read --
----------
entry Read when W = 0 and then Write'Count = 0 is
begin
R := R + 1;
end Read;
------------------
-- Release_Read --
------------------
procedure Release_Read is
begin
R := R - 1;
end Release_Read;
-------------------
-- Release_Write --
-------------------
procedure Release_Write is
begin
W := W - 1;
end Release_Write;
-----------
-- Write --
-----------
entry Write when R = 0 and then W < Writers is
begin
W := W + 1;
end Write;
end RW_Semaphore;
---------------
-- Semaphore --
---------------
protected body Semaphore is
-------------
-- Release --
-------------
procedure Release is
begin
Seized := False;
end Release;
-----------
-- Seize --
-----------
entry Seize when not Seized is
begin
Seized := True;
end Seize;
end Semaphore;
begin
Integer_Random.Reset (Random_Generator);
end AWS.Utils;