improved on IO_read for recursion case
This commit is contained in:
parent
ed3faff605
commit
8044c5b737
37
code/IO.f90
37
code/IO.f90
|
@ -134,7 +134,7 @@ recursive function IO_read(fileUnit,reset) result(line)
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
! reset case
|
! reset case
|
||||||
if(present(reset)) then; if (reset .eqv. .true.) then ! do not short circuit here
|
if(present(reset)) then; if (reset) then ! do not short circuit here
|
||||||
do while (stack > 1_pInt) ! can go back to former file
|
do while (stack > 1_pInt) ! can go back to former file
|
||||||
close(unitOn(stack))
|
close(unitOn(stack))
|
||||||
stack = stack-1_pInt
|
stack = stack-1_pInt
|
||||||
|
@ -148,12 +148,12 @@ recursive function IO_read(fileUnit,reset) result(line)
|
||||||
unitOn(1) = fileUnit
|
unitOn(1) = fileUnit
|
||||||
|
|
||||||
read(unitOn(stack),'(a65536)',END=100) line
|
read(unitOn(stack),'(a65536)',END=100) line
|
||||||
|
|
||||||
input = IO_getTag(line,'{','}')
|
input = IO_getTag(line,'{','}')
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
! normal case
|
! normal case
|
||||||
if (input == '') return ! regular line
|
if (input == '') return ! regular line
|
||||||
|
|
||||||
!--------------------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------------------
|
||||||
! recursion case
|
! recursion case
|
||||||
if (stack >= 10_pInt) call IO_error(104_pInt,ext_msg=input) ! recursion limit reached
|
if (stack >= 10_pInt) call IO_error(104_pInt,ext_msg=input) ! recursion limit reached
|
||||||
|
@ -752,14 +752,17 @@ integer(pInt) function IO_countSections(fileUnit,part)
|
||||||
IO_countSections = 0_pInt
|
IO_countSections = 0_pInt
|
||||||
rewind(fileUnit)
|
rewind(fileUnit)
|
||||||
|
|
||||||
do while (trim(line) /= IO_EOF .and. IO_getTag(line,'<','>') /= part) ! search for part
|
do while (trim(line) /= IO_EOF .and. IO_lc(IO_getTag(line,'<','>')) /= part) ! search for part
|
||||||
line = IO_read(fileUnit)
|
line = IO_read(fileUnit)
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
do while (trim(line) /= IO_EOF)
|
do while (trim(line) /= IO_EOF)
|
||||||
line = IO_read(fileUnit)
|
line = IO_read(fileUnit)
|
||||||
if (IO_isBlank(line)) cycle ! skip empty lines
|
if (IO_isBlank(line)) cycle ! skip empty lines
|
||||||
if (IO_getTag(line,'<','>') /= '') exit ! stop at next part
|
if (IO_getTag(line,'<','>') /= '') then ! stop at next part
|
||||||
|
line = IO_read(fileUnit, .true.) ! reset IO_read
|
||||||
|
exit
|
||||||
|
endif
|
||||||
if (IO_getTag(line,'[',']') /= '') & ! found [section] identifier
|
if (IO_getTag(line,'[',']') /= '') & ! found [section] identifier
|
||||||
IO_countSections = IO_countSections + 1_pInt
|
IO_countSections = IO_countSections + 1_pInt
|
||||||
enddo
|
enddo
|
||||||
|
@ -791,14 +794,17 @@ function IO_countTagInPart(fileUnit,part,tag,Nsections)
|
||||||
section = 0_pInt
|
section = 0_pInt
|
||||||
|
|
||||||
rewind(fileUnit)
|
rewind(fileUnit)
|
||||||
do while (trim(line) /= IO_EOF .and. IO_getTag(line,'<','>') /= part) ! search for part
|
do while (trim(line) /= IO_EOF .and. IO_lc(IO_getTag(line,'<','>')) /= part) ! search for part
|
||||||
line = IO_read(fileUnit)
|
line = IO_read(fileUnit)
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
do while (trim(line) /= IO_EOF)
|
do while (trim(line) /= IO_EOF)
|
||||||
line = IO_read(fileUnit)
|
line = IO_read(fileUnit)
|
||||||
if (IO_isBlank(line)) cycle ! skip empty lines
|
if (IO_isBlank(line)) cycle ! skip empty lines
|
||||||
if (IO_getTag(line,'<','>') /= '') exit ! stop at next part
|
if (IO_getTag(line,'<','>') /= '') then ! stop at next part
|
||||||
|
line = IO_read(fileUnit, .true.) ! reset IO_read
|
||||||
|
exit
|
||||||
|
endif
|
||||||
if (IO_getTag(line,'[',']') /= '') section = section + 1_pInt ! found [section] identifier
|
if (IO_getTag(line,'[',']') /= '') section = section + 1_pInt ! found [section] identifier
|
||||||
if (section > 0) then
|
if (section > 0) then
|
||||||
positions = IO_stringPos(line,MAXNCHUNKS)
|
positions = IO_stringPos(line,MAXNCHUNKS)
|
||||||
|
@ -835,14 +841,17 @@ function IO_spotTagInPart(fileUnit,part,tag,Nsections)
|
||||||
line =''
|
line =''
|
||||||
|
|
||||||
rewind(fileUnit)
|
rewind(fileUnit)
|
||||||
do while (trim(line) /= IO_EOF .and. IO_getTag(line,'<','>') /= part) ! search for part
|
do while (trim(line) /= IO_EOF .and. IO_lc(IO_getTag(line,'<','>')) /= part) ! search for part
|
||||||
line = IO_read(fileUnit)
|
line = IO_read(fileUnit)
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
do while (trim(line) /= IO_EOF)
|
do while (trim(line) /= IO_EOF)
|
||||||
line = IO_read(fileUnit)
|
line = IO_read(fileUnit)
|
||||||
if (IO_isBlank(line)) cycle ! skip empty lines
|
if (IO_isBlank(line)) cycle ! skip empty lines
|
||||||
if (IO_getTag(line,'<','>') /= '') exit ! stop at next part
|
if (IO_getTag(line,'<','>') /= '') then ! stop at next part
|
||||||
|
line = IO_read(fileUnit, .true.) ! reset IO_read
|
||||||
|
exit
|
||||||
|
endif
|
||||||
if (IO_getTag(line,'[',']') /= '') section = section + 1_pInt ! found [section] identifier
|
if (IO_getTag(line,'[',']') /= '') section = section + 1_pInt ! found [section] identifier
|
||||||
if (section > 0_pInt) then
|
if (section > 0_pInt) then
|
||||||
positions = IO_stringPos(line,MAXNCHUNKS)
|
positions = IO_stringPos(line,MAXNCHUNKS)
|
||||||
|
@ -875,14 +884,17 @@ logical function IO_globalTagInPart(fileUnit,part,tag)
|
||||||
line =''
|
line =''
|
||||||
|
|
||||||
rewind(fileUnit)
|
rewind(fileUnit)
|
||||||
do while (trim(line) /= IO_EOF .and. IO_getTag(line,'<','>') /= part) ! search for part
|
do while (trim(line) /= IO_EOF .and. IO_lc(IO_getTag(line,'<','>')) /= part) ! search for part
|
||||||
line = IO_read(fileUnit)
|
line = IO_read(fileUnit)
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
do while (trim(line) /= IO_EOF)
|
do while (trim(line) /= IO_EOF)
|
||||||
line = IO_read(fileUnit)
|
line = IO_read(fileUnit)
|
||||||
if (IO_isBlank(line)) cycle ! skip empty lines
|
if (IO_isBlank(line)) cycle ! skip empty lines
|
||||||
if (IO_getTag(line,'<','>') /= '') exit ! stop at next part
|
if (IO_getTag(line,'<','>') /= '') then ! stop at next part
|
||||||
|
line = IO_read(fileUnit, .true.) ! reset IO_read
|
||||||
|
exit
|
||||||
|
endif
|
||||||
if (IO_getTag(line,'[',']') /= '') section = section + 1_pInt ! found [section] identifier
|
if (IO_getTag(line,'[',']') /= '') section = section + 1_pInt ! found [section] identifier
|
||||||
if (section == 0_pInt) then
|
if (section == 0_pInt) then
|
||||||
positions = IO_stringPos(line,MAXNCHUNKS)
|
positions = IO_stringPos(line,MAXNCHUNKS)
|
||||||
|
@ -1215,6 +1227,7 @@ integer(pInt) function IO_countDataLines(fileUnit)
|
||||||
myPos = IO_stringPos(line,MAXNCHUNKS)
|
myPos = IO_stringPos(line,MAXNCHUNKS)
|
||||||
tmp = IO_lc(IO_stringValue(line,myPos,1_pInt))
|
tmp = IO_lc(IO_stringValue(line,myPos,1_pInt))
|
||||||
if (tmp(1:1) == '*' .and. tmp(2:2) /= '*') then ! found keyword
|
if (tmp(1:1) == '*' .and. tmp(2:2) /= '*') then ! found keyword
|
||||||
|
line = IO_read(fileUnit, .true.) ! reset IO_read
|
||||||
exit
|
exit
|
||||||
else
|
else
|
||||||
if (tmp(2:2) /= '*') IO_countDataLines = IO_countDataLines + 1_pInt
|
if (tmp(2:2) /= '*') IO_countDataLines = IO_countDataLines + 1_pInt
|
||||||
|
@ -1251,18 +1264,22 @@ integer(pInt) function IO_countContinuousIntValues(fileUnit)
|
||||||
line = IO_read(fileUnit)
|
line = IO_read(fileUnit)
|
||||||
myPos = IO_stringPos(line,MAXNCHUNKS)
|
myPos = IO_stringPos(line,MAXNCHUNKS)
|
||||||
if (myPos(1) < 1_pInt) then ! empty line
|
if (myPos(1) < 1_pInt) then ! empty line
|
||||||
|
line = IO_read(fileUnit, .true.) ! reset IO_read
|
||||||
exit
|
exit
|
||||||
elseif (IO_lc(IO_stringValue(line,myPos,2_pInt)) == 'to' ) then ! found range indicator
|
elseif (IO_lc(IO_stringValue(line,myPos,2_pInt)) == 'to' ) then ! found range indicator
|
||||||
IO_countContinuousIntValues = 1_pInt + IO_intValue(line,myPos,3_pInt) &
|
IO_countContinuousIntValues = 1_pInt + IO_intValue(line,myPos,3_pInt) &
|
||||||
- IO_intValue(line,myPos,1_pInt)
|
- IO_intValue(line,myPos,1_pInt)
|
||||||
|
line = IO_read(fileUnit, .true.) ! reset IO_read
|
||||||
exit ! only one single range indicator allowed
|
exit ! only one single range indicator allowed
|
||||||
else if (IO_lc(IO_stringValue(line,myPos,2_pInt)) == 'of' ) then ! found multiple entries indicator
|
else if (IO_lc(IO_stringValue(line,myPos,2_pInt)) == 'of' ) then ! found multiple entries indicator
|
||||||
IO_countContinuousIntValues = IO_intValue(line,myPos,1_pInt)
|
IO_countContinuousIntValues = IO_intValue(line,myPos,1_pInt)
|
||||||
|
line = IO_read(fileUnit, .true.) ! reset IO_read
|
||||||
exit ! only one single multiplier allowed
|
exit ! only one single multiplier allowed
|
||||||
else
|
else
|
||||||
IO_countContinuousIntValues = IO_countContinuousIntValues+myPos(1)-1_pInt ! add line's count when assuming 'c'
|
IO_countContinuousIntValues = IO_countContinuousIntValues+myPos(1)-1_pInt ! add line's count when assuming 'c'
|
||||||
if ( IO_lc(IO_stringValue(line,myPos,myPos(1))) /= 'c' ) then ! line finished, read last value
|
if ( IO_lc(IO_stringValue(line,myPos,myPos(1))) /= 'c' ) then ! line finished, read last value
|
||||||
IO_countContinuousIntValues = IO_countContinuousIntValues+1_pInt
|
IO_countContinuousIntValues = IO_countContinuousIntValues+1_pInt
|
||||||
|
line = IO_read(fileUnit, .true.) ! reset IO_read
|
||||||
exit ! data ended
|
exit ! data ended
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
Loading…
Reference in New Issue