36 character,
intent(in) :: str*(*)
43 if(ch.ge.65.and.ch.le.91) ch = ch + 32
60 character,
intent(in) :: str*(*)
67 if(ch.ge.97.and.ch.le.123) ch = ch - 32
84 character,
intent(in) :: str*(*)
114 character,
intent(in) :: str16*(*)
115 character ::
utf16to8*((len(str16)+1)/2)
119 do ic16=1,len(str16),2
121 utf16to8(ic8:ic8) = str16(ic16:ic16)
145 character,
intent(inout) :: string*(*)
146 character,
intent(in) :: str_srch*(*),str_repl*(*)
147 integer,
parameter :: lran=100
148 character(len=lRan),
parameter :: ranstr =
'G^$("q]WvtDB5VCFCJ/\gAo9|8^wDB|G,?q|Vi)|9wUhN.mKZI6>VMkGa~NkBMk(~F{b?<:kW1TDJ-Gmq8q-eW<WD3=(1M#*MhSy'
149 character :: tmpstr*(len(str_srch))
150 integer :: istart,istop,di,iloop, ltmp,lstr,is,lsrch, il, maxloop
153 lsrch = len(str_srch)
154 if(lsrch.gt.lstr)
return
156 if(index(str_repl, str_srch) .ne. 0)
then
164 if(ltmp.le.lran)
then
165 tmpstr = ranstr(1:ltmp)
169 do iloop=1,huge(iloop)-1
171 tmpstr(istart:istop) = ranstr(1:1+di)
172 if(istop.ge.ltmp)
exit
175 istop = min(istart + lran - 1 - (mod(iloop,max(lran-2,lran/10))), ltmp)
183 maxloop = lstr+1-lsrch
185 is = index(string, str_srch, back=.false.)
187 if(is.gt.maxloop)
exit
189 string = string(1:is-1)//tmpstr//trim(string(is+lsrch:))
199 maxloop = lstr+1-lsrch
201 is = index(string, tmpstr, back=.false.)
203 if(is.gt.maxloop)
exit
205 string = string(1:is-1)//str_repl//trim(string(is+lsrch:))
223 character,
intent(inout) :: string*(*)
224 character,
intent(in) :: substr*(*)
225 logical,
intent(in),
optional :: debug
227 integer :: l,ls, i1, il,maxLoop
228 character :: tstr*(len(string))
229 logical :: print_debug
231 print_debug = .false.
232 if(
present(debug)) print_debug = debug
238 maxloop = ceiling( real(len(string))/real(ls) )
242 i1 = index(string,substr,back=.false.)
245 tstr = string(1:i1-1)//string(i1+ls:l)
248 print*,string(1:i1-1)
249 print*,string(i1+ls:l)
250 print*,string(i1:i1+ls),i1,l
272 character,
intent(in) :: string*(*), substr*(*)
275 character :: lstr*(len(string)), tstr*(len(string))
283 maxloop = ceiling( real(len(string))/real(ls) )
288 i1 = index(trim(lstr),substr,back=.false.)
291 tstr = lstr(1:i1-1)//lstr(i1+ls:l)
317 character,
intent(in) :: file_in*(*),file_out*(*), str_srch*(*),str_repl*(*)
318 integer,
intent(out) :: status
320 character :: string*(9999)
326 open(unit=ip, file=trim(file_in), status=
'old', action=
'read', iostat=io)
328 call error(
'libSUFR replace_string_in_textfile(): could not open file: '//trim(file_in), 0)
335 open(unit=op, file=trim(file_out), status=
'replace', action=
'write', iostat=io)
337 call error(
'libSUFR replace_string_in_textfile(): could not open file: '//trim(file_out), 0)
345 read(ip,
'(A)', iostat=io) string
347 if(len(string).eq.len_trim(string))
then
348 call error(
'libSUFR replace_string_in_textfile(): character array string too small', 0)
355 if(len(string).eq.len_trim(string))
then
356 call error(
'libSUFR replace_string_in_textfile(): character array string too small', 0)
361 write(op,
'(A)') trim(string)
385 character,
intent(in) :: string*(*), characters*(*)
390 do ci=1,len_trim(characters)
391 if(index(trim(string),characters(ci:ci)).gt.0)
return
412 integer,
intent(in) :: number
413 character ::
tabs*(max(number,1))
419 tabs(count:count) = char(9)
436 integer,
intent(in) :: number
437 character ::
int2str*(max(ceiling(log10(dble(abs(number)+1))),1) - (sign(1,number)-1)/2)
457 real(
double),
intent(in) :: number
458 integer,
intent(in) :: decim
459 character,
intent(in),
optional :: mark*(*)
460 real(
double),
parameter :: eps = sqrt(epsilon(number))
472 character ::
dbl2str*(max(ceiling(log10((abs(number) + 10.d0**(-decim)/2.d0) * (1.d0+eps))),1) - &
473 (sign(1_long,floor(number,
long))-1)/2 + decim + 1)
475 write(fmt,
'(A,I0,A)')
'(F0.',max(decim,0),
')'
476 write(
dbl2str, trim(fmt)) number
484 else if(
dbl2str(1:2).eq.
'-.')
then
519 pure function d2s(number, decim, mark)
522 real(
double),
intent(in) :: number
523 integer,
intent(in) :: decim
524 character,
intent(in),
optional :: mark*(*)
526 real(
double),
parameter :: eps = sqrt(epsilon(number))
527 character ::
d2s*(max(ceiling(log10(abs((number + 10.d0**(-decim)/2.d0) * (1.d0+eps)))),1) - &
528 (sign(1_long,floor(number,
long))-1)/2 + decim + 1)
530 if(
present(mark))
then
519 pure function d2s(number, decim, mark)
…
548 pure function d2sc(number, decim)
551 real(
double),
intent(in) :: number
552 integer,
intent(in) :: decim
554 real(
double),
parameter :: eps = sqrt(epsilon(number))
555 character ::
d2sc*(max(ceiling(log10(abs((number + 10.d0**(-decim)/2.d0) * (1.d0+eps)))),1) - &
556 (sign(1_long,floor(number,
long))-1)/2 + decim + 1)
574 real,
intent(in) :: number
575 integer,
intent(in) :: decim
576 character,
intent(in),
optional :: mark*(*)
577 character ::
real2str*(max(ceiling(log10(abs(number)+sqrt(epsilon(number)))),1) - (sign(1,floor(number))-1)/2 + decim + 1)
579 if(
present(mark))
then
Provides kinds and related constants/routines.
integer, parameter double
Double-precision float. Precision = 15, range = 307.
integer, parameter long
Long integer.
System-related procedures.
subroutine error(message, unit)
Print an error to StdOut or StErr.
subroutine find_free_io_unit(unit)
Find the first unused I/O unit larger than 100.
subroutine warn(message, unit)
Print a warning to StdOut or StErr.
Procedures to manipulate text/strings.
pure character function, dimension(max(number, 1)) tabs(number)
Print multiple tab characters.
pure character function, dimension((len(str16)+1)/2) utf16to8(str16)
Convert a UTF-16 string to UTF-8.
subroutine replace_string_in_textfile(file_in, file_out, str_srch, str_repl, status)
Search and replace occurences of a string in a text file. Lines up to 9999 characters only,...
integer function count_substring(string, substr)
Count how many times a substring is present in a string.
pure character function, dimension(len(str)) lowercase(str)
Make a string lower case.
pure subroutine replace_substring(string, str_srch, str_repl)
Search and replace occurences of a substring in a string as often as the search string is found.
subroutine remove_substring(string, substr, debug)
Remove a substring from a string, if present.
pure character function, dimension(sign(1, floor(number)) -1) real2str(number, decim, mark)
Convert a single-precision real to a nice character string. Single-precision wrapper for dbl2str.
pure logical function string_contains_one_of(string, characters)
Verify whether a string contains any of a given list of characters.
pure character function, dimension(sign(1_long, floor(number, long)) -1) dbl2str(number, decim, mark)
Convert a double-precision real to a nice character string. Difference with the F0 format descriptor:...
pure character function, dimension(sign(1_long, floor(number, long)) -1) d2s(number, decim, mark)
Convert a double-precision real to a nice character string. Short alias for dbl2str().
pure character function, dimension(sign(1_long, floor(number, long)) -1) d2sc(number, decim)
Convert a double-precision real to a nice character string using a comma as decimal mark....
pure character function, dimension(len(str)) uppercase(str)
Make a string upper case.
pure character function, dimension(sign(1, number) -1) int2str(number)
Convert an integer to a character string of the proper length.
pure character function, dimension(len(str)) uppercaseinitial(str)
Make a string lower case with an upper-case initial.