!TITLE  Source of S#FOR ALL USERS
!<
%RECORDFORMAT comf(%INTEGER ocptype,ipldev,sblks,sepgs,ndiscs,  %C
                             ddtaddr,gpctabsize,gpca,sfctabsize,sfca,sfck,dirsite,  %C
                             dcodeda,suplvn,wasklokcorrect,date0,date1,date2,  %C
                             time0,time1,time2,epagesize,users,cattad,dqaddr,  %C
                             sacport,ocpport,itint,contypea,gpcconfa,fpcconfa,sfcconfa,%C
                             blkaddr,dptaddr,smacs,trans,  %C
                   %LONGINTEGER kmon,  %C
                   %INTEGER ditaddr,smacpos,supvsn,pstva,secsfrmn,secstocd,%C
                             sync1dest,sync2dest,asyncdest,maxprocs,inspersec,elaphead,%C
                             commsreca,storeaad,procaad,sfcctad,drumtad,sp0,sp1,sp2,sp3,%C
                             sp4,sp5,sp6,sp7,sp8,sp9,%C
                             lstl,lstb,pstl,pstb,hkeys,hoot,sim,clkx,clky,clkz,  %C
                             hbit,slaveoff,inhssr,sdr1,sdr2,sdr3,  %C
                             sdr4,sesr,hoffbit,s2,s3,s4,end)


%RECORDFORMAT procf(%STRING(6) user,  %C
                    %BYTEINTEGER incar,category,wsn,runq,active,%C
                    %INTEGER actwo,lstad,lamtx,stack,status)


%RECORDFORMAT ustabf(%INTEGER next,status, %STRING(6) name)


%EXTERNALINTEGERFNSPEC DPROCS(%INTEGERNAME maxprocs, %INTEGER adr)

%ROUTINE apply(%INTEGER maxprocs,%ROUTINE use)
%SPEC  use(%STRING(255) S,%INTEGER Mode)
   %BYTEINTEGERARRAY proclist(0:32*maxprocs)
   %RECORDARRAYFORMAT procaf(0:maxprocs)(procf)
   %RECORDARRAYNAME proca(procf)
   %RECORDARRAY ustab(0:maxprocs)(ustabf)
   %INTEGER i,j,flag,nusers,nextfree,start,dummy,adr,k,last
   %STRING(255) sout

nusers=0; nextfree=0; start=0; dummy=0; adr=0

flag=DPROCS(maxprocs, ADDR(proclist(0)))
WRITE(flag,4) %AND %RETURN %IF flag#0

maxprocs = maxprocs-1
proca==ARRAY(ADDR(proclist(0)),procaf)

%CYCLE j=0,1,maxprocs
   %IF proca(j)_user#"" %THEN %START
      %IF 1=1 %THEN %START
         nusers=nusers+1
         ustab(nextfree)_name=proca(j)_user
         ustab(nextfree)_status=proca(j)_status
         %IF nextfree=0 %THEN ustab(nextfree)_next=-1 %AND %C
         nextfree=nextfree+1 %ELSE %START
            k=start
            last=start
            %CYCLE
               %EXIT %IF ustab(nextfree)_name<ustab(k)_name %OR ustab(k)_next=-1
               last=k
               k=ustab(k)_next
            %REPEAT
            %IF k=start %THEN %START
            %IF ustab(nextfree)_name>ustab(k)_name %THEN %C
                  ustab(nextfree)_next=ustab(k)_next %AND ustab(k)_next=nextfree %C
                  %ELSE ustab(nextfree)_next=k %AND start=nextfree
            %FINISH %ELSE %START
               %IF ustab(nextfree)_name>ustab(k)_name %THEN  %C
                  ustab(nextfree)_next=ustab(k)_next %C
                  %AND ustab(k)_next=nextfree %ELSE %START

                  ustab(nextfree)_next=ustab(last)_next
                  ustab(last)_next=nextfree

               %FINISH
         %FINISH

         nextfree=nextfree+1
         %FINISH
      %FINISH
   %FINISH
%REPEAT

i=start
sout=""
j=start

%CYCLE i=1,1,nextfree

   use(ustab(j)_name,ustab(j)_status)
   j=ustab(j)_next

%REPEAT

%END;  ! of apply


%SYSTEMROUTINE FORALL USERS(%ROUTINE use)
%SPEC  use(%STRING(255) s,%INTEGER Mode)
   %INTEGER maxprocs
   %RECORDNAME com(comf)

com==RECORD(X'80000000'+48<<18)
maxprocs=com_maxprocs
apply(maxprocs,use)
%BEGIN
   %RECORD %FORMAT  FILEFM(%INTEGER conad,filetype,datastart,dataend)

   %SYSTEM %ROUTINE %SPEC  CONNECT(%STRING(31)S, %C
                                   %INTEGER   a,m,p, %C
                                   %RECORD%NAME  info, %C
                                   %INTEGERNAME          flag)

   %SYSTEM %ROUTINE %SPEC  DISCONNECT(%STRING(31)S, %C
                                      %INTEGERNAME flag)

   %EXTERNAL %STRING(255) %FN %SPEC  UINFS(%INTEGER which)
   %EXTERNAL %STRING(8)   %FN %SPEC  TIME
   %EXTERNAL %STRING(8)   %FN %SPEC  DATE

   %RECORD File (FILEFM)
   %INTEGER Group,Type,Site,Flag
   %STRING(255) Line
   %STRING(10) User

      User = UINFS(1)
      Group = CHAR NO(User,4)
      Type  = CHAR NO(User,3)
      LENGTH(User)=2
      %IF 0=0 %OR (User="EC" %AND Group='U' %AND 'U'<=Type<='Z') %START
         LENGTH(User)=6; User=User.":   "
         Line = User.DATE." ".TIME.",  ".UINFS(7)." ".UINFS(2)."
"
         CONNECT("ECSLIB.".TOSTRING('U'),3,0,0,File,Flag)
                           !Disguise file name
         %IF Flag=0 %THEN %START
            %IF INTEGER(File_conad+X'8')-X'20'-File_dataend-1 > LENGTH(Line) %THEN %START
               %CYCLE Site = File_conad+File_datastart,1,File_conad+File_dataend-1
                  %IF BYTEINTEGER(Site)=10 %AND STRING(Site)=User %THEN ->END
               %REPEAT
               STRING(Site) = Line
               INTEGER(File_conad) = INTEGER(File_conad)+LENGTH(Line)+1
               BYTEINTEGER(Site) = NL
            %FINISH
            END:
         %FINISH
         DISCONNECT("ECSLIB.".TOSTRING('U'),Flag)
      %FINISH
%END


%END; ! of whoson


%ENDOFFILE
!>