@@ -317,7 +317,6 @@ module pcre2
317317
318318 private :: c_f_str_ptr
319319 private :: c_strlen
320- private :: copy
321320 private :: pcre2_substring_copy_byname_
322321 private :: pcre2_substring_copy_bynumber_
323322 private :: pcre2_substring_get_byname_
@@ -560,16 +559,27 @@ function pcre2_substring_get_bynumber(match_data, number, buffer, buff_len) resu
560559 end function pcre2_substring_get_bynumber
561560
562561 subroutine c_f_str_ptr (c_str , f_str )
562+ ! ! Copies a C string, passed as a C pointer, to a Fortran string.
563563 type (c_ptr), intent (in ) :: c_str
564564 character (len= :), allocatable , intent (out ) :: f_str
565- character (kind= c_char), pointer :: ptrs(:)
566- integer (kind= i8) :: sz
567-
568- if (.not. c_associated(c_str)) return
569- sz = c_strlen(c_str)
570- if (sz < 0 ) return
571- call c_f_pointer(c_str, ptrs, [ sz ])
572- allocate (character (len= sz) :: f_str)
573- f_str = copy(ptrs)
565+
566+ character (kind= c_char), pointer :: ptrs(:)
567+ integer (kind= c_size_t) :: i, sz
568+
569+ copy_block: block
570+ if (.not. c_associated(c_str)) exit copy_block
571+ sz = c_strlen(c_str)
572+ if (sz < 0 ) exit copy_block
573+ call c_f_pointer(c_str, ptrs, [ sz ])
574+ allocate (character (len= sz) :: f_str)
575+
576+ do i = 1 , sz
577+ f_str(i:i) = ptrs(i)
578+ end do
579+
580+ return
581+ end block copy_block
582+
583+ if (.not. allocated (f_str)) f_str = ' '
574584 end subroutine c_f_str_ptr
575585end module pcre2
0 commit comments