aboutsummaryrefslogtreecommitdiff
path: root/platform.F90
blob: 7c864b12318530b95e9c46d6a2b9e4df6b8dc9d8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
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)
    use iso_c_binding
    implicit none

        character(*), intent(in)::dir
        
#ifdef WINDOWS
        character(kind=c_char, len=:), allocatable, target::passdir
        interface
            function CreateDirectory(dir, ignored) bind(c, name="CreateDirectoryA")
            use iso_c_binding
            type(c_ptr), value::dir
            type(c_ptr), value::ignored
            integer(kind=c_int)::CreateDirectory
            end function CreateDirectory
        end interface
        
        allocate(character(len=(len_trim(dir)+1)) :: passdir)
        passdir = trim(dir)//c_null_char
        if(CreateDirectory(c_loc(passdir), c_null_ptr) == 0) then
            print *, "Could not create directory, maybe exists?"
        end if
        deallocate(passdir)
            
        !call execute_command_line('mkdir "'//trim(dir)//'"')
#else
        call execute_command_line('mkdir -p "'//trim(dir)//'"')
#endif
    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