// FileIOSubrs.bcpl // Last change May 25, 1983 10:44 AM by Bill van Melle // Last change April 5, 1983 4:48 PM by Bill van Melle // Major pruning December 14, 1982 2:47 PM by Bill van Melle // Last change October 25, 1982 12:43 PM by Bill van Melle // Last change July 21, 1982 9:50 PM by Bill van Melle // Last change March 29, 1982 3:53 PM by Bill van Melle // Last change August 2, 1981 12:43 AM by Beau Sheil // Tone change March 17, 1981 4:49 PM by Beau Sheil // Chord change November 20, 1980 2:52 PM by Beau Sheil // Previous last change August 18, 1980 12:31 PM by Beau Sheil get "AltoFileSys.d" get "Disks.d" get "LispBcpl.decl" get "Stats.decl" get "Streams.d" external [ // defined here COPYSYS0SUBR OutputStream // used by stats to access log file // statics used @lvNIL; @TopLevelFrame sysDisk; LispFmap; @MiscSTATSbase // O.S. procedures used Resets; Closes; WriteBlock; Zero; CallSwat; Min; MyFrame TruncateDiskStream; CreateDiskStream; ActOnDiskPages; WriteDiskPages FlushDD // procedures used @BGetBase; @BSetBR; @XSetReadBR; @RRead @XGetBase; IGetBase; IPutBase EqNIL; RAIDCode; EmUnbox; EmAddr SmallUnbox; MkSmallPos; MkSmallNeg SysErr; IndexedPageIO ] manifest [ lenCB = #25 IFPcbstart = #200 ] let GetFptrArg(lvFptr, f) be [ XSetReadBR(lvFptr) for i = 0 to lFP-1 do f!i = RRead(i) ] and HintError(s, cb, code) = valof // BFS errors - diff args from SysErr [ MyFrame()!0 = TopLevelFrame // set return addr to return from SUBR resultis selecton code into // error code switch [ case 1102: MkSmallNeg(-22) // error 22 if disk full case 1105: MkSmallNeg(-41) // error 41 if protected default: SysErr(0, code) ] ] and OutputStream(lvFid) = valof [ let fp = vec lFP; GetFptrArg(lvFid, fp) let st = CreateDiskStream(fp, ksTypeWriteOnly, wordItem, 0, StreamError) unless st do RAIDCode("Cant create stream", lvFid) resultis st ] and COPYSYS0SUBR(lvFid) = valof [ let st = OutputStream(lvFid) let pvec = vec 4*WordsPerPage Zero(pvec, WordsPerPage) WriteBlock(st, pvec, WordsPerPage) // page 1 <- isf index page let Last = IGetBase(IFPNActivePages) + FirstVmemBlock - 1 let i = FirstVmemBlock [ let np = Min(Last - i, 4) IndexedPageIO(LispFmap, i, pvec, np, 1) WriteBlock(st, pvec, np*WordsPerPage) i = i + np ] repeatuntil i ge Last TruncateDiskStream(st) // in case using old file Resets(st); Closes(st) resultis lvNIL ] and StreamError(s, code) = HintError(s, 0, code) // adjust args for HintError