Skip to content

Commit eeba077

Browse files
author
Damian Rouson
committed
fix check of minimally acceptable compiler version
1 parent 9fe0eb6 commit eeba077

File tree

1 file changed

+36
-28
lines changed

1 file changed

+36
-28
lines changed

prerequisites/acceptable_compiler.f90

Lines changed: 36 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -47,33 +47,39 @@ program main
4747
call get_command_argument(first_argument,acceptable_version,status=stat)
4848
call validate_command_line( stat )
4949

50-
associate( compiler_version=> compiler_version() )
51-
associate(major_version=>major(compiler_version), acceptable_major=>major(acceptable_version))
52-
if ( major_version > acceptable_major ) then
53-
print *,.true.
54-
else if ( major_version == acceptable_major ) then
55-
associate(minor_version=>minor(compiler_version), acceptable_minor=>minor(acceptable_version))
56-
if ( minor_version > acceptable_minor ) then
57-
print *,.true.
58-
else if ( minor_version == acceptable_minor ) then
59-
associate(patch_version=>patch(compiler_version), acceptable_patch=>patch(acceptable_version))
60-
if ( patch_version >= acceptable_patch ) then
61-
print *,.true.
62-
else
63-
print *,.false.
64-
end if
65-
end associate
66-
else
67-
print *,.false.
50+
print *, patch_meets_minimum( acceptable_version )
51+
52+
contains
53+
54+
pure function patch_meets_minimum( required_version ) result( is_acceptable)
55+
character(len=*), intent(in) :: required_version
56+
logical is_acceptable
57+
58+
is_acceptable = .false. ! default result
59+
60+
associate( actual_version => compiler_version() )
61+
associate(major_version=>major(actual_version), acceptable_major=>major(required_version))
62+
if (major_version < acceptable_major) return
63+
if (major_version > acceptable_major) then
64+
is_acceptable = .true.
65+
return
66+
end if
67+
associate(minor_version=>minor(actual_version), acceptable_minor=>minor(required_version))
68+
if (minor_version < acceptable_minor) return
69+
if (minor_version > acceptable_minor) then
70+
is_acceptable = .true.
71+
return
6872
end if
73+
associate(patch_version=>patch(actual_version), acceptable_patch=>patch(required_version))
74+
if (patch_version < acceptable_patch) return
75+
is_acceptable = .true.
76+
end associate
6977
end associate
70-
else
71-
print *,.false.
72-
end if
78+
end associate
7379
end associate
74-
end associate
7580

76-
contains
81+
82+
end function
7783

7884
subroutine validate_command_line( command_line_status )
7985
integer, intent(in) :: command_line_status
@@ -118,29 +124,31 @@ pure function minor(version_string) result(minor_value)
118124
end function
119125

120126
pure function patch(version_string) result(patch_value)
127+
use iso_fortran_env, only : iostat_end
121128
character(len=*), intent(in) :: version_string
122-
integer patch_value
129+
integer patch_value, io_stat
123130
character(len=:), allocatable :: trailing_digits
124131

125132
associate( first_dot => scan(version_string, '.') )
126133
associate( second_dot => first_dot + scan(version_string(first_dot+1:), '.') )
127-
associate( first_non_digit=> second_dot + first_printable_non_digit(version_string(second_dot+1:)) )
128-
trailing_digits = version_string( second_dot+1 : first_non_digit-1 )
129-
read(trailing_digits,*) patch_value
134+
associate( next_non_digit=> second_dot + next_printable_non_digit(version_string(second_dot+1:)) )
135+
trailing_digits = version_string( second_dot+1 : next_non_digit-1 )
136+
read(trailing_digits, * , iostat=io_stat) patch_value
130137
end associate
131138
end associate
132139
end associate
133140

134141
end function
135142

136-
pure function first_printable_non_digit( string ) result(location)
143+
pure function next_printable_non_digit( string ) result(location)
137144
character(len=*), intent(in) :: string
138145
integer i, location
139146
integer, parameter :: ASCII_non_digit(*)=[(i,i=32,47),(i,i=58,126)]
140147
character(len=1), parameter :: non_digit(*)=[( char(ASCII_non_digit(i)) , i=1, size(ASCII_non_digit) )]
141148
character(len=size(non_digit)) non_digit_string
142149
write(non_digit_string,'(85a)') non_digit
143150
location = scan(string,non_digit_string)
151+
if (location==0) location=len(string)+1
144152
end function
145153

146154
end program

0 commit comments

Comments
 (0)