Fortran · 1738 bytes Raw Blame History
1 module ferp_kinds
2 !> Portable kind parameters for FERP
3 !> Ensures consistent behavior across platforms (Apple Silicon, Linux x86_64)
4 use, intrinsic :: iso_fortran_env, only: int32, int64, real64
5 implicit none
6 private
7
8 public :: i32, i64, dp
9 public :: initial_line_len, max_line_len, max_path_len, max_pattern_len
10 public :: pattern_len
11
12 !> Integer kinds
13 integer, parameter :: i32 = int32
14 integer, parameter :: i64 = int64
15
16 !> Real kinds (for future use)
17 integer, parameter :: dp = real64
18
19 !> Buffer size constants
20 integer, parameter :: initial_line_len = 8192 ! Initial buffer size for dynamic line reading
21 integer, parameter :: max_line_len = 8192 ! Legacy - kept for compatibility, will be removed
22 integer, parameter :: max_path_len = 4096
23 integer, parameter :: max_pattern_len = 4096
24
25 contains
26
27 pure function pattern_len(pattern) result(plen)
28 !> Get the true length of a pattern, respecting null terminator if present
29 !> This allows whitespace-only patterns like " " to be handled correctly
30 !> If no null terminator is found, returns the full string length (not len_trim)
31 !> to properly handle whitespace-only patterns passed with explicit length
32 character(len=*), intent(in) :: pattern
33 integer :: plen
34
35 integer :: i, slen
36
37 slen = len(pattern)
38 plen = slen
39
40 ! Look for null terminator
41 do i = 1, slen
42 if (pattern(i:i) == char(0)) then
43 plen = i - 1
44 return
45 end if
46 end do
47
48 ! No null terminator found - return full length
49 ! (pattern was passed with explicit length, e.g., pattern(1:2))
50 ! Note: Don't use len_trim here as it would break whitespace patterns
51
52 end function pattern_len
53
54 end module ferp_kinds
55