1:- module(os_search_paths,
    2          [   search_path_prepend/2,    % +Name:atom, +Directory:atom
    3              search_path/2,            % +Name:atom, ?Directories:list(atom)
    4              search_path_separator/1   % ?Separator:atom
    5          ]).
 search_path_prepend(+Name:atom, +Directory:atom) is det
Adds Directory to a search-path environment variable. Note, this is not naturally an atomic operation but the prepend makes it thread safe by wrapping the fetching and storing within a mutex.

Prepends Directory to the environment search path by Name, unless already present. Uses semi-colon as the search-path separator on Windows operating systems, or colon everywhere else. Adds Directory to the start of an existing path. Makes Directory the first and only directory element if the search path does not yet exist.

Note that Directory should be an operating-system compatible search path because non-Prolog software needs to search using the included directory paths. Automatically converts incoming directory paths to operating-system compatible paths.

Note also, the environment variable Name is case insensitive on Windows, but not so on Unix-based operating systems.

   27search_path_prepend(Name, Directory0) :-
   28    prolog_to_os_filename(Directory0, Directory),
   29    with_mutex(
   30        search_path_prepend,
   31        (   search_path(Name, Directories)
   32        ->  (   memberchk(Directory, Directories)
   33            ->  true
   34            ;   search_path(Name, [Directory|Directories])
   35            )
   36        ;   setenv(Name, Directory)
   37        )).
 search_path(+Name:atom, -Directories:list(atom)) is semidet
search_path(+Name:atom, +Directories:list(atom)) is det
Only fails if the environment does not contain the given search-path variable. Does not fail if the variable does not identify a proper separator-delimited variable.
   46search_path(Name, Directories) :-
   47    var(Directories),
   48    !,
   49    getenv(Name, Value),
   50    search_path_separator(Separator),
   51    atomic_list_concat(Directories, Separator, Value).
   52search_path(Name, Directories) :-
   53    search_path_separator(Separator),
   54    atomic_list_concat(Directories, Separator, Value),
   55    setenv(Name, Value).
 search_path_separator(?Separator:atom) is semidet
Separator used for search paths: semi-colon on the Microsoft Windows operating system; colon elsewhere.
   62search_path_separator((;)) :-
   63    current_prolog_flag(windows, true),
   64    !.
   65search_path_separator(:)