Files
alire-index-community/src/alire-utils.adb
T
2018-04-30 00:31:03 +02:00

201 lines
4.7 KiB
Ada

with Ada.Streams.Stream_IO;
with Ada.Strings.Fixed;
with Ada.Strings.Maps;
with GNAT.Case_Util;
with GNAT.OS_Lib;
package body Alire.Utils is
--------------
-- Contains --
--------------
function Contains (Text : String; Sub : String) return Boolean is
(Ada.Strings.Fixed.Count (Text, Sub) > 0);
----------
-- Head --
----------
function Head (Str : String; Separator : Character) return String is
begin
for I in Str'Range loop
if Str (I) = Separator then
return Str (Str'First .. I - 1);
end if;
end loop;
return Str;
end Head;
-------------
-- Flatten --
-------------
function Flatten (V : String_Vector; Separator : String := " ") return String is
function Flatten (Pos : Positive; V : String_Vector) return String is
(if Pos > V.Count
then ""
else V (Pos) & Separator & Flatten (Pos + 1, V));
begin
return Flatten (1, V);
end Flatten;
-------------
-- Replace --
-------------
function Replace (Text : String; Match : String; Subst : String) return String is
use Ada.Strings.Fixed;
First : Natural;
begin
First := Index (Text, Match);
if First = 0 then
return Text;
else
return Replace (Replace_Slice (Text, First, First + Match'Length - 1, Subst), Match, Subst);
end if;
end Replace;
-----------
-- Split --
-----------
function Split (Text : String;
Separator : Character;
Side : Halves := Head;
From : Halves := Head;
Count : Positive := 1;
Raises : Boolean := True) return String
is
Seen : Natural := 0;
Pos : Integer := (if From = Head then Text'First else Text'Last);
Inc : constant Integer := (if From = Head then 1 else -1);
begin
loop
if Text (Pos) = Separator then
Seen := Seen + 1;
if Seen = Count then
if Side = Head then
return Text (Text'First .. Pos - 1);
else
return Text (Pos + 1 .. Text'Last);
end if;
end if;
end if;
Pos := Pos + Inc;
exit when Pos not in Text'Range;
end loop;
if Raises then
raise Constraint_Error with "Not enought separators found";
else
return Text;
end if;
end Split;
----------
-- Tail --
----------
function Tail (Str : String; Separator : Character) return String is
begin
for I in Str'Range loop
if Str (I) = Separator then
return Str (I + 1 .. Str'Last);
end if;
end loop;
return "";
end Tail;
-------------------
-- To_Lower_Case --
-------------------
function To_Lower_Case (S : String) return String is
begin
return SLC : String := S do
GNAT.Case_Util.To_Lower (SLC);
end return;
end To_Lower_Case;
-------------------
-- To_Mixed_Case --
-------------------
function To_Mixed_Case (S : String) return String is
begin
return SMC : String := S do
GNAT.Case_Util.To_Mixed (SMC);
end return;
end To_Mixed_Case;
--------------------
-- Image_One_Line --
--------------------
function Image_One_Line (V : Vector) return String is
use all type Vectors.Index_Type;
function Image (V : Vector; Pos : Vectors.Index_Type) return String is
(Image (V.Element (Pos)) &
(if Pos = V.Last_Index
then ""
else Separator & Image (V, Pos + 1)));
begin
if V.Is_Empty then
return When_Empty;
else
return Image (V, V.First_Index);
end if;
end Image_One_Line;
---------------
-- To_Native --
---------------
function To_Native (Path : Platform_Independent_Path) return String is
Dir_Seps : constant Ada.Strings.Maps.Character_Set := Ada.Strings.Maps.To_Set ("/\");
use Ada.Strings.Maps;
begin
return Native : String := Path do
for I in Native'Range loop
if Is_In (Path (I), Dir_Seps) then
Native (I) := GNAT.OS_Lib.Directory_Separator;
end if;
end loop;
end return;
end To_Native;
-----------
-- Write --
-----------
procedure Write (V : String_Vector;
Filename : Platform_Independent_Path;
Separator : String := ASCII.LF & "")
is
use Ada.Streams.Stream_IO;
F : File_Type;
begin
Create (F, Out_File, Filename);
for Line of V loop
String'Write (Stream (F), Line);
String'Write (Stream (F), Separator);
end loop;
Close (F);
end Write;
end Alire.Utils;