Skip to content

Commit e8819eb

Browse files
committed
Added licence information. Added signed to unsigned functions. Minor updates.
1 parent 4e47f6e commit e8819eb

28 files changed

+158
-23
lines changed

examples/key/key.f90

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,29 +28,26 @@ end function next_char
2828
subroutine set_mode(mode)
2929
integer, intent(in) :: mode
3030

31-
integer :: stat
32-
integer(kind=c_tcflag_t) :: c_lflag
33-
type(c_termios) :: term_attr
34-
type(c_termios), save :: save_attr
31+
integer :: stat
32+
integer(kind=c_int64_t) :: c_lflag
33+
type(c_termios) :: term_attr
34+
type(c_termios), save :: save_attr
3535

3636
if (mode == 0) then
3737
stat = c_tcsetattr(STDIN_FILENO, TCSADRAIN, save_attr)
38-
if (stat /= 0) error stop
3938
else
4039
stat = c_tcgetattr(STDIN_FILENO, term_attr)
41-
if (stat /= 0) error stop
4240

4341
save_attr = term_attr
4442

45-
c_lflag = int(c_uint_to_int(term_attr%c_lflag), kind=c_tcflag_t)
46-
c_lflag = iand(c_lflag, not(ior(ICANON, ECHO)))
43+
c_lflag = c_uint_to_int(term_attr%c_lflag)
44+
c_lflag = iand(c_lflag, not(int(ior(ICANON, ECHO), kind=c_int64_t)))
4745

48-
term_attr%c_lflag = c_lflag
46+
term_attr%c_lflag = c_int_to_uint(c_lflag)
4947
term_attr%c_cc(VMIN) = 1_c_cc_t
5048
term_attr%c_cc(VTIME) = 0_c_cc_t
5149

52-
stat = c_tcsetattr(STDIN_FILENO, TCSANOW , term_attr)
53-
if (stat /= 0) error stop
50+
stat = c_tcsetattr(STDIN_FILENO, TCSANOW, term_attr)
5451
end if
5552
end subroutine set_mode
5653
end program main

examples/stat/stat.f90

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,9 @@ program main
1111
character(len=*), parameter :: FILE_NAME = 'README.md'
1212

1313
character(len=:), allocatable :: atime, mtime, ctime
14-
15-
integer :: file_type, stat
16-
integer(kind=c_int64_t) :: file_mode
17-
type(c_stat_type) :: file_stat
14+
integer :: file_type, stat
15+
integer(kind=c_int64_t) :: file_mode
16+
type(c_stat_type) :: file_stat
1817

1918
! Get file status.
2019
stat = c_stat(FILE_NAME // c_null_char, file_stat)

src/unix.f90

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
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
5261
contains
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.

src/unix_dirent.F90

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
! unix_dirent.F90
2+
!
3+
! Author: Philipp Engel
4+
! Licence: ISC
25
module unix_dirent
36
use, intrinsic :: iso_c_binding
47
implicit none
@@ -16,6 +19,7 @@ module unix_dirent
1619

1720
#if defined (__linux__)
1821

22+
! struct dirent
1923
type, bind(c), public :: c_dirent
2024
integer(kind=c_int64_t) :: d_ino = 0_c_int64_t
2125
integer(kind=c_int64_t) :: d_off = 0_c_int64_t
@@ -26,6 +30,7 @@ module unix_dirent
2630

2731
#elif defined (__FreeBSD__)
2832

33+
! struct dirent
2934
type, bind(c), public :: c_dirent
3035
integer(kind=c_int64_t) :: d_fileno = 0_c_int64_t
3136
integer(kind=c_int64_t) :: d_off = 0_c_int64_t

src/unix_errno.F90

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
! unix_errno.F90
2+
!
3+
! Author: Philipp Engel
4+
! Licence: ISC
25
module unix_errno
36
use, intrinsic :: iso_c_binding
47
implicit none

src/unix_fcntl.F90

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
! unix_fcntl.F90
2+
!
3+
! Author: Philipp Engel
4+
! Licence: ISC
25
module unix_fcntl
36
use, intrinsic :: iso_c_binding
47
use :: unix_types

src/unix_inet.F90

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
! unix_inet.F90
2+
!
3+
! Author: Philipp Engel
4+
! Licence: ISC
25
module unix_inet
36
use, intrinsic :: iso_c_binding
47
use :: unix_types

src/unix_ioctl.F90

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
! unix_ioctl.F90
2+
!
3+
! Author: Philipp Engel
4+
! Licence: ISC
25
module unix_ioctl
36
use, intrinsic :: iso_c_binding
47
use :: unix_types

src/unix_ipc.F90

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
! unix_ipc.F90
2+
!
3+
! Author: Philipp Engel
4+
! Licence: ISC
25
module unix_ipc
36
use, intrinsic :: iso_c_binding
47
use :: unix_types

src/unix_mqueue.F90

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
! unix_mqueues.F90
2+
!
3+
! Author: Philipp Engel
4+
! Licence: ISC
25
module unix_mqueue
36
use, intrinsic :: iso_c_binding
47
use :: unix_time
58
use :: unix_types
69
implicit none
710
private
811

12+
! struct mq_attr
913
type, bind(c), public :: c_mq_attr
1014
integer(kind=c_long) :: mq_flags = 0_c_long ! Flags (ignored for mq_open()).
1115
integer(kind=c_long) :: mq_maxmsg = 0_c_long ! Max. # of messages on queue.
@@ -84,7 +88,7 @@ function c_mq_setattr(mqdes, attr, oldattr) bind(c, name='mq_setattr')
8488
integer(kind=c_int) :: c_mq_setattr
8589
end function c_mq_setattr
8690

87-
! ssize_t mq_timedreceive(mqd_t mqdes, char *restrict msg_ptr, size_t msg_len, unsigned int *restrict msg_prio, const struct timespec *restrict abs_timeout)
91+
! ssize_t mq_timedreceive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned int *msg_prio, const struct timespec *abs_timeout)
8892
function c_mq_timedreceive(mqdes, msg_ptr, msg_len, msg_prio, abs_timeout) bind(c, name='mq_timedreceive')
8993
import :: c_char, c_int, c_mqd_t, c_size_t, c_timespec
9094
implicit none

0 commit comments

Comments
 (0)