// Peek.bcpl // Copyright Xerox Corporation 1979 // Last modified August 28, 1979 11:56 AM by Boggs get "Pup0.decl" get "Pup1.decl" get "AltoFileSys.d" get "Disks.d" get "Streams.d" get "SysDefs.d" get "AltoDefs.d" external [ // outgoing procedures Title; Command; PeekFinishProc Wss; Ws; GatewayFinish // incoming procedures InitPeek; Junta Allocate; AddToZone; MoveBlock; Zero Block; CallContextList; Dismiss Puts; Resets; Gets; GetBitPos; CharWidth; SetBitPos ReadCalendar; WRITEUDT; PutTemplate DoubleDifference; Enqueue; Dequeue; HLookup LockBootServ; LockNameServ OpenFile; HelpOpenFile; DefaultArgs // outgoing statics quitFlag; quitCount; versionText; gatewayGoingDown // incoming statics show; noShow; dsp; keys; EventVector sysZone; sysDisk; pupRT; ctxQ; CtxRunning lvUserFinishProc; savedPeekFP; lvIdle; savedIdle ] static [ quitFlag = false quitCount = 0 versionText; gatewayGoingDown openLock ] //---------------------------------------------------------------------------- let Peek() be Junta(levDisplay, AfterJunta) //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- and AfterJunta() be //---------------------------------------------------------------------------- [ versionText = "Peek of 28 Aug 79" let endCode = InitPeek() AddToZone(sysZone, InitPeek, endCode-InitPeek) OpenFile = PeekOpenFile CallContextList(ctxQ!0) repeat //forever ] //---------------------------------------------------------------------------- and PeekFinishProc() be //---------------------------------------------------------------------------- [ @displayListHead = 0; for i = 1 to 30000 loop @lvIdle = savedIdle @lvUserFinishProc = savedPeekFP ] //---------------------------------------------------------------------------- and Wss(stream, string) be //---------------------------------------------------------------------------- for i = 1 to string>>String.length do Puts(stream, string>>String.char^i) //---------------------------------------------------------------------------- and Ws(string) be Wss(dsp, string) //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- and GatewayFinish(code) be //---------------------------------------------------------------------------- [ if code eq 1000 then //restart [ // assume a standard PeekUser.cm which invokes Peek on eventBooted let ev = EventVector while ev!0 ne 0 do ev = ev + ev>>EVM.length if ev-EventVector+1 ls EventVector!-1 then [ ev>>EVM.type = eventBooted ev>>EVM.length = 1 ev!1 = 0 ] ] finish ] //---------------------------------------------------------------------------- and Title() be // a context //---------------------------------------------------------------------------- [ let lastTime, now = vec 1, vec 1 [ ReadCalendar(now) if DoubleDifference(now, lastTime) ne 0 then [ Resets(noShow) PutTemplate(noShow, "-- $S", versionText) FillWithDash(190, noShow) WRITEUDT(noShow, 0) FillWithDash(365, noShow) let rte = HLookup(pupRT, 0) PutTemplate(noShow, "Alto $O#$O#", rte>>RTE.ndb>>NDB.localNet, rte>>RTE.ndb>>NDB.localHost) FillWithDash(490, noShow) PutTemplate(noShow, "$UD pages", sysDisk>>DSK.diskKd>>KDH.freePages) FillWithDash(605, noShow) let dcb = @displayListHead while dcb>>DCB.next ne show>>DS.cdcb do [ if dcb eq 0 then Block() repeat dcb = dcb>>DCB.next ] noShow>>DS.cdcb>>DCB.next = show>>DS.cdcb>>DCB.next dcb>>DCB.next = noShow>>DS.cdcb let temp = noShow; noShow = show; show = temp MoveBlock(lastTime, now, 2) ] Block() ] repeat ] //---------------------------------------------------------------------------- and FillWithDash(end, stream) be //---------------------------------------------------------------------------- [ if (end-GetBitPos(stream)) gr CharWidth(stream, $*S) then Puts(stream, $*S) while end gr GetBitPos(stream)+CharWidth(stream,$*S)+CharWidth(stream,$-) do Puts(stream, $-) SetBitPos(stream, end) ] //---------------------------------------------------------------------------- and Command() be //a context //---------------------------------------------------------------------------- [ Ws("*N> ") let char = nil [ char = Gets(keys) if char ne $*S break ] repeat switchon char into [ case $Q: case $q: [ unless Confirm("Quit") loop LockBootServ() LockNameServ() quitFlag = true Block() repeatuntil quitCount eq 0 finish ] default: [ Ding(dsp); endcase ] case $?: [ Ws("? Commands are: Quit") loop ] ] ] repeat //---------------------------------------------------------------------------- and Confirm(string) = valof //---------------------------------------------------------------------------- [ if string then Ws(string) Ws(" [Confirm] ") switchon Gets(keys) into [ case $Y: case $y: case $*N: resultis true case $N: case $n: case $*177: resultis false case $?: [ Ws(" Confirm with "); endcase ] default: [ Ding(dsp); endcase ] ] repeat ] //---------------------------------------------------------------------------- and Ding(stream) be //---------------------------------------------------------------------------- [ InvertWindow(stream, true) Dismiss(25) InvertWindow(stream, false) ] //---------------------------------------------------------------------------- and InvertWindow(stream, background) be //---------------------------------------------------------------------------- [ let dcb = stream>>DS.fdcb [ dcb>>DCB.background = background if dcb eq stream>>DS.ldcb return dcb = dcb>>DCB.next ] repeat ] //---------------------------------------------------------------------------- and PeekOpenFile(name, ksType, itemSize, versionControl, hintFp, errRtn, zone, nil, disk, CreateStream, SNword; numargs na) = valof //---------------------------------------------------------------------------- [ while openLock ne 0 & openLock ne CtxRunning do Block() openLock = CtxRunning DefaultArgs(lv na, -1) //default all defaultable args to zero let stream = HelpOpenFile(name, ksType, itemSize, versionControl, hintFp, errRtn, zone, nil, disk, CreateStream, SNword) openLock = 0 resultis stream ]