add_single_attribute Subroutine

private pure subroutine add_single_attribute(self, attribute, sanitize_value)

Arguments

TypeIntentOptionalAttributesName
class(xml_tag), intent(inout) :: self
character, intent(in) :: attribute(1:)
logical, intent(in), optional :: sanitize_value

Contents

Source Code


Source Code

  pure subroutine add_single_attribute(self, attribute, sanitize_value)
  !< Add one attribute name/value pair.
  !<
  !< @note Leading and trailing white spaces are trimmed out by attribute's name.
  class(xml_tag), intent(inout)        :: self               !< XML tag.
  character(*),   intent(in)           :: attribute(1:)      !< Attribute name/value pair [1:2].
  logical,        intent(in), optional :: sanitize_value     !< Sanitize attribute value.
  type(string), allocatable            :: new_attribute(:,:) !< Temporary storage for attributes.
  logical                              :: sanitize_value_    !< Sanitize attribute value.
  logical                              :: is_updated         !< Flag to check if the attribute has been updeted.
  integer(I4P)                         :: a                  !< Counter.

  sanitize_value_ = .false. ; if (present(sanitize_value)) sanitize_value_ = sanitize_value
  if (self%attributes_number>0) then
    is_updated = .false.
    update_if_already_present: do a=1, self%attributes_number
      if (self%attribute(1, a)==attribute(1)) then
        if (sanitize_value_) then
          self%attribute(2, a) = trim(adjustl(attribute(2)))
        else
          self%attribute(2, a) = attribute(2)
        endif
        is_updated = .true.
        exit update_if_already_present
      endif
    enddo update_if_already_present
    if (.not.is_updated) then
      allocate(new_attribute(1:2, 1:self%attributes_number+1))
      new_attribute(1:2, 1:self%attributes_number) = self%attribute
      new_attribute(1, self%attributes_number+1) = trim(adjustl(attribute(1)))
      if (sanitize_value_) then
        new_attribute(2, self%attributes_number+1) = trim(adjustl(attribute(2)))
      else
        new_attribute(2, self%attributes_number+1) = attribute(2)
      endif
      call move_alloc(from=new_attribute, to=self%attribute)
      self%attributes_number = self%attributes_number + 1
    endif
  else
    call self%alloc_attributes(Na=1)
    self%attribute(1, 1) = trim(adjustl(attribute(1)))
    if (sanitize_value_) then
      self%attribute(2, 1) = trim(adjustl(attribute(2)))
    else
      self%attribute(2, 1) = attribute(2)
    endif
  endif
  endsubroutine add_single_attribute