with shell.Commands, gnat.OS_Lib, ada.Strings.fixed, ada.Strings.Maps, ada.Characters.latin_1, ada.Exceptions; package body lace.Environ.OS_Commands is use ada.Exceptions; function Path_to (Command : in String) return Paths.Folder is use Paths; begin return to_Folder (run_OS ("which " & Command)); end Path_to; procedure run_OS (command_Line : in String; Input : in String := "") is use Shell; begin Commands.run (command_Line, +Input); exception when E : Commands.command_Error => raise Error with Exception_Message (E); end run_OS; function run_OS (command_Line : in String; Input : in String := ""; add_Errors : in Boolean := True) return String is use Shell, Shell.Commands; function trim_LF (Source : in String) return String is use ada.Strings.fixed, ada.Strings.Maps, ada.Characters; LF_Set : constant Character_Set := to_Set (Latin_1.LF); begin return trim (Source, LF_Set, LF_Set); end trim_LF; Results : constant Command_Results := run (command_Line, +Input); Output : constant String := +Output_of (Results); begin if add_Errors then return trim_LF (Output & (+Errors_of (Results))); else return trim_LF (Output); end if; exception when E : command_Error => raise Error with Exception_Message (E); end run_OS; function run_OS (command_Line : in String; Input : in String := "") return Data is use Shell, Shell.Commands; the_Command : Command := Forge.to_Command (command_Line); begin return Output_of (run (The_Command, +Input)); exception when E : command_Error => raise Error with Exception_Message (E); end run_OS; function Executable_on_Path (Executable : Paths.File) return Boolean is use Paths, gnat.OS_Lib; File_Path : String_Access := Locate_Exec_On_Path (+Executable); Found : constant Boolean := File_Path /= null; begin free (File_Path); return Found; end Executable_on_Path; end lace.Environ.OS_Commands;