/usr/share/ada/adainclude/xmlada/sax-symbols.adb is in libxmlada5-dev 4.4.2014-1build1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 | ------------------------------------------------------------------------------
-- XML/Ada - An XML suite for Ada95 --
-- --
-- Copyright (C) 2010-2014, AdaCore --
-- --
-- This library is free software; you can redistribute it and/or modify it --
-- under terms of the GNU General Public License as published by the Free --
-- Software Foundation; either version 3, 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 MERCHAN- --
-- TABILITY or FITNESS FOR A PARTICULAR PURPOSE. --
-- --
-- You should have received a copy of the GNU General Public License along --
-- with this program; see the file COPYING3. If not, see --
-- <http://www.gnu.org/licenses/>. --
-- --
------------------------------------------------------------------------------
with Interfaces; use Interfaces;
with Ada.Unchecked_Conversion;
with Ada.Unchecked_Deallocation;
with GNAT.Task_Lock;
with System.Address_Image;
package body Sax.Symbols is
-----------------
-- Debug_Print --
-----------------
function Debug_Print (S : Symbol) return String is
begin
if S = No_Symbol then
return "<Symbol: null>";
else
return "<Symbol: " & System.Address_Image (S.all'Address)
& " {" & S.all & "}>";
end if;
end Debug_Print;
----------
-- Hash --
----------
function Hash (Str : Cst_Byte_Sequence_Access) return Unsigned_32 is
-- This hash function looks at every character, in order to make it
-- likely that similar strings get different hash values. The rotate by
-- 7 bits has been determined empirically to be good, and it doesn't
-- lose bits like a shift would. The final conversion can't overflow,
-- because the table is 2**16 in size. This function probably needs to
-- be changed if the hash table size is changed.
-- Note that we could get some speed improvement by aligning the string
-- to 32 or 64 bits, and doing word-wise xor's. We could also implement
-- a growable table. It doesn't seem worth the trouble to do those
-- things, for now.
Result : Unsigned_32 := 0;
begin
for J in Str'Range loop
Result := Rotate_Left (Result, 7) xor Character'Pos (Str (J));
end loop;
return Result;
end Hash;
-------------
-- Get_Key --
-------------
function Get_Key (Str : Symbol) return Cst_Byte_Sequence_Access is
begin
return Cst_Byte_Sequence_Access (Str);
end Get_Key;
----------
-- Free --
----------
procedure Free (Str : in out Symbol) is
function Convert is new Ada.Unchecked_Conversion
(Symbol, Byte_Sequence_Access);
procedure Unchecked_Free is new Ada.Unchecked_Deallocation
(Byte_Sequence, Byte_Sequence_Access);
S : Byte_Sequence_Access := Convert (Str);
begin
Unchecked_Free (S);
Str := No_Symbol;
end Free;
---------------
-- Key_Equal --
---------------
function Key_Equal (Key1, Key2 : Cst_Byte_Sequence_Access) return Boolean is
begin
return Key1.all = Key2.all;
end Key_Equal;
----------
-- Find --
----------
function Find
(Table : access Symbol_Table_Record;
Str : Unicode.CES.Byte_Sequence) return Symbol
is
use String_Htable;
Result : String_Htable.Element_Ptr;
Hashed : Interfaces.Unsigned_32;
Str_A : Symbol;
begin
if Str'Length = 0 then
return Empty_String;
else
Hashed := Hash (Cst_Byte_Sequence_Access'(Str'Unrestricted_Access));
GNAT.Task_Lock.Lock;
Result := String_Htable.Get_Ptr_With_Hash
(Table.Hash, Str'Unrestricted_Access, Hashed);
if Result = null then
Str_A := new Byte_Sequence'(Str);
String_Htable.Set_With_Hash (Table.Hash, Str_A, Hashed);
GNAT.Task_Lock.Unlock;
return Str_A;
end if;
GNAT.Task_Lock.Unlock;
return Result.all;
end if;
end Find;
---------
-- Get --
---------
function Get (Sym : Symbol) return Cst_Byte_Sequence_Access is
begin
return Cst_Byte_Sequence_Access (Sym);
end Get;
----------
-- Free --
----------
procedure Free (Table : in out Symbol_Table_Record) is
begin
String_Htable.Reset (Table.Hash);
end Free;
----------
-- Hash --
----------
function Hash (S : Sax.Symbols.Symbol) return Interfaces.Unsigned_32 is
begin
return Hash (Cst_Byte_Sequence_Access (S));
end Hash;
---------
-- "=" --
---------
function "=" (S : Symbol; Str : Unicode.CES.Byte_Sequence) return Boolean is
begin
if S = No_Symbol then
return False;
else
return Get (S).all = Str;
end if;
end "=";
end Sax.Symbols;
|