ICON Community Interface 0.4.0
Loading...
Searching...
No Matches
comin_c_utils.F90
Go to the documentation of this file.
1
4!
5! @authors 01/2023 :: ICON Community Interface <comin@icon-model.org>
6!
7! SPDX-License-Identifier: BSD-3-Clause
8!
9! See LICENSES for license information.
10! Where software is supplied by third parties, it is indicated in the
11! headers of the routines.
12!
14
15 USE iso_c_binding, ONLY: c_char, c_null_char
16 IMPLICIT NONE
17
18 PRIVATE
20
22 MODULE PROCEDURE convert_c_string_cptr
23 MODULE PROCEDURE convert_c_string_arr
24 END INTERFACE convert_c_string
25
26CONTAINS
27
29 !
30 FUNCTION convert_c_string_cptr( cptr ) RESULT (string)
31
32 use, intrinsic :: iso_c_binding, only: c_ptr, c_char, &
33 c_f_pointer,c_size_t
34
35 TYPE(c_ptr), intent(in) :: cptr
36 CHARACTER(len=:), allocatable :: string
37 CHARACTER(kind=c_char), dimension(:), pointer :: chars
38 INTEGER(kind=c_size_t) :: strlen
39
40 INTERFACE
41 FUNCTION c_strlen(str_ptr) BIND ( C, name = "strlen" ) RESULT(len)
42 use, INTRINSIC :: iso_c_binding
43 TYPE(c_ptr), VALUE :: str_ptr
44 INTEGER(kind=c_size_t) :: len
45 END FUNCTION c_strlen
46 END INTERFACE
47
48 strlen = c_strlen(cptr)
49 CALL c_f_pointer(cptr, chars, [ strlen ])
50 string = convert_c_string_arr(chars)
51 END FUNCTION convert_c_string_cptr
52
53 FUNCTION convert_c_string_arr( arr ) RESULT (string)
54 CHARACTER(kind=C_CHAR), INTENT(IN) :: arr(:)
55 CHARACTER(len=:), ALLOCATABLE :: string
56 INTEGER :: i, strlen
57
58 DO strlen=1,SIZE(arr)
59 IF (arr(strlen) .EQ. c_null_char) EXIT
60 END DO
61
62 ALLOCATE(CHARACTER(len=strlen-1) :: string)
63 DO i=1,strlen-1
64 string(i:i) = arr(i)
65 END DO
66 END FUNCTION convert_c_string_arr
67
69 !
70 subroutine convert_f_string( string, arr)
71
72 CHARACTER(len=*), INTENT(IN) :: string
73 CHARACTER(len=1, kind=c_char), INTENT(INOUT) :: arr(:)
74 INTEGER :: i
75
76 DO i=1,len_trim(string)
77 arr(i) = string(i:i)
78 END DO
79 arr(i) = c_null_char
80 end subroutine convert_f_string
81
82END MODULE comin_c_utils
subroutine, public convert_f_string(string, arr)
Convert Fortran string into C-style character array.