getada_1.0.1_e3e93ee6/src/common.adb

 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
--    Copyright (C) 2024 A.J. Ianozi <aj@ianozi.com>
--
--    This file is part of GetAda: the Unofficial Alire Installer
--
--    This program 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 3 of the License, or
--    (at your option) any later version.
--
--    This program 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 program.  If not, see <https://www.gnu.org/licenses/>.
with Ada.Strings.Fixed;

package body Common is
   use Ada.Strings.Fixed;
   function Split
      (Item : String; Delimiter : String)
   return String_Vectors.Vector is
      Result : String_Vectors.Vector;
   begin
      if Delimiter'Length > 0 and then Item'Length > 0 then
         declare
            Next_Begin     : Natural := Item'First;
            Next_Delimiter : Natural := Index (Item, Delimiter);
         begin
            loop
               if Next_Delimiter > 0 then
                  if Next_Delimiter = 1 then
                     Result.Append ("");
                  else
                     Result.Append (Item (Next_Begin .. Next_Delimiter - 1));
                  end if;
                  Next_Begin     := Next_Delimiter + Delimiter'Length;
                  Next_Delimiter := Index (Item (Next_Begin .. Item'Last),
                                           Delimiter);
               else
                  Result.Append (Item (Next_Begin .. Item'Last));
                  exit;
               end if;
               exit when Next_Delimiter > Item'Last;
            end loop;
         end;
      end if;
      return Result;
   end Split;
end Common;