Data update
This commit is contained in:
parent
4bb20c9b71
commit
cbaf4c4b64
12390 changed files with 318560 additions and 27248 deletions
138
Task/Function-frequency/REXX/function-frequency-3.rexx
Normal file
138
Task/Function-frequency/REXX/function-frequency-3.rexx
Normal file
|
|
@ -0,0 +1,138 @@
|
|||
-- 21 Feb 2026
|
||||
include Setting
|
||||
parse arg program
|
||||
|
||||
say 'FUNCTION FREQUENCY'
|
||||
say version
|
||||
call ReadSource
|
||||
call CleanSource
|
||||
call CollectInvokes
|
||||
call SortSt 'invo.'
|
||||
call ReportInvokes
|
||||
call Timer
|
||||
exit
|
||||
|
||||
ReadSource:
|
||||
-- Read all lines in a stem
|
||||
if program='' then
|
||||
program='FuncFreq.rex'
|
||||
else
|
||||
program=program'.rex'
|
||||
say 'Invoke frequencies for program' program
|
||||
say
|
||||
call Stream program,'c','open read'
|
||||
srce.=0; n=0
|
||||
do while Lines(program)
|
||||
record=LineIn(program)
|
||||
n=n+1; srce.n=record
|
||||
end
|
||||
srce.0=n
|
||||
call Stream program,'c','close'
|
||||
return
|
||||
|
||||
CleanSource:
|
||||
-- Erase all characters that are (in this order):
|
||||
-- within a '' literal or a "" literal
|
||||
-- within a /*...*/ comment block
|
||||
-- after -- ... comment
|
||||
-- not allowed in names
|
||||
cleanc=0
|
||||
p1=0; q1=0
|
||||
do i = 1 to srce.0
|
||||
cleanl=0
|
||||
s=srce.i; k=Length(s)
|
||||
do j = 1 to k
|
||||
-- Substring for literals
|
||||
p1=SubStr(s,j,1)
|
||||
-- Erase literal
|
||||
if p1 = "'" | p1 = '"' then do
|
||||
if cleanl then do
|
||||
s=Overlay(' ',s,j)
|
||||
if p1 = q1 then
|
||||
cleanl=0
|
||||
end
|
||||
else do
|
||||
q1=p1; cleanl=1
|
||||
end
|
||||
end
|
||||
if cleanl then
|
||||
s=Overlay(' ',s,j)
|
||||
end j
|
||||
-- Substring for comments
|
||||
p2=SubStr(s,j,2)
|
||||
-- Erase block /*...*/ comment
|
||||
if p2 = '/*' then
|
||||
cleanc=1
|
||||
else do
|
||||
if p2 = '*/' then do
|
||||
s=Overlay(' ',s,j,2)
|
||||
cleanc=0
|
||||
end
|
||||
end
|
||||
if cleanc then do
|
||||
s=Overlay(' ',s,j)
|
||||
iterate j
|
||||
end
|
||||
-- Erase -- ... comment
|
||||
if p2 = '--' then do
|
||||
s=Overlay(' ',s,j,k)
|
||||
leave j
|
||||
end
|
||||
-- Erase all characters not allowed in names
|
||||
s=Translate(s,' ','+-*|<>,;=/\%)')
|
||||
srce.i=s
|
||||
end i
|
||||
return
|
||||
|
||||
CollectInvokes:
|
||||
-- Collect invocations 'Name()' or 'call Name'
|
||||
invo.=0; v=0
|
||||
do i = 1 to srce.0
|
||||
s=srce.i
|
||||
-- Parse words
|
||||
wrds.=0; n=0
|
||||
do until s = ''
|
||||
n=n+1; parse var s wrds.n s
|
||||
end
|
||||
-- Find invocations
|
||||
wrds.0=n
|
||||
do j = 1 to wrds.0
|
||||
w=wrds.j
|
||||
-- Call Name
|
||||
if Upper(w) = 'CALL' then do
|
||||
k=j+1; v=v+1; invo.v=wrds.k
|
||||
end
|
||||
-- Name()
|
||||
else do
|
||||
p1=1; p2=Pos('(',w)
|
||||
do while p2 > 0
|
||||
a=SubStr(w,p1,p2-p1)
|
||||
if a <> '' then do
|
||||
v=v+1; invo.v=SubStr(w,p1,p2-p1)
|
||||
end
|
||||
p1=p2+1; p2=Pos('(',w,p1)
|
||||
end
|
||||
end
|
||||
end j
|
||||
end i
|
||||
invo.0=v
|
||||
return
|
||||
|
||||
ReportInvokes:
|
||||
-- Aggregate and report
|
||||
p=invo.1; n=1
|
||||
do i = 2 to invo.0
|
||||
v = invo.i
|
||||
if v = p then
|
||||
n=n+1
|
||||
else do
|
||||
say Right(n,3) p
|
||||
p=v; n=1
|
||||
end
|
||||
end i
|
||||
say Right(n,3) p
|
||||
say
|
||||
return
|
||||
|
||||
-- SortSt; Timer
|
||||
include Math
|
||||
Loading…
Add table
Add a link
Reference in a new issue