ANY INSTALL NONE
expanded class interface BASIC_DIRECTORY
   --
   -- Very low-level basic tools for file-system directory handling and file
   -- path manipulation. This class is intended to be platform independant as
   -- much as possible. In order to remove from the client side the burden of
   -- file path computation, this class tries to compute automatically the
   -- system file notation using argument(s) of some of the very first call(s).
   -- As soon as the system notation has been properly detected, the result is
   -- internally memorized for all objects of type BASIC_DIRECTORY in a common
   -- private buffer. Besides the low-level nature of operations one can found
   -- in this class, all file path manipulations are done in a smart way
   -- (except when the system file path notation has not been detected
   -- automatically, which is quite uncommon). As an example, even if the
   -- directory separator is internally detected, this information is
   -- _intentionaly_ kept private to avoid low-level manipulation from the
   -- client side. Finally, this class is expanded in order to avoid as much as
   -- possible memory allocations.
   --
   -- Also consider high level facade class DIRECTORY if you don't want
   -- to deal directly with low level directory streams.
   --

feature(s) from BASIC_DIRECTORY
   directory_stream: POINTER
      -- This pointer memorize the current directory stream being
      -- scanned (used to compute is_connected).

   current_entry: POINTER
      -- When is_connected, memorize the current entry in the
      -- current  directory_stream.

feature(s) from BASIC_DIRECTORY
   -- State of Current basic directory stream:

   is_connected: BOOLEAN
      -- Is Current connected to some directory stream ?

   end_of_input: BOOLEAN
      -- Is end of input reached ?
      require
         is_connected

feature(s) from BASIC_DIRECTORY
   -- Connect and disconnect:

   connect_to (directory_path: STRING)
      -- Try to connect Current to some existing directory_path. After
      -- this call, the client is supposed to use is_connected to check
      -- that the stream is ready to be used.
      require
         not is_connected;
         not directory_path.is_empty;
         common_buffer_protection: last_entry /= directory_path
      ensure
         is_connected implies not end_of_input

   connect_with (some_path: STRING)
      -- Try to connect Current to some directory using some_path which
      -- may  be either an existing directory path or some arbitrary
      -- file path name. When some_path is the path of some readable
      -- existing directory, this directory is opened and the effect of
      -- connect_with is equivalent to connect_to. When some_path is not an
      -- existing readable directory path, connect_with tries to open the
      -- directory which may contains some_path viewed as a file path
      -- name. After this call, the client is supposed to use is_connected
      -- to check that the stream is ready to be used and the last_entry
      -- buffer to know about the corresponding opened directory path.
      -- Whatever the result, some_path is left unchanged.
      require
         not is_connected;
         not some_path.is_empty;
         common_buffer_protection: last_entry /= some_path
      ensure
         is_connected implies not end_of_input

   connect_to_current_working_directory
      -- Try to connect Current to the current working directory.
      -- After this call, the client is supposed to use is_connected
      -- to check that the stream is ready to be used and the last_entry
      -- buffer to know about the name of the current working directory.
      require
         not is_connected
      ensure
         is_connected implies not end_of_input

   disconnect
      -- Do not forget to call this feature when you have finished
      -- with some previously opened directory stream.
      require
         is_connected
      ensure
         not is_connected

feature(s) from BASIC_DIRECTORY
   -- Scanning:

   last_entry: STRING
      -- Unique global buffer (once object) to get the last information
      -- computed by many routines of this class: read_entry, connect_with
      -- connect_to_current_working_directory, compute_parent_directory_of, ...

   read_entry
      -- Read the next entry name and update last_entry and end_of_input
      -- accordingly.
      require
         is_connected;
         not end_of_input

feature(s) from BASIC_DIRECTORY
   -- File path handling tools:

   compute_parent_directory_of (some_path: STRING)
      -- Using some_path (which may be either a file path or a directory
      -- path) tries to compute in the last_entry buffer the parent
      -- directory of some_path. When some_path is a path with no parent
      -- directory, the last_entry buffer is_empty after this call. This
      -- operation does not perform any disk access.
      require
         not some_path.is_empty;
         common_buffer_protection: last_entry /= some_path

   compute_subdirectory_with (parent_path, entry_name: STRING)
      -- Try to compute in the last_entry buffer the new subdirectory
      -- path obtained when trying to concatenate smartly parent_path
      -- whith some entry_name. When this fails the last_entry buffer is_empty
      -- after this call. This operation does not perform any disk access.
      -- Whatever the result, parent_path and  entry_name are left unchanged.
      require
         not parent_path.is_empty;
         not entry_name.is_empty;
         common_buffer_protection1: last_entry /= parent_path;
         common_buffer_protection2: last_entry /= entry_name

   compute_file_path_with (parent_path, file_name: STRING)
      -- Try to compute in the last_entry buffer the new file path obtained
      -- when trying to concatenate smartly parent_path whith some
      -- file_name. When this fails the last_entry buffer is_empty after
      -- this call. This operation does not perform any disk access.
      -- Whatever the result, parent_path and file_name are left unchanged.
      require
         not parent_path.is_empty;
         not file_name.is_empty;
         common_buffer_protection1: last_entry /= parent_path;
         common_buffer_protection2: last_entry /= file_name

   change_current_working_directory (directory_path: STRING)
      -- Try to change the current working directory using some
      -- directory_path. When the operation is possible, the last_entry buffer
      -- is updated with the new current working directory path,
      -- otherwise, when the modification is not possible the last_entry
      -- buffer is_empty after this call. Whatever the result,
      -- directory_path is left unchanged.
      require
         not is_connected;
         common_buffer_protection1: last_entry /= directory_path
      ensure
         not is_connected

feature(s) from BASIC_DIRECTORY
   -- Disk modification:

   create_new_directory (directory_path: STRING): BOOLEAN
      -- Try to create a new directory using the directory_path name.
      -- Returns True on success.
      require
         not is_connected
      ensure
         not is_connected

   remove_directory (directory_path: STRING): BOOLEAN
      -- Try to remove directory directory_path which must be empty.
      -- Returns True on success.
      require
         not is_connected
      ensure
         not is_connected

   remove_files_of (directory_path: STRING)
      -- Try to remove all files (not subdirectories) of directory
      -- specified by directory_path.
      require
         not is_connected
      ensure
         not is_connected

feature(s) from BASIC_DIRECTORY
   -- Miscellaneous:

   is_case_sensitive: BOOLEAN

feature(s) from BASIC_DIRECTORY
   notation: STRING
      -- Unique common buffer to memorize the system path
      -- name notation code.

   valid_notation: BOOLEAN

   system_notation_detected: BOOLEAN
      require
         valid_notation

   unix_notation: BOOLEAN
      -- The Unix like file path notation looks like:
      --   /SmartEiffel/sys/system.se
      require
         valid_notation

   windows_notation: BOOLEAN
      -- The Windows like file path notation looks like:
      --   C:\SmartEiffel\sys\system.se
      require
         valid_notation

   cygwin_notation: BOOLEAN
      -- The Cygwin like file path notation looks like:
      --   //C/SmartEiffel/sys/system.se
      require
         valid_notation

   amiga_notation: BOOLEAN
      -- The Amiga file path notation looks like:
      --   DEV:SmartEiffel/sys/system.se
      require
         valid_notation

   macintosh_notation: BOOLEAN
      -- The Macintosh file path notation looks like:
      --   :SmartEiffel:sys:system.se
      require
         valid_notation

   openvms_notation: BOOLEAN
      -- The VMS file path notation looks like:
      --    DISK:[SmartEiffel.sys]system.se
      -- The current working directory notation is:
      --    DISK:[]
      -- The equivalent of Unix .. is :
      --    [-]
      -- The equivalent of Unix ../.. is :
      --    [-.-]
      --
      require
         valid_notation

   set_notation_using (some_path: STRING)
      -- Try to detect automatically the file system notation.
      require
         not some_path.is_empty;
         not system_notation_detected

   reset_notation_using (some_path: STRING)
      -- Try to detect automatically the file system notation.

   tmp_path: STRING

feature(s) from BASIC_DIRECTORY
   directory_open (path_pointer: POINTER): POINTER
      -- Try to open some existing directory using path. When Result
      -- is_not_null, the directory is correctly opened and Result is
      -- a valid handle for this directory. Using Result, one can
      -- then scan the content of the directory using function
      -- basic_directory_read_entry and basic_directory_get_entry_name. Finally,
      -- a is_not_null directory must be closed using function
      -- basic_directory_close.
      require
         path_pointer.is_not_null

   directory_read_entry (dirstream: POINTER): POINTER
      -- Read an return a new entry using the directory handle dirstream
      -- obtained with function basic_directory_open. When there is no more
      -- entry, the Result becomes is_null.
      require
         dirstream.is_not_null

   directory_get_entry_name (entry: POINTER): POINTER
      -- Read an return a new entry using the directory handle dirstream
      -- obtained with function basic_directory_open.
      -- When there is no more entry, the Result becomes is_null.
      require
         entry.is_not_null

   directory_close (dirstream: POINTER): BOOLEAN
      -- Try to close some opened dirstream directory.
      -- A True result indicates that the directory is correctly
      -- closed.
      require
         dirstream.is_not_null

   directory_current_working_directory: POINTER
      -- Try to get the current working directory path.

   directory_chdir (destination: POINTER): BOOLEAN
      -- Try to change the current working directory using destination.

   directory_mkdir (directory_path: POINTER): BOOLEAN
      -- Try to create a new directory using directory_path.

   directory_rmdir (directory_path: POINTER): BOOLEAN
      -- Try to remove directory_path.



end of expanded BASIC_DIRECTORY