spawn_glib_1.0.0_44f27529/source/spawn/spawn-environments-search_in_path__windows.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
52
53
54
55
56
57
58
59
60
------------------------------------------------------------------------------
--                         Language Server Protocol                         --
--                                                                          --
--                     Copyright (C) 2018-2019, AdaCore                     --
--                                                                          --
-- This is free software;  you can redistribute it  and/or modify it  under --
-- terms of the  GNU General Public License as published  by the Free Soft- --
-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
-- sion.  This software 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. See the GNU General Public --
-- License for  more details.  You should have  received  a copy of the GNU --
-- General  Public  License  distributed  with  this  software;   see  file --
-- COPYING3.  If not, go to http://www.gnu.org/licenses for a complete copy --
-- of the license.                                                          --
------------------------------------------------------------------------------

with Ada.Strings.UTF_Encoding.Wide_Strings;
with Interfaces.C;
with Spawn.Windows_API;

separate (Spawn.Environments)
function Search_In_Path
  (File : UTF_8_String;
   Path : UTF_8_String) return UTF_8_String
is
   use type Spawn.Windows_API.DWORD;

   Raw_Path : Interfaces.C.wchar_array :=
     Interfaces.C.To_C
       (Ada.Strings.UTF_Encoding.Wide_Strings.Decode (Path));

   Raw_File : Interfaces.C.wchar_array :=
     Interfaces.C.To_C
       (Ada.Strings.UTF_Encoding.Wide_Strings.Decode (File));

   Raw_Exe : Interfaces.C.wchar_array := Interfaces.C.To_C (".exe");

   Buffer : Interfaces.C.wchar_array (1 .. Spawn.Windows_API.MAX_PATH);

   Length : constant Spawn.Windows_API.DWORD :=
     Spawn.Windows_API.SearchPath
       (lpPath        => Raw_Path (Raw_Path'First)'Unchecked_Access,
        lpFileName    => Raw_File (Raw_File'First)'Unchecked_Access,
        lpExtension   => Raw_Exe (Raw_Exe'First)'Unchecked_Access,
        nBufferLength => Buffer'Length,
        lpBuffer      => Buffer (Buffer'First)'Unchecked_Access,
        lpFilePart    => null);
begin
   if Length = 0 or else Length > Buffer'Length then

      return "";
   else

      return Ada.Strings.UTF_Encoding.Wide_Strings.Encode
        (Interfaces.C.To_Ada
           (Buffer (1 .. Interfaces.C.size_t (Length)),
            Trim_Nul => False));
   end if;
end Search_In_Path;