- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I have a simple program:
Program MkCallTree
Implicit None
Character(50) :: Cfile, Dfile
Character(135):: Buffer(5000)
Character(26):: Progr(20), Csv, P1, P2, P3
Character(76):: Calling(5000)
Integer(4):: Ndx = 0, Nd2 = 0, I, Ndxs, Nof
Interface
Function ToLower (Input_String) Result (Output_String)
Character(*), Intent(In) :: Input_String
Character(Len(Input_String)) :: Output_String
End Function ToLower
End Interface
Call System("Dir /B *.Lst > List")
Open ( Unit=4, &
File="Calltree.Txt", &
Status='replace', &
Form='formatted')
Open ( Unit=8, &
File="List", &
Status='old', &
Form='formatted')
Rewind (4)
Rewind (8)
Csv = ""
Ndx = 0
Do
Read(8,"(A)",End=999) Cfile
If (Cfile == "") Go To 999
I = 1
Dfile = ""
Do While(Cfile(I:I) /= '.')
I = I + 1
End Do
Dfile = Cfile(1:I) // "F90"C
Dfile = ToLower(Dfile)
Write(4,"(A,5X,A)") "Dfile = ", Dfile
Open ( Unit=3, &
File="Cfile", &
Status='old', &
Form='formatted')
Rewind (3)
Nof = 0
! Now Read In The Entire Cfile Entry
Do While (1 == 1)
Nof = Nof + 1
Write(4,'(A,I5)') 'nof = ', Nof
Buffer(Nof) = " "C
Read(3,'(A135)',End=100) Buffer(Nof)
End Do
100 Close (3)
Nof = Nof - 1
Write (4,'(A,I5)') 'read Nof = ', Nof
Ndx = 1
Progr(Ndx) = ToLower(Trim(Buffer(1)(50:75)))
Ndxs = Nd2
Write(4,'(A)') "At Stmt No 100"
Do I = 3, Nof
If (Buffer(I)(1:4) == "Page") Then
P3 = ToLower(Buffer(I)(50:75))
If (Progr(Ndx) /= P3) Then
Csv = Progr(Ndx)
Ndx = Ndx + 1
Progr(Ndx) = P3
If (Progr(Ndx) == "") Then
Progr(Ndx) = Csv
End If
End If
Cycle
End If
P1 = ToLower(Trim(Buffer(I)(2:19)))
P2 = ToLower(Trim(Buffer(I)(29:35)))
P3 = ToLower(Buffer(I)(50:75))
Write(4,600) 'progr', Progr(Ndx), Ndx
Write(4,600) 'p1=',P1
Write(4,600) 'p2=', P2
600 Format(A5, 5X, A, I5)
Write(4,600) 'p3=',P3
If (P1 == Progr(Ndx)) Then
Write(4,601) 'p1='
601 Format(A3, ' Cycle')
Cycle
Elseif (P1 == Csv) Then
Write(4,601) 'csv'
Cycle
End If
Write(4,602) Progr(Ndx), P1
602 Format ('is ', A, ' /= ', A)
If (Progr(Ndx) /= P1) Then
If (P2 == "Func ") Then
Nd2 = Nd2 + 1
Write(Calling(Nd2),500) Dfile, Progr(Ndx), "Func ", P1
500 Format (A20,1X,A20,1X,A6,1X,A)
Else If (P2 == "Subr ") Then
Nd2 = Nd2 + 1
Write(Calling(Nd2),500) Dfile, Progr(Ndx), "Subr ", P3
Else If (P2 == "Module") Then
Nd2 = Nd2 + 1
Write(Calling(Nd2),500) Dfile, Progr(Ndx), "Module", P3
Else If (P2 == "Intrin") Then
Nd2 = Nd2 + 1
Write(Calling(Nd2),500) Dfile, Progr(Ndx), "Intrin", P3
End If
If (I /= Nd2) Then
Write(4,"(A)") Calling(Nd2)
End If
End If
End Do
If (Ndxs == Nd2) Then
Nd2 = Nd2 + 1
Write(Calling(Nd2),500) Dfile, Progr(Ndx), "*None*"
End If
! Go Process Another Cfile From List On (8)
End Do
999 Close (8)
Do I = 1, Nd2
Write(4,'(A)') Calling(I)
End Do
Close (4)
End Program MkCallTree
Function ToLower ( Input_String ) Result ( Output_String )
Character(*),Intent(In) :: Input_String
Character(Len(Input_String)) :: Output_String
Character(*),Parameter :: Lower_Case = 'abcdefghijklmnopqrstuvwxyz'
Character(*),Parameter :: Upper_Case = 'abcdefghijklmnopqrstuvwxyz'
Integer :: I, N
Output_String = Input_String
Do I = 1, Len(Output_String)
! -- Find Location Of Letter In Upper Case Constant String
N = Index( Upper_Case, Output_String( I:I ) )
If ( N /= 0 ) Output_String( I:I ) = Lower_Case( N:N )
End Do
N = Index(Lower_Case, Output_String(1:1))
! Capitalize First Letter In String
If (N /= 0) Output_String(1:1) = Upper_Case(N:N)
Return
End Function ToLower
And a data file list that the system command produces:
BoxIt.lst Browse.lst ClrScreen.lst DlgChanged.lst DoColor.lst DoGraphs.lst DoGrids.lst DoHisto.lst DoInput.lst DoMoments.lst DrawIt.lst FitOut.lst FitSamp.lst GetK.lst GetLength.lst GetPT.lst GetRS.lst GetValue.lst Heap.lst Horn.lst Howe.lst Integrate.lst Kolmo.lst KS.lst LnGamma.lst MyHearderOut.lst MyScreen.lst MyTextOut.lst NormalCDF.lst OnSpinEdit.lst Pearson.lst Pearsonglobals.lst PlotCDF.lst PlotEDF.lst PlotHist.lst PlotPDF.lst Print.lst Purge.lst RadioChanged.lst RanF.lst SaveAll.lst SetupMyDlg.lst Special.lst TypeI.lst TypeII.lst TypeIII.lst TypeIV.lst TypeV.lst TypeVI.lst TypeVII.lst TypeVIII.lst Van.lst zData.lst
I read the first entry from list into cfile and create dfile and all goes well until the first read of the .lst file and it jumps to 999. I've put in a lot of debug to unit 4 but that doesn't get printed. I'm at a loss.
Thanks for any suggestion.
Brooks
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
It was a stupid mistake. All is working now. Line 48 should not have any "'s around cfile. Plus a few cleanup things had to be changed. The ToLowCase had to be made into a subroutine because the allocation went south on the return value.
Thanks,
Brooks
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Just a few remarks:
- Why "F90"C? If it is to mark the end of the significant part of the string, that is failing - the tolower function just takes the whole character length.You could do: DFile = Tolower( cfile(1:i) ) instead
- The function tolower does not convert to lower case - the characters in lower_case and upper_case are identical
- If you make tolower an internal routine by placing it before the end of the program you have no need for the interface block:
...
close(4)
contains
function tolower( ... )
...
end function
end program mycalltree
But I do not understand your comment that tolower had to be turned in a subroutine because of a problem with the allocation. The code does not do any allocation and returning a character string like in the code you posted ought to work fine.
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page