The function implemented for the .in.
operator.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
character(len=*), | intent(in) | :: | pattern | |||
character(len=*), | intent(in) | :: | str |
pure elemental function operator__in(pattern, str) result(res) use :: forgex_parameters_m, only: ACCEPTED_EMPTY, INVALID_CHAR_INDEX !! The function implemented for the `.in.` operator. implicit none character(*), intent(in) :: pattern, str logical :: res character(:), allocatable :: buff type(tree_t) :: tree type(automaton_t) :: automaton integer :: from, to character(:), allocatable :: prefix, suffix, entirely_fixed_string logical :: unused prefix = '' suffix = '' entirely_fixed_string = '' from = INVALID_CHAR_INDEX to = INVALID_CHAR_INDEX buff = trim(pattern) ! Build a syntax tree from buff, and store the result in tree and 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 ! from_l stores the position of the literal in input text. from = index(str, entirely_fixed_string) ! If the literal is included, if (from > 0) then ! to_l stores the position of the end of the literal in the text. to = from + len(entirely_fixed_string) -1 end if ! If the pattern is contained, it returns true, otherwise it returns false. if (from > 0 .and. to > 0) then res = .true. else res = .false. end if return end if != From here on, we will deal with cases where an entire pattern is not a fixed string. ! Extract a prefix and a suffix from the tree. prefix = get_prefix_literal(tree) suffix = get_suffix_literal(tree) ! Initialize automaton with tree. call automaton%preprocess(tree) call automaton%init() ! Call the internal procedure to match string, and store the result in logical `res`. call do_matching_including(automaton, str, from, to, prefix, suffix, unused) ! Handle when it matches an empty string. if (from == ACCEPTED_EMPTY .and. to == ACCEPTED_EMPTY) then res = .true. return end if ! If the pattern is contained in the text, it returns true, otherwise it returns false. if (from > 0 .and. to > 0) then res = .true. else res = .false. end if ! Free the automaton instance. call automaton%free() end function operator__in