Routine that extracts any subscripts present in a line of the input file author: P J Knight, CCFE, Culham Science Centre isub1 : output integer : first subscript found isub2 : output integer : second subscript found icode : output integer : diagnostic flag This routine extracts any subscripts from the current line of the input file, i.e. if any array elements are specified by the user. It looks at the next non-space character in the line, and if it is a left bracket, it assumes that at least one subscript is to follow and extracts it/them. None
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
integer, | intent(out) | :: | isub1 | |||
integer, | intent(out) | :: | isub2 | |||
integer, | intent(out) | :: | icode |
subroutine get_subscript(isub1,isub2,icode)
!! Routine that extracts any subscripts present in a line of
!! the input file
!! author: P J Knight, CCFE, Culham Science Centre
!! isub1 : output integer : first subscript found
!! isub2 : output integer : second subscript found
!! icode : output integer : diagnostic flag
!! This routine extracts any subscripts from the current line of
!! the input file, i.e. if any array elements are specified
!! by the user. It looks at the next non-space character in the
!! line, and if it is a left bracket, it assumes that at
!! least one subscript is to follow and extracts it/them.
!! None
!
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
implicit none
! Arguments
integer, intent(out) :: isub1, isub2, icode
! Local variables
integer :: izero
logical :: negate
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! *** Initial values
isub1 = 0
isub2 = 0
! *** First character should be '('
if (line(iptr:iptr) /= '(') goto 70
iptr = iptr + 1
if (iptr > linelen) goto 80
! *** Parse the first subscript
! *** Ignore leading spaces
10 continue
if (line(iptr:iptr) == ' ') then
iptr = iptr + 1
if (iptr > linelen) goto 80
goto 10
end if
izero = ichar('0')
negate = .false.
! *** Extract and evaluate the first subscript
! *** Subscript may be prefaced by '+' or '-'
if (line(iptr:iptr) == '+') then
iptr = iptr + 1
if (iptr > linelen) goto 80
else if (line(iptr:iptr) == '-') then
negate = .true.
iptr = iptr + 1
if (iptr > linelen) goto 80
else
continue
end if
20 continue
if ((line(iptr:iptr) >= '0').and.(line(iptr:iptr) <= '9')) then
isub1 = isub1 * 10 + ichar(line(iptr:iptr)) - izero
iptr = iptr + 1
if (iptr > linelen) goto 80
goto 20
end if
if (negate) isub1 = -isub1
! *** Ignore trailing spaces of first subscript
30 continue
if (line(iptr:iptr) == ' ') then
iptr = iptr + 1
if (iptr > linelen) goto 70
goto 30
end if
! *** Is there a second subscript?
if (line(iptr:iptr) == ',') then
iptr = iptr + 1
if (iptr > linelen) goto 80
! *** Ignore leading spaces of second subscript
40 continue
if (line(iptr:iptr) == ' ') then
iptr = iptr + 1
if (iptr > linelen) goto 80
goto 40
end if
! *** Extract and evaluate the second subscript
negate = .false.
! *** Subscript may be prefaced by '+' or '-'
if (line(iptr:iptr) == '+') then
iptr = iptr + 1
if (iptr > linelen) goto 80
else if (line(iptr:iptr) == '-') then
negate = .true.
iptr = iptr + 1
if (iptr > linelen) goto 80
else
continue
end if
50 continue
if ((line(iptr:iptr) >= '0').and.(line(iptr:iptr) <= '9')) then
isub2 = isub2 * 10 + ichar(line(iptr:iptr)) - izero
iptr = iptr + 1
if (iptr > linelen) goto 80
goto 50
end if
! *** Is it a negative subscript?
if (negate) isub2 = -isub2
! *** Ignore trailing spaces of second subscript
60 continue
if (line(iptr:iptr) == ' ') then
iptr = iptr + 1
if (iptr <= linelen) goto 60
end if
end if
! *** Must end with ')'
if (line(iptr:iptr) /= ')') goto 80
iptr = iptr + 1
70 continue
icode = 0
goto 1000
80 continue
icode = 1
1000 continue
end subroutine get_subscript