anchor.diff:      pos = index(buffer, trim(adjustlt(Upper_Case(attrib)))//'="')+len_trim(adjustlt(attrib))+2
     endif
   
  -  if (pos <= len_trim(adjustlt(attrib))+2) stop 'Attrib not found' !E_IO = -1_I4P
  +  if (pos <= len_trim(adjustlt(attrib))+2) return
     po2 = index(buffer(pos:len_trim(buffer)), '"')+pos-2
  +  if (po2 <= pos) return
     allocate(character(po2-pos+1) :: val)
  -  read(buffer(pos:po2),'(a)') val
  +  read(buffer(pos:po2),fmt='(a)',iostat=ios) val
  +  if(present(E_IO)) E_IO = ios
     !---------------------------------------------------------------------------------------------------------------------------------
     end subroutine
   
  
positive.code:     pos = index(buffer, trim(adjustlt(Upper_Case(attrib)))//'="')+len_trim(adjustlt(attrib))+2
    endif
  
      if (pos <= len_trim(adjustlt(attrib))+2) stop 'Attrib not found' !E_IO = -1_I4P
      po2 = index(buffer(pos:len_trim(buffer)), '"')+pos-2
      read(buffer(pos:po2),*) val
    !---------------------------------------------------------------------------------------------------------------------------------
    end subroutine
  
   
    subroutine get_char(buffer, attrib, val, case)
    !---------------------------------------------------------------------------------------------------------------------------------
    !< get_char: get in buffer, the value of attribute 'attrib'
    !---------------------------------------------------------------------------------------------------------------------------------
    character(len=*),              intent(IN)  :: buffer
    character(len=*),              intent(in)  :: attrib
    character(len=:), allocatable, intent(OUT) :: val
    character(len=*), optional,    intent(IN)  :: case
    integer :: pos, po2
    !---------------------------------------------------------------------------------------------------------------------------------
  
    !---------------------------------------------------------------------------------------------------------------------------------
    if(present(case)) then
      if(trim(case) == 'lower') then
        pos = index(buffer, trim(adjustlt(attrib))//'="')+len_trim(adjustlt(attrib))+2
  
negative.code:   !<- RAW: data are saved in raw-binary format in the appended tag of the XML file; (Not implemented!)
    !<- BINARY-APPENDED: data are saved in base64 encoded format in the appended tag of the XML file. (Not implemented!)
    !< Supported topologies are:
    !<- RectilinearGrid; (Not tested!)
    !<- StructuredGrid; (Not tested!)
    !<- UnstructuredGrid. (Not tested!)
    !<### Example of usage
    !<```fortran
    !< integer(I4P):: nx1,nx2,ny1,ny2,nz1,nz2
    !< ...
    !< E_IO = VTK_INI_XML_READ('BINARY','XML_RECT_BINARY.vtr','RectilinearGrid',nx1=nx1,nx2=nx2,ny1=ny1,ny2=ny2,nz1=nz1,nz2=nz2,cf=rf)
    !< ...
    !<```
    !< Note that the file extension is necessary in the file name. The XML standard has different extensions for each
    !< different topologies (e.g. *vtr* for rectilinear topology). See the VTK-standard file for more information.
    !---------------------------------------------------------------------------------------------------------------------------------
    character(*), intent(IN)            :: input_format   !< input format: ASCII,  BINARY or RAW
    character(*), intent(IN)            :: filename       !< file name
    character(*), intent(IN)            :: mesh_topology  !< mesh topology
    integer(I4P), intent(OUT), optional :: npieces        !< Number of pieces stored in the file
  