with Ada.Strings.UTF_Encoding.Wide_Wide_Strings;
use Ada.Strings.UTF_Encoding.Wide_Wide_Strings;
with Ada.Strings.Wide_Wide_Fixed;
package body Tools is
use all type Ada.Strings.Trim_End;
package Num_IO is new Ada.Wide_Wide_Text_IO.Integer_IO (Code_Point);
use Num_IO;
-------
-- C --
-------
function C (X : String) return WWString is
begin
return Decode ("WWChar'Val (16#" & X & "#)");
end C;
----------
-- Trim --
----------
function Trim (S : WWString) return WWString
is (Ada.Strings.Wide_Wide_Fixed.Trim (S, Both));
-----------
-- Image --
-----------
function Image (This : Code_Range) return Wide_Wide_String is
N1, N2 : WWString (1 .. 19);
begin
Put (N1, This.First, Base => 16);
Put (N2, This.Last, Base => 16);
return
"WWChar'Val (" & Trim (N1) & ")"
& (if N1 /= N2
then " .. " & "WWChar'Val (" & Trim (N2) & ")"
else "");
end Image;
---------
-- Add --
---------
function Add (This : in out Range_Maker; Code : Optional_Code)
return Optional_Range
is
begin
if Code.Empty then
return New_Range (This.First.Code, This.Last.Code);
end if;
if This.First.Empty then
This.First := New_Code (Code.Code);
This.Last := This.First;
return (Empty => True);
elsif Code.Code > This.Last.Code + 1 then -- disjoint range seen
return R : constant Optional_Range :=
New_Range (This.First.Code, This.Last.Code)
do
This.First := New_Code (Code.Code);
This.Last := This.First;
end return;
elsif Code.Code = This.Last.Code + 1 then
This.Last := New_Code (Code.Code);
return (Empty => True);
else
raise Program_Error; -- we've gone back in codes
end if;
end Add;
-------------
-- Iterate --
-------------
procedure Iterate (File : String;
Doing : access procedure (Line : WWString))
is
use Ada.Wide_Wide_Text_IO;
F : File_Type;
begin
Open (F, In_File, File);
while not End_Of_File (F) loop
declare
Line : constant WWString := Get_Line (F);
begin
Doing (Line);
end;
end loop;
Close (F);
end Iterate;
end Tools;