12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- ! Part of XML-Fortran library:
- !
- ! $Id: read_from_buffer.inc,v 1.2 2006/03/26 19:05:48 arjenmarkus Exp $
- !
- character(len=*), intent(in) :: buffer
- integer, intent(inout) :: ierror
- integer :: n
- integer :: i
- integer :: step
- integer :: ierr
- !
- ! First allocate an array that is surely large enough
- ! Note:
- ! This is not completely failsafe: with list-directed
- ! input you can also use repeat counts (10000*1.0 for
- ! instance).
- !
- allocate( work(len(buffer)/2+1) )
- !
- ! NOTE:
- ! This is not portable!!
- !
- ! read( buffer, *, iostat = ierror ) (work(n), n=1,size(work))
- !
- ! So, use a different strategy: a binary search
- ! First: establish that we have at least one item to read
- ! Second: do the binary search
- !
- ! read( buffer, *, iostat = ierr ) work(1)
- ! if ( ierr /= 0 ) then
- ! n = 0
- ! else
- n = 1
- do while ( n <= size(work) )
- n = 2 * n
- enddo
- n = n / 2
- step = n / 2
- ! step = n / 2
- do while ( step > 0 )
- read( buffer, *, iostat = ierr ) (work(i), i = 1,n)
- if ( ierr /= 0 ) then
- ierror = ierr ! Store the error code for later use
- n = n - step
- else
- n = n + step
- endif
- step = step / 2
- enddo
- ! endif
- !
- ! Then allocate an array of the actual size needed
- ! and copy the data
- !
- !
- if ( associated( var ) ) then
- deallocate( var )
- endif
- !
- ! One complication: we may have one too many
- ! (consequence of the binary search)
- !
- read( buffer, *, iostat = ierr ) (work(i), i = 1,n)
- if ( ierr < 0 ) then
- n = n - 1
- endif
- allocate( var(n) )
- var(1:n) = work(1:n)
- deallocate( work )
- if ( ierror .lt. 0 ) then
- ierror = 0
- endif
|