1- ! unix.F90
1+ ! unix.f90
22!
33! A collection of Fortran 2008 ISO C binding interfaces to selected POSIX and
44! SysV routines on 64-bit Unix-like operating systems.
@@ -35,6 +35,12 @@ module unix
3535 use :: unix_wait
3636 implicit none
3737
38+ interface c_int_to_uint
39+ ! ! Converts unsigned integer to signed integer.
40+ module procedure :: c_int32_to_uint16
41+ module procedure :: c_int64_to_uint32
42+ end interface
43+
3844 interface c_uint_to_int
3945 ! ! Converts unsigned integer to signed integer.
4046 module procedure :: c_uint16_to_int32
@@ -43,13 +49,48 @@ module unix
4349
4450 public :: c_f_str_chars
4551 public :: c_f_str_ptr
52+ public :: c_int32_to_uint16
53+ public :: c_int64_to_uint32
54+ public :: c_int_to_uint
4655 public :: c_uint16_to_int32
4756 public :: c_uint32_to_int64
4857 public :: c_uint_to_int
4958 public :: f_c_str_chars
5059 public :: f_readdir
5160 public :: f_strerror
5261contains
62+ pure elemental function c_int32_to_uint16(s) result(u)
63+ ! ! Converts signed `c_int32_t` integer to unsigned `c_uint16_t` integer.
64+ integer (kind= c_int32_t), intent (in ) :: s ! ! Signed integer.
65+ integer (kind= c_uint16_t) :: u ! ! Unsigned integer.
66+
67+ integer (kind= c_int32_t) :: i
68+
69+ i = modulo (s, 65536_c_int32_t )
70+
71+ if (i < 32768_c_int32_t ) then
72+ u = int (i, kind= c_uint16_t)
73+ else
74+ u = int (i - 65536_c_int32_t , kind= c_uint16_t)
75+ end if
76+ end function c_int32_to_uint16
77+
78+ pure elemental function c_int64_to_uint32(s) result(u)
79+ ! ! Converts signed `c_int64_t` integer to unsigned `c_uint32_t` integer.
80+ integer (kind= c_int64_t), intent (in ) :: s ! ! Signed integer.
81+ integer (kind= c_uint32_t) :: u ! ! Unsigned integer.
82+
83+ integer (kind= c_int64_t) :: i
84+
85+ i = modulo (s, 4294967296_c_int64_t )
86+
87+ if (i < 2147483648_c_int64_t ) then
88+ u = int (i, kind= c_uint32_t)
89+ else
90+ u = int (i - 4294967296_c_int64_t , kind= c_uint32_t)
91+ end if
92+ end function c_int64_to_uint32
93+
5394 pure elemental function c_uint16_to_int32(i) result(r)
5495 ! ! Converts unsigned `uint16_t` integer to signed `int32_t` integer.
5596 integer (kind= c_uint16_t), intent (in ) :: i ! ! Unsigned integer.
0 commit comments