;-*-Midas-*-

	Title :IDLE - List idle users

A=1	;General porpoise
B=2
C=3
D=4
E=5
F=6
G=7

T1=10
T2=11
T3=12

I=13	;Index
T=14	;TTY

P=17

Call=<PUSHJ P,>
Return=<POPJ P,>

TTYo==1

MapBot==5
MapTop=177
MapLen==MapTop-MapBot+1

Pdlen==10
JCLen==10
MaxUsr==50.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Define SYSCAL op,args
	.Call [Setz ? Sixbit /op/ ? args ((Setz))]
Termin

Define TYPE &string
	Movei T1,<.Length string>
	Move T2,[440700,,[Ascii string]]
	Syscal SIOT,[%Climm,,TTYo ? T2 ? T1]
	  .Lose %LsSys
Termin

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

JCLbuf:	Block JCLen
	-1

Text:	Block JCLen

Pdlist:	-Pdlen,,Pdlist
	Block Pdlen

NCT:	0	;Number Console Terminals - Max TTY#
TTITM:	0	;TTy Idle TiMe (?) - Idle time
UNAME:	0
TTYSTS:	0	;STS?  Has the index of the job which has that TTY

Who:	Block MaxUsr
When:	Block MaxUsr
Where:	Block MaxUsr

Time:	30.*60.
	30.*60.*60.
	30.*60.*60.*24.

Alpha:	0

Now:	0

Target:	0
Limit:	30.*60.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Begin:	Move P,PDList
	Syscal OPEN,[%Clbit,,.uao\%TJDIS
		     %Climm,,TTYo
		     [Sixbit /TTY/]]
	  .Lose %LsFil
	.Break 12,[..rJCL,,JCLbuf]
	Skipn JCLbuf
	  Jrst SysMap
	Move A,[440700,,JCLbuf]

Clean:	Ildb B,A	;Remove leading spaces/tabs
	Caie B,^I
	  Cain B,40
	    Jrst Clean
	Setz E,
	Move C,[440700,,Text]
	Skipa

Read:	Ildb B,A
	Caie B,^C
	  Cain B,^M
	    Jrst Inter
	Caie B,177
	  Cain B,^_
	    Jrst Inter
	Cail B,"0
	  Caile B,"9
	    Setom Alpha
	Cail B,"a
	  Trz B,40
	Idpb B,C
	Aoja E,Read

Inter:	Jumpe E,SysMap
	Move C,[440700,,Text]
	Skipe Alpha
	  Jrst Name

Numify:	Imuli D,10.
	Ildb B,C
	Subi B,"0
	Add D,B
	Sojn E,Numify
	IMuli D,<30.*60.>
	Movem D,Limit
	Jrst SysMap

Name:	Caile E,6
	  Movei E,6
	Move D,[440600,,Target]

Sixify:	Ildb B,C
	Subi B,40
	Idpb B,D
	Sojn E,Sixify

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
;;;	JCL parsing done.  LIMIT contains the time in ticks that
;;;	is the bottom cut-of for people listed.  If TARGET is non-
;;;	zero, then only TARGET is listed, not all users
;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SysMap:	Move B,[Squoze 0,NCT]
	.Eval B,
	  .Lose
	Movem B,NCT
	Move C,[Squoze 0,UNAME]
	.Eval C,
	  .Lose
	Add C,[(I)]	;Indexed by I
	Movem C,UNAME
	Move D,[Squoze 0,TTITM]
	.Eval D,
	  .Lose
	Add D,[(T)]	;Likewise for T
	Movem D,TTITM
	Move E,[Squoze 0,TTYSTS]
	.Eval E,
	  .Lose
	Add E,[(T)]
	Movem E,TTYSTS
	Syscal CORBLK,[%Climm,,%Cbndr
		       %Climm,,%Jself
		     [-MapLen,,MapBot]
		       %Climm,,%Jsnum]
	  .Lose %LsSys
	Movei T,1		;Start at T01
	.RdTime T1,
	Movem T1,Now
	Seto E,

GetEm:	Move C,@TTYSTS
	Hrre I,C
	Jumple I,Next
	Tlne C,400000
	  Jrst Next
	Move A,Now
	Sub A,@TTITM
	Skipge A
	  Setz A,
	Move D,@UNAME
	Camn D,Target
	  Jrst Save
	Camge A,Limit
	  Jrst Next
Save:	Aoj E,
	Movem T,Where(E)
	Movem A,When(E)
	Movem D,Who(E)
Next:	Aoj T,
	Camg T,NCT
	  Jrst GetEm

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
;;;	All unames and idle times have been read in.  Now is the time
;;;	to sort and output, or just output for one name....
;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Squeal:	.Iot TTYo,[^P]
	.Iot TTYo,["A]
	Jumpl E,[TYPE "No users"
		Jrst Die]
	Skipn Target
	  Jrst Sort
	Move T1,E
	Move T2,Target

Find:	Camn T2,Who(T1)
	  Jrst Here
	Sojge T1,Find
	TYPE "Who?  Not idle... not even HERE!"
	Jrst Die

Here:	Call OutLin
	Jrst Die

Sort:	TYPE "TTY Uname  Idle"

Loopi:	Seto T2,
	Move T3,E
Loop:	Caml T2,When(T3)
	  Jrst Too
	Move T1,T3
	Move T2,When(T3)
Too:	Sojge T3,Loop
	Skipge T2
	  Jrst Die
	Call OutLin
	Setom When(T1)
	Jrst Loopi

Die:	.Logout 1,

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

OutLin:	.Iot TTYo,[^P]
	.Iot TTYo,["A]
	.Iot TTYo,["T]
	Move A,Where(T1)
	IDivi A,10
	Addi A,60
	.Iot TTYo,A
	Addi B,60
	.Iot TTYo,B
	.Iot TTYo,[" ]
	Movei C,7
	Move A,Who(T1)
6Type:	Setz B,
	Rotc A,6
	Addi B,40
	.Iot TTYo,B
	Sojn C,6Type

TType:	Setz A,		;1st set has no leading '0'
	Movei D,2
	Move B,When(T1)
TTloop:	Idiv B,Time(D)
	Skipn A
	  Jumpe B,TTnext
	Move F,B
	Idivi F,10.
	Addi F,"0
	Caig F,"0
	  Skipe A
	    .Iot TTYo,F
	Addi G,"0
	.Iot TTYo,G
	Skipe D
	  .Iot TTYo,[":]
	Seto A,
TTnext:	Move B,C
	Sojge D,TTloop
	Return

	END BEGIN
