module platform implicit none #ifdef WINDOWS character, parameter::dir_sep = '\' #else character, parameter::dir_sep = '/' #endif character(*), parameter::favorites_file = "favorites.gmi" contains subroutine make_directory(dir) implicit none character(*), intent(in)::dir call execute_command_line('mkdir "'//trim(dir)//'"') end subroutine make_directory subroutine get_settings_directory(dir) use iso_c_binding implicit none character(*), intent(out)::dir #ifdef WINDOWS interface function SHGetFolderPath(hwnd, csidl, htoken, dwflags, path) bind(c, name="SHGetFolderPathA") use iso_c_binding type(c_ptr), value::hwnd integer(kind=c_int), value::csidl type(c_ptr), value::htoken integer(kind=c_int32_t), value::dwflags character(kind=c_char), dimension(260)::path integer(kind=c_intptr_t)::SHGetFolderPath end function SHGetFolderPath end interface integer(kind=c_intptr_t), parameter::S_OK = 0 integer(kind=c_int), parameter::CSIDL_APPDATA = 26 character(kind=c_char), dimension(260)::path integer::i if(SHGetFolderPath(c_null_ptr, CSIDL_APPDATA, c_null_ptr, 0, path) == S_OK) then dir = " " i = 1 do while(path(i) /= c_null_char .and. i < 260) dir(i:i) = path(i) i = i + 1 end do else Print *, "Warning: Could not access CSIDL_APPDATA" call get_environment_variable("HOME", value=dir) end if if(dir(len_trim(dir):len_trim(dir)) /= dir_sep) then dir = trim(dir)//dir_sep end if dir = trim(dir)//"LR-87" #else call get_environment_variable("HOME", value=dir) if(dir(len_trim(dir):len_trim(dir)) /= dir_sep) then dir = trim(dir)//dir_sep end if dir = trim(dir)//".lr87" #endif ! Harmless call make_directory(dir) end subroutine get_settings_directory subroutine get_favorites_file(filename) implicit none character(*), intent(out)::filename call get_settings_directory(filename) filename = trim(filename)//dir_sep//favorites_file end subroutine get_favorites_file end module platform