Utility module for supporting Fortran 2003 C language interface module.
This module contains various utilties for simplifying the exchange of character variables between Fortran and C when using the ISO_C_BINDING
intrinsic module of Fortran 2003.
PROGRAM fortranc_test
use,INTRINSIC :: iso_c_binding
IMPLICIT NONE
INTERFACE
FUNCTION return_null_charp() BIND(C)
IMPORT
TYPE(c_ptr) :: return_null_charp
END FUNCTION return_null_charp
FUNCTION return_empty_charp() BIND(C)
IMPORT
TYPE(c_ptr) :: return_empty_charp
END FUNCTION return_empty_charp
FUNCTION return_8_charp() BIND(C)
IMPORT
TYPE(c_ptr) :: return_8_charp
END FUNCTION return_8_charp
FUNCTION return_c_ptr_ptr() BIND(C)
IMPORT
TYPE(c_ptr) :: return_c_ptr_ptr
END FUNCTION return_c_ptr_ptr
END INTERFACE
TYPE(c_ptr_ptr) :: strarrp
INTEGER :: i
print*,'Testing strlen with C char* argument'
IF (
strlen(return_null_charp()) /= 0)
THEN
print*,'Error in strlen: a NULL char* does not return zero, ', &
stop 1
ENDIF
IF (
strlen(return_empty_charp()) /= 0)
THEN
print*,'Error in strlen: a zero len char* does not return zero, ', &
stop 1
ENDIF
IF (
strlen(return_8_charp()) /= 8)
THEN
print*,'Error in strlen: a nonzero len char* does not return expected len (8), ', &
stop 1
ENDIF
print*,'Strlen returns the expected values'
print*,'Getting a c_ptr_ptr object from C'
print*,'The object has ',c_ptr_ptr_getsize(strarrp),' elements'
IF (c_ptr_ptr_getsize(strarrp) /= 3) THEN
print*,'Error in c_ptr_ptr_getsize:',3,c_ptr_ptr_getsize(strarrp)
stop 1
ENDIF
IF (
strtofchar(c_ptr_ptr_getptr(strarrp, 1),100) /=
'first')
THEN
print*,
'Error in c_ptr_ptr_getptr:',
strtofchar(c_ptr_ptr_getptr(strarrp, 1),100),
':first'
stop 1
ENDIF
IF (
strtofchar(c_ptr_ptr_getptr(strarrp, 2),100) /=
'segundo')
THEN
print*,
'Error in c_ptr_ptr_getptr:',
strtofchar(c_ptr_ptr_getptr(strarrp, 2),100),
':segundo'
stop 1
ENDIF
IF (
strtofchar(c_ptr_ptr_getptr(strarrp, 3),100) /=
'troisieme')
THEN
print*,
'Error in c_ptr_ptr_getptr:',
strtofchar(c_ptr_ptr_getptr(strarrp, 3),100),
':troisieme'
stop 1
ENDIF
IF (
strtofchar(c_ptr_ptr_getptr(strarrp, 4),100) /=
'')
THEN
print*,
'Error in c_ptr_ptr_getptr: out of bound request should return empty string:',
strtofchar(c_ptr_ptr_getptr(strarrp, 4),100)
stop 1
ENDIF
print*,'The object contains the expected data'
print*,'Creating a c_ptr_ptr object from a Fortran array of characters'
print*,'The object has ',c_ptr_ptr_getsize(strarrp),' elements'
IF (c_ptr_ptr_getsize(strarrp) /= 3) THEN
print*,'Error in c_ptr_ptr_getsize:',3,c_ptr_ptr_getsize(strarrp)
stop 1
ENDIF
IF (
strtofchar(c_ptr_ptr_getptr(strarrp, 1),100) /=
'first')
THEN
print*,
'Error in c_ptr_ptr_getptr:',
strtofchar(c_ptr_ptr_getptr(strarrp, 1),100),
':first'
stop 1
ENDIF
IF (
strtofchar(c_ptr_ptr_getptr(strarrp, 2),100) /=
'segundo')
THEN
print*,
'Error in c_ptr_ptr_getptr:',
strtofchar(c_ptr_ptr_getptr(strarrp, 2),100),
':segundo'
stop 1
ENDIF
IF (
strtofchar(c_ptr_ptr_getptr(strarrp, 3),100) /=
'troisieme')
THEN
print*,
'Error in c_ptr_ptr_getptr:',
strtofchar(c_ptr_ptr_getptr(strarrp, 3),100),
':troisieme'
stop 1
ENDIF
IF (
strtofchar(c_ptr_ptr_getptr(strarrp, 4),100) /=
'')
THEN
print*,
'Error in c_ptr_ptr_getptr: out of bound request should return empty string:',
strtofchar(c_ptr_ptr_getptr(strarrp, 4),100)
stop 1
ENDIF
print*,'The object contains the expected data'
END PROGRAM fortranc_test
Constructor for a c_ptr_ptr object.
Equivalent of the strlen C function.
Convert a null-terminated C string into a Fortran CHARACTER variable of the proper length.
Utility module for supporting Fortran 2003 C language interface module.