Appearance
stringifor_string_t
StringiFor, definition of
stringtype.
Source: src/lib/stringifor_string_t.F90
Dependencies
Contents
- string
- glob
- strjoin
- adjustl
- adjustr
- count
- index
- len_trim
- repeat
- scan
- trim
- verify
- free
- glob_character
- glob_string
- justify
- read_file
- read_line
- read_lines
- split
- split_chunked
- read_number_I1P
- read_number_I2P
- read_number_I4P
- read_number_I8P
- read_number_R4P
- read_number_R8P
- read_number_R16P
- write_file
- write_line
- write_lines
- string_assign_string
- string_assign_character
- string_assign_integer_I1P
- string_assign_integer_I2P
- string_assign_integer_I4P
- string_assign_integer_I8P
- string_assign_real_R4P
- string_assign_real_R8P
- string_assign_real_R16P
- read_formatted
- read_delimited
- read_undelimited_listdirected
- read_undelimited
- write_formatted
- read_unformatted
- write_unformatted
- parse_number_fast
- append_to_buffer
- get_delimiter_mode
- get_next_non_blank_character_this_record
- get_next_non_blank_character_any_record
- get_decimal_mode
- string_
- sadjustl_character
- sadjustr_character
- count_substring
- sindex_character_string
- sscan_character_string
- sverify_character_string
- sadjustl
- sadjustr
- scount
- sindex_string_string
- sindex_string_character
- slen
- slen_trim
- srepeat_string_string
- srepeat_character_string
- sscan_string_string
- sscan_string_character
- strim
- sverify_string_string
- sverify_string_character
- basedir
- basename
- camelcase
- capitalize
- center
- chars
- colorize_str
- common_prefix_string
- common_prefix_character
- common_prefix_strings
- compact
- compare_version_string
- compare_version_character
- decode
- encode
- escape
- expand_tabs
- extension
- fill
- hex
- insert_character
- insert_string
- join_strings
- join_characters
- strjoin_strings
- strjoin_characters
- strjoin_strings_array
- strjoin_characters_array
- len_last_word
- ljust
- lstrip
- lower
- partition
- quote
- replace
- reverse
- reverse_words
- rjust
- rstrip
- search
- slice
- snakecase
- squeeze
- startcase
- strip
- swapcase
- tempname
- to_integer_I1P
- to_integer_I2P
- to_integer_I4P
- to_integer_I8P
- to_real_R4P
- to_real_R8P
- to_real_R16P
- transliterate
- unescape
- unique
- unquote
- upper
- end_with
- is_allocated
- is_alnum
- is_alpha
- is_digit
- is_integer
- is_lower
- is_number
- is_punct
- is_real
- is_space
- is_upper
- is_xdigit
- match
- start_with
- string_concat_string
- string_concat_character
- character_concat_string
- string_concat_string_string
- string_concat_character_string
- character_concat_string_string
- string_eq_string
- string_eq_character
- character_eq_string
- string_ne_string
- string_ne_character
- character_ne_string
- string_lt_string
- string_lt_character
- character_lt_string
- string_le_string
- string_le_character
- character_le_string
- string_ge_string
- string_ge_character
- character_ge_string
- string_gt_string
- string_gt_character
- character_gt_string
- find_occurrence
- strip_characters
- strip_set
- is_digit_char
- is_punct_char
- is_space_char
- is_xdigit_char
- is_lower_char
- is_upper_char
- lower_char
- upper_char
- match_token
- shell_escape
- replace_substring
- unique_substring
- join_raws
- join_chars
- compare_versions
Variables
| Name | Type | Attributes | Description |
|---|---|---|---|
CK | integer | parameter | Default character kind. |
CASE_SHIFT | integer | parameter | ASCII distance of the cases. |
P10_R8P | real(kind=R8P) | parameter | 1e0..1e22. |
P10_R4P | real(kind=R4P) | parameter | 1e0..1e10. |
SPACE | character(kind=CK, len=1) | parameter | Space character. |
TAB | character(kind=CK, len=1) | parameter | Tab character. |
UIX_DIR_SEP | character(kind=CK, len=1) | parameter | Unix/Linux directories separator (/). |
BACKSLASH | character(kind=CK, len=1) | parameter | Backslash character. |
Derived Types
string
OOP designed string class.
Components
| Name | Type | Attributes | Description |
|---|---|---|---|
raw | character(kind=CK, len=:) | allocatable | Raw data. |
Type-Bound Procedures
| Name | Attributes | Description |
|---|---|---|
adjustl | pass(self) | Adjustl replacement. |
adjustr | pass(self) | Adjustr replacement. |
count | pass(self) | Count replacement. |
index | Index replacement. | |
len | pass(self) | Len replacement. |
len_trim | pass(self) | Len_trim replacement. |
repeat | Repeat replacement. | |
scan | Scan replacement. | |
trim | pass(self) | Trim replacement. |
verify | Verify replacement. | |
basedir | pass(self) | Return the base directory name of a string containing a file name. |
basename | pass(self) | Return the base file name of a string containing a file name. |
camelcase | pass(self) | Return a string with all words capitalized without spaces. |
capitalize | pass(self) | Return a string with its first character capitalized and the rest lowercased. |
center | pass(self) | Return the string centered in a given width. |
chars | pass(self) | Return the raw characters data. |
colorize | Colorize and stylize strings. | |
common_prefix | Return the longest common prefix shared with other string(s). | |
compare_version | Compare two version numbers, return -1, 0 or 1. | |
compact | pass(self) | Return the words of the string separated by one separator, whitespace collapsed. |
decode | pass(self) | Decode string. |
encode | pass(self) | Encode string. |
escape | pass(self) | Escape backslashes (or custom escape character). |
expand_tabs | pass(self) | Return a string with the tabs expanded to spaces. |
extension | pass(self) | Return the extension of a string containing a file name. |
fill | pass(self) | Pad string on the left (or right) with zeros (or other char) to fill width. |
free | pass(self) | Free dynamic memory. |
glob | Glob search, finds all the pathnames matching a given pattern. | |
hex | pass(self) | Return the hexadecimal representation of the integer into the string. |
insert | Insert substring into string at a specified position. | |
join | Return a string that is a join of an array of strings or characters. | |
strjoin | Return a string that is a join of an array of strings or characters; | |
justify | pass(self) | Return the words of the string packed into fully justified lines. |
len_last_word | pass(self) | Return the length of the last word of the string. |
ljust | pass(self) | Return the string left justified in a given width. |
lower | pass(self) | Return a string with all lowercase characters. |
lstrip | pass(self) | Return a string with the leading characters removed. |
partition | pass(self) | Split string at separator and return the 3 parts (before, the separator and after). |
quote | pass(self) | Return the string quoted, the inner quotes doubled. |
read_file | pass(self) | Read a file a single string stream. |
read_line | pass(self) | Read line (record) from a connected unit. |
read_lines | pass(self) | Read (all) lines (records) from a connected unit as a single ascii stream. |
read_number | Cast string to number, with an error status. | |
replace | pass(self) | Return a string with all occurrences of substring old replaced by new. |
reverse | pass(self) | Return a reversed string. |
reverse_words | pass(self) | Return a string with the words order reversed. |
rjust | pass(self) | Return the string right justified in a given width. |
rstrip | pass(self) | Return a string with the trailing characters removed. |
search | pass(self) | Search for tagged record into string. |
slice | pass(self) | Return the raw characters data sliced. |
snakecase | pass(self) | Return a string with all words lowercase separated by "_". |
split | pass(self) | Return a list of substring in the string, using sep as the delimiter string. |
split_chunked | pass(self) | Return a list of substring in the string, using sep as the delimiter string. |
squeeze | pass(self) | Return a string with the runs of a repeated character reduced to one. |
startcase | pass(self) | Return a string with all words capitalized, e.g. title case. |
strip | pass(self) | Return a string with the leading and trailing characters removed. |
swapcase | pass(self) | Return a string with uppercase chars converted to lowercase and vice versa. |
tempname | pass(self) | Return a safe temporary name suitable for temporary file or directories. |
to_number | Cast string to number. | |
transliterate | pass(self) | Return a string with the characters of a set replaced by the ones of another. |
unescape | pass(self) | Unescape double backslashes (or custom escaped character). |
unique | pass(self) | Reduce to one (unique) multiple occurrences of a substring into a string. |
unquote | pass(self) | Return the string unquoted, the inner doubled quotes undoubled. |
upper | pass(self) | Return a string with all uppercase characters. |
write_file | pass(self) | Write a single string stream into file. |
write_line | pass(self) | Write line (record) to a connected unit. |
write_lines | pass(self) | Write lines (records) to a connected unit. |
end_with | pass(self) | Return true if a string ends with a specified suffix. |
is_allocated | pass(self) | Return true if the string is allocated. |
is_alnum | pass(self) | Return true if all characters in the string are letters or digits. |
is_alpha | pass(self) | Return true if all characters in the string are letters. |
is_digit | pass(self) | Return true if all characters in the string are digits. |
is_integer | pass(self) | Return true if the string contains an integer. |
is_lower | pass(self) | Return true if all characters in the string are lowercase. |
is_number | pass(self) | Return true if the string contains a number (real or integer). |
is_punct | pass(self) | Return true if all characters in the string are punctuation characters. |
is_real | pass(self) | Return true if the string contains an real. |
is_space | pass(self) | Return true if all characters in the string are whitespace. |
is_upper | pass(self) | Return true if all characters in the string are uppercase. |
is_xdigit | pass(self) | Return true if all characters in the string are hexadecimal digits. |
match | pass(self) | Return true if the string matches a wildcard pattern. |
start_with | pass(self) | Return true if a string starts with a specified prefix. |
assignment(=) | Assignment operator overloading. | |
operator(//) | Concatenation operator overloading. | |
operator(.cat.) | Concatenation operator (string output) overloading. | |
operator(==) | Equal operator overloading. | |
operator(/=) | Not equal operator overloading. | |
operator(<) | Lower than operator overloading. | |
operator(<=) | Lower equal than operator overloading. | |
operator(>=) | Greater equal than operator overloading. | |
operator(>) | Greater than operator overloading. | |
read(formatted) | Formatted input. | |
write(formatted) | Formatted output. | |
read(unformatted) | Unformatted input. | |
write(unformatted) | Unformatted output. | |
sindex_string_string | pass(self) | Index replacement. |
sindex_string_character | pass(self) | Index replacement. |
srepeat_string_string | pass(self) | Repeat replacement. |
srepeat_character_string | nopass | Repeat replacement. |
sscan_string_string | pass(self) | Scan replacement. |
sscan_string_character | pass(self) | Scan replacement. |
sverify_string_string | pass(self) | Verify replacement. |
sverify_string_character | pass(self) | Verify replacement. |
colorize_str | pass(self) | Colorize and stylize strings. |
common_prefix_string | pass(self) | Longest common prefix shared with a string. |
common_prefix_character | pass(self) | Longest common prefix shared with a character. |
common_prefix_strings | pass(self) | Longest common prefix shared with an array of strings. |
compare_version_string | pass(self) | Compare version number with a string one. |
compare_version_character | pass(self) | Compare version number with a character one. |
glob_character | pass(self) | Glob search (character output). |
glob_string | pass(self) | Glob search (string output). |
insert_string | pass(self) | Insert substring into string at a specified position. |
insert_character | pass(self) | Insert substring into string at a specified position. |
join_strings | pass(self) | Return join string of an array of strings. |
join_characters | pass(self) | Return join string of an array of characters. |
strjoin_strings | nopass | Return join string of an array of strings. |
strjoin_characters | nopass | Return join string of an array of strings. |
strjoin_strings_array | nopass | Return join 1D string array of an 2D array of strings in columns or rows. |
strjoin_characters_array | nopass | Return join 1D string array of an 2D array of characters in columns or rows. |
to_integer_I1P | pass(self) | Cast string to integer. |
to_integer_I2P | pass(self) | Cast string to integer. |
to_integer_I4P | pass(self) | Cast string to integer. |
to_integer_I8P | pass(self) | Cast string to integer. |
to_real_R4P | pass(self) | Cast string to real. |
to_real_R8P | pass(self) | Cast string to real. |
to_real_R16P | pass(self) | Cast string to real. |
read_number_I1P | pass(self) | Cast string to integer, with an error status. |
read_number_I2P | pass(self) | Cast string to integer, with an error status. |
read_number_I4P | pass(self) | Cast string to integer, with an error status. |
read_number_I8P | pass(self) | Cast string to integer, with an error status. |
read_number_R4P | pass(self) | Cast string to real, with an error status. |
read_number_R8P | pass(self) | Cast string to real, with an error status. |
read_number_R16P | pass(self) | Cast string to real, with an error status. |
string_assign_string | pass(lhs) | Assignment operator from string input. |
string_assign_character | pass(lhs) | Assignment operator from character input. |
string_assign_integer_I1P | pass(lhs) | Assignment operator from integer input. |
string_assign_integer_I2P | pass(lhs) | Assignment operator from integer input. |
string_assign_integer_I4P | pass(lhs) | Assignment operator from integer input. |
string_assign_integer_I8P | pass(lhs) | Assignment operator from integer input. |
string_assign_real_R4P | pass(lhs) | Assignment operator from real input. |
string_assign_real_R8P | pass(lhs) | Assignment operator from real input. |
string_assign_real_R16P | pass(lhs) | Assignment operator from real input. |
string_concat_string | pass(lhs) | Concatenation with string. |
string_concat_character | pass(lhs) | Concatenation with character. |
character_concat_string | pass(rhs) | Concatenation with character (inverted). |
string_concat_string_string | pass(lhs) | Concatenation with string (string output). |
string_concat_character_string | pass(lhs) | Concatenation with character (string output). |
character_concat_string_string | pass(rhs) | Concatenation with character (inverted, string output). |
string_eq_string | pass(lhs) | Equal to string logical operator. |
string_eq_character | pass(lhs) | Equal to character logical operator. |
character_eq_string | pass(rhs) | Equal to character (inverted) logical operator. |
string_ne_string | pass(lhs) | Not equal to string logical operator. |
string_ne_character | pass(lhs) | Not equal to character logical operator. |
character_ne_string | pass(rhs) | Not equal to character (inverted) logical operator. |
string_lt_string | pass(lhs) | Lower than to string logical operator. |
string_lt_character | pass(lhs) | Lower than to character logical operator. |
character_lt_string | pass(rhs) | Lower than to character (inverted) logical operator. |
string_le_string | pass(lhs) | Lower equal than to string logical operator. |
string_le_character | pass(lhs) | Lower equal than to character logical operator. |
character_le_string | pass(rhs) | Lower equal than to character (inverted) logical operator. |
string_ge_string | pass(lhs) | Greater equal than to string logical operator. |
string_ge_character | pass(lhs) | Greater equal than to character logical operator. |
character_ge_string | pass(rhs) | Greater equal than to character (inverted) logical operator. |
string_gt_string | pass(lhs) | Greater than to string logical operator. |
string_gt_character | pass(lhs) | Greater than to character logical operator. |
character_gt_string | pass(rhs) | Greater than to character (inverted) logical operator. |
read_formatted | pass(dtv) | Formatted input. |
read_delimited | pass(dtv) | Read a delimited input. |
read_undelimited | pass(dtv) | Read an undelimited input. |
read_undelimited_listdirected | pass(dtv) | Read an undelimited list directed input. |
write_formatted | pass(dtv) | Formatted output. |
read_unformatted | pass(dtv) | Unformatted input. |
write_unformatted | pass(dtv) | Unformatted output. |
Interfaces
glob
Overloading glob procedure.
fortran
type(string) :: astring
character(len=:), allocatable :: alist_chr(:)
type(string), allocatable :: alist_str(:)
integer, parameter :: Nf=5
character(14) :: files(1:Nf)
integer :: file_unit
integer :: f
integer :: ff
logical :: test_passed
do f=1, Nf
files(f) = astring%tempname(prefix='foo-')
open(newunit=file_unit, file=files(f))
write(file_unit, *)f
close(unit=file_unit)
enddo
call glob(self=astring, pattern='foo-*', list=alist_chr)
call glob(self=astring, pattern='foo-*', list=alist_str)
do f=1, Nf
open(newunit=file_unit, file=files(f))
close(unit=file_unit, status='delete')
enddo
test_passed = .false.
outer_chr: do f=1, size(alist_chr, dim=1)
do ff=1, Nf
test_passed = alist_chr(f) == files(ff)
if (test_passed) cycle outer_chr
enddo
enddo outer_chr
if (test_passed) then
test_passed = .false.
outer_str: do f=1, size(alist_str, dim=1)
do ff=1, Nf
test_passed = alist_str(f) == files(ff)
if (test_passed) cycle outer_str
enddo
enddo outer_str
endif
print '(L1)', test_passedModule procedures: glob_character, glob_string
strjoin
Module procedures: strjoin_strings, strjoin_characters, strjoin_strings_array, strjoin_characters_array
adjustl
Builtin adjustl overloading.
Module procedures: sadjustl_character
adjustr
Builtin adjustr overloading.
Module procedures: sadjustr_character
count
Builtin count overloading.
Module procedures: count_substring
index
Builtin index overloading.
Module procedures: sindex_string_string, sindex_string_character, sindex_character_string
len_trim
Builtin len_trim overloading.
Module procedures: slen_trim
repeat
Builtin repeat overloading.
Module procedures: srepeat_string_string
scan
Builtin scan overloading.
Module procedures: sscan_string_string, sscan_string_character, sscan_character_string
trim
Builtin trim overloading.
Module procedures: strim
verify
Builtin verify overloading.
Module procedures: sverify_string_string, sverify_string_character, sverify_character_string
Subroutines
free
Free dynamic memory.
fortran
type(string) :: astring
astring = 'this is string example....wow!!!'
call astring%free
print '(L1)', astring%is_allocated().eqv..false.Attributes: elemental
fortran
subroutine free(self)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | inout | The string. |
glob_character
Glob search (character output), finds all the pathnames matching a given pattern according to the rules used by the Unix shell.
@note Method not portable: works only on Unix/GNU Linux OS.
fortran
type(string) :: astring
character(len=:), allocatable :: alist_chr(:)
integer, parameter :: Nf=5
character(14) :: files(1:Nf)
integer :: file_unit
integer :: f
integer :: ff
logical :: test_passed
do f=1, Nf
files(f) = astring%tempname(prefix='foo-')
open(newunit=file_unit, file=files(f))
write(file_unit, *)f
close(unit=file_unit)
enddo
call astring%glob(pattern='foo-*', list=alist_chr)
do f=1, Nf
open(newunit=file_unit, file=files(f))
close(unit=file_unit, status='delete')
enddo
test_passed = .false.
outer_chr: do f=1, size(alist_chr, dim=1)
do ff=1, Nf
test_passed = alist_chr(f) == files(ff)
if (test_passed) cycle outer_chr
enddo
enddo outer_chr
print '(L1)', test_passedfortran
subroutine glob_character(self, pattern, list)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
pattern | character(len=*) | in | Given pattern. | |
list | character(len=:) | out | allocatable | List of matching pathnames. |
Call graph
glob_string
Glob search (string output), finds all the pathnames matching a given pattern according to the rules used by the Unix shell.
@note Method not portable: works only on Unix/GNU Linux OS (it runs ls through the shell).
@note If no pathname matches the pattern list is allocated with zero size.
@note Only the wildcards *, ? and [...] are special: every other character of the pattern is passed to the shell escaped, so spaces, ;, $, quotes or a leading - are part of the names searched, never shell syntax. A pattern holding a new line matches nothing. A matching directory is listed itself, not its content. Match a list of names already in memory with match.
fortran
type(string) :: astring
type(string), allocatable :: alist_str(:)
character(len=:), allocatable :: alist_chr(:)
logical :: test_passed(2)
call astring%glob(pattern='no-file-has-this-name-*', list=alist_str)
test_passed(1) = allocated(alist_str).and.size(alist_str, dim=1)==0
call astring%glob(pattern='no-file-has-this-name-*', list=alist_chr)
test_passed(2) = allocated(alist_chr).and.size(alist_chr, dim=1)==0
print '(L1)', all(test_passed)fortran
type(string) :: astring
type(string), allocatable :: alist_str(:)
character(len=:), allocatable :: files(:)
character(len=:), allocatable :: directory
integer :: file_unit
integer :: f
logical :: is_injected
logical :: test_passed(5)
files = [character(len=20) :: astring%tempname(prefix='glob test-'), astring%tempname(prefix='glob test-'), &
astring%tempname(prefix='-glob-')]
do f=1, size(files, dim=1)
open(newunit=file_unit, file=files(f))
close(unit=file_unit)
enddo
call astring%glob(pattern='glob test-*.tmp', list=alist_str)
test_passed(1) = size(alist_str, dim=1)==2
if (test_passed(1)) test_passed(1) = all(alist_str==files(1).or.alist_str==files(2))
call astring%glob(pattern=files(3), list=alist_str)
test_passed(2) = size(alist_str, dim=1)==1
call astring%glob(pattern='glob test-*; touch glob-injected', list=alist_str)
inquire(file='glob-injected', exist=is_injected)
test_passed(3) = size(alist_str, dim=1)==0.and..not.is_injected
do f=1, size(files, dim=1)
open(newunit=file_unit, file=files(f))
close(unit=file_unit, status='delete')
enddo
directory = astring%tempname(is_file=.false., prefix='glob-dir-')
call execute_command_line('mkdir '//directory)
call astring%glob(pattern=directory, list=alist_str)
test_passed(4) = size(alist_str, dim=1)==1
if (test_passed(4)) test_passed(4) = alist_str(1)==directory
call execute_command_line('rmdir '//directory)
call astring%glob(pattern='', list=alist_str)
test_passed(5) = size(alist_str, dim=1)==0
print '(L1)', all(test_passed)fortran
subroutine glob_string(self, pattern, list)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
pattern | character(len=*) | in | Given pattern. | |
list | type(string) | out | allocatable | List of matching pathnames. |
Call graph
justify
Return the words of the string packed into fully justified lines of (at least) width characters.
The words (separated by spaces) are greedily packed into lines; the blanks are evenly distributed between the words of each line, the leftmost gaps taking the extra ones. The last line and the lines made of one word are left-justified and padded with trailing blanks.
@note A word longer than width is not broken: it is placed alone into a line longer than width.
@note If the string is not allocated or it has no words lines has zero size.
@note This is a subroutine, like split: a function returning the lines would need an assignment to an unallocated array, that is not allowed for a type with a defined assignment.
fortran
type(string) :: astring
type(string), allocatable :: lines(:)
logical :: test_passed(9)
astring = 'This is an example of text justification.'
call astring%justify(lines=lines, width=16)
test_passed(1) = size(lines, dim=1)==3
test_passed(2) = lines(1)//''=='This is an'
test_passed(3) = lines(2)//''=='example of text'
test_passed(4) = lines(3)//''=='justification. '
astring = ' What must be acknowledgment shall be '
call astring%justify(lines=lines, width=16)
test_passed(5) = lines(1)//''=='What must be'
test_passed(6) = lines(2)//''=='acknowledgment '
test_passed(7) = lines(3)//''=='shall be '
call astring%justify(lines=lines, width=4)
test_passed(8) = size(lines, dim=1)==6.and.lines(4)//''=='acknowledgment'
astring = ' '
call astring%justify(lines=lines, width=16)
test_passed(9) = size(lines, dim=1)==0
print '(L1)', all(test_passed)Attributes: pure
fortran
subroutine justify(self, lines, width)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
lines | type(string) | out | allocatable | Justified lines. |
width | integer | in | Width of the justified lines. |
Call graph
read_file
Read a file as a single string stream.
@note All the lines are stored into the string self as a single ascii stream. Each line (record) is separated by a new_line character.
@note For unformatted read only access='stream' is supported with new_line as line terminator.
@note Fast file reading allows a very efficient reading of streamed file, but it dumps file as single streamed string.
fortran
type(string) :: astring
type(string), allocatable :: strings(:)
type(string) :: line(3)
integer :: iostat
character(len=99) :: iomsg
integer :: scratch
integer :: l
logical :: test_passed(9)
line(1) = ' Hello World! '
line(2) = 'How are you? '
line(3) = ' All say: "Fine thanks"'
open(newunit=scratch, file='read_file_test.tmp')
write(scratch, "(A)") line(1)%chars()
write(scratch, "(A)") line(2)%chars()
write(scratch, "(A)") line(3)%chars()
close(scratch)
call astring%read_file(file='read_file_test.tmp', iostat=iostat, iomsg=iomsg)
call astring%split(tokens=strings, sep=new_line('a'))
test_passed(1) = (size(strings, dim=1)==size(line, dim=1))
do l=1, size(strings, dim=1)
test_passed(l+1) = (strings(l)==line(l))
enddo
open(newunit=scratch, file='read_file_test.tmp', form='UNFORMATTED', access='STREAM')
write(scratch) line(1)%chars()//new_line('a')
write(scratch) line(2)%chars()//new_line('a')
write(scratch) line(3)%chars()//new_line('a')
close(scratch)
call astring%read_file(file='read_file_test.tmp', form='unformatted', iostat=iostat, iomsg=iomsg)
call astring%split(tokens=strings, sep=new_line('a'))
test_passed(5) = (size(strings, dim=1)==size(line, dim=1))
do l=1, size(strings, dim=1)
test_passed(l+5) = (strings(l)==line(l))
enddo
open(newunit=scratch, file='read_file_test.tmp', form='UNFORMATTED', access='STREAM')
close(scratch, status='DELETE')
call astring%read_file(file='read_file_test.tmp', iostat=iostat)
test_passed(9) = (iostat/=0)
print '(L1)', all(test_passed)fortran
subroutine read_file(self, file, is_fast, form, iostat, iomsg)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | inout | The string. | |
file | character(len=*) | in | File name. | |
is_fast | logical | in | optional | Flag to enable (super) fast file reading. |
form | character(len=*) | in | optional | Format of unit. |
iostat | integer | out | optional | IO status code. |
iomsg | character(len=*) | inout | optional | IO status message. |
Call graph
read_line
Read line (record) from a connected unit.
The line is read as an ascii stream read until the eor is reached.
@note iostat is zero when a line has been read, an empty one included: the string is then set to the line. At the end of the file iostat is the end-of-file code and the string is left unchanged, as it is on an error.
@note For unformatted read only access='stream' is supported with new_line as line terminator.
fortran
type(string) :: astring
integer :: iostat
integer :: scratch
integer :: l
logical :: test_passed(6)
open(newunit=scratch, status='SCRATCH')
write(scratch, "(A)") 'first'
write(scratch, "(A)") ''
write(scratch, "(A)") 'third'
rewind(scratch)
astring = 'untouched'
call astring%read_line(unit=scratch, iostat=iostat)
test_passed(1) = (iostat==0.and.astring=='first')
call astring%read_line(unit=scratch, iostat=iostat)
test_passed(2) = (iostat==0.and.astring%len()==0)
call astring%read_line(unit=scratch, iostat=iostat)
test_passed(3) = (iostat==0.and.astring=='third')
call astring%read_line(unit=scratch, iostat=iostat)
test_passed(4) = (is_iostat_end(iostat).and.astring=='third')
close(scratch)
open(newunit=scratch, status='SCRATCH', form='UNFORMATTED', access='STREAM')
write(scratch) 'first'//new_line('a')//new_line('a')//'last, not terminated'
rewind(scratch)
l = 0
do
call astring%read_line(unit=scratch, iostat=iostat, form='unformatted')
if (iostat/=0) exit
l = l + 1
enddo
test_passed(5) = (l==3.and.astring=='last, not terminated')
test_passed(6) = is_iostat_end(iostat)
close(scratch)
print '(L1)', all(test_passed)fortran
type(string) :: astring
type(string) :: line(3)
integer :: iostat
character(len=99) :: iomsg
integer :: scratch
integer :: l
logical :: test_passed(6)
line(1) = ' Hello World! '
line(2) = 'How are you? '
line(3) = ' All say: "Fine thanks"'
open(newunit=scratch, status='SCRATCH')
write(scratch, "(A)") line(1)%chars()
write(scratch, "(A)") line(2)%chars()
write(scratch, "(A)") line(3)%chars()
rewind(scratch)
l = 0
iostat = 0
do
l = l + 1
call astring%read_line(unit=scratch, iostat=iostat, iomsg=iomsg)
if (iostat/=0.and..not.is_iostat_eor(iostat)) then
exit
else
test_passed(l) = (astring==line(l))
endif
enddo
close(scratch)
open(newunit=scratch, status='SCRATCH', form='UNFORMATTED', access='STREAM')
write(scratch) line(1)%chars()//new_line('a')
write(scratch) line(2)%chars()//new_line('a')
write(scratch) line(3)%chars()//new_line('a')
rewind(scratch)
l = 0
iostat = 0
do
l = l + 1
call astring%read_line(unit=scratch, iostat=iostat, iomsg=iomsg, form='UnfORMatteD')
if (iostat/=0.and..not.is_iostat_eor(iostat)) then
exit
else
test_passed(l+3) = (astring==line(l))
endif
enddo
close(scratch)
print '(L1)', all(test_passed)fortran
subroutine read_line(self, unit, form, iostat, iomsg)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | inout | The string. | |
unit | integer | in | Logical unit. | |
form | character(len=*) | in | optional | Format of unit. |
iostat | integer | out | optional | IO status code. |
iomsg | character(len=*) | inout | optional | IO status message. |
Call graph
read_lines
Read (all) lines (records) from a connected unit as a single ascii stream.
@note All the lines are stored into the string self as a single ascii stream. Each line (record) is separated by a new_line character. The line is read as an ascii stream read until the eor is reached.
@note The connected unit is rewinded. At a successful exit current record is at eof, at the beginning otherwise.
@note For unformatted read only access='stream' is supported with new_line as line terminator.
fortran
type(string) :: astring
type(string), allocatable :: strings(:)
type(string) :: line(3)
integer :: iostat
character(len=99) :: iomsg
integer :: scratch
integer :: l
logical :: test_passed(8)
line(1) = ' Hello World! '
line(2) = 'How are you? '
line(3) = ' All say: "Fine thanks"'
open(newunit=scratch, status='SCRATCH')
write(scratch, "(A)") line(1)%chars()
write(scratch, "(A)") line(2)%chars()
write(scratch, "(A)") line(3)%chars()
call astring%read_lines(unit=scratch, iostat=iostat, iomsg=iomsg)
call astring%split(tokens=strings, sep=new_line('a'))
test_passed(1) = (size(strings, dim=1)==size(line, dim=1))
do l=1, size(strings, dim=1)
test_passed(l+1) = (strings(l)==line(l))
enddo
close(scratch)
open(newunit=scratch, status='SCRATCH', form='UNFORMATTED', access='STREAM')
write(scratch) line(1)%chars()//new_line('a')
write(scratch) line(2)%chars()//new_line('a')
write(scratch) line(3)%chars()//new_line('a')
call astring%read_lines(unit=scratch, form='unformatted', iostat=iostat, iomsg=iomsg)
call astring%split(tokens=strings, sep=new_line('a'))
test_passed(5) = (size(strings, dim=1)==size(line, dim=1))
do l=1, size(strings, dim=1)
test_passed(l+5) = (strings(l)==line(l))
enddo
close(scratch)
print '(L1)', all(test_passed)fortran
subroutine read_lines(self, unit, form, iostat, iomsg)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | inout | The string. | |
unit | integer | in | Logical unit. | |
form | character(len=*) | in | optional | Format of unit. |
iostat | integer | out | optional | IO status code. |
iomsg | character(len=*) | inout | optional | IO status message. |
Call graph
split
Return a list of substring in the string, using sep as the delimiter string.
@note Multiple subsequent separators are collapsed to one occurrence.
@note With keep_empty=.true. nothing is collapsed and the empty fields are tokens (as Python str.split(sep)): 'a,,b' gives 'a', '' and 'b', a null string gives one null token; max_tokens is then the number of splits, the last token being the rest of the string.
@note If max_tokens is passed the returned number of tokens is either max_tokens or max_tokens + 1.
@note A string made only of separators has no tokens (tokens is allocated with size 0).
fortran
type(string) :: astring
type(string), allocatable :: strings(:)
logical :: test_passed(14)
astring = '+ab-++cre-++cre-ab+'
call astring%split(tokens=strings, sep='+')
test_passed(1) = (strings(1)//''=='ab-'.and.strings(2)//''=='cre-'.and.strings(3)//''=='cre-ab')
astring = 'ab-++cre-++cre-ab+'
call astring%split(tokens=strings, sep='+')
test_passed(2) = (strings(1)//''=='ab-'.and.strings(2)//''=='cre-'.and.strings(3)//''=='cre-ab')
astring = 'ab-++cre-++cre-ab'
call astring%split(tokens=strings, sep='+')
test_passed(3) = (strings(1)//''=='ab-'.and.strings(2)//''=='cre-'.and.strings(3)//''=='cre-ab')
astring = 'Hello '//new_line('a')//'World!'
call astring%split(tokens=strings, sep=new_line('a'))
test_passed(4) = (strings(1)//''=='Hello '.and.strings(2)//''=='World!')
astring = 'Hello World!'
call astring%split(tokens=strings)
test_passed(5) = (strings(1)//''=='Hello'.and.strings(2)//''=='World!')
astring = '+ab-'
call astring%split(tokens=strings, sep='+')
test_passed(6) = (strings(1)//''=='ab-')
astring = '+ab-'
call astring%split(tokens=strings, sep='-')
test_passed(7) = (strings(1)//''=='+ab')
astring = '+ab-+cd-'
call astring%split(tokens=strings, sep='+')
test_passed(8) = (strings(1)//''=='ab-'.and.strings(2)//''=='cd-')
astring = 'ab-+cd-+'
call astring%split(tokens=strings, sep='+')
test_passed(9) = (strings(1)//''=='ab-'.and.strings(2)//''=='cd-')
astring = '+ab-+cd-+'
call astring%split(tokens=strings, sep='+')
test_passed(10) = (strings(1)//''=='ab-'.and.strings(2)//''=='cd-')
astring = '1-2-3-4-5-6-7-8'
call astring%split(tokens=strings, sep='-', max_tokens=3)
test_passed(11) = (strings(1)//''=='1'.and.strings(2)//''=='2'.and.strings(3)//''=='3'.and.strings(4)//''=='4-5-6-7-8')
astring = '+++'
call astring%split(tokens=strings, sep='+')
test_passed(12) = (size(strings, dim=1)==0)
astring = ',a,,b,'
call astring%split(tokens=strings, sep=',', keep_empty=.true.)
test_passed(13) = size(strings, dim=1)==5
if (test_passed(13)) test_passed(13) = all(strings==[' ', 'a ', ' ', 'b ', ' ']).and.all(strings%len()==[0, 1, 0, 1, 0])
call astring%split(tokens=strings, sep=',', max_tokens=2, keep_empty=.true.)
test_passed(14) = size(strings, dim=1)==3
if (test_passed(14)) test_passed(14) = strings(1)//''==''.and.strings(2)//''=='a'.and.strings(3)//''==',b,'
print '(L1)', all(test_passed)Attributes: pure
fortran
subroutine split(self, tokens, sep, max_tokens, keep_empty)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
tokens | type(string) | out | allocatable | Tokens substring. |
sep | character(kind=CK, len=*) | in | optional | Separator. |
max_tokens | integer | in | optional | Fix the maximum number of returned tokens. |
keep_empty | logical | in | optional | Keep the empty fields, collapsing nothing. |
Call graph
split_chunked
Return a list of substring in the string, using sep as the delimiter string, chunked (memory-efficient) algorithm.
@note Multiple subsequent separators are collapsed to one occurrence.
@note The split is performed in chunks of #chunks to avoid excessive memory consumption.
fortran
type(string) :: astring
type(string), allocatable :: strings(:)
logical :: test_passed(1)
astring = '-1-2-3-4-5-6-7-8-'
call astring%split_chunked(tokens=strings, sep='-', chunks=3)
test_passed(1) = (strings(1)//''=='1'.and.strings(2)//''=='2'.and.strings(3)//''=='3'.and.strings(4)//''=='4'.and. &
strings(5)//''=='5'.and.strings(6)//''=='6'.and.strings(7)//''=='7'.and.strings(8)//''=='8')
print '(L1)', all(test_passed)Attributes: pure
fortran
subroutine split_chunked(self, tokens, chunks, sep)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
tokens | type(string) | out | allocatable | Tokens substring. |
chunks | integer | in | Number of chunks. | |
sep | character(kind=CK, len=*) | in | optional | Separator. |
Call graph
read_number_I1P
Cast string to integer (I1P), with an error status.
@note If the string is not an integer number is 0 and iostat is positive: unlike to_number, the failure is reported. As the read statement, iomsg is changed only on failure. See is_integer.
@note The doctest is not necessary, this being tested by the I4P one.
Attributes: elemental
fortran
subroutine read_number_I1P(self, number, iostat, iomsg)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
number | integer(kind=I1P) | out | The number into the string. | |
iostat | integer | out | optional | IO status code: 0 on success, positive otherwise. |
iomsg | character(len=*) | inout | optional | IO status message, set on failure. |
Call graph
read_number_I2P
Cast string to integer (I2P), with an error status.
@note If the string is not an integer number is 0 and iostat is positive: unlike to_number, the failure is reported. As the read statement, iomsg is changed only on failure. See is_integer.
@note The doctest is not necessary, this being tested by the I4P one.
Attributes: elemental
fortran
subroutine read_number_I2P(self, number, iostat, iomsg)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
number | integer(kind=I2P) | out | The number into the string. | |
iostat | integer | out | optional | IO status code: 0 on success, positive otherwise. |
iomsg | character(len=*) | inout | optional | IO status message, set on failure. |
Call graph
read_number_I4P
Cast string to integer (I4P), with an error status.
@note If the string is not an integer number is 0 and iostat is positive: unlike to_number, the failure is reported. As the read statement, iomsg is changed only on failure. See is_integer.
fortran
use penf
type(string) :: astring
integer(I4P) :: integer_
integer :: iostat
character(len=99) :: iomsg
logical :: test_passed(4)
astring = '127'
call astring%read_number(integer_, iostat=iostat)
test_passed(1) = integer_==127_I4P.and.iostat==0
astring = '12x'
call astring%read_number(integer_, iostat=iostat, iomsg=iomsg)
test_passed(2) = integer_==0_I4P.and.iostat>0.and.trim(iomsg)=='the string is not an integer'
astring = '99999999999'
call astring%read_number(integer_, iostat=iostat)
test_passed(3) = integer_==0_I4P.and.iostat/=0
call astring%free
call astring%read_number(integer_, iostat=iostat)
test_passed(4) = iostat>0
print '(L1)', all(test_passed)Attributes: elemental
fortran
subroutine read_number_I4P(self, number, iostat, iomsg)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
number | integer(kind=I4P) | out | The number into the string. | |
iostat | integer | out | optional | IO status code: 0 on success, positive otherwise. |
iomsg | character(len=*) | inout | optional | IO status message, set on failure. |
Call graph
read_number_I8P
Cast string to integer (I8P), with an error status.
@note If the string is not an integer number is 0 and iostat is positive: unlike to_number, the failure is reported. As the read statement, iomsg is changed only on failure. See is_integer.
@note The doctest is not necessary, this being tested by the I4P one.
Attributes: elemental
fortran
subroutine read_number_I8P(self, number, iostat, iomsg)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
number | integer(kind=I8P) | out | The number into the string. | |
iostat | integer | out | optional | IO status code: 0 on success, positive otherwise. |
iomsg | character(len=*) | inout | optional | IO status message, set on failure. |
Call graph
read_number_R4P
Cast string to real (R4P), with an error status.
@note If the string is not a number number is a quiet NaN and iostat is positive: unlike to_number, the failure is reported. As the read statement, iomsg is changed only on failure. See is_number.
@note The doctest is not necessary, this being tested by the R8P one.
Attributes: elemental
fortran
subroutine read_number_R4P(self, number, iostat, iomsg)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
number | real(kind=R4P) | out | The number into the string. | |
iostat | integer | out | optional | IO status code: 0 on success, positive otherwise. |
iomsg | character(len=*) | inout | optional | IO status message, set on failure. |
Call graph
read_number_R8P
Cast string to real (R8P), with an error status.
@note If the string is not a number number is a quiet NaN and iostat is positive: unlike to_number, the failure is reported. As the read statement, iomsg is changed only on failure. See is_number.
fortran
use penf
type(string) :: astrings(3)
real(R8P) :: reals(3)
integer :: iostats(3)
logical :: test_passed(3)
astrings(1) = '3.4e9'
astrings(2) = '12'
astrings(3) = 'twelve'
call astrings%read_number(reals, iostat=iostats)
test_passed(1) = reals(1)==3.4e9_R8P.and.iostats(1)==0
test_passed(2) = reals(2)==12._R8P.and.iostats(2)==0
test_passed(3) = reals(3)/=reals(3).and.iostats(3)>0
print '(L1)', all(test_passed)Attributes: elemental
fortran
subroutine read_number_R8P(self, number, iostat, iomsg)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
number | real(kind=R8P) | out | The number into the string. | |
iostat | integer | out | optional | IO status code: 0 on success, positive otherwise. |
iomsg | character(len=*) | inout | optional | IO status message, set on failure. |
Call graph
read_number_R16P
Cast string to real (R16P), with an error status.
@note If the string is not a number number is a quiet NaN and iostat is positive: unlike to_number, the failure is reported. As the read statement, iomsg is changed only on failure. See is_number.
@note The doctest is not necessary, this being tested by the R8P one.
Attributes: elemental
fortran
subroutine read_number_R16P(self, number, iostat, iomsg)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
number | real(kind=R16P) | out | The number into the string. | |
iostat | integer | out | optional | IO status code: 0 on success, positive otherwise. |
iomsg | character(len=*) | inout | optional | IO status message, set on failure. |
Call graph
write_file
Write a single string stream into file.
@note For unformatted read only access='stream' is supported with new_line as line terminator.
fortran
type(string) :: astring
type(string) :: anotherstring
type(string), allocatable :: strings(:)
type(string) :: line(3)
integer :: iostat
character(len=99) :: iomsg
integer :: scratch
integer :: l
logical :: test_passed(8)
line(1) = ' Hello World! '
line(2) = 'How are you? '
line(3) = ' All say: "Fine thanks"'
anotherstring = anotherstring%join(array=line, sep=new_line('a'))
call anotherstring%write_file(file='write_file_test.tmp', iostat=iostat, iomsg=iomsg)
call astring%read_file(file='write_file_test.tmp', iostat=iostat, iomsg=iomsg)
call astring%split(tokens=strings, sep=new_line('a'))
test_passed(1) = (size(strings, dim=1)==size(line, dim=1))
do l=1, size(strings, dim=1)
test_passed(l+1) = (strings(l)==line(l))
enddo
call anotherstring%write_file(file='write_file_test.tmp', form='unformatted', iostat=iostat, iomsg=iomsg)
call astring%read_file(file='write_file_test.tmp', form='unformatted', iostat=iostat, iomsg=iomsg)
call astring%split(tokens=strings, sep=new_line('a'))
test_passed(5) = (size(strings, dim=1)==size(line, dim=1))
do l=1, size(strings, dim=1)
test_passed(l+5) = (strings(l)==line(l))
enddo
open(newunit=scratch, file='write_file_test.tmp')
close(unit=scratch, status='delete')
print '(L1)', all(test_passed)fortran
subroutine write_file(self, file, form, iostat, iomsg)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
file | character(len=*) | in | File name. | |
form | character(len=*) | in | optional | Format of unit. |
iostat | integer | out | optional | IO status code. |
iomsg | character(len=*) | inout | optional | IO status message. |
Call graph
write_line
Write line (record) to a connected unit.
@note If the connected unit is unformatted a new_line() character is added at the end (if necessary) to mark the end of line.
@note There is no doctests, this being tested by means of write_file doctests.
fortran
subroutine write_line(self, unit, form, iostat, iomsg)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
unit | integer | in | Logical unit. | |
form | character(len=*) | in | optional | Format of unit. |
iostat | integer | out | optional | IO status code. |
iomsg | character(len=*) | inout | optional | IO status message. |
Call graph
write_lines
Write lines (records) to a connected unit.
This method checks if self contains more than one line (records) and writes them as lines (records).
@note If the connected unit is unformatted a new_line() character is added at the end (if necessary) to mark the end of line.
@note There is no doctests, this being tested by means of write_file doctests.
fortran
subroutine write_lines(self, unit, form, iostat, iomsg)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
unit | integer | in | Logical unit. | |
form | character(len=*) | in | optional | Format of unit. |
iostat | integer | out | optional | IO status code. |
iomsg | character(len=*) | inout | optional | IO status message. |
Call graph
string_assign_string
Assignment operator from string input.
fortran
type(string) :: astring
type(string) :: anotherstring
type(string) :: notallocated
logical :: test_passed(2)
astring = 'hello'
anotherstring = astring
test_passed(1) = astring%chars()==anotherstring%chars()
anotherstring = notallocated
test_passed(2) = .not.anotherstring%is_allocated()
print '(L1)', all(test_passed)Attributes: pure
fortran
subroutine string_assign_string(lhs, rhs)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
lhs | class(string) | inout | Left hand side. | |
rhs | type(string) | in | Right hand side. |
string_assign_character
Assignment operator from character input.
fortran
type(string) :: astring
logical :: test_passed(1)
astring = 'hello'
test_passed(1) = astring%chars()=='hello'
print '(L1)', all(test_passed)Attributes: pure
fortran
subroutine string_assign_character(lhs, rhs)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
lhs | class(string) | inout | Left hand side. | |
rhs | character(kind=CK, len=*) | in | Right hand side. |
string_assign_integer_I1P
Assignment operator from integer input.
fortran
use penf
type(string) :: astring
logical :: test_passed(1)
astring = 127_I1P
test_passed(1) = astring%to_number(kind=1_I1P)==127_I1P
print '(L1)', all(test_passed)Attributes: pure
fortran
subroutine string_assign_integer_I1P(lhs, rhs)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
lhs | class(string) | inout | Left hand side. | |
rhs | integer(kind=I1P) | in | Right hand side. |
string_assign_integer_I2P
Assignment operator from integer input.
fortran
use penf
type(string) :: astring
logical :: test_passed(1)
astring = 127_I2P
test_passed(1) = astring%to_number(kind=1_I2P)==127_I2P
print '(L1)', all(test_passed)Attributes: pure
fortran
subroutine string_assign_integer_I2P(lhs, rhs)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
lhs | class(string) | inout | Left hand side. | |
rhs | integer(kind=I2P) | in | Right hand side. |
string_assign_integer_I4P
Assignment operator from integer input.
fortran
use penf
type(string) :: astring
logical :: test_passed(1)
astring = 127_I4P
test_passed(1) = astring%to_number(kind=1_I4P)==127_I4P
print '(L1)', all(test_passed)Attributes: pure
fortran
subroutine string_assign_integer_I4P(lhs, rhs)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
lhs | class(string) | inout | Left hand side. | |
rhs | integer(kind=I4P) | in | Right hand side. |
string_assign_integer_I8P
Assignment operator from integer input.
fortran
use penf
type(string) :: astring
logical :: test_passed(1)
astring = 127_I8P
test_passed(1) = astring%to_number(kind=1_I8P)==127_I8P
print '(L1)', all(test_passed)Attributes: pure
fortran
subroutine string_assign_integer_I8P(lhs, rhs)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
lhs | class(string) | inout | Left hand side. | |
rhs | integer(kind=I8P) | in | Right hand side. |
string_assign_real_R4P
Assignment operator from real input.
fortran
use penf
type(string) :: astring
logical :: test_passed(1)
astring = 3.021e6_R4P
test_passed(1) = astring%to_number(kind=1._R4P)==3.021e6_R4P
print '(L1)', all(test_passed)Attributes: pure
fortran
subroutine string_assign_real_R4P(lhs, rhs)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
lhs | class(string) | inout | Left hand side. | |
rhs | real(kind=R4P) | in | Right hand side. |
string_assign_real_R8P
Assignment operator from real input.
fortran
use penf
type(string) :: astring
logical :: test_passed(1)
astring = 3.021e6_R8P
test_passed(1) = astring%to_number(kind=1._R8P)==3.021e6_R8P
print '(L1)', all(test_passed)Attributes: pure
fortran
subroutine string_assign_real_R8P(lhs, rhs)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
lhs | class(string) | inout | Left hand side. | |
rhs | real(kind=R8P) | in | Right hand side. |
string_assign_real_R16P
Assignment operator from real input.
fortran
use penf
type(string) :: astring
logical :: test_passed(1)
astring = 3.021e6_R8P
test_passed(1) = astring%to_number(kind=1._R8P)==3.021e6_R8P
print '(L1)', all(test_passed)Attributes: pure
fortran
subroutine string_assign_real_R16P(lhs, rhs)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
lhs | class(string) | inout | Left hand side. | |
rhs | real(kind=R16P) | in | Right hand side. |
read_formatted
Formatted input.
@bug Change temporary acks: find a more precise length of the input string and avoid the trimming!
@bug Read listdirected with and without delimiters does not work.
fortran
subroutine read_formatted(dtv, unit, iotype, v_list, iostat, iomsg)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
dtv | class(string) | inout | The string. | |
unit | integer | in | Logical unit. | |
iotype | character(len=*) | in | Edit descriptor. | |
v_list | integer | in | Edit descriptor list. | |
iostat | integer | out | IO status code. | |
iomsg | character(len=*) | inout | IO status message. |
Call graph
read_delimited
Read a delimited string from a unit connected for formatted input.
If the closing delimiter is followed by end of record, then we return end of record.
@note This does not need a doctest, it being tested by [[string::read_formatted]].
fortran
subroutine read_delimited(dtv, unit, delim, iostat, iomsg)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
dtv | class(string) | inout | The string. | |
unit | integer | in | Logical unit. | |
delim | character(kind=CK, len=1) | in | String delimiter. | |
iostat | integer | out | IO status code. | |
iomsg | character(kind=CK, len=*) | inout | IO status message. |
Call graph
read_undelimited_listdirected
Read an undelimited (no leading apostrophe or double quote) character value according to the rules for list directed input.
A blank, comma/semicolon (depending on the decimal mode), slash or end of record terminates the string.
If input is terminated by end of record, then this procedure returns an end-of-record condition.
fortran
subroutine read_undelimited_listdirected(dtv, unit, iostat, iomsg)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
dtv | class(string) | inout | The string. | |
unit | integer | in | Logical unit. | |
iostat | integer | out | IO status code. | |
iomsg | character(len=*) | inout | IO status message. |
Call graph
read_undelimited
Read an undelimited string up until end of record or a character from a set of terminators is encountered.
If a terminator is encountered, the file position will be at that terminating character. If end of record is encountered, the file remains at end of record.
fortran
subroutine read_undelimited(dtv, unit, terminators, iostat, iomsg)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
dtv | class(string) | inout | The string. | |
unit | integer | in | Logical unit. | |
terminators | character(kind=CK, len=*) | in | Characters that are considered to terminate the string. | |
iostat | integer | out | IO status code. | |
iomsg | character(len=*) | inout | IO status message. |
Call graph
write_formatted
Formatted output.
fortran
subroutine write_formatted(dtv, unit, iotype, v_list, iostat, iomsg)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
dtv | class(string) | in | The string. | |
unit | integer | in | Logical unit. | |
iotype | character(kind=CK, len=*) | in | Edit descriptor. | |
v_list | integer | in | Edit descriptor list. | |
iostat | integer | out | IO status code. | |
iomsg | character(kind=CK, len=*) | inout | IO status message. |
read_unformatted
Unformatted input.
@note The string is stored as its length (an I8P integer) followed by its characters, see write_unformatted.
fortran
type(string) :: astring
type(string) :: bstring
type(string) :: cstring
integer :: scratch
logical :: test_passed(4)
astring = repeat('a', 250)//' '
open(newunit=scratch, status='SCRATCH', form='UNFORMATTED')
write(scratch) astring, bstring
rewind(scratch)
read(scratch) cstring, bstring
close(scratch)
test_passed(1) = cstring%len()==252.and.cstring==astring
test_passed(2) = bstring%is_allocated().and.bstring%len()==0
open(newunit=scratch, status='SCRATCH', form='UNFORMATTED', access='STREAM')
write(scratch) astring
rewind(scratch)
read(scratch) cstring
close(scratch)
test_passed(3) = cstring%len()==252
test_passed(4) = cstring==astring
print '(L1)', all(test_passed)fortran
subroutine read_unformatted(dtv, unit, iostat, iomsg)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
dtv | class(string) | inout | The string. | |
unit | integer | in | Logical unit. | |
iostat | integer | out | IO status code. | |
iomsg | character(kind=CK, len=*) | inout | IO status message. |
write_unformatted
Unformatted output.
@note The string is stored as its length (an I8P integer) followed by its characters, a not allocated string being stored as a null one.
@note The doctest is not necessary, this being tested by read_unformatted.
fortran
subroutine write_unformatted(dtv, unit, iostat, iomsg)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
dtv | class(string) | in | The string. | |
unit | integer | in | Logical unit. | |
iostat | integer | out | IO status code. | |
iomsg | character(kind=CK, len=*) | inout | IO status message. |
parse_number_fast
Parse a plain decimal number, [blanks][sign]digits[.digits][e|E|d|D[sign]digits][blanks] (only the integer part if is_integer), into its sign, its digits as an integer and its decimal exponent.
is_ok is false for anything else, and for more than 18 significant digits: the caller then falls back to the read statement. The accepted strings are a subset of the ones accepted by is_number and by the read statement.
@note The doctest is not necessary, this being tested by read_number and by the differential test.
Attributes: pure
fortran
subroutine parse_number_fast(raw, is_integer, negative, mantissa, exponent, is_ok)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
raw | character(kind=CK, len=*) | in | Raw characters data. | |
is_integer | logical | in | Accept an integer only, no fraction nor exponent. | |
negative | logical | out | The number is negative. | |
mantissa | integer(kind=I8P) | out | Significant digits, as an integer. | |
exponent | integer | out | Decimal exponent: the number is mantissa * 10**exponent. | |
is_ok | logical | out | The string is a plain decimal number of at most 18 digits. |
Call graph
append_to_buffer
Append a piece to the first length characters of a buffer, doubling the buffer when it is full.
@note The doctest is not necessary, this being tested by read_line and read_lines.
Attributes: pure
fortran
subroutine append_to_buffer(buffer, length, piece)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
buffer | character(kind=CK, len=:) | inout | allocatable | Buffer, only its first length characters are used. |
length | integer | inout | Length of the used part of the buffer. | |
piece | character(kind=CK, len=*) | in | Piece to append. |
Call graph
get_delimiter_mode
Get the DELIM changeable connection mode for the given unit.
If the unit is connected to an internal file, then the default value of NONE is always returned.
fortran
subroutine get_delimiter_mode(unit, delim, iostat, iomsg)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
unit | integer | in | The unit for the connection. | |
delim | character(kind=CK, len=1) | out | Represents the value of the DELIM mode. | |
iostat | integer | out | IOSTAT error code, non-zero on error. | |
iomsg | character(len=*) | inout | IOMSG explanatory message - only defined if iostat is non-zero. |
get_next_non_blank_character_this_record
Get the next non-blank character in the current record.
fortran
subroutine get_next_non_blank_character_this_record(unit, ch, iostat, iomsg)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
unit | integer | in | Logical unit. | |
ch | character(kind=CK, len=1) | out | The non-blank character read. Not valid if IOSTAT is non-zero. | |
iostat | integer | out | IO status code. | |
iomsg | character(kind=CK, len=*) | inout | IO status message. |
Call graph
get_next_non_blank_character_any_record
Get the next non-blank character, advancing records if necessary.
fortran
subroutine get_next_non_blank_character_any_record(unit, ch, iostat, iomsg)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
unit | integer | in | Logical unit. | |
ch | character(kind=CK, len=1) | out | The non-blank character read. Not valid if IOSTAT is non-zero. | |
iostat | integer | out | IO status code. | |
iomsg | character(kind=CK, len=*) | inout | IO status message. |
Call graph
get_decimal_mode
Get the DECIMAL changeable connection mode for the given unit.
If the unit is connected to an internal file, then the default value of DECIMAL is always returned. This may not be the actual value in force at the time of the call to this procedure.
fortran
subroutine get_decimal_mode(unit, decimal_point, iostat, iomsg)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
unit | integer | in | Logical unit. | |
decimal_point | logical | out | True if the decimal mode is POINT, false otherwise. | |
iostat | integer | out | IO status code. | |
iomsg | character(kind=CK, len=*) | inout | IO status message. |
Call graph
Functions
string_
Return a string given a character input.
fortran
print "(L1)", string('Hello World')//''=='Hello World'Attributes: pure
Returns: type(string)
fortran
function string_(c)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
c | character(len=*) | in | Character. |
sadjustl_character
Left adjust a string by removing leading spaces (character output).
fortran
type(string) :: astring
astring = ' Hello World!'
print "(L1)", adjustl(astring)=='Hello World! 'Attributes: pure
Returns: character(kind=CK, len=:)
fortran
function sadjustl_character(s) result(adjusted)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
s | class(string) | in | String. |
sadjustr_character
Right adjust a string by removing leading spaces (character output).
fortran
type(string) :: astring
astring = 'Hello World! '
print "(L1)", adjustr(astring)==' Hello World!'Attributes: pure
Returns: character(kind=CK, len=:)
fortran
function sadjustr_character(s) result(adjusted)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
s | class(string) | in | String. |
count_substring
Count the number of occurences of a substring into a string.
@note The occurrences are not overlapping, counted from left to right (as Python str.count), unless overlapping is true. A null substring has no occurrences.
fortran
logical :: test_passed(6)
test_passed(1) = count('hello', substring='ll')==1
test_passed(2) = count('aaaa', substring='a')==4
test_passed(3) = count('aaaa', substring='aa')==2
test_passed(4) = count('abc', substring='')==0
test_passed(5) = count('aaaa', substring='aa', overlapping=.true.)==3
test_passed(6) = count('abab', substring='ab', overlapping=.true.)==2
print '(L1)', all(test_passed)Attributes: elemental
Returns: integer(kind=I4P)
fortran
function count_substring(s, substring, overlapping) result(No)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
s | character(len=*) | in | String. | |
substring | character(len=*) | in | Substring. | |
overlapping | logical | in | optional | Count the overlapping occurrences too. |
Call graph
sindex_character_string
Return the position of the start of the first occurrence of string substring as a substring in string, counting from one. If substring is not present in string, zero is returned. If the back argument is present and true, the return value is the start of the last occurrence rather than the first.
fortran
type(string) :: string1
logical :: test_passed(2)
string1 = 'llo'
test_passed(1) = index(s='Hello World Hello!', substring=string1)==index(string='Hello World Hello!', substring='llo')
test_passed(2) = index(s='Hello World Hello!', substring=string1, back=.true.)==index(string='Hello World Hello!', &
substring='llo', back=.true.)
print '(L1)', all(test_passed)Attributes: elemental
Returns: integer
fortran
function sindex_character_string(s, substring, back, occurrence) result(i)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
s | character(kind=CK, len=*) | in | String. | |
substring | type(string) | in | Searched substring. | |
back | logical | in | optional | Start of the last occurrence rather than the first. |
occurrence | integer | in | optional | Number of the occurrence, default 1. |
Call graph
sscan_character_string
Return the leftmost (if back is either absent or equals false, otherwise the rightmost) character of string that is in set.
fortran
type(string) :: string1
logical :: test_passed(2)
string1 = 'llo'
test_passed(1) = scan(s='Hello World Hello!', set=string1)==scan(string='Hello World Hello!', set='llo')
test_passed(2) = scan(s='Hello World Hello!', set=string1, back=.true.)==scan(string='Hello World Hello!', &
set='llo', back=.true.)
print '(L1)', all(test_passed)Attributes: elemental
Returns: integer
fortran
function sscan_character_string(s, set, back) result(i)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
s | character(kind=CK, len=*) | in | String. | |
set | type(string) | in | Searched set. | |
back | logical | in | optional | Start of the last occurrence rather than the first. |
sverify_character_string
Return the leftmost (if back is either absent or equals false, otherwise the rightmost) character of string that is not in set. If all characters of string are found in set, the result is zero.
fortran
type(string) :: string1
logical :: test_passed(2)
string1 = 'ell'
test_passed(1) = verify(s='Hello World Hello!', set=string1)==verify(string='Hello World Hello!', set='llo')
test_passed(2) = verify(s='Hello World Hello!', set=string1, back=.true.)==verify(string='Hello World Hello!', set='llo', &
back=.true.)
print '(L1)', all(test_passed)Attributes: elemental
Returns: integer
fortran
function sverify_character_string(s, set, back) result(i)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
s | character(kind=CK, len=*) | in | String. | |
set | type(string) | in | Searched set. | |
back | logical | in | optional | Start of the last occurrence rather than the first. |
sadjustl
Left adjust a string by removing leading spaces.
fortran
type(string) :: astring
astring = ' Hello World!'
print "(L1)", astring%adjustl()//''=='Hello World! 'Attributes: elemental
Returns: type(string)
fortran
function sadjustl(self) result(adjusted)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. |
sadjustr
Right adjust a string by removing leading spaces.
fortran
type(string) :: astring
astring = 'Hello World! '
print "(L1)", astring%adjustr()//''==' Hello World!'Attributes: elemental
Returns: type(string)
fortran
function sadjustr(self) result(adjusted)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. |
scount
Count the number of occurences of a substring into a string.
@note The occurrences are not overlapping, counted from left to right (as Python str.count), unless overlapping is true: 'aaaa' holds 2 occurrences of 'aa', 3 overlapping ones.
@note If ignore_isolated is set to true the eventual "isolated" occurences are ignored: an isolated occurrences are those occurrences happening at the start of string (thus not having a left companion) or at the end of the string (thus not having a right companion).
fortran
type(string) :: astring
logical :: test_passed(6)
astring = ' Hello World ! '
test_passed(1) = astring%count(substring=' ')==10
astring = 'Hello World ! '
test_passed(2) = astring%count(substring=' ', ignore_isolated=.true.)==6
astring = ' Hello World !'
test_passed(3) = astring%count(substring=' ', ignore_isolated=.true.)==6
astring = ' Hello World ! '
test_passed(4) = astring%count(substring=' ', ignore_isolated=.true.)==8
test_passed(5) = astring%count(substring='')==0
astring = 'aaaa'
test_passed(6) = astring%count('aa')==2.and.astring%count('aa', overlapping=.true.)==3
print '(L1)', all(test_passed)Attributes: elemental
Returns: integer
fortran
function scount(self, substring, ignore_isolated, overlapping) result(No)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
substring | character(len=*) | in | Substring. | |
ignore_isolated | logical | in | optional | Ignore "isolated" occurrences. |
overlapping | logical | in | optional | Count the overlapping occurrences too. |
sindex_string_string
Return the position of the start of the first occurrence of string substring as a substring in string, counting from one. If substring is not present in string, zero is returned. If the back argument is present and true, the return value is the start of the last occurrence rather than the first.
@note With occurrence=k the start of the k-th occurrence is returned (counted from the end if back is true), zero if there are fewer: the occurrences are not overlapping, as for count.
fortran
type(string) :: string1
type(string) :: string2
logical :: test_passed(4)
string1 = 'Hello World Hello!'
string2 = 'llo'
test_passed(1) = string1%index(substring=string2)==index(string='Hello World Hello!', substring='llo')
test_passed(2) = string1%index(substring=string2, back=.true.)==index(string='Hello World Hello!', substring='llo', &
back=.true.)
string1 = 'ab-ab-ab'
string2 = 'ab'
test_passed(3) = string1%index(string2, occurrence=2)==4.and.string1%index(string2, occurrence=4)==0
test_passed(4) = string1%index(string2, back=.true., occurrence=2)==4
print '(L1)', all(test_passed)Attributes: elemental
Returns: integer
fortran
function sindex_string_string(self, substring, back, occurrence) result(i)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
substring | type(string) | in | Searched substring. | |
back | logical | in | optional | Start of the last occurrence rather than the first. |
occurrence | integer | in | optional | Number of the occurrence, default 1. |
Call graph
sindex_string_character
Return the position of the start of the first occurrence of string substring as a substring in string, counting from one. If substring is not present in string, zero is returned. If the back argument is present and true, the return value is the start of the last occurrence rather than the first.
fortran
type(string) :: string1
logical :: test_passed(2)
string1 = 'Hello World Hello!'
test_passed(1) = string1%index(substring='llo')==index(string='Hello World Hello!', substring='llo')
test_passed(2) = string1%index(substring='llo', back=.true.)==index(string='Hello World Hello!', substring='llo', back=.true.)
print '(L1)', all(test_passed)Attributes: elemental
Returns: integer
fortran
function sindex_string_character(self, substring, back, occurrence) result(i)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
substring | character(kind=CK, len=*) | in | Searched substring. | |
back | logical | in | optional | Start of the last occurrence rather than the first. |
occurrence | integer | in | optional | Number of the occurrence, default 1. |
Call graph
slen
Return the length of a string.
fortran
type(string) :: astring
astring = 'Hello World! '
print "(L1)", astring%len()==len('Hello World! ')Attributes: elemental
Returns: integer
fortran
function slen(self) result(l)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. |
slen_trim
Return the length of a string, ignoring any trailing blanks.
fortran
type(string) :: astring
astring = 'Hello World! '
print "(L1)", astring%len_trim()==len_trim('Hello World! ')Attributes: elemental
Returns: integer
fortran
function slen_trim(self) result(l)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. |
srepeat_string_string
Concatenates several copies of an input string.
fortran
type(string) :: astring
astring = 'x'
print "(L1)", astring%repeat(5)//''=='xxxxx'Attributes: elemental
Returns: type(string)
fortran
function srepeat_string_string(self, ncopies) result(repeated)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | String to be repeated. | |
ncopies | integer | in | Number of string copies. |
srepeat_character_string
Concatenates several copies of an input string.
fortran
type(string) :: astring
astring = 'y'
print "(L1)", astring%repeat('x', 5)//''=='xxxxx'Attributes: elemental
Returns: type(string)
fortran
function srepeat_character_string(rstring, ncopies) result(repeated)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
rstring | character(kind=CK, len=*) | in | String to be repeated. | |
ncopies | integer | in | Number of string copies. |
sscan_string_string
Return the leftmost (if back is either absent or equals false, otherwise the rightmost) character of string that is in set.
fortran
type(string) :: string1
type(string) :: string2
logical :: test_passed(2)
string1 = 'Hello World Hello!'
string2 = 'llo'
test_passed(1) = string1%scan(set=string2)==scan(string='Hello World Hello!', set='llo')
test_passed(2) = string1%scan(set=string2, back=.true.)==scan(string='Hello World Hello!', set='llo', back=.true.)
print '(L1)', all(test_passed)Attributes: elemental
Returns: integer
fortran
function sscan_string_string(self, set, back) result(i)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
set | type(string) | in | Searched set. | |
back | logical | in | optional | Start of the last occurrence rather than the first. |
sscan_string_character
Return the leftmost (if back is either absent or equals false, otherwise the rightmost) character of string that is in set.
fortran
type(string) :: string1
logical :: test_passed(2)
string1 = 'Hello World Hello!'
test_passed(1) = string1%scan(set='llo')==scan(string='Hello World Hello!', set='llo')
test_passed(2) = string1%scan(set='llo', back=.true.)==scan(string='Hello World Hello!', set='llo', back=.true.)
print '(L1)', all(test_passed)Attributes: elemental
Returns: integer
fortran
function sscan_string_character(self, set, back) result(i)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
set | character(kind=CK, len=*) | in | Searched set. | |
back | logical | in | optional | Start of the last occurrence rather than the first. |
strim
Remove trailing spaces.
fortran
type(string) :: astring
astring = 'Hello World! '
print "(L1)", astring%trim()==trim('Hello World! ')Attributes: elemental
Returns: type(string)
fortran
function strim(self) result(trimmed)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. |
sverify_string_string
Return the leftmost (if back is either absent or equals false, otherwise the rightmost) character of string that is not in set. If all characters of string are found in set, the result is zero.
fortran
type(string) :: string1
type(string) :: string2
logical :: test_passed(2)
string1 = 'Hello World Hello!'
string2 = 'llo'
test_passed(1) = string1%verify(set=string2)==verify(string='Hello World Hello!', set='llo')
test_passed(2) = string1%verify(set=string2, back=.true.)==verify(string='Hello World Hello!', set='llo', back=.true.)
print '(L1)', all(test_passed)Attributes: elemental
Returns: integer
fortran
function sverify_string_string(self, set, back) result(i)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
set | type(string) | in | Searched set. | |
back | logical | in | optional | Start of the last occurrence rather than the first. |
sverify_string_character
Return the leftmost (if back is either absent or equals false, otherwise the rightmost) character of string that is not in set. If all characters of string are found in set, the result is zero.
fortran
type(string) :: string1
logical :: test_passed(2)
string1 = 'Hello World Hello!'
test_passed(1) = string1%verify(set='llo')==verify(string='Hello World Hello!', set='llo')
test_passed(2) = string1%verify(set='llo', back=.true.)==verify(string='Hello World Hello!', set='llo', back=.true.)
print '(L1)', all(test_passed)Attributes: elemental
Returns: integer
fortran
function sverify_string_character(self, set, back) result(i)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
set | character(kind=CK, len=*) | in | Searched set. | |
back | logical | in | optional | Start of the last occurrence rather than the first. |
basedir
Return the base directory name of a string containing a file name.
@note A file name without a directory has a null base directory.
fortran
type(string) :: string1
logical :: test_passed(5)
string1 = '/bar/foo.tar.bz2'
test_passed(1) = string1%basedir()//''=='/bar'
string1 = './bar/foo.tar.bz2'
test_passed(2) = string1%basedir()//''=='./bar'
string1 = 'bar/foo.tar.bz2'
test_passed(3) = string1%basedir()//''=='bar'
string1 = '\bar\foo.tar.bz2'
test_passed(4) = string1%basedir(sep='\')//''=='\bar'
string1 = 'foo.tar.bz2'
test_passed(5) = string1%basedir()//''==''
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function basedir(self, sep)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
sep | character(kind=CK, len=*) | in | optional | Directory separator. |
basename
Return the base file name of a string containing a file name.
Optionally, the extension is also stripped if provided or the last one if required, e.g.
fortran
type(string) :: astring
logical :: test_passed(5)
astring = 'bar/foo.tar.bz2'
test_passed(1) = astring%basename()//''=='foo.tar.bz2'
test_passed(2) = astring%basename(extension='.tar.bz2')//''=='foo'
test_passed(3) = astring%basename(strip_last_extension=.true.)//''=='foo.tar'
astring = '\bar\foo.tar.bz2'
test_passed(4) = astring%basename(sep='\')//''=='foo.tar.bz2'
astring = 'bar'
test_passed(5) = astring%basename(strip_last_extension=.true.)//''=='bar'
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function basename(self, sep, extension, strip_last_extension)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
sep | character(kind=CK, len=*) | in | optional | Directory separator. |
extension | character(kind=CK, len=*) | in | optional | File extension. |
strip_last_extension | logical | in | optional | Flag to enable the stripping of last extension. |
camelcase
Return a string with all words capitalized without spaces.
@note Multiple subsequent separators are collapsed to one occurence.
fortran
type(string) :: astring
logical :: test_passed(2)
astring = 'caMeL caSe var'
test_passed(1) = astring%camelcase()//''=='CamelCaseVar'
astring = ' '
test_passed(2) = astring%camelcase()//''==''
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function camelcase(self, sep)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
sep | character(kind=CK, len=*) | in | optional | Separator. |
Call graph
capitalize
Return a string with its first character capitalized and the rest lowercased.
fortran
type(string) :: astring
logical :: test_passed(2)
astring = 'say all Hello WorLD!'
test_passed(1) = astring%capitalize()//''=='Say all hello world!'
astring = ''
test_passed(2) = astring%capitalize()//''==''
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function capitalize(self) result(capitalized)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. |
Call graph
center
Return the string centered in a string of length width, padded with fill_char (default a space).
@note As Python str.center: a string not shorter than width is returned unchanged; when the padding is odd the extra fill character goes on the left if width is odd, on the right otherwise.
fortran
type(string) :: astring
type(string) :: centered
logical :: test_passed(4)
astring = 'abc'
test_passed(1) = astring%center(7, '*')//''=='**abc**'
centered = astring%center(6)
test_passed(2) = centered%len()==6.and.centered//''==' abc'
test_passed(3) = astring%center(2)//''=='abc'
astring = 'ab'
test_passed(4) = astring%center(5, '-')//''=='--ab-'
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function center(self, width, fill_char) result(centered)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
width | integer | in | Width of the result. | |
fill_char | character(kind=CK, len=1) | in | optional | Fill character, default a space. |
chars
Return the raw characters data.
fortran
type(string) :: astring
astring = 'say all Hello WorLD!'
print '(L1)', astring%chars()=='say all Hello WorLD!'Attributes: pure
Returns: character(kind=CK, len=:)
fortran
function chars(self) result(raw)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. |
Call graph
colorize_str
Colorize and stylize strings, DEFAULT kind.
fortran
type(string) :: astring
astring = 'say all Hello WorLD!'
print '(L1)', astring%colorize(color_fg='red')=='[31msay all Hello WorLD![0m'Attributes: pure
Returns: character(len=:)
fortran
function colorize_str(self, color_fg, color_bg, style) result(colorized)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
color_fg | character(len=*) | in | optional | Foreground color definition. |
color_bg | character(len=*) | in | optional | Background color definition. |
style | character(len=*) | in | optional | Style definition. |
Call graph
common_prefix_string
Return the longest common prefix shared with another string.
@note An unallocated other shares only the null prefix.
fortran
type(string) :: astring
type(string) :: anotherstring
logical :: test_passed(3)
astring = 'src/lib/stringifor.F90'
anotherstring = 'src/lib/stringifor_string_t.F90'
test_passed(1) = astring%common_prefix(anotherstring)//''=='src/lib/stringifor'
anotherstring = 'docs/index.md'
test_passed(2) = astring%common_prefix(anotherstring)//''==''
call anotherstring%free
test_passed(3) = astring%common_prefix(anotherstring)//''==''
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function common_prefix_string(self, other) result(prefix)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
other | type(string) | in | Other string. |
Call graph
common_prefix_character
Return the longest common prefix shared with a character.
fortran
type(string) :: astring
type(string) :: prefix
logical :: test_passed(4)
astring = 'flower'
test_passed(1) = astring%common_prefix('flow')//''=='flow'
test_passed(2) = astring%common_prefix('flight')//''=='fl'
test_passed(3) = astring%common_prefix('dog')//''==''
call astring%free
prefix = astring%common_prefix('flow')
test_passed(4) = prefix%is_allocated().eqv..false.
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function common_prefix_character(self, other) result(prefix)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
other | character(kind=CK, len=*) | in | Other string. |
Call graph
common_prefix_strings
Return the longest common prefix shared with all the elements of an array of strings.
@note An unallocated element of array shares only the null prefix.
fortran
type(string) :: astring
type(string) :: strings(3)
logical :: test_passed(3)
strings(1) = 'flower'
strings(2) = 'flow'
strings(3) = 'flight'
astring = strings(1)%common_prefix(array=strings)
test_passed(1) = astring//''=='fl'
astring = strings(1)%common_prefix(array=strings(1:2))
test_passed(2) = astring//''=='flow'
strings(1) = 'dog'
strings(2) = 'racecar'
strings(3) = 'car'
astring = strings(1)%common_prefix(array=strings)
test_passed(3) = astring//''==''
print '(L1)', all(test_passed)Attributes: pure
Returns: type(string)
fortran
function common_prefix_strings(self, array) result(prefix)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
array | type(string) | in | Array of other strings. |
Call graph
compact
Return the words of the string separated by sep (default a space): every run of whitespace becomes one separator, the leading and trailing whitespace is removed.
@note As Python sep.join(s.split()); the whitespace is the one of is_space, a null sep removes it.
fortran
type(string) :: astring
logical :: test_passed(3)
astring = ' one'//achar(9)//' two'//new_line('a')//'three '
test_passed(1) = astring%compact()//''=='one two three'
test_passed(2) = astring%compact(sep=', ')//''=='one, two, three'
test_passed(3) = astring%compact(sep='')//''=='onetwothree'
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function compact(self, sep) result(compacted)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
sep | character(kind=CK, len=*) | in | optional | Separator of the words, default a space. |
Call graph
compare_version_string
Compare the version number into the string with the one into another string.
See compare_version_character for the comparison rules.
fortran
type(string) :: astring
type(string) :: anotherstring
logical :: test_passed(2)
astring = '1.2.0'
anotherstring = '1.10'
test_passed(1) = astring%compare_version(anotherstring)==-1
test_passed(2) = anotherstring%compare_version(astring)==1
print '(L1)', all(test_passed)Attributes: elemental
Returns: integer
fortran
function compare_version_string(self, other, sep) result(order)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
other | type(string) | in | Other version. | |
sep | character(kind=CK, len=*) | in | optional | Fields separator, default ".". |
Call graph
compare_version_character
Compare the version number into the string with the one into a character.
The versions are compared field by field, the fields being separated by sep: two fields made only of digits are compared as integers of arbitrary size (leading zeros are ignored), otherwise they are compared lexically. Missing or null fields count as zero, thus 1.0 is equal to 1.0.0.
@note The comparison is not semantic versioning aware: a pre-release tag is compared lexically, thus 1.0.0-rc1 is greater than 1.0.0.
fortran
type(string) :: astring
logical :: test_passed(8)
astring = '1.01'
test_passed(1) = astring%compare_version('1.001')==0
astring = '1.0'
test_passed(2) = astring%compare_version('1.0.0')==0
astring = '0.1'
test_passed(3) = astring%compare_version('1.1')==-1
astring = '1.10'
test_passed(4) = astring%compare_version('1.9')==1
astring = '1-2-3'
test_passed(5) = astring%compare_version('1-2-4', sep='-')==-1
astring = '1.99999999999999999999999'
test_passed(6) = astring%compare_version('1.100000000000000000000000')==-1
astring = '1.2.b'
test_passed(7) = astring%compare_version('1.2.a')==1
astring = '1.'
test_passed(8) = astring%compare_version('1')==0
print '(L1)', all(test_passed)Attributes: elemental
Returns: integer
fortran
function compare_version_character(self, other, sep) result(order)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
other | character(kind=CK, len=*) | in | Other version. | |
sep | character(kind=CK, len=*) | in | optional | Fields separator, default ".". |
Call graph
decode
Return a string decoded accordingly the codec.
@note Only BASE64 codec is currently available.
@note The decoded string has exactly the length encoded into the code: the padding characters = are honored (and they can be omitted), the eventual leading/trailing white spaces and null characters of the decoded data are preserved. An invalid code, namely one with a length that cannot be produced by an encoding, is decoded to a null string.
@note An unknown codec gives a not allocated string, to be checked by means of is_allocated.
fortran
type(string) :: astring
type(string) :: decoded
logical :: test_passed(11)
astring = 'SG93IGFyZSB5b3U/'
test_passed(1) = astring%decode(codec='base64')//''=='How are you?'
astring = 'SGVsbG8gV29ybGQ='
test_passed(2) = astring%decode(codec='base64')//''=='Hello World'
astring = 'aGVsbG8gd29ybGQhIQ=='
test_passed(3) = astring%decode(codec='base64')//''=='hello world!!'
astring = 'SGVsbG8gV29ybGQ'
test_passed(4) = astring%decode(codec='base64')//''=='Hello World'
astring = ' spaces kept '
astring = astring%encode(codec='base64')
test_passed(5) = astring%decode(codec='base64')//''==' spaces kept '
test_passed(6) = len(astring%decode(codec='base64')//'')==15
astring = 'YQ=='
test_passed(7) = astring%decode(codec='base64')//''=='a'
astring = 'YWJjZ'
test_passed(8) = len(astring%decode(codec='base64')//'')==0
astring = ''
test_passed(9) = len(astring%decode(codec='base64')//'')==0
astring = 'SGVsbG8gV29ybGQ='
decoded = astring%decode(codec='BASE64')
test_passed(10) = decoded%is_allocated().and.decoded=='Hello World'
decoded = astring%decode(codec='rot13')
test_passed(11) = .not.decoded%is_allocated()
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function decode(self, codec) result(decoded)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
codec | character(kind=CK, len=*) | in | Encoding codec. |
Call graph
encode
Return a string encoded accordingly the codec.
@note Only BASE64 codec is currently available.
@note An unknown codec gives a not allocated string, to be checked by means of is_allocated.
fortran
type(string) :: astring
type(string) :: encoded
logical :: test_passed(3)
astring = 'How are you?'
test_passed(1) = astring%encode(codec='base64')//''=='SG93IGFyZSB5b3U/'
encoded = astring%encode(codec='BASE64')
test_passed(2) = encoded%is_allocated().and.encoded=='SG93IGFyZSB5b3U/'
encoded = astring%encode(codec='rot13')
test_passed(3) = .not.encoded%is_allocated()
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function encode(self, codec) result(encoded)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
codec | character(kind=CK, len=*) | in | Encoding codec. |
Call graph
escape
Escape backslashes (or custom escape character).
fortran
type(string) :: astring
logical :: test_passed(2)
astring = '^\s \d+\s*'
test_passed(1) = astring%escape(to_escape='\')//''=='^\\s \\d+\\s*'
test_passed(2) = astring%escape(to_escape='\', esc='|')//''=='^|\s |\d+|\s*'
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function escape(self, to_escape, esc) result(escaped)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
to_escape | character(kind=CK, len=1) | in | Character to be escaped. | |
esc | character(kind=CK, len=*) | in | optional | Character used to escape. |
Call graph
expand_tabs
Return a string with every tab replaced by the spaces up to the next tab stop, every tab_size columns (default 8).
@note As Python str.expandtabs: the column restarts after a new line or a carriage return; a tab_size not positive removes the tabs.
fortran
type(string) :: astring
logical :: test_passed(3)
astring = 'a'//achar(9)//'bc'//achar(9)//'d'
test_passed(1) = astring%expand_tabs()//''=='a bc d'
test_passed(2) = astring%expand_tabs(4)//''=='a bc d'
astring = 'abcd'//achar(9)//'e'//new_line('a')//achar(9)//'f'
test_passed(3) = astring%expand_tabs(4)//''=='abcd e'//new_line('a')//' f'
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function expand_tabs(self, tab_size) result(expanded)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
tab_size | integer | in | optional | Columns between tab stops, default 8. |
Call graph
extension
Return the extension of a string containing a file name.
fortran
type(string) :: astring
astring = '/bar/foo.tar.bz2'
print '(L1)', astring%extension()//''=='.bz2'Attributes: elemental
Returns: type(string)
fortran
function extension(self)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. |
fill
Pad string on the left (or right) with zeros (or other char) to fill width.
@note A string already as wide as (or wider than) width is returned unchanged.
fortran
type(string) :: astring
logical :: test_passed(6)
astring = 'this is string example....wow!!!'
test_passed(1) = astring%fill(width=40)//''=='00000000this is string example....wow!!!'
test_passed(2) = astring%fill(width=50)//''=='000000000000000000this is string example....wow!!!'
test_passed(3) = astring%fill(width=50, right=.true.)//''=='this is string example....wow!!!000000000000000000'
test_passed(4) = astring%fill(width=40, filling_char='*')//''=='********this is string example....wow!!!'
test_passed(5) = astring%fill(width=32)//''=='this is string example....wow!!!'
test_passed(6) = astring%fill(width=5)//''=='this is string example....wow!!!'
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function fill(self, width, right, filling_char) result(filled)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
width | integer | in | Final width of filled string. | |
right | logical | in | optional | Fill on the right instead of left. |
filling_char | character(kind=CK, len=1) | in | optional | Filling character (default "0"). |
hex
Return the hexadecimal representation of the integer number into the string.
Negative numbers are represented in two's complement on bits bits. The number is truncated to its bits lowest bits and the leading zeros are removed.
@note If the string does not contain an integer the result is not allocated.
fortran
type(string) :: astring
type(string) :: hexed
logical :: test_passed(7)
astring = 26
test_passed(1) = astring%hex()//''=='1a'
astring = -1
test_passed(2) = astring%hex(bits=32)//''=='ffffffff'
test_passed(3) = astring%hex()//''=='ffffffffffffffff'
astring = 0
test_passed(4) = astring%hex()//''=='0'
astring = '255'
test_passed(5) = astring%hex(uppercase=.true.)//''=='FF'
astring = 4096
test_passed(6) = astring%hex(bits=8)//''=='0'
astring = 'not a number'
hexed = astring%hex()
test_passed(7) = hexed%is_allocated().eqv..false.
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function hex(self, bits, uppercase) result(hexed)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
bits | integer | in | optional | Width of the representation, in [4, 64], default 64. |
uppercase | logical | in | optional | Use uppercase digits, default lowercase. |
Call graph
insert_character
Insert substring into string at a specified position.
fortran
type(string) :: astring
character(len=:), allocatable :: acharacter
logical :: test_passed(5)
astring = 'this is string example wow!!!'
acharacter = '... '
test_passed(1) = astring%insert(substring=acharacter, pos=1)//''=='... this is string example wow!!!'
test_passed(2) = astring%insert(substring=acharacter, pos=23)//''=='this is string example... wow!!!'
test_passed(3) = astring%insert(substring=acharacter, pos=29)//''=='this is string example wow!!!... '
test_passed(4) = astring%insert(substring=acharacter, pos=-1)//''=='... this is string example wow!!!'
test_passed(5) = astring%insert(substring=acharacter, pos=100)//''=='this is string example wow!!!... '
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function insert_character(self, substring, pos) result(inserted)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
substring | character(len=*) | in | Substring. | |
pos | integer | in | Position from which insert substring. |
insert_string
Insert substring into string at a specified position.
fortran
type(string) :: astring
type(string) :: anotherstring
logical :: test_passed(5)
astring = 'this is string example wow!!!'
anotherstring = '... '
test_passed(1) = astring%insert(substring=anotherstring, pos=1)//''=='... this is string example wow!!!'
test_passed(2) = astring%insert(substring=anotherstring, pos=23)//''=='this is string example... wow!!!'
test_passed(3) = astring%insert(substring=anotherstring, pos=29)//''=='this is string example wow!!!... '
test_passed(4) = astring%insert(substring=anotherstring, pos=-1)//''=='... this is string example wow!!!'
test_passed(5) = astring%insert(substring=anotherstring, pos=100)//''=='this is string example wow!!!... '
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function insert_string(self, substring, pos) result(inserted)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
substring | type(string) | in | Substring. | |
pos | integer | in | Position from which insert substring. |
join_strings
Return a string that is a join of an array of strings.
The join-separator is set equals to self if self has a value or it is set to a null string ''. This value can be overridden passing a custom separator.
fortran
type(string) :: astring
type(string) :: strings(3)
logical :: test_passed(5)
strings(1) = 'one'
strings(2) = 'two'
strings(3) = 'three'
test_passed(1) = (astring%join(array=strings)//''==strings(1)//strings(2)//strings(3))
test_passed(2) = (astring%join(array=strings, sep='-')//''==strings(1)//'-'//strings(2)//'-'//strings(3))
call strings(1)%free
strings(2) = 'two'
strings(3) = 'three'
test_passed(3) = (astring%join(array=strings, sep='-')//''==strings(2)//'-'//strings(3))
strings(1) = 'one'
strings(2) = 'two'
call strings(3)%free
test_passed(4) = (astring%join(array=strings, sep='-')//''==strings(1)//'-'//strings(2))
strings(1) = 'one'
call strings(2)%free
strings(3) = 'three'
test_passed(5) = (astring%join(array=strings, sep='-')//''==strings(1)//'-'//strings(3))
print '(L1)', all(test_passed)Attributes: pure
Returns: type(string)
fortran
function join_strings(self, array, sep) result(join)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
array | type(string) | in | Array to be joined. | |
sep | character(kind=CK, len=*) | in | optional | Separator. |
Call graph
join_characters
Return a string that is a join of an array of characters.
The join-separator is set equals to self if self has a value or it is set to a null string ''. This value can be overridden passing a custom separator.
fortran
type(string) :: astring
character(5) :: characters(3)
logical :: test_passed(6)
characters(1) = 'one'
characters(2) = 'two'
characters(3) = 'three'
test_passed(1) = (astring%join(array=characters)//''==characters(1)//characters(2)//characters(3))
test_passed(2) = (astring%join(array=characters, sep='-')//''==characters(1)//'-'//characters(2)//'-'//characters(3))
characters(1) = ''
characters(2) = 'two'
characters(3) = 'three'
test_passed(3) = (astring%join(array=characters, sep='-')//''==characters(2)//'-'//characters(3))
characters(1) = 'one'
characters(2) = 'two'
characters(3) = ''
test_passed(4) = (astring%join(array=characters, sep='-')//''==characters(1)//'-'//characters(2))
characters(1) = 'one'
characters(2) = ''
characters(3) = 'three'
test_passed(5) = (astring%join(array=characters, sep='-')//''==characters(1)//'-'//characters(3))
characters(1) = 'one'
characters(2) = 'two'
characters(3) = 'three'
astring = '_'
test_passed(6) = (astring%join(array=characters)//''==characters(1)//'_'//characters(2)//'_'//characters(3))
print '(L1)', all(test_passed)Attributes: pure
Returns: type(string)
fortran
function join_characters(self, array, sep) result(join)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
array | character(kind=CK, len=*) | in | Array to be joined. | |
sep | character(kind=CK, len=*) | in | optional | Separator. |
Call graph
strjoin_strings
Return a string that is a join of an array of strings.
The join-separator is set equals to a null string '' if custom separator isn't specified.
fortran
type(string) :: strings(3)
logical :: test_passed(5)
strings(1) = 'one'
strings(2) = 'two'
strings(3) = 'three'
test_passed(1) = (strjoin(array=strings)//''==strings(1)//strings(2)//strings(3))
test_passed(2) = (strjoin(array=strings, sep='-')//''==strings(1)//'-'//strings(2)//'-'//strings(3))
call strings(1)%free
strings(2) = 'two'
strings(3) = 'three'
test_passed(3) = (strjoin(array=strings, sep='-')//''==strings(2)//'-'//strings(3))
strings(1) = 'one'
strings(2) = 'two'
call strings(3)%free
test_passed(4) = (strjoin(array=strings, sep='-')//''==strings(1)//'-'//strings(2))
strings(1) = 'one'
call strings(2)%free
strings(3) = 'three'
test_passed(5) = (strjoin(array=strings, sep='-')//''==strings(1)//'-'//strings(3))
print '(L1)', all(test_passed)Attributes: pure
Returns: type(string)
fortran
function strjoin_strings(array, sep) result(join)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
array | class(string) | in | Array to be joined. | |
sep | character(kind=CK, len=*) | in | optional | Separator. |
Call graph
strjoin_characters
Return a string that is a join of an array of characters.
The join-separator is set equals to a null string '' if custom separator isn't specified. The trim function is applied to array items if optional logical is_trim variable isn't set to .false.
fortran
character(5) :: characters(3)
logical :: test_passed(13)
characters(1) = 'one'
characters(2) = 'two'
characters(3) = 'three'
test_passed(1) = (strjoin(array=characters)//''==trim(characters(1))//trim(characters(2))//trim(characters(3)))
test_passed(2) = (strjoin(array=characters, sep='-')//''==trim(characters(1))//'-'//trim(characters(2))//'-'//trim(characters(3)))
test_passed(3) = ( strjoin(array=characters, is_trim=.false.)//''==characters(1)//characters(2)//characters(3))
test_passed(4) = ( strjoin(array=characters, sep='-', is_trim=.false.)//''==characters(1)//'-'//characters(2)//'-'//characters(3))
characters(1) = ''
characters(2) = 'two'
characters(3) = 'three'
test_passed(5) = (strjoin(array=characters)//''==trim(characters(2))//trim(characters(3)))
characters(1) = 'one'
characters(2) = 'two'
characters(3) = ''
test_passed(6) = (strjoin(array=characters)//''==trim(characters(1))//trim(characters(2)))
characters(1) = 'one'
characters(2) = ''
characters(3) = 'three'
test_passed(7) = (strjoin(array=characters)//''==trim(characters(1))//trim(characters(3)))
characters(1) = ''
characters(2) = 'two'
characters(3) = 'three'
test_passed(8) = (strjoin(array=characters, sep='-')//''==trim(characters(2))//'-'//trim(characters(3)))
characters(1) = 'one'
characters(2) = 'two'
characters(3) = ''
test_passed(9) = (strjoin(array=characters, sep='-')//''==trim(characters(1))//'-'//trim(characters(2)))
characters(1) = 'one'
characters(2) = ''
characters(3) = 'three'
test_passed(10) = (strjoin(array=characters, sep='-')//''==trim(characters(1))//'-'//trim(characters(3)))
characters(1) = ''
characters(2) = 'two'
characters(3) = 'three'
test_passed(11) = (strjoin(array=characters, sep='-', is_trim=.false.)//''==characters(2)//'-'//characters(3))
characters(1) = 'one'
characters(2) = 'two'
characters(3) = ''
test_passed(12) = (strjoin(array=characters, sep='-', is_trim=.false.)//''==characters(1)//'-'//characters(2))
characters(1) = 'one'
characters(2) = ''
characters(3) = 'three'
test_passed(13) = (strjoin(array=characters, sep='-', is_trim=.false.)//''==characters(1)//'-'//characters(3))
print '(L1)', all(test_passed)Attributes: pure
Returns: type(string)
fortran
function strjoin_characters(array, sep, is_trim) result(join)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
array | character(kind=CK, len=*) | in | Array to be joined. | |
sep | character(kind=CK, len=*) | in | optional | Separator. |
is_trim | logical | in | optional | Flag to setup trim character or not |
Call graph
strjoin_strings_array
Return a string that is a join of columns or rows of an array of strings.
The join-separator is set equals to a null string '' if custom separator isn't specified. The is_col is setup the direction of join: within default columns (.true.) or rows(.false.).
fortran
type(string), allocatable :: strings_arr(:, :)
logical :: test_passed(5)
strings_arr = reshape( source = &
[string('one'), string('two'), string('three'), &
string('ONE'), string('TWO'), string('THREE')], &
shape = [3, 2] )
test_passed(1) = all( strjoin(array=strings_arr) == &
reshape([string('onetwothree'), string('ONETWOTHREE')], &
shape = [2]) )
test_passed(2) = all( strjoin(array=strings_arr, sep='_') == &
reshape([string('one_two_three'), string('ONE_TWO_THREE')], &
shape = [2]) )
test_passed(3) = all( strjoin(array=strings_arr, is_col=.false.) == &
reshape([string('oneONE'), string('twoTWO'), string('threeTHREE')], &
shape = [3]) )
test_passed(4) = all( strjoin(array=strings_arr, sep='_', is_col=.false.) == &
reshape([string('one_ONE'), string('two_TWO'), string('three_THREE')], &
shape = [3]) )
call strings_arr(2, 1)%free
test_passed(5) = all( strjoin(array=strings_arr, sep='_', is_col=.false.) == &
reshape([string('one_ONE'), string('TWO'), string('three_THREE')], &
shape = [3]) )
print '(L1)', all(test_passed)Attributes: pure
Returns: type(string)
fortran
function strjoin_strings_array(array, sep, is_col) result(join)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
array | class(string) | in | Array to be joined. | |
sep | character(kind=CK, len=*) | in | optional | Separator. |
is_col | logical | in | optional | Direction: 'columns' if .true. or 'rows' if .false. |
Call graph
strjoin_characters_array
Return a string that is a join of columns or rows of an array of characters.
The join-separator is set equals to a null string '' if custom separator isn't specified. The trim function is applied to array items if optional logical is_trim variable isn't set to .false. The is_col is setup the direction of join: within default columns (.true.) or rows(.false.).
fortran
character(len=10) :: chars_arr(3, 2)
logical :: test_passed(9)
chars_arr(:, 1) = ['one ', 'two ', 'three ']
chars_arr(:, 2) = ['ONE ', 'TWO ', 'THREE ']
test_passed(1) = all( strjoin(array=chars_arr) == &
reshape([string('onetwothree'), string('ONETWOTHREE')], &
shape = [2]) )
test_passed(2) = all( strjoin(array=chars_arr, is_trim=.false.) == &
reshape([string('one two three '), &
string('ONE TWO THREE ')], &
shape = [2]) )
test_passed(3) = all( strjoin(array=chars_arr, sep='_') == &
reshape([string('one_two_three'), string('ONE_TWO_THREE')], &
shape = [2]) )
test_passed(4) = all( strjoin(array=chars_arr, sep='_', is_trim=.false.) == &
reshape([string('one _two _three '), &
string('ONE _TWO _THREE ')], &
shape = [2]) )
test_passed(5) = all( strjoin(array=chars_arr, is_col=.false.) == &
reshape([string('oneONE'), string('twoTWO'), string('threeTHREE')], &
shape = [3]) )
test_passed(6) = all( strjoin(array=chars_arr, is_trim=.false., is_col=.false.) == &
reshape([string('one ONE '), &
string('two TWO '), &
string('three THREE ')], &
shape = [3]) )
test_passed(7) = all( strjoin(array=chars_arr, sep='_', is_col=.false.) == &
reshape([string('one_ONE'), string('two_TWO'), string('three_THREE')], &
shape = [3]) )
test_passed(8) = all( strjoin(array=chars_arr, sep='_', is_trim=.false., is_col=.false.) == &
reshape([string('one _ONE '), &
string('two _TWO '), &
string('three _THREE ')], &
shape = [3]) )
chars_arr(2,1) = ''
test_passed(9) = all( strjoin(array=chars_arr, sep='_', is_col=.false.) == &
reshape([string('one_ONE'), &
string('TWO'), &
string('three_THREE')], &
shape = [3]) )
print '(L1)', all(test_passed)all items of character array have equal lengths
Attributes: pure
Returns: type(string)
fortran
function strjoin_characters_array(array, sep, is_trim, is_col) result(join)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
array | character(kind=CK, len=*) | in | Array to be joined. | |
sep | character(kind=CK, len=*) | in | optional | Separator. |
is_trim | logical | in | optional | Flag to setup trim character or not |
is_col | logical | in | optional | Direction: 'columns' if .true. or 'rows' if .false. |
Call graph
len_last_word
Return the length of the last word of the string.
@note The trailing separators are ignored.
fortran
type(string) :: astring
logical :: test_passed(6)
astring = 'Hello World'
test_passed(1) = astring%len_last_word()==5
astring = ' fly me to the moon '
test_passed(2) = astring%len_last_word()==4
astring = 'joyboy'
test_passed(3) = astring%len_last_word()==6
astring = 'src/lib/stringifor//'
test_passed(4) = astring%len_last_word(sep='/')==10
astring = ' '
test_passed(5) = astring%len_last_word()==0
call astring%free
test_passed(6) = astring%len_last_word()==0
print '(L1)', all(test_passed)Attributes: elemental
Returns: integer
fortran
function len_last_word(self, sep) result(length)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
sep | character(kind=CK, len=*) | in | optional | Separator. |
ljust
Return the string left justified in a string of length width, padded with fill_char (default a space).
@note As Python str.ljust: a string not shorter than width is returned unchanged.
fortran
type(string) :: astring
type(string) :: centered
logical :: test_passed(3)
astring = 'abc'
test_passed(1) = astring%ljust(6, '.')//''=='abc...'
centered = astring%ljust(6)
test_passed(2) = centered%len()==6.and.centered//''=='abc'
test_passed(3) = astring%ljust(2)//''=='abc'
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function ljust(self, width, fill_char) result(justified)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
width | integer | in | Width of the result. | |
fill_char | character(kind=CK, len=1) | in | optional | Fill character, default a space. |
lstrip
Return a copy of the string with the leading characters removed: spaces by default, the characters of the set remove if passed, plus the whitespace of is_space if whitespace is true (as Python str.lstrip).
fortran
type(string) :: astring
logical :: test_passed(3)
astring = ' xx-ab-xx '
test_passed(1) = astring%lstrip()//'|'=='xx-ab-xx |'
test_passed(2) = astring%lstrip(remove=' x')//''=='-ab-xx'
test_passed(3) = astring%lstrip(remove='')//''==astring//''
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function lstrip(self, remove, whitespace) result(stripped)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
remove | character(kind=CK, len=*) | in | optional | Set of characters to be removed, default space. |
whitespace | logical | in | optional | Remove the whitespace too. |
Call graph
lower
Return a string with all lowercase characters.
fortran
type(string) :: astring
logical :: test_passed(1)
astring = 'Hello WorLD!'
test_passed(1) = astring%lower()//''=='hello world!'
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function lower(self)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. |
Call graph
partition
Split string at separator and return the 3 parts (before, the separator and after).
fortran
type(string) :: astring
type(string) :: strings(3)
logical :: test_passed(3)
astring = 'Hello WorLD!'
strings = astring%partition(sep='lo Wo')
test_passed(1) = (strings(1)//''=='Hel'.and.strings(2)//''=='lo Wo'.and.strings(3)//''=='rLD!')
strings = astring%partition(sep='Hello')
test_passed(2) = (strings(1)//''==''.and.strings(2)//''=='Hello'.and.strings(3)//''==' WorLD!')
astring = 'Hello WorLD!'
strings = astring%partition()
test_passed(3) = (strings(1)//''=='Hello'.and.strings(2)//''==' '.and.strings(3)//''=='WorLD!')
print '(L1)', all(test_passed)Attributes: pure
Returns: type(string)
fortran
function partition(self, sep) result(partitions)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
sep | character(kind=CK, len=*) | in | optional | Separator. |
quote
Return the string between quote_char (default "), every quote_char inside it doubled.
@note The quoting of Fortran list-directed output and of CSV, undone by unquote.
fortran
type(string) :: astring
logical :: test_passed(3)
astring = 'say "hi"'
test_passed(1) = astring%quote()//''=='"say ""hi"""'
test_passed(2) = astring%quote("'")//''=="'say ""hi""'"
astring = astring%quote()
test_passed(3) = astring%unquote()//''=='say "hi"'
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function quote(self, quote_char) result(quoted)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
quote_char | character(kind=CK, len=1) | in | optional | Quote character, default ". |
Call graph
replace
Return a string with all occurrences of substring old replaced by new.
@note The occurrences are not overlapping, found from left to right, and the replaced text is not searched again (as Python str.replace): 'aaaa' with 'aa' replaced by 'a' gives 'aa'. If count is passed only the first count occurrences are replaced, none if count<=0. A null old substring leaves the string unchanged.
fortran
type(string) :: astring
logical :: test_passed(8)
astring = 'When YOU are sad YOU should think to me :-)'
test_passed(1) = (astring%replace(old='YOU', new='THEY')//''=='When THEY are sad THEY should think to me :-)')
test_passed(2) = (astring%replace(old='YOU', new='THEY', count=1)//''=='When THEY are sad YOU should think to me :-)')
astring = repeat(new_line('a')//'abcd', 20)
astring = astring%replace(old=new_line('a'), new='|cr|')
astring = astring%replace(old='|cr|', new=new_line('a')//' ')
test_passed(3) = (astring//''==repeat(new_line('a')//' '//'abcd', 20))
astring = 'abcd efg hlmn'
astring = astring%replace(old='', new='-')
test_passed(4) = (astring//''=='abcd efg hlmn')
astring = 'aaa'
test_passed(5) = (astring%replace(old='a', new='aa')//''=='aaaaaa')
astring = 'aaaa'
test_passed(6) = (astring%replace(old='aa', new='a')//''=='aa')
astring = 'abab'
test_passed(7) = (astring%replace(old='ab', new='x', count=0)//''=='abab')
test_passed(8) = (astring%replace(old='ab', new='')//''=='')
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function replace(self, old, new, count) result(replaced)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
old | character(kind=CK, len=*) | in | Old substring. | |
new | character(kind=CK, len=*) | in | New substring. | |
count | integer | in | optional | Number of old occurences to be replaced. |
Call graph
reverse
Return a reversed string.
fortran
type(string) :: astring
logical :: test_passed(2)
astring = 'abcdefghilmnopqrstuvz'
test_passed(1) = (astring%reverse()//''=='zvutsrqponmlihgfedcba')
astring = '0123456789'
test_passed(2) = (astring%reverse()//''=='9876543210')
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function reverse(self) result(reversed)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. |
reverse_words
Return a string with the words order reversed.
@note Multiple subsequent separators are collapsed to one occurence, leading and trailing ones are removed.
fortran
type(string) :: astring
logical :: test_passed(5)
astring = 'the sky is blue'
test_passed(1) = astring%reverse_words()//''=='blue is sky the'
astring = ' hello world '
test_passed(2) = astring%reverse_words()//''=='world hello'
astring = 'a good example'
test_passed(3) = astring%reverse_words()//''=='example good a'
astring = 'src/lib/stringifor'
test_passed(4) = astring%reverse_words(sep='/')//''=='stringifor/lib/src'
astring = ' '
test_passed(5) = astring%reverse_words()//''==''
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function reverse_words(self, sep) result(reversed)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
sep | character(kind=CK, len=*) | in | optional | Separator. |
Call graph
rjust
Return the string right justified in a string of length width, padded with fill_char (default a space).
@note As Python str.rjust: a string not shorter than width is returned unchanged.
fortran
type(string) :: astring
type(string) :: centered
logical :: test_passed(3)
astring = 'abc'
test_passed(1) = astring%rjust(6, '.')//''=='...abc'
centered = astring%rjust(6)
test_passed(2) = centered%len()==6.and.centered//''==' abc'
test_passed(3) = astring%rjust(2)//''=='abc'
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function rjust(self, width, fill_char) result(justified)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
width | integer | in | Width of the result. | |
fill_char | character(kind=CK, len=1) | in | optional | Fill character, default a space. |
rstrip
Return a copy of the string with the trailing characters removed: spaces by default, the characters of the set remove if passed, plus the whitespace of is_space if whitespace is true (as Python str.rstrip).
fortran
type(string) :: astring
logical :: test_passed(3)
astring = ' xx-ab-xx'//achar(9)//new_line('a')
test_passed(1) = '|'//astring%rstrip(whitespace=.true.)=='| xx-ab-xx'
test_passed(2) = astring%rstrip(remove='x', whitespace=.true.)//''==' xx-ab-'
test_passed(3) = astring%rstrip()//''==astring//''
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function rstrip(self, remove, whitespace) result(stripped)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
remove | character(kind=CK, len=*) | in | optional | Set of characters to be removed, default space. |
whitespace | logical | in | optional | Remove the whitespace too. |
Call graph
search
Search for tagged record into string, return the first record found (if any) matching the tags.
Optionally, returns the indexes of tag start/end, thus this is not an elemental function.
@note The tagged record is searched into self if allocated otherwise into in_string if passed or, eventually, into in_character is passed. If tag is not found the return string is not allocated and the start/end indexes (if requested) are zero.
fortran
type(string) :: astring
type(string) :: anotherstring
character(len=:), allocatable :: acharacter
integer :: istart
integer :: iend
logical :: test_passed(5)
astring = '<test> <first> hello </first> <first> not the first </first> </test>'
anotherstring = astring%search(tag_start='<first>', tag_end='</first>')
test_passed(1) = anotherstring//''=='<first> hello </first>'
astring = '<test> <a> <a> <a> the nested a </a> </a> </a> </test>'
anotherstring = astring%search(tag_start='<a>', tag_end='</a>')
test_passed(2) = anotherstring//''=='<a> <a> <a> the nested a </a> </a> </a>'
call astring%free
anotherstring = '<test> <a> <a> <a> the nested a </a> </a> </a> </test>'
astring = astring%search(in_string=anotherstring, tag_start='<a>', tag_end='</a>')
test_passed(3) = astring//''=='<a> <a> <a> the nested a </a> </a> </a>'
call astring%free
acharacter = '<test> <a> <a> <a> the nested a </a> </a> </a> </test>'
astring = astring%search(in_character=acharacter, tag_start='<a>', tag_end='</a>')
test_passed(4) = astring//''=='<a> <a> <a> the nested a </a> </a> </a>'
acharacter = '<test> <first> hello </first> <sec> <sec>not the first</sec> </sec> </test>'
astring = astring%search(in_character=acharacter, tag_start='<sec>', tag_end='</sec>', istart=istart, iend=iend)
test_passed(5) = astring//''==acharacter(31:67)
print '(L1)', all(test_passed)Returns: type(string)
fortran
function search(self, tag_start, tag_end, in_string, in_character, istart, iend) result(tag)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
tag_start | character(kind=CK, len=*) | in | Start tag. | |
tag_end | character(kind=CK, len=*) | in | End tag. | |
in_string | type(string) | in | optional | Search into this string. |
in_character | character(kind=CK, len=*) | in | optional | Search into this character string. |
istart | integer | out | optional | Starting index of tag inside the string. |
iend | integer | out | optional | Ending index of tag inside the string. |
slice
Return the raw characters data sliced.
The slice is first:last:stride, like a Fortran array section, both bounds being included. All the arguments are optional: stride defaults to 1, first and last default to the string bounds, namely 1:len for a positive stride and len:1 for a negative one. The bounds are clamped into the string ones, thus a slice never goes out of bounds: it is null if the clamped section is empty, if stride is zero or if the string is not allocated.
@note istart and iend are deprecated aliases of first and last, kept for backward compatibility of keyword calls: they are ignored if first and last are passed.
fortran
type(string) :: astring
astring = 'the Quick Brown fox Jumps over the Lazy Dog.'
print "(A)", astring%slice(11,25)fortran
type(string) :: astring
logical :: test_passed(12)
astring = 'Hello World'
test_passed(1) = astring%slice(first=1, last=5)=='Hello'
test_passed(2) = astring%slice(first=7)=='World'
test_passed(3) = astring%slice(last=5)=='Hello'
test_passed(4) = astring%slice()=='Hello World'
test_passed(5) = astring%slice(stride=2)=='HloWrd'
test_passed(6) = astring%slice(stride=-1)=='dlroW olleH'
test_passed(7) = astring%slice(first=5, last=1, stride=-2)=='olH'
test_passed(8) = astring%slice(first=-3, last=100)=='Hello World'
test_passed(9) = len(astring%slice(first=7, last=5))==0
test_passed(10) = len(astring%slice(stride=0))==0
test_passed(11) = astring%slice(istart=1, iend=5)=='Hello'
call astring%free
test_passed(12) = len(astring%slice(first=1, last=5))==0
print '(L1)', all(test_passed)Attributes: pure
Returns: character(kind=CK, len=:)
fortran
function slice(self, first, last, stride, istart, iend) result(raw)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
first | integer | in | optional | Slice first index, default 1 (len for negative stride). |
last | integer | in | optional | Slice last index, default len (1 for negative stride). |
stride | integer | in | optional | Slice stride, default 1. |
istart | integer | in | optional | Deprecated alias of first. |
iend | integer | in | optional | Deprecated alias of last. |
snakecase
Return a string with all words lowercase separated by "_".
@note Multiple subsequent separators are collapsed to one occurence.
fortran
type(string) :: astring
logical :: test_passed(2)
astring = 'the Quick Brown fox Jumps over the Lazy Dog.'
test_passed(1) = astring%snakecase()//''=='the_quick_brown_fox_jumps_over_the_lazy_dog.'
astring = ' '
test_passed(2) = astring%snakecase()//''==''
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function snakecase(self, sep)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
sep | character(kind=CK, len=*) | in | optional | Separator. |
Call graph
squeeze
Return a string with every run of a repeated character reduced to one, only for the characters of set if passed.
@note As tr -s. To reduce the runs of a substring see unique.
fortran
type(string) :: astring
logical :: test_passed(2)
astring = 'bookkeeper -- aa'
test_passed(1) = astring%squeeze()//''=='bokeper - a'
test_passed(2) = astring%squeeze(set=' -')//''=='bookkeeper - aa'
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function squeeze(self, set) result(squeezed)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
set | character(kind=CK, len=*) | in | optional | Characters whose runs are reduced, default all. |
startcase
Return a string with all words capitalized, e.g. title case.
@note Multiple subsequent separators are collapsed to one occurence.
fortran
type(string) :: astring
logical :: test_passed(2)
astring = 'the Quick Brown fox Jumps over the Lazy Dog.'
test_passed(1) = astring%startcase()//''=='The Quick Brown Fox Jumps Over The Lazy Dog.'
astring = ' '
test_passed(2) = astring%startcase()//''==''
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function startcase(self, sep)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
sep | character(kind=CK, len=*) | in | optional | Separator. |
Call graph
strip
Return a copy of the string with the leading and trailing characters removed.
By default the leading and trailing spaces are removed. If remove is passed, it is the set of characters to be removed: all the leading and trailing characters of the string belonging to the set are removed, in any order they occur. If whitespace is true, the whitespace of is_space (space, tab, new line, vertical tab, form feed, carriage return) is removed too, as Python str.strip(). To strip one side only see lstrip and rstrip.
fortran
type(string) :: astring
logical :: test_passed(10)
astring = ' Hello World! '
test_passed(1) = astring%strip()//''=='Hello World!'
astring = ' hello '
test_passed(2) = astring%strip(remove=' h')//''=='ello'
astring = 'xxyHello Worldyx'
test_passed(3) = astring%strip(remove='xy')//''=='Hello World'
test_passed(4) = astring%strip(remove='')//''=='xxyHello Worldyx'
astring = 'xyxy'
test_passed(5) = astring%strip(remove='xy')//''==''
astring = ' ab'//char(0)//char(0)
test_passed(6) = astring%strip(remove_nulls=.true.)//''=='ab'
astring = ''
test_passed(7) = astring%strip(remove=' ')//''==''
astring = '--a-b--'
test_passed(8) = astring%strip(remove='-')//''=='a-b'
astring = achar(9)//' a b'//new_line('a')
test_passed(9) = astring%strip(whitespace=.true.)//''=='a b'
test_passed(10) = astring%strip(remove='b', whitespace=.true.)//''=='a'
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function strip(self, remove_nulls, remove, whitespace)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
remove_nulls | logical | in | optional | Remove null characters at the end. |
remove | character(kind=CK, len=*) | in | optional | Set of characters to be removed, default space. |
whitespace | logical | in | optional | Remove the whitespace too. |
Call graph
swapcase
Return a copy of the string with uppercase characters converted to lowercase and vice versa.
fortran
type(string) :: astring
logical :: test_passed(1)
astring = ' Hello World! '
test_passed(1) = astring%swapcase()//''==' hELLO wORLD! '
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function swapcase(self)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. |
Call graph
tempname
Return a safe temporary name suitable for temporary file or directories.
fortran
type(string) :: astring
character(len=:), allocatable :: tmpname
logical :: test_passed(5)
tmpname = astring%tempname()
inquire(file=tmpname, exist=test_passed(1))
test_passed(1) = .not.test_passed(1)
tmpname = astring%tempname(is_file=.false.)
inquire(file=tmpname, exist=test_passed(2))
test_passed(2) = .not.test_passed(2)
tmpname = astring%tempname(path='./')
inquire(file=tmpname, exist=test_passed(3))
test_passed(3) = .not.test_passed(3)
astring = 'me-'
tmpname = astring%tempname()
inquire(file=tmpname, exist=test_passed(4))
test_passed(4) = .not.test_passed(4)
tmpname = astring%tempname(prefix='you-')
inquire(file=tmpname, exist=test_passed(5))
test_passed(5) = .not.test_passed(5)
print '(L1)', all(test_passed)Returns: character(len=:)
fortran
function tempname(self, is_file, prefix, path)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
is_file | logical | in | optional | True if tempname should be used for file (the default). |
prefix | character(len=*) | in | optional | Name prefix, otherwise self is used (if allocated). |
path | character(len=*) | in | optional | Path where file/directory should be used, default ./. |
Call graph
to_integer_I1P
Cast string to integer (I1P).
@note A string that is not an integer gives 0, see is_integer.
fortran
use penf
type(string) :: astring
integer(I1P) :: integer_
logical :: test_passed(1)
astring = '127'
integer_ = astring%to_number(kind=1_I1P)
test_passed(1) = integer_==127_I1P
print '(L1)', all(test_passed)Attributes: elemental
Returns: integer(kind=I1P)
fortran
function to_integer_I1P(self, kind) result(to_number)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
kind | integer(kind=I1P) | in | Mold parameter for kind detection. |
Call graph
to_integer_I2P
Cast string to integer (I2P).
@note A string that is not an integer gives 0, see is_integer.
fortran
use penf
type(string) :: astring
integer(I2P) :: integer_
logical :: test_passed(1)
astring = '127'
integer_ = astring%to_number(kind=1_I2P)
test_passed(1) = integer_==127_I2P
print '(L1)', all(test_passed)Attributes: elemental
Returns: integer(kind=I2P)
fortran
function to_integer_I2P(self, kind) result(to_number)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
kind | integer(kind=I2P) | in | Mold parameter for kind detection. |
Call graph
to_integer_I4P
Cast string to integer (I4P).
@note A string that is not an integer gives 0, see is_integer.
fortran
use penf
type(string) :: astring
integer(I4P) :: integer_
logical :: test_passed(2)
astring = '127'
integer_ = astring%to_number(kind=1_I4P)
test_passed(1) = integer_==127_I4P
astring = '12x'
integer_ = astring%to_number(kind=1_I4P)
test_passed(2) = integer_==0_I4P
print '(L1)', all(test_passed)Attributes: elemental
Returns: integer(kind=I4P)
fortran
function to_integer_I4P(self, kind) result(to_number)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
kind | integer(kind=I4P) | in | Mold parameter for kind detection. |
Call graph
to_integer_I8P
Cast string to integer (I8P).
@note A string that is not an integer gives 0, see is_integer.
fortran
use penf
type(string) :: astring
integer(I8P) :: integer_
logical :: test_passed(1)
astring = '127'
integer_ = astring%to_number(kind=1_I8P)
test_passed(1) = integer_==127_I8P
print '(L1)', all(test_passed)Attributes: elemental
Returns: integer(kind=I8P)
fortran
function to_integer_I8P(self, kind) result(to_number)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
kind | integer(kind=I8P) | in | Mold parameter for kind detection. |
Call graph
to_real_R4P
Cast string to real (R4P).
@note A string that is not a number gives a quiet NaN, see is_number.
fortran
use penf
type(string) :: astring
real(R4P) :: real_
logical :: test_passed(1)
astring = '3.4e9'
real_ = astring%to_number(kind=1._R4P)
test_passed(1) = real_==3.4e9_R4P
print '(L1)', all(test_passed)Attributes: elemental
Returns: real(kind=R4P)
fortran
function to_real_R4P(self, kind) result(to_number)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
kind | real(kind=R4P) | in | Mold parameter for kind detection. |
Call graph
to_real_R8P
Cast string to real (R8P).
@note A string that is not a number gives a quiet NaN, see is_number.
fortran
use penf
type(string) :: astring
real(R8P) :: real_
logical :: test_passed(2)
astring = '3.4e9'
real_ = astring%to_number(kind=1._R8P)
test_passed(1) = real_==3.4e9_R8P
astring = '12x'
real_ = astring%to_number(kind=1._R8P)
test_passed(2) = real_/=real_
print '(L1)', all(test_passed)Attributes: elemental
Returns: real(kind=R8P)
fortran
function to_real_R8P(self, kind) result(to_number)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
kind | real(kind=R8P) | in | Mold parameter for kind detection. |
Call graph
to_real_R16P
Cast string to real (R16P).
@note A string that is not a number gives a quiet NaN, see is_number.
fortran
use penf
type(string) :: astring
real(R16P) :: real_
logical :: test_passed(1)
astring = '3.4e9'
real_ = astring%to_number(kind=1._R16P)
test_passed(1) = real_==3.4e9_R16P
print '(L1)', all(test_passed)Attributes: elemental
Returns: real(kind=R16P)
fortran
function to_real_R16P(self, kind) result(to_number)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
kind | real(kind=R16P) | in | Mold parameter for kind detection. |
Call graph
transliterate
Return a string with every character of old_set replaced by the character at the same position in new_set.
@note As GNU tr: if new_set is shorter than old_set its last character replaces the remaining ones, if it is null the characters of old_set are deleted. A character repeated in old_set is replaced as its first occurrence.
fortran
type(string) :: astring
logical :: test_passed(3)
astring = 'hello world'
test_passed(1) = astring%transliterate('lo', 'LO')//''=='heLLO wOrLd'
test_passed(2) = astring%transliterate('elo', 'x')//''=='hxxxx wxrxd'
test_passed(3) = astring%transliterate('lo', '')//''=='he wrd'
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function transliterate(self, old_set, new_set) result(transliterated)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
old_set | character(kind=CK, len=*) | in | Characters to replace. | |
new_set | character(kind=CK, len=*) | in | Replacing characters. |
unescape
Unescape double backslashes (or custom escaped character).
fortran
type(string) :: astring
logical :: test_passed(3)
astring = '^\\s \\d+\\s*'
test_passed(1) = (astring%unescape(to_unescape='\')//''=='^\s \d+\s*')
test_passed(2) = (astring%unescape(to_unescape='s')//''=='^\s \\d+\s*')
astring = '^|\s |\d+|\s*'
test_passed(3) = (astring%unescape(to_unescape='\', unesc='|')//''=='^\s \d+\s*')
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function unescape(self, to_unescape, unesc) result(unescaped)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
to_unescape | character(kind=CK, len=1) | in | Character to be unescaped. | |
unesc | character(kind=CK, len=*) | in | optional | Character used to unescape. |
Call graph
unique
Reduce to one (unique) multiple (sequential) occurrences of a substring into a string.
For example the string ' ab-cre-cre-ab' is reduce to 'ab-cre-ab' if the substring is '-cre'.
@note The leftmost occurrence of the doubled substring is reduced to one until none is left, so the result never contains the doubled substring. A null substring leaves the string unchanged.
fortran
type(string) :: astring
logical :: test_passed(3)
astring = '+++ab-++cre-++cre-ab+++++'
test_passed(1) = astring%unique(substring='+')//''=='+ab-+cre-+cre-ab+'
astring = 'ab '
test_passed(2) = astring%unique()//''=='ab '
astring = 'abab'
test_passed(3) = astring%unique(substring='')//''=='abab'
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function unique(self, substring) result(uniq)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
substring | character(kind=CK, len=*) | in | optional | Substring which multiple occurences must be reduced to one. |
Call graph
unquote
Return the string without its quotes, if it starts and ends with the same quote character (' or "), the doubled quote characters inside it undoubled; any other string unchanged.
@note The inverse of quote.
fortran
type(string) :: astring
logical :: test_passed(4)
astring = '"say ""hi"""'
test_passed(1) = astring%unquote()//''=='say "hi"'
astring = "'it''s'"
test_passed(2) = astring%unquote()//''=="it's"
astring = '"unbalanced'
test_passed(3) = astring%unquote()//''=='"unbalanced'
astring = '""'
test_passed(4) = astring%unquote()//''==''.and.astring%len()==2
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function unquote(self) result(unquoted)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. |
Call graph
upper
Return a string with all uppercase characters.
fortran
type(string) :: astring
logical :: test_passed(1)
astring = 'Hello WorLD!'
test_passed(1) = astring%upper()//''=='HELLO WORLD!'
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function upper(self)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. |
Call graph
end_with
Return true if a string ends with a specified suffix.
fortran
type(string) :: astring
logical :: test_passed(5)
astring = 'Hello WorLD!'
test_passed(1) = astring%end_with(suffix='LD!').eqv..true.
test_passed(2) = astring%end_with(suffix='lD!').eqv..false.
test_passed(3) = astring%end_with(suffix='orLD!', start=5).eqv..true.
test_passed(4) = astring%end_with(suffix='orLD!', start=8, end=12).eqv..true.
test_passed(5) = astring%end_with(suffix='!').eqv..true.
print '(L1)', all(test_passed)Attributes: elemental
Returns: logical
fortran
function end_with(self, suffix, start, end, ignore_null_eof)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
suffix | character(kind=CK, len=*) | in | Searched suffix. | |
start | integer | in | optional | Start position into the string. |
end | integer | in | optional | End position into the string. |
ignore_null_eof | logical | in | optional | Ignore null character at the end of file. |
Call graph
is_allocated
Return true if the string is allocated.
fortran
type(string) :: astring
logical :: test_passed(2)
test_passed(1) = astring%is_allocated().eqv..false.
astring = 'hello'
test_passed(2) = astring%is_allocated().eqv..true.
print '(L1)', all(test_passed)Attributes: elemental
Returns: logical
fortran
function is_allocated(self)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. |
is_alnum
Return true if all characters in the string are letters or digits.
@note The letters and the digits are the ASCII ones. A null or not allocated string gives false.
fortran
type(string) :: astring
logical :: test_passed(3)
astring = 'Fortran2023'
test_passed(1) = astring%is_alnum()
astring = 'Fortran 2023'
test_passed(2) = .not.astring%is_alnum()
astring = ''
test_passed(3) = .not.astring%is_alnum()
print '(L1)', all(test_passed)Attributes: elemental
Returns: logical
fortran
function is_alnum(self)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. |
Call graph
is_alpha
Return true if all characters in the string are letters.
@note The letters are the ASCII ones. A null or not allocated string gives false.
fortran
type(string) :: astring
logical :: test_passed(3)
astring = 'Fortran'
test_passed(1) = astring%is_alpha()
astring = 'Fortran2023'
test_passed(2) = .not.astring%is_alpha()
astring = ''
test_passed(3) = .not.astring%is_alpha()
print '(L1)', all(test_passed)Attributes: elemental
Returns: logical
fortran
function is_alpha(self)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. |
Call graph
is_digit
Return true if all characters in the string are digits.
fortran
type(string) :: astring
logical :: test_passed(2)
astring = ' -1212112.3 '
test_passed(1) = astring%is_digit().eqv..false.
astring = '12121123'
test_passed(2) = astring%is_digit().eqv..true.
print '(L1)', all(test_passed)Attributes: elemental
Returns: logical
fortran
function is_digit(self)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. |
is_integer
Return true if the string contains an integer.
The regular expression is \s*[\+\-]?\d+([eE]\+?\d+)?\s*. The parse algorithm is done in stages:
| S0 | S1 | S2 | S3 | S4 | S5 | S6 |
|---|---|---|---|---|---|---|
\s* | [\+\-]? | \d+ | [eE] | \+? | \d+ | \s* |
Exit on stages-parsing results in:
| S0 | S1 | S2 | S3 | S4 | S5 | S6 |
|---|---|---|---|---|---|---|
| F | F | T | F | F | T | T |
@note This implementation is courtesy of tomedunn
fortran
type(string) :: astring
logical :: test_passed(6)
astring = ' -1212112 '
test_passed(1) = astring%is_integer().eqv..true.
astring = ' -1212112'
test_passed(2) = astring%is_integer(allow_spaces=.false.).eqv..false.
astring = '-1212112 '
test_passed(3) = astring%is_integer(allow_spaces=.false.).eqv..false.
astring = '+2e20'
test_passed(4) = astring%is_integer().eqv..true.
astring = ' -2E13 '
test_passed(5) = astring%is_integer().eqv..true.
astring = ' -2 E13 '
test_passed(6) = astring%is_integer().eqv..false.
print '(L1)', all(test_passed)Attributes: elemental
Returns: logical
fortran
function is_integer(self, allow_spaces)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
allow_spaces | logical | in | optional | Allow leading-trailing spaces. |
Call graph
is_lower
Return true if all characters in the string are lowercase.
fortran
type(string) :: astring
logical :: test_passed(3)
astring = ' Hello World'
test_passed(1) = astring%is_lower().eqv..false.
astring = ' HELLO WORLD'
test_passed(2) = astring%is_lower().eqv..false.
astring = ' hello world'
test_passed(3) = astring%is_lower().eqv..true.
print '(L1)', all(test_passed)Attributes: elemental
Returns: logical
fortran
function is_lower(self)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. |
Call graph
is_number
Return true if the string contains a number (real or integer).
fortran
type(string) :: astring
logical :: test_passed(7)
astring = ' -1212112 '
test_passed(1) = astring%is_number().eqv..true.
astring = ' -121.2112 '
test_passed(2) = astring%is_number().eqv..true.
astring = ' -1212112'
test_passed(3) = astring%is_number(allow_spaces=.false.).eqv..false.
astring = '-12121.12 '
test_passed(4) = astring%is_number(allow_spaces=.false.).eqv..false.
astring = '+2e20'
test_passed(5) = astring%is_number().eqv..true.
astring = ' -2.4E13 '
test_passed(6) = astring%is_number().eqv..true.
astring = ' -2 E13 '
test_passed(7) = astring%is_number().eqv..false.
print '(L1)', all(test_passed)Attributes: elemental
Returns: logical
fortran
function is_number(self, allow_spaces)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
allow_spaces | logical | in | optional | Allow leading-trailing spaces. |
Call graph
is_punct
Return true if all characters in the string are punctuation characters.
@note The punctuation characters are the printable ASCII ones that are not letters, digits or space (as C ispunct). A null or not allocated string gives false.
fortran
type(string) :: astring
logical :: test_passed(3)
astring = '!?(),.;'
test_passed(1) = astring%is_punct()
astring = '!? ok'
test_passed(2) = .not.astring%is_punct()
astring = ''
test_passed(3) = .not.astring%is_punct()
print '(L1)', all(test_passed)Attributes: elemental
Returns: logical
fortran
function is_punct(self)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. |
Call graph
is_real
Return true if the string contains a real.
A real must have a decimal point or an exponent (or both): a string containing an integer, e.g. 42, is not a real, see is_integer and is_number.
The regular expression is \s*[\+\-]?\d*(\.\d*([deDE][\+\-]?\d+)?|[deDE][\+\-]?\d+)\s*. The parse algorithm is done in stages:
| S0 | S1 | S2 | S3 | S4 | S5 | S6 | S7 | S8 |
|---|---|---|---|---|---|---|---|---|
\s* | [\+\-]? | \d* | \.? | \d* | [deDE] | [\+\-]? | \d* | \s* |
Exit on stages-parsing results in:
| S0 | S1 | S2 | S3 | S4 | S5 | S6 | S7 | S8 |
|---|---|---|---|---|---|---|---|---|
| F | F | F | T | T | F | F | T | T |
The exit on S8 is true only if a decimal point or an exponent has been parsed.
@note This implementation is courtesy of tomedunn
fortran
type(string) :: astring
logical :: test_passed(12)
astring = ' -1212112.d0 '
test_passed(1) = astring%is_real().eqv..true.
astring = ' -1212112.d0'
test_passed(2) = astring%is_real(allow_spaces=.false.).eqv..false.
astring = '-1212112.d0 '
test_passed(3) = astring%is_real(allow_spaces=.false.).eqv..false.
astring = '+2.e20'
test_passed(4) = astring%is_real().eqv..true.
astring = ' -2.01E13 '
test_passed(5) = astring%is_real().eqv..true.
astring = ' -2.01 E13 '
test_passed(6) = astring%is_real().eqv..false.
astring = '42'
test_passed(7) = astring%is_real().eqv..false.
astring = ' -42 '
test_passed(8) = astring%is_real().eqv..false.
astring = '42.'
test_passed(9) = astring%is_real().eqv..true.
astring = '.5'
test_passed(10) = astring%is_real().eqv..true.
astring = '2e20'
test_passed(11) = astring%is_real().eqv..true.
call astring%free
test_passed(12) = astring%is_real().eqv..false.
print '(L1)', all(test_passed)Attributes: elemental
Returns: logical
fortran
function is_real(self, allow_spaces)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
allow_spaces | logical | in | optional | Allow leading-trailing spaces. |
Call graph
is_space
Return true if all characters in the string are whitespace.
@note The whitespace is space, tab, new line, vertical tab, form feed and carriage return (as C isspace). A null or not allocated string gives false.
fortran
type(string) :: astring
logical :: test_passed(3)
astring = ' '//achar(9)//new_line('a')
test_passed(1) = astring%is_space()
astring = ' x '
test_passed(2) = .not.astring%is_space()
astring = ''
test_passed(3) = .not.astring%is_space()
print '(L1)', all(test_passed)Attributes: elemental
Returns: logical
fortran
function is_space(self)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. |
Call graph
is_upper
Return true if all characters in the string are uppercase.
fortran
type(string) :: astring
logical :: test_passed(3)
astring = ' Hello World'
test_passed(1) = astring%is_upper().eqv..false.
astring = ' HELLO WORLD'
test_passed(2) = astring%is_upper().eqv..true.
astring = ' hello world'
test_passed(3) = astring%is_upper().eqv..false.
print '(L1)', all(test_passed)Attributes: elemental
Returns: logical
fortran
function is_upper(self)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. |
Call graph
is_xdigit
Return true if all characters in the string are hexadecimal digits.
@note The hexadecimal digits are 0-9, a-f and A-F. A null or not allocated string gives false.
fortran
type(string) :: astring
logical :: test_passed(3)
astring = '00ff7FA9'
test_passed(1) = astring%is_xdigit()
astring = '0x00ff'
test_passed(2) = .not.astring%is_xdigit()
astring = ''
test_passed(3) = .not.astring%is_xdigit()
print '(L1)', all(test_passed)Attributes: elemental
Returns: logical
fortran
function is_xdigit(self)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. |
Call graph
match
Return true if the whole string matches a wildcard pattern.
The wildcards are the ones of the shell (as Python fnmatch.fnmatchcase):
*matches any sequence of characters, also empty;?matches any single character;[seq]matches any character ofseq, wherea-zis a range;[!seq]any character not inseq; a]just after[or[!is a member ofseq; a[without its closing]is a plain character.
Any other character matches itself: the match is case-sensitive, there is no escape character (match a wildcard with a one-character class, [*]) and a leading dot is not special. A not allocated string matches nothing.
fortran
type(string) :: astring
logical :: test_passed(9)
astring = 'data/report-2026.csv'
test_passed(1) = astring%match('*.csv')
test_passed(2) = astring%match('data/report-????.csv')
test_passed(3) = astring%match('*-20[0-9][0-9].*')
test_passed(4) = .not.astring%match('*.CSV')
test_passed(5) = .not.astring%match('report*')
test_passed(6) = astring%match('*[!a-z].csv')
astring = 'a*b'
test_passed(7) = astring%match('a[*]b').and..not.astring%match('a[*]c')
astring = ''
test_passed(8) = astring%match('*').and..not.astring%match('?')
astring = '[x]'
test_passed(9) = astring%match('[[]x]').and.astring%match('[[]x[]]').and..not.astring%match('[]x]*')
print '(L1)', all(test_passed)Attributes: elemental
Returns: logical
fortran
function match(self, pattern) result(is_match)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
pattern | character(kind=CK, len=*) | in | Wildcard pattern. |
Call graph
start_with
Return true if a string starts with a specified prefix.
fortran
type(string) :: astring
logical :: test_passed(4)
astring = 'Hello WorLD!'
test_passed(1) = astring%start_with(prefix='Hello').eqv..true.
test_passed(2) = astring%start_with(prefix='hell').eqv..false.
test_passed(3) = astring%start_with(prefix='llo Wor', start=3).eqv..true.
test_passed(4) = astring%start_with(prefix='lo W', start=4, end=7).eqv..true.
print '(L1)', all(test_passed)Attributes: elemental
Returns: logical
fortran
function start_with(self, prefix, start, end)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
self | class(string) | in | The string. | |
prefix | character(kind=CK, len=*) | in | Searched prefix. | |
start | integer | in | optional | Start position into the string. |
end | integer | in | optional | End position into the string. |
Call graph
string_concat_string
Concatenation with string.
fortran
type(string) :: astring
type(string) :: anotherstring
logical :: test_passed(1)
astring = 'Hello '
anotherstring = 'Bye bye'
test_passed(1) = astring//anotherstring=='Hello Bye bye'
print '(L1)', all(test_passed)Attributes: pure
Returns: character(kind=CK, len=:)
fortran
function string_concat_string(lhs, rhs) result(concat)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
lhs | class(string) | in | Left hand side. | |
rhs | type(string) | in | Right hand side. |
string_concat_character
Concatenation with character.
fortran
type(string) :: astring
character(len=:), allocatable :: acharacter
logical :: test_passed(1)
astring = 'Hello '
acharacter = 'World!'
test_passed(1) = astring//acharacter=='Hello World!'
print '(L1)', all(test_passed)Attributes: pure
Returns: character(kind=CK, len=:)
fortran
function string_concat_character(lhs, rhs) result(concat)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
lhs | class(string) | in | Left hand side. | |
rhs | character(kind=CK, len=*) | in | Right hand side. |
character_concat_string
Concatenation with character (inverted).
fortran
type(string) :: astring
character(len=:), allocatable :: acharacter
logical :: test_passed(1)
astring = 'Hello '
acharacter = 'World!'
test_passed(1) = acharacter//astring=='World!Hello '
print '(L1)', all(test_passed)Attributes: pure
Returns: character(kind=CK, len=:)
fortran
function character_concat_string(lhs, rhs) result(concat)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
lhs | character(kind=CK, len=*) | in | Left hand side. | |
rhs | class(string) | in | Right hand side. |
string_concat_string_string
Concatenation with string.
fortran
type(string) :: astring
type(string) :: anotherstring
type(string) :: yetanotherstring
logical :: test_passed(1)
astring = 'Hello '
anotherstring = 'Bye bye'
yetanotherstring = astring.cat.anotherstring
test_passed(1) = yetanotherstring%chars()=='Hello Bye bye'
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function string_concat_string_string(lhs, rhs) result(concat)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
lhs | class(string) | in | Left hand side. | |
rhs | type(string) | in | Right hand side. |
string_concat_character_string
Concatenation with character.
fortran
type(string) :: astring
type(string) :: yetanotherstring
character(len=:), allocatable :: acharacter
logical :: test_passed(1)
astring = 'Hello '
acharacter = 'World!'
yetanotherstring = astring.cat.acharacter
test_passed(1) = yetanotherstring%chars()=='Hello World!'
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function string_concat_character_string(lhs, rhs) result(concat)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
lhs | class(string) | in | Left hand side. | |
rhs | character(kind=CK, len=*) | in | Right hand side. |
character_concat_string_string
Concatenation with character (inverted).
fortran
type(string) :: astring
type(string) :: yetanotherstring
character(len=:), allocatable :: acharacter
logical :: test_passed(1)
astring = 'Hello '
acharacter = 'World!'
yetanotherstring = acharacter.cat.astring
test_passed(1) = yetanotherstring%chars()=='World!Hello '
print '(L1)', all(test_passed)Attributes: elemental
Returns: type(string)
fortran
function character_concat_string_string(lhs, rhs) result(concat)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
lhs | character(kind=CK, len=*) | in | Left hand side. | |
rhs | class(string) | in | Right hand side. |
string_eq_string
Equal to string logical operator.
fortran
type(string) :: astring
type(string) :: anotherstring
logical :: test_passed(2)
astring = ' one '
anotherstring = 'two'
test_passed(1) = ((astring==anotherstring).eqv..false.)
astring = 'the same '
anotherstring = 'the same '
test_passed(2) = ((astring==anotherstring).eqv..true.)
print '(L1)', all(test_passed)Attributes: elemental
Returns: logical
fortran
function string_eq_string(lhs, rhs) result(is_it)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
lhs | class(string) | in | Left hand side. | |
rhs | type(string) | in | Right hand side. |
string_eq_character
Equal to character logical operator.
fortran
type(string) :: astring
character(len=:), allocatable :: acharacter
logical :: test_passed(2)
astring = ' one '
acharacter = 'three'
test_passed(1) = ((astring==acharacter).eqv..false.)
astring = 'the same '
acharacter = 'the same '
test_passed(2) = ((astring==acharacter).eqv..true.)
print '(L1)', all(test_passed)Attributes: elemental
Returns: logical
fortran
function string_eq_character(lhs, rhs) result(is_it)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
lhs | class(string) | in | Left hand side. | |
rhs | character(kind=CK, len=*) | in | Right hand side. |
character_eq_string
Equal to character (inverted) logical operator.
fortran
type(string) :: astring
character(len=:), allocatable :: acharacter
logical :: test_passed(2)
astring = ' one '
acharacter = 'three'
test_passed(1) = ((acharacter==astring).eqv..false.)
astring = 'the same '
acharacter = 'the same '
test_passed(2) = ((acharacter==astring).eqv..true.)
print '(L1)', all(test_passed)Attributes: elemental
Returns: logical
fortran
function character_eq_string(lhs, rhs) result(is_it)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
lhs | character(kind=CK, len=*) | in | Left hand side. | |
rhs | class(string) | in | Right hand side. |
string_ne_string
Not equal to string logical operator.
fortran
type(string) :: astring
type(string) :: anotherstring
logical :: test_passed(2)
astring = ' one '
anotherstring = 'two'
test_passed(1) = ((astring/=anotherstring).eqv..true.)
astring = 'the same '
anotherstring = 'the same '
test_passed(2) = ((astring/=anotherstring).eqv..false.)
print '(L1)', all(test_passed)Attributes: elemental
Returns: logical
fortran
function string_ne_string(lhs, rhs) result(is_it)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
lhs | class(string) | in | Left hand side. | |
rhs | type(string) | in | Right hand side. |
string_ne_character
Not equal to character logical operator.
fortran
type(string) :: astring
character(len=:), allocatable :: acharacter
logical :: test_passed(2)
astring = ' one '
acharacter = 'three'
test_passed(1) = ((astring/=acharacter).eqv..true.)
astring = 'the same '
acharacter = 'the same '
test_passed(2) = ((astring/=acharacter).eqv..false.)
print '(L1)', all(test_passed)Attributes: elemental
Returns: logical
fortran
function string_ne_character(lhs, rhs) result(is_it)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
lhs | class(string) | in | Left hand side. | |
rhs | character(kind=CK, len=*) | in | Right hand side. |
character_ne_string
Not equal to character (inverted) logical operator.
fortran
type(string) :: astring
character(len=:), allocatable :: acharacter
logical :: test_passed(2)
astring = ' one '
acharacter = 'three'
test_passed(1) = ((acharacter/=astring).eqv..true.)
astring = 'the same '
acharacter = 'the same '
test_passed(2) = ((acharacter/=astring).eqv..false.)
print '(L1)', all(test_passed)Attributes: elemental
Returns: logical
fortran
function character_ne_string(lhs, rhs) result(is_it)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
lhs | character(kind=CK, len=*) | in | Left hand side. | |
rhs | class(string) | in | Right hand side. |
string_lt_string
Lower than to string logical operator.
fortran
type(string) :: astring
type(string) :: anotherstring
logical :: test_passed(2)
astring = 'one'
anotherstring = 'ONE'
test_passed(1) = ((astring<anotherstring).eqv..false.)
astring = 'ONE'
anotherstring = 'one'
test_passed(2) = ((astring<anotherstring).eqv..true.)
print '(L1)', all(test_passed)Attributes: elemental
Returns: logical
fortran
function string_lt_string(lhs, rhs) result(is_it)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
lhs | class(string) | in | Left hand side. | |
rhs | type(string) | in | Right hand side. |
string_lt_character
Lower than to character logical operator.
fortran
type(string) :: astring
character(len=:), allocatable :: acharacter
logical :: test_passed(2)
astring = 'one'
acharacter = 'ONE'
test_passed(1) = ((astring<acharacter).eqv..false.)
astring = 'ONE'
acharacter = 'one'
test_passed(2) = ((astring<acharacter).eqv..true.)
print '(L1)', all(test_passed)Attributes: elemental
Returns: logical
fortran
function string_lt_character(lhs, rhs) result(is_it)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
lhs | class(string) | in | Left hand side. | |
rhs | character(kind=CK, len=*) | in | Right hand side. |
character_lt_string
Lower than to character (inverted) logical operator.
fortran
type(string) :: astring
character(len=:), allocatable :: acharacter
logical :: test_passed(2)
astring = 'one'
acharacter = 'ONE'
test_passed(1) = ((acharacter<astring).eqv..true.)
astring = 'ONE'
acharacter = 'one'
test_passed(2) = ((acharacter<astring).eqv..false.)
print '(L1)', all(test_passed)Attributes: elemental
Returns: logical
fortran
function character_lt_string(lhs, rhs) result(is_it)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
lhs | character(kind=CK, len=*) | in | Left hand side. | |
rhs | class(string) | in | Right hand side. |
string_le_string
Lower equal than to string logical operator.
fortran
type(string) :: astring
type(string) :: anotherstring
logical :: test_passed(3)
astring = 'one'
anotherstring = 'ONE'
test_passed(1) = ((astring<=anotherstring).eqv..false.)
astring = 'ONE'
anotherstring = 'one'
test_passed(2) = ((astring<=anotherstring).eqv..true.)
astring = 'ONE'
anotherstring = 'ONE'
test_passed(3) = ((astring<=anotherstring).eqv..true.)
print '(L1)', all(test_passed)Attributes: elemental
Returns: logical
fortran
function string_le_string(lhs, rhs) result(is_it)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
lhs | class(string) | in | Left hand side. | |
rhs | type(string) | in | Right hand side. |
string_le_character
Lower equal than to character logical operator.
fortran
type(string) :: astring
character(len=:), allocatable :: acharacter
logical :: test_passed(3)
astring = 'one'
acharacter = 'ONE'
test_passed(1) = ((astring<=acharacter).eqv..false.)
astring = 'ONE'
acharacter = 'one'
test_passed(2) = ((astring<=acharacter).eqv..true.)
astring = 'ONE'
acharacter = 'ONE'
test_passed(3) = ((astring<=acharacter).eqv..true.)
print '(L1)', all(test_passed)Attributes: elemental
Returns: logical
fortran
function string_le_character(lhs, rhs) result(is_it)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
lhs | class(string) | in | Left hand side. | |
rhs | character(kind=CK, len=*) | in | Right hand side. |
character_le_string
Lower equal than to character (inverted) logical operator.
fortran
type(string) :: astring
character(len=:), allocatable :: acharacter
logical :: test_passed(3)
astring = 'one'
acharacter = 'ONE'
test_passed(1) = ((acharacter<=astring).eqv..true.)
astring = 'ONE'
acharacter = 'one'
test_passed(2) = ((acharacter<=astring).eqv..false.)
astring = 'ONE'
acharacter = 'ONE'
test_passed(3) = ((acharacter<=astring).eqv..true.)
print '(L1)', all(test_passed)Attributes: elemental
Returns: logical
fortran
function character_le_string(lhs, rhs) result(is_it)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
lhs | character(kind=CK, len=*) | in | Left hand side. | |
rhs | class(string) | in | Right hand side. |
string_ge_string
Greater equal than to string logical operator.
fortran
type(string) :: astring
type(string) :: anotherstring
logical :: test_passed(3)
astring = 'one'
anotherstring = 'ONE'
test_passed(1) = ((astring>=anotherstring).eqv..true.)
astring = 'ONE'
anotherstring = 'one'
test_passed(2) = ((astring>=anotherstring).eqv..false.)
astring = 'ONE'
anotherstring = 'ONE'
test_passed(3) = ((astring>=anotherstring).eqv..true.)
print '(L1)', all(test_passed)Attributes: elemental
Returns: logical
fortran
function string_ge_string(lhs, rhs) result(is_it)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
lhs | class(string) | in | Left hand side. | |
rhs | type(string) | in | Right hand side. |
string_ge_character
Greater equal than to character logical operator.
fortran
type(string) :: astring
character(len=:), allocatable :: acharacter
logical :: test_passed(3)
astring = 'one'
acharacter = 'ONE'
test_passed(1) = ((astring>=acharacter).eqv..true.)
astring = 'ONE'
acharacter = 'one'
test_passed(2) = ((astring>=acharacter).eqv..false.)
astring = 'ONE'
acharacter = 'ONE'
test_passed(3) = ((astring>=acharacter).eqv..true.)
print '(L1)', all(test_passed)Attributes: elemental
Returns: logical
fortran
function string_ge_character(lhs, rhs) result(is_it)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
lhs | class(string) | in | Left hand side. | |
rhs | character(kind=CK, len=*) | in | Right hand side. |
character_ge_string
Greater equal than to character (inverted) logical operator.
fortran
type(string) :: astring
character(len=:), allocatable :: acharacter
logical :: test_passed(3)
astring = 'one'
acharacter = 'ONE'
test_passed(1) = ((acharacter>=astring).eqv..false.)
astring = 'ONE'
acharacter = 'one'
test_passed(2) = ((acharacter>=astring).eqv..true.)
astring = 'ONE'
acharacter = 'ONE'
test_passed(3) = ((acharacter>=astring).eqv..true.)
print '(L1)', all(test_passed)Attributes: elemental
Returns: logical
fortran
function character_ge_string(lhs, rhs) result(is_it)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
lhs | character(kind=CK, len=*) | in | Left hand side. | |
rhs | class(string) | in | Right hand side. |
string_gt_string
Greater than to string logical operator.
fortran
type(string) :: astring
type(string) :: anotherstring
logical :: test_passed(2)
astring = 'one'
anotherstring = 'ONE'
test_passed(1) = ((astring>anotherstring).eqv..true.)
astring = 'ONE'
anotherstring = 'one'
test_passed(2) = ((astring>anotherstring).eqv..false.)
print '(L1)', all(test_passed)Attributes: elemental
Returns: logical
fortran
function string_gt_string(lhs, rhs) result(is_it)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
lhs | class(string) | in | Left hand side. | |
rhs | type(string) | in | Right hand side. |
string_gt_character
Greater than to character logical operator.
fortran
type(string) :: astring
character(len=:), allocatable :: acharacter
logical :: test_passed(2)
astring = 'one'
acharacter = 'ONE'
test_passed(1) = ((astring>acharacter).eqv..true.)
astring = 'ONE'
acharacter = 'one'
test_passed(2) = ((astring>acharacter).eqv..false.)
print '(L1)', all(test_passed)Attributes: elemental
Returns: logical
fortran
function string_gt_character(lhs, rhs) result(is_it)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
lhs | class(string) | in | Left hand side. | |
rhs | character(kind=CK, len=*) | in | Right hand side. |
character_gt_string
Greater than to character (inverted) logical operator.
fortran
type(string) :: astring
character(len=:), allocatable :: acharacter
logical :: test_passed(2)
astring = 'one'
acharacter = 'ONE'
test_passed(1) = ((acharacter>astring).eqv..false.)
astring = 'ONE'
acharacter = 'one'
test_passed(2) = ((acharacter>astring).eqv..true.)
print '(L1)', all(test_passed)Attributes: elemental
Returns: logical
fortran
function character_gt_string(lhs, rhs) result(is_it)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
lhs | character(kind=CK, len=*) | in | Left hand side. | |
rhs | class(string) | in | Right hand side. |
find_occurrence
Return the start of the occurrence number occurrence of substring into raw, zero if there are fewer.
The occurrences are not overlapping, counted from the start or, if back is true, from the end. A null substring is found by its first occurrence only, as the intrinsic index.
@note The doctest is not necessary, this being tested by index.
Attributes: pure
Returns: integer
fortran
function find_occurrence(raw, substring, occurrence, back) result(pos)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
raw | character(kind=CK, len=*) | in | Raw characters data. | |
substring | character(kind=CK, len=*) | in | Searched substring. | |
occurrence | integer | in | Number of the occurrence. | |
back | logical | in | optional | Count from the end. |
Call graph
strip_characters
Return the set of characters to strip: remove (default a space), plus the whitespace if whitespace is true.
@note The doctest is not necessary, this being tested by strip.
Attributes: pure
Returns: character(kind=CK, len=:)
fortran
function strip_characters(remove, whitespace) result(set)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
remove | character(kind=CK, len=*) | in | optional | Set of characters to be removed, default space. |
whitespace | logical | in | optional | Remove the whitespace too. |
Call graph
strip_set
Return raw without the leading (if left) and the trailing (if right) characters belonging to set.
@note The doctest is not necessary, this being tested by strip, lstrip and rstrip.
Attributes: pure
Returns: character(kind=CK, len=:)
fortran
function strip_set(raw, set, left, right) result(stripped)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
raw | character(kind=CK, len=*) | in | Raw characters data. | |
set | character(kind=CK, len=*) | in | Set of characters to strip. | |
left | logical | in | Strip the leading characters. | |
right | logical | in | Strip the trailing characters. |
Call graph
is_digit_char
Return true if the character is an ASCII digit.
@note The doctest is not necessary, this being tested by is_alnum.
Attributes: elemental
Returns: logical
fortran
function is_digit_char(c) result(is_digit)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
c | character(kind=CK, len=1) | in | The character. |
Call graph
is_punct_char
Return true if the character is printable ASCII and not a letter, a digit or a space (as C ispunct).
@note The doctest is not necessary, this being tested by is_punct.
Attributes: elemental
Returns: logical
fortran
function is_punct_char(c) result(is_punct)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
c | character(kind=CK, len=1) | in | The character. |
Call graph
is_space_char
Return true if the character is a space, a tab, a new line, a vertical tab, a form feed or a carriage return.
@note The doctest is not necessary, this being tested by is_space.
Attributes: elemental
Returns: logical
fortran
function is_space_char(c) result(is_space)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
c | character(kind=CK, len=1) | in | The character. |
Call graph
is_xdigit_char
Return true if the character is a hexadecimal digit.
@note The doctest is not necessary, this being tested by is_xdigit.
Attributes: elemental
Returns: logical
fortran
function is_xdigit_char(c) result(is_xdigit)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
c | character(kind=CK, len=1) | in | The character. |
Call graph
is_lower_char
Return true if the character is an ASCII lowercase letter.
@note The doctest is not necessary, this being tested by is_upper and lower.
Attributes: elemental
Returns: logical
fortran
function is_lower_char(c) result(is_lower)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
c | character(kind=CK, len=1) | in | The character. |
Call graph
is_upper_char
Return true if the character is an ASCII uppercase letter.
@note The doctest is not necessary, this being tested by is_lower and upper.
Attributes: elemental
Returns: logical
fortran
function is_upper_char(c) result(is_upper)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
c | character(kind=CK, len=1) | in | The character. |
Call graph
lower_char
Return the lowercase of an ASCII uppercase letter, any other character unchanged.
@note The doctest is not necessary, this being tested by lower.
Attributes: elemental
Returns: character(kind=CK, len=1)
fortran
function lower_char(c) result(lower)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
c | character(kind=CK, len=1) | in | The character. |
Call graph
upper_char
Return the uppercase of an ASCII lowercase letter, any other character unchanged.
@note The doctest is not necessary, this being tested by upper.
Attributes: elemental
Returns: character(kind=CK, len=1)
fortran
function upper_char(c) result(upper)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
c | character(kind=CK, len=1) | in | The character. |
Call graph
match_token
Return the length of the token of a wildcard pattern starting at p if it matches the character c, 0 otherwise.
The token is ?, a class [seq] or [!seq], or a plain character, see match; * is handled by the caller.
@note The doctest is not necessary, this being tested by match.
Attributes: pure
Returns: integer
fortran
function match_token(pattern, p, c) result(token_len)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
pattern | character(kind=CK, len=*) | in | Wildcard pattern. | |
p | integer | in | Position of the token into the pattern. | |
c | character(kind=CK, len=1) | in | Character to match. |
Call graph
shell_escape
Return raw with a backslash before every character that the POSIX shell could take as syntax.
The letters, the digits, ._/-+,:@%=! and the wildcards *?[] are left as they are: the shell still expands the wildcards, but spaces, ;, |, &, $, quotes, parentheses, ~, # and the like become plain characters.
@note A new line cannot be escaped (a backslash before it continues the line): the caller must reject it.
@note The doctest is not necessary, this being tested by glob.
Attributes: pure
Returns: character(kind=CK, len=:)
fortran
function shell_escape(raw) result(escaped)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
raw | character(kind=CK, len=*) | in | Raw characters data. |
Call graph
replace_substring
Return raw with the occurrences of old replaced by new, in one pass.
The occurrences are not overlapping, found from left to right, and the replaced text is not searched again. If count is passed only the first count occurrences are replaced, none if count<=0.
@note The doctest is not necessary, this being tested by replace, escape and unescape.
Attributes: pure
Returns: character(kind=CK, len=:)
fortran
function replace_substring(raw, old, new, count) result(replaced)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
raw | character(kind=CK, len=*) | in | Raw characters data. | |
old | character(kind=CK, len=*) | in | Old substring, not null. | |
new | character(kind=CK, len=*) | in | New substring. | |
count | integer | in | optional | Number of old occurences to be replaced. |
Call graph
unique_substring
Return raw with the sequential occurrences of substring reduced to one, in one pass.
The result is the one of replacing the leftmost occurrence of substring//substring by substring until none is left: the characters are appended one by one to the result and, when the result ends with substring//substring, the last substring is removed. The leftmost occurrence being the first to end, the two are the same.
@note The doctest is not necessary, this being tested by unique.
Attributes: pure
Returns: character(kind=CK, len=:)
fortran
function unique_substring(raw, substring) result(uniq)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
raw | character(kind=CK, len=*) | in | Raw characters data. | |
substring | character(kind=CK, len=*) | in | Substring which sequential occurrences are reduced to one. |
Call graph
join_raws
Return the join of the allocated strings of an array, the not allocated ones being skipped.
@note The doctest is not necessary, this being tested by join and strjoin.
Attributes: pure
Returns: character(kind=CK, len=:)
fortran
function join_raws(array, sep) result(join)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
array | class(string) | in | Array to be joined. | |
sep | character(kind=CK, len=*) | in | Separator. |
Call graph
join_chars
Return the join of the not blank characters of an array, the blank ones being skipped.
@note The doctest is not necessary, this being tested by join and strjoin.
Attributes: pure
Returns: character(kind=CK, len=:)
fortran
function join_chars(array, sep, is_trim) result(join)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
array | character(kind=CK, len=*) | in | Array to be joined. | |
sep | character(kind=CK, len=*) | in | Separator. | |
is_trim | logical | in | Trim the items. |
Call graph
compare_versions
Compare two version numbers field by field, see compare_version_character.
Attributes: pure
Returns: integer
fortran
function compare_versions(version_a, version_b, sep) result(order)Arguments
| Name | Type | Intent | Attributes | Description |
|---|---|---|---|---|
version_a | character(kind=CK, len=*) | in | First version. | |
version_b | character(kind=CK, len=*) | in | Second version. | |
sep | character(kind=CK, len=*) | in | Fields separator, it must be not null. |
Call graph