The function implemented for the .match.
operator.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
character(len=*), | intent(in) | :: | pattern | |||
character(len=*), | intent(in) | :: | str |
pure elemental function operator__match(pattern, str) result(res) !! The function implemented for the `.match.` operator. implicit none character(*), intent(in) :: pattern, str logical :: res character(:), allocatable :: buff type(tree_t) :: tree type(automaton_t) :: automaton character(:), allocatable :: prefix, suffix, entirely_fixed_string logical :: unused ! Initalize prefix = '' suffix = '' entirely_fixed_string = '' ! If the pattern begins with a caret character and ends with ! a doller character, they are removed and assigned to the string buffer. if (is_there_caret_at_the_top(pattern)) then buff = pattern(2:len(pattern)) else buff = pattern(1:len(pattern)) end if if (is_there_dollar_at_the_end(pattern)) then buff = buff(1:len_trim(pattern)-1) end if ! Build a syntax tree from buff, and store the result in tree and root. ! call build_syntax_tree(buff, tape, tree, root) call tree%build(buff) ! If the whole pattern is a fixed string, get it. entirely_fixed_string = get_entire_literal(tree) ! If the pattern consists only of fixed character string, if (entirely_fixed_string /= '') then if (len(str) == len(entirely_fixed_string)) then ! return true if the lengths are equal and the strings are equal. res = str == entirely_fixed_string return end if end if != From here on, we will deal with cases where an entire pattern is not a fixed string. ! Get the prefix contained in the AST. prefix = get_prefix_literal(tree) suffix = get_suffix_literal(tree) ! Initialize automaton with tree and root. call automaton%preprocess(tree) call automaton%init() ! Call the internal procedure to match string, and store the result in logical `res`. call do_matching_exactly(automaton, str, res, prefix, suffix, unused) ! Free the automaton instance. call automaton%free() end function operator__match