-- This file is  free  software, which  comes  along  with  SmartEiffel. This
-- software  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. You can modify it as you want, provided
-- this header is kept unaltered, and a notification of the changes is added.
-- You  are  allowed  to  redistribute  it and sell it, alone or as a part of
-- another product.
--       Copyright (C) 1994-2002 LORIA - INRIA - U.H.P. Nancy 1 - FRANCE
--          Dominique COLNET and Suzanne COLLIN - SmartEiffel@loria.fr
--                       http://SmartEiffel.loria.fr
--
expanded class SYSTEM
--
-- This expanded class allow to execute system command
-- and to get/set environment variables.
--

inherit ANY redefine get_environment_variable end

feature

   get_environment_variable(variable: STRING): STRING is
         -- Try to get the value of the system environment `variable' or some
         -- `variable' in the system registry. Gives Void when no information
         -- about the `variable' is available. Under UNIX like system, this is in
         -- fact the good way to know about some system environment variable.
	 -- Under Windows, this function also look in the system registery.
      require
         variable /= Void
      local
         p, null: POINTER
      do
         p := variable.to_external
	 p := basic_getenv(p)
	 if p /= null then
	    !!Result.from_external_copy(p)
	 end
      end

   set_environment_variable(variable, value: STRING) is
         -- Try to assign the system environment `variable' with `value'.
      require
         variable /= Void
	 value /= Void
      do
	 basic_putenv(variable.to_external,value.to_external)
      end

   execute_command(system_command_line: STRING): INTEGER is
         -- To execute a `system_command_line' as for example, "ls -l" on UNIX.
         -- The `Result' depends of the actual operating system. As an exemple,
         -- this `execute' feature is under UNIX the equivalent of a `system' call.
      require
	 system_command_line /= Void
      local
         p: POINTER
      do
         p := system_command_line.to_external
         Result := basic_system_execute_command(p)
      end

   execute_command_line(system_command_line: STRING) is
	 -- The equivalent of `execute_command' without `Result'.
      do
	 if execute_command(system_command_line) = 0 then end
      end

feature {NONE}

   basic_getenv(environment_variable: POINTER): POINTER is
         -- To implement `get_environment_variable'.
      external "SmartEiffel"
      end

   basic_putenv(variable, value: POINTER) is
         -- To implement `set_environment_variable'.
      external "SmartEiffel"
      end

   basic_system_execute_command(system_command_line: POINTER): INTEGER is
      external "SmartEiffel"
      end

end -- SYSTEM