fftw3: Wisdom String Export/Import from Fortran

 
 7.6.2 Wisdom String Export/Import from Fortran
 ----------------------------------------------
 
 Dealing with FFTW's C string export/import is a bit more painful.  In
 particular, the 'fftw_export_wisdom_to_string' function requires you to
 deal with a dynamically allocated C string.  To get its length, you must
 define an interface to the C 'strlen' function, and to deallocate it you
 must define an interface to C 'free':
 
        use, intrinsic :: iso_c_binding
        interface
          integer(C_INT) function strlen(s) bind(C, name='strlen')
            import
            type(C_PTR), value :: s
          end function strlen
          subroutine free(p) bind(C, name='free')
            import
            type(C_PTR), value :: p
          end subroutine free
        end interface
 
    Given these definitions, you can then export wisdom to a Fortran
 character array:
 
        character(C_CHAR), pointer :: s(:)
        integer(C_SIZE_T) :: slen
        type(C_PTR) :: p
        p = fftw_export_wisdom_to_string()
        if (.not. c_associated(p)) stop 'error exporting wisdom'
        slen = strlen(p)
        call c_f_pointer(p, s, [slen+1])
        ...
        call free(p)
 
    Note that 'slen' is the length of the C string, but the length of the
 array is 'slen+1' because it includes the terminating null character.
 (You can omit the '+1' if you don't want Fortran to know about the null
 character.)  The standard 'c_associated' function checks whether 'p' is
 a null pointer, which is returned by 'fftw_export_wisdom_to_string' if
 there was an error.
 
    To import wisdom from a string, use 'fftw_import_wisdom_from_string'
 as usual; note that the argument of this function must be a
 'character(C_CHAR)' that is terminated by the 'C_NULL_CHAR' character,
 like the 's' array above.