3 use iso_c_binding,
only : c_int, c_long_long, c_float, c_double, c_bool, &
11 procedure :: concatenate_char_char_fn
12 procedure :: concatenate_char_int_fn
13 procedure :: concatenate_char_float_fn
14 procedure :: concatenate_char_double_fn
15 end interface operator(+)
23 public ::
operator( .strequal. )
24 interface operator( .strequal. )
25 procedure :: is_char_equal_to_char_case_sensitive_fn
26 end interface operator( .strequal. )
28 public ::
operator( .strapprox. )
29 interface operator( .strapprox. )
30 procedure :: is_char_equal_to_char_case_insensitive_fn
31 end interface operator( .strapprox. )
33 public ::
operator( .contains. )
34 interface operator( .contains. )
35 procedure :: is_string2_present_in_string1_case_sensitive_fn
36 end interface operator( .contains. )
38 public ::
operator( .containssimilar. )
39 interface operator( .containssimilar. )
40 procedure :: is_string2_present_in_string1_case_insensitive_fn
41 end interface operator( .containssimilar. )
45 procedure :: short_to_char_fn
46 procedure :: int_to_char_fn
47 procedure :: long_long_to_char_fn
48 procedure :: float_to_char_fn
49 procedure :: double_to_char_fn
50 procedure :: bool_to_char_fn
56 procedure :: short_to_char_fn
57 procedure :: int_to_char_fn
58 procedure :: long_long_to_char_fn
59 procedure :: float_to_char_fn
60 procedure :: double_to_char_fn
61 procedure :: bool_to_char_fn
66 procedure :: string_to_integer_fn
71 procedure :: string_to_float_fn
76 procedure :: split_and_return_text_sub
81 procedure :: count_number_of_fields_fn
86 procedure :: remove_multiple_characters_fn
91 procedure :: squote_char_fn
96 procedure :: dquote_char_fn
101 procedure :: replace_character_sub
106 procedure :: char_to_uppercase_fn
111 procedure :: char_to_lowercase_fn
116 procedure :: char_to_uppercase_sub
121 procedure :: char_to_lowercase_sub
126 procedure :: char_to_uppercase_fn
131 procedure :: char_to_lowercase_fn
136 procedure :: char_to_uppercase_sub
141 procedure :: char_to_lowercase_sub
146 procedure :: return_right_part_of_string_fn
151 procedure :: return_left_part_of_string_fn
155 procedure :: strip_full_pathname_fn
160 procedure :: f_to_c_string_fn
165 procedure :: c_to_f_string_fn
171 character (len=1),
parameter ::
tab = achar(9)
181 integer (c_int),
parameter ::
na_int = - (huge(1_c_int)-1_c_int)
182 real (c_float),
parameter ::
na_float = - (huge(1._c_float)-1._c_float)
183 real (c_double),
parameter ::
na_double = - (huge(1._c_double)-1._c_double)
190 character (len=*),
intent(in) :: filename
191 character (len=:),
allocatable :: value
193 if (filename .contains.
"/")
value =
right(
value, substring=
"/")
194 if (filename .contains.
"\")
value =
right(
value, substring=
"\")
201 character (len=*),
intent(in) :: text
202 integer (c_int) :: value
205 integer (c_int) :: op_status
206 character (len=:),
allocatable :: temp_str
207 real (c_float) :: float_value
213 if ( scan(temp_str,
".") /= 0 )
then
215 read(unit=temp_str, fmt=*, iostat=op_status) float_value
216 if (op_status == 0)
value = int(float_value, c_int)
220 read(unit=temp_str, fmt=*, iostat=op_status)
value
224 if (op_status /= 0)
value =
na_int
232 character (len=*),
intent(in) :: text
233 real (c_float) :: value
236 integer (c_int) :: op_status
237 character (len=:),
allocatable :: temp_str
241 read(unit=temp_str, fmt=*, iostat=op_status)
value
242 if (op_status /= 0)
value =
na_float
250 character (len=*),
intent(in) :: string
251 integer (c_int),
intent(in),
optional :: indx
252 character (len=*),
intent(in),
optional :: substring
253 character (len=:),
allocatable :: left_part
256 integer (c_int) :: position
258 if (
present( indx ) )
then
260 if ( ( indx > 0 ) .and. ( indx < len_trim( string ) ) )
then
262 left_part = string( 1:indx )
270 elseif (
present( substring ) )
then
272 position = index( string, substring )
274 if ( position > 0 )
then
276 left_part = string( 1:(position-1) )
297 character (len=*),
intent(in) :: string
298 integer (c_int),
intent(in),
optional :: indx
299 character (len=*),
intent(in),
optional :: substring
300 character (len=:),
allocatable :: right_part
303 integer (c_int) :: position
305 if (
present( indx ) )
then
307 if ( ( indx > 0 ) .and. ( indx < len_trim( string ) ) )
then
309 right_part = string( (indx+1):len_trim(string) )
317 elseif (
present( substring ) )
then
319 position = index( string, substring, back=.true._c_bool )
321 if ( position > 0 )
then
323 right_part = string( (position+1):len_trim(string) )
344 character (len=*),
intent(in) :: stext1
345 character (len=*),
intent(in) :: stext2
346 logical (c_bool) :: lbool
349 character (len=len_trim(sText1)) :: stemp1
350 character (len=len_trim(sText2)) :: stemp2
352 lbool = .false._c_bool
357 if ( index(stemp1, stemp2) /= 0 ) lbool = .true._c_bool
365 character (len=*),
intent(in) :: stext1
366 character (len=*),
intent(in) :: stext2
367 logical (c_bool) :: lbool
370 character (len=len_trim(sText1)) :: stemp1
371 character (len=len_trim(sText2)) :: stemp2
373 lbool = .false._c_bool
375 stemp1 = trim( stext1 )
376 stemp2 = trim( stext2 )
378 if ( index(stemp1, stemp2) /= 0 ) lbool = .true._c_bool
386 character (len=*),
intent(in) :: stext1
387 character (len=*),
intent(in) :: stext2
388 logical (c_bool) :: lbool
391 character (len=:),
allocatable :: stemp1
392 character (len=:),
allocatable :: stemp2
394 lbool = .false._c_bool
396 stemp1 = trim( stext1 )
397 stemp2 = trim( stext2 )
399 if (trim(adjustl( stemp1 ) ) .eq. trim(adjustl( stemp2) ) ) lbool = .true._c_bool
407 character (len=*),
intent(in) :: stext1
408 character (len=*),
intent(in) :: stext2
409 logical (c_bool) :: lbool
412 character (len=:),
allocatable :: stemp1
413 character (len=:),
allocatable :: stemp2
415 lbool = .false._c_bool
420 if (trim(adjustl( stemp1 ) ) .eq. trim(adjustl( stemp2) ) ) lbool = .true._c_bool
428 character (len=*),
intent(in) :: stext1
429 character (len=*),
intent(in) :: stext2
430 character (len=:),
allocatable :: stext
432 stext = stext1 // stext2
440 character (len=*),
intent(in) :: stext1
441 integer (c_int),
intent(in) :: ivalue1
442 character (len=:),
allocatable :: stext
452 character (len=*),
intent(in) :: stext1
453 real (c_float),
intent(in) :: fvalue1
454 character (len=:),
allocatable :: stext
464 character (len=*),
intent(in) :: stext1
465 real (c_double),
intent(in) :: dvalue1
466 character (len=:),
allocatable :: stext
474 integer (c_short),
intent(in) :: value
475 character (len=*),
intent(in),
optional :: fmt_string
476 character (len=:),
allocatable :: text
478 integer (c_int) :: status
479 character (len=32) :: sbuf
481 if (
present(fmt_string) )
then
482 write(sbuf, fmt=
"("//trim(fmt_string)//
")", iostat=status)
value
484 write(sbuf, fmt=*, iostat=status)
value
488 text = trim( adjustl(sbuf) )
498 integer (c_int),
intent(in) :: value
499 character (len=*),
intent(in),
optional :: fmt_string
500 character (len=:),
allocatable :: text
502 integer (c_int) :: status
503 character (len=32) :: sbuf
505 if (
present(fmt_string) )
then
506 write(sbuf, fmt=
"("//trim(fmt_string)//
")", iostat=status)
value
508 write(sbuf, fmt=*, iostat=status)
value
512 text = trim( adjustl(sbuf) )
522 integer (c_long_long),
intent(in) :: value
523 character (len=*),
intent(in),
optional :: fmt_string
524 character (len=:),
allocatable :: text
526 integer (c_int) :: status
527 character (len=32) :: sbuf
529 if (
present(fmt_string) )
then
530 write(sbuf, fmt=
"("//trim(fmt_string)//
")", iostat=status)
value
532 write(sbuf, fmt=*, iostat=status)
value
536 text = trim( adjustl(sbuf) )
546 real (c_float),
intent(in) :: value
547 character (len=*),
intent(in),
optional :: fmt_string
548 character (len=:),
allocatable :: text
550 integer (c_int) :: status
551 character (len=32) :: sbuf
553 if (
present(fmt_string) )
then
554 write(sbuf, fmt=
"("//trim(fmt_string)//
")", iostat=status)
value
556 write(sbuf, fmt=*, iostat=status)
value
560 text = trim( adjustl(sbuf) )
570 real (c_double),
intent(in) :: value
571 character (len=*),
intent(in),
optional :: fmt_string
572 character (len=:),
allocatable :: text
574 integer (c_int) :: status
575 character (len=32) :: sbuf
577 if (
present(fmt_string) )
then
578 write(sbuf, fmt=
"("//trim(fmt_string)//
")", iostat=status)
value
580 write(sbuf, fmt=*, iostat=status)
value
584 text = trim( adjustl(sbuf) )
594 logical (c_bool),
intent(in) :: value
595 character (len=:),
allocatable :: text
597 integer (c_int) :: status
598 character (len=32) :: sbuf
601 text =
".TRUE._c_bool"
612 character (len=*),
intent(in) :: stext1
613 character (len=:),
allocatable :: stext
615 stext =
"'"//trim(stext1)//
"'"
623 character (len=*),
intent(in) :: stext1
624 character (len=:),
allocatable :: stext
626 stext =
'"'//trim(stext1)//
'"'
635 character (len=*),
intent(in) :: s
636 character(len=len(s)) :: stext
642 integer (c_int),
parameter :: lower_to_upper = -32
643 integer (c_int),
parameter :: ascii_small_a = ichar(
"a")
644 integer (c_int),
parameter :: ascii_small_z = ichar(
"z")
648 do i=1,len_trim(stext)
649 if ( ichar(stext(i:i) ) >= ascii_small_a .and. ichar(stext(i:i)) <= ascii_small_z )
then
650 stext(i:i) = char( ichar( stext(i:i) ) + lower_to_upper )
661 character (len=*),
intent(in) :: s
662 character(len=len(s)) :: stext
667 integer (c_int),
parameter :: upper_to_lower = 32
668 integer (c_int),
parameter :: ascii_a = ichar(
"A")
669 integer (c_int),
parameter :: ascii_z = ichar(
"Z")
673 do i=1,len_trim(stext)
674 if ( ichar(stext(i:i) ) >= ascii_a .and. ichar(stext(i:i)) <= ascii_z )
then
675 stext(i:i) = char( ichar( stext(i:i) ) + upper_to_lower )
685 character (len=*),
intent(inout) :: s
689 integer (c_int),
parameter :: LOWER_TO_UPPER = -32
690 integer (c_int),
parameter :: ASCII_SMALL_A = ichar(
"a")
691 integer (c_int),
parameter :: ASCII_SMALL_Z = ichar(
"z")
694 if ( ichar(s(i:i) ) >= ascii_small_a .and. ichar(s(i:i)) <= ascii_small_z )
then
695 s(i:i) = char( ichar( s(i:i) ) + lower_to_upper )
705 character (len=*),
intent(inout) :: s
709 integer (c_int),
parameter :: UPPER_TO_LOWER = 32
710 integer (c_int),
parameter :: ASCII_A = ichar(
"A")
711 integer (c_int),
parameter :: ASCII_Z = ichar(
"Z")
716 if ( ichar(s(i:i) ) >= ascii_a .and. ichar(s(i:i)) <= ascii_z )
then
717 s(i:i) = char( ichar( s(i:i) ) + upper_to_lower )
737 character (len=*),
intent(inout) :: stext1
738 character (len=*),
intent(in),
optional :: stargetcharacters
739 character (len=:),
allocatable :: stext
742 character (len=512) :: sbuf
743 integer (c_int) :: ir
744 integer (c_int) :: iindex1, iindex2
745 character (len=:),
allocatable :: stargetcharacters_l
748 stext1 = adjustl(stext1)
752 if (
present(stargetcharacters) )
then
753 stargetcharacters_l = stargetcharacters
755 stargetcharacters_l =
":/;,"
758 do iindex1 = 1,len_trim(stext1)
760 ir = scan(stext1(iindex1:iindex1), stargetcharacters_l)
763 iindex2 = iindex2 + 1
764 sbuf(iindex2:iindex2) = stext1(iindex1:iindex1)
782 character (len=*),
intent(inout) :: stext1
783 character (len=*),
intent(in),
optional :: schar
784 character (len=:),
allocatable :: stext
787 character (len=256) :: sbuf
788 integer (c_int) :: ir
789 integer (c_int) :: iindex1, iindex2
790 character (len=1) :: schar_l
791 logical (c_bool) :: lpreviouslyfound
794 stext1 = adjustl(stext1)
797 lpreviouslyfound = .false._c_bool
799 if (
present(schar) )
then
805 do iindex1 = 1,len_trim(stext1)
807 ir = scan(stext1(iindex1:iindex1), schar_l)
811 iindex2 = iindex2 + 1
812 sbuf(iindex2:iindex2) = stext1(iindex1:iindex1)
813 lpreviouslyfound = .false._c_bool
815 elseif( lpreviouslyfound )
then
823 iindex2 = iindex2 + 1
824 sbuf(iindex2:iindex2) = stext1(iindex1:iindex1)
825 lpreviouslyfound = .true._c_bool
839 character (len=*),
intent(in) :: stext
840 character (len=*),
intent(in),
optional :: sdelimiters
841 integer (c_int) :: icount
844 character (len=len(sText)) :: str
845 character (len=len(sText)) :: substr
846 character (len=:),
allocatable :: delimiter_chr_
848 if (
present(sdelimiters) )
then
849 delimiter_chr_=sdelimiters
859 call chomp(str=str, substr=substr, delimiter_chr=delimiter_chr_ )
861 if ( len_trim( substr ) == 0 )
exit
873 character (len=*),
intent(inout) :: str
874 character (len=*),
intent(out) :: substr
875 character (len=*),
intent(in),
optional :: delimiter_chr
876 logical (c_bool),
intent(in),
optional :: remove_extra_delimiters
879 character (len=:),
allocatable :: delimiter_chr_
880 logical (c_bool) :: remove_extra_delimiters_
881 integer (kind=c_int) :: iIndex
884 if (
present(remove_extra_delimiters))
then
885 remove_extra_delimiters_ = remove_extra_delimiters
887 remove_extra_delimiters_ = .false._c_bool
890 if (
present(delimiter_chr) )
then
891 select case (delimiter_chr)
896 case (
"COMMA",
"CSV")
899 delimiter_chr_ = delimiter_chr
907 iindex = scan( string = str, set = delimiter_chr_ )
909 if (iindex == 0)
then
915 substr = trim( str(1:iindex-1) )
916 str = trim( str(iindex + 1: ) )
919 if (remove_extra_delimiters_)
then
924 if ( scan( string=str(1:1), set=delimiter_chr_) == 0)
exit
936 character (len=*),
intent(inout) :: sText1
937 character (len=1),
intent(in) :: sFind
938 character (len=1),
intent(in),
optional :: sReplace
941 integer (c_int) :: iIndex
942 integer (c_int) :: iCount
943 character (len=len_trim(sText1)) :: sText
947 if ( len(stext1) > 0 )
then
950 do iindex = 1, len_trim(stext1)
951 if ( stext1(iindex:iindex) .ne. sfind)
then
953 stext(icount:icount) = stext1(iindex:iindex)
955 if (
present(sreplace))
then
957 stext(icount:icount) = sreplace
973 character (len=*),
intent(in) :: text
974 character (len=len(text)) :: result_text
976 character (len=:),
allocatable :: temp_str
977 character (len=512) :: temp_result
980 integer (c_int) :: index1, index2
981 character (len=:),
allocatable :: target_characters
985 target_characters =
"qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM" &
988 temp_str = adjustl(text)
992 do index1 = 1,len_trim(text)
993 n = scan(text(index1:index1), target_characters)
996 temp_result(index2:index2) = text(index1:index1)
1000 result_text = trim(temp_result)
1008 character (len=*),
intent(in) :: c_character_str
1009 character (len=:),
allocatable :: f_character_str
1011 integer (c_int) :: indx
1013 f_character_str = c_character_str
1015 do indx=1,len(c_character_str)
1016 if (c_character_str(indx:indx) == c_null_char)
then
1017 f_character_str = c_character_str(1:indx-1)
1028 character (len=*),
intent(in) :: f_character_str
1029 character (len=:),
allocatable :: c_character_str
1031 integer (c_int) :: str_len
1033 str_len = len_trim(f_character_str)
1035 if ( str_len == 0 )
then
1036 c_character_str = c_null_char
1037 elseif ( f_character_str(str_len:str_len) == c_null_char )
then
1039 c_character_str = trim(f_character_str)
1042 c_character_str = trim(f_character_str)//c_null_char
character(len=1), parameter, public forwardslash
impure elemental integer(c_int) function string_to_integer_fn(text)
character(len=:) function, allocatable int_to_char_fn(value, fmt_string)
logical(c_bool) function is_string2_present_in_string1_case_insensitive_fn(stext1, stext2)
character(len=:) function, allocatable dquote_char_fn(stext1)
character(len=len(s)) function char_to_lowercase_fn(s)
character(len=:) function, allocatable remove_repeats(stext1, schar)
Strip repeated characters from string.
impure character(len=:) function, allocatable remove_multiple_characters_fn(stext1, stargetcharacters)
Strip offending characters from a text string.
character(len=:) function, allocatable long_long_to_char_fn(value, fmt_string)
subroutine split_and_return_text_sub(str, substr, delimiter_chr, remove_extra_delimiters)
character(len=:) function, allocatable return_left_part_of_string_fn(string, indx, substring)
character(len=:) function, allocatable f_to_c_string_fn(f_character_str)
integer(c_int), parameter, private na_int
character(len=:) function, allocatable concatenate_char_double_fn(stext1, dvalue1)
real(c_double), parameter, private na_double
character(len=:) function, allocatable short_to_char_fn(value, fmt_string)
character(len=3), parameter, public punctuation
character(len=:) function, allocatable squote_char_fn(stext1)
impure elemental real(c_float) function string_to_float_fn(text)
character(len=1), parameter, public carriage_return
logical(c_bool) function is_string2_present_in_string1_case_sensitive_fn(stext1, stext2)
character(len=1), parameter, public tab
character(len=:) function, allocatable concatenate_char_float_fn(stext1, fvalue1)
character(len=:) function, allocatable float_to_char_fn(value, fmt_string)
logical(c_bool) function is_char_equal_to_char_case_insensitive_fn(stext1, stext2)
character(len=:) function, allocatable bool_to_char_fn(value)
character(len=:) function, allocatable double_to_char_fn(value, fmt_string)
subroutine char_to_lowercase_sub(s)
character(len=1), parameter, public backslash
subroutine replace_character_sub(stext1, sfind, sreplace)
integer(c_int) function count_number_of_fields_fn(stext, sdelimiters)
impure elemental character(len=len(text)) function keepnumeric(text)
character(len=len(s)) function char_to_uppercase_fn(s)
character(len=2), parameter, public whitespace
real(c_float), parameter, private na_float
character(len=:) function, allocatable concatenate_char_int_fn(stext1, ivalue1)
subroutine char_to_uppercase_sub(s)
character(len=:) function, allocatable c_to_f_string_fn(c_character_str)
character(len=:) function, allocatable strip_full_pathname_fn(filename)
character(len=1), parameter, public double_quote
character(len=:) function, allocatable concatenate_char_char_fn(stext1, stext2)
logical(c_bool) function is_char_equal_to_char_case_sensitive_fn(stext1, stext2)
character(len=3), parameter, public comment_characters
character(len=:) function, allocatable return_right_part_of_string_fn(string, indx, substring)