small improvements

default case of error handling, checking for recursion limit, some
comments to also understand it later
This commit is contained in:
Martin Diehl 2018-08-04 13:58:01 +02:00
parent 8c07825d7e
commit 20d1264d07
1 changed files with 44 additions and 24 deletions

View File

@ -176,48 +176,65 @@ end function IO_read
!> @brief recursively reads a text file. !> @brief recursively reads a text file.
!! Recursion is triggered by "{path/to/inputfile}" in a line !! Recursion is triggered by "{path/to/inputfile}" in a line
!-------------------------------------------------------------------------------------------------- !--------------------------------------------------------------------------------------------------
recursive function IO_recursiveRead(fileName) result(fileContent) recursive function IO_recursiveRead(fileName,cnt) result(fileContent)
implicit none implicit none
character(len=*), intent(in) :: fileName character(len=*), intent(in) :: fileName
character(len=256), dimension(:), allocatable :: fileContent integer(pInt), intent(in), optional :: cnt !< recursion counter
character(len=256), dimension(:), allocatable :: fileContent !< file content, separated per lines
character(len=256), dimension(:), allocatable :: includedContent character(len=256), dimension(:), allocatable :: includedContent
character(len=256) :: line character(len=256) :: line
character(len=256), parameter :: dummy = 'https://damask.mpie.de' !< to fill up remaining array
character(len=:), allocatable :: rawData character(len=:), allocatable :: rawData
integer(pInt) :: fileLength, fileUnit,startPos,endPos,& integer(pInt) :: &
myTotalLines,l,includedLines, missingLines,i fileLength, &
fileUnit, &
startPos, endPos, &
myTotalLines, & !< # lines read from file without include statements
includedLines, & !< # lines included from other file(s)
missingLines, & !< # lines missing from current file
l,i
if (merge(cnt,0_pInt,present(cnt))>10_pInt) call IO_error(106_pInt,ext_msg=trim(fileName))
!--------------------------------------------------------------------------------------------------
! read data as stream
inquire(file = fileName, size=fileLength) inquire(file = fileName, size=fileLength)
open(newunit=fileUnit, file = fileName, access = "STREAM") open(newunit=fileUnit, file = fileName, access = "STREAM")
allocate(character(len=fileLength)::rawData) allocate(character(len=fileLength)::rawData)
read(fileUnit) rawData read(fileUnit) rawData
close(fileUnit) close(fileUnit)
myTotalLines = 0 !--------------------------------------------------------------------------------------------------
do l=1, len(rawData) ! count lines to allocate string array
myTotalLines = 0_pInt
do l=1_pInt, len(rawData)
if (rawData(l:l) == new_line('')) myTotalLines = myTotalLines+1 if (rawData(l:l) == new_line('')) myTotalLines = myTotalLines+1
enddo enddo
allocate(fileContent(myTotalLines)) allocate(fileContent(myTotalLines))
startPos = 1 !--------------------------------------------------------------------------------------------------
endPos = 0 ! split raw data at end of line and handle includes
startPos = 1_pInt
endPos = 0_pInt
includedLines=0 includedLines=0_pInt
l=0 l=0_pInt
do while (startPos <= len(rawData)) do while (startPos <= len(rawData))
l = l + 1 l = l + 1_pInt
endPos = endPos + scan(rawData(startPos:),new_line('')) endPos = endPos + scan(rawData(startPos:),new_line(''))
if(endPos - startPos >256) write(6,*) 'mist' if(endPos - startPos >256) call IO_error(107_pInt,ext_msg=trim(fileName))
line = rawData(startPos:endPos-1) line = rawData(startPos:endPos-1_pInt)
startPos = endPos + 1 startPos = endPos + 1_pInt
recursion: if(scan(trim(line),'{') < scan(trim(line),'}')) then recursion: if(scan(trim(line),'{') < scan(trim(line),'}')) then
myTotalLines = myTotalLines - 1 myTotalLines = myTotalLines - 1_pInt
includedContent = IO_recursiveRead(trim(line(scan(line,'{')+1:scan(line,'}')-1))) includedContent = IO_recursiveRead(trim(line(scan(line,'{')+1_pInt:scan(line,'}')-1_pInt)), &
merge(cnt,1_pInt,present(cnt))) ! to track recursion depth
includedLines = includedLines + size(includedContent) includedLines = includedLines + size(includedContent)
missingLines = myTotalLines + includedLines - size(fileContent(1:l-1)) -size(includedContent) missingLines = myTotalLines + includedLines - size(fileContent(1:l-1)) -size(includedContent)
fileContent = [fileContent(1:l-1),includedContent,[(line,i=1,missingLines)]] fileContent = [ fileContent(1:l-1_pInt), includedContent, [(dummy,i=1,missingLines)] ] ! add content and grow array
l=l-1+size(includedContent) l = l - 1_pInt + size(includedContent)
else recursion else recursion
fileContent(l) = line fileContent(l) = line
endif recursion endif recursion
@ -226,6 +243,7 @@ recursive function IO_recursiveRead(fileName) result(fileContent)
end function IO_recursiveRead end function IO_recursiveRead
!-------------------------------------------------------------------------------------------------- !--------------------------------------------------------------------------------------------------
!> @brief checks if unit is opened for reading, if true rewinds. Otherwise stops with !> @brief checks if unit is opened for reading, if true rewinds. Otherwise stops with
!! error message !! error message
@ -1568,6 +1586,8 @@ subroutine IO_error(error_ID,el,ip,g,instance,ext_msg)
msg = 'unknown output:' msg = 'unknown output:'
case (106_pInt) case (106_pInt)
msg = 'working directory does not exist:' msg = 'working directory does not exist:'
case (107_pInt)
msg = 'line length exceeds limit of 256'
!-------------------------------------------------------------------------------------------------- !--------------------------------------------------------------------------------------------------
! lattice error messages ! lattice error messages