IfsScavenger.RUNCOMMON50277STATICS10002777Ifs.BR3000IFS10013001P XIFSAfterJunta10023014P X304142 (34)IfsScavenger.BR3042IfsScavenger10273043P XSetup10303523P SetupPass210313575P SetupDiskEditor10323610P Scavenge10333624P Debug10344245P InitLPT10354255P InitTree10364265P EditHome10374275P JustFixDir10404306P Quit10414317P ToggleFlag10424325P Scratch10434370P XScavNoBufsProc10444501P XSplitPuts10764525P XLogErrors10774545P XExtendFile11004651P X53602317 (1231)IfsScavCompare.BR5361CompareRecords11245361L XCompareLPTEs11255366L XCompareStrings11265376L XDirEntryLength11275570L X5615235 (157)IfsResUtilA.BR5616TFSSwatProc11305616L XMulDiv11315630L XDoubleUsc11325643L XIfsPupChecksum11335670L XDoMove11345701L XMul11355710L XDiv11365725L XDiv32x1611375742L XLoadXM11405763L XStoreXM11415765L XDoubleBlt11425771L XCallWithArgVec11436011L XSysAllocate11446037L XSysFree11456042L XGetBit11466046L XSetBit11476063L X6103266 (182)IfsBcplRuntime.BR6104Z30011536104L InitBcplRuntime11526254L XInitIfsRuntime10046321L XResetStrings11556332L X6336233 (155)PupAl1A.BR6337PupChecksum11566337L XOnesComplementSubtract11606436L XOnesComplementAdd11576437L XLeftCycle11616443L XMultEq11626445L XDoubleIncrement11636467L XDoubleDifference11656506L XDoubleSubtract11646533L X6552214 (140)Context.BR6553CallContextList10076553L XBlock11726564L XYield11736564L XCtxRunning11756625L X662755 (45)ContextSched.BR6630SchedYield12006630L XSchedInterrupt11776636L XSchedFinish12016652L XIfsScavenger.bs10-Aug-84 2:04:36Page 1 c8 a"@& ` &N _ T^D~ $T] ~ $ [- Z&NTYP ~ $TX~ $TV ~ $TU~ $TT\~ $TS~ $TQ~ $TP~ $TOh~ $TN+ ~ $TL~ $TK ~ $TJt~ $TI7 ~ $TG~ $TF~ $TE ~ $ DC+ C&NTA ~ $T@ ~ $T?O ~ $T> ~ $ <,c ; &NT:[ ~ $T9~ $T7~ $T6 ~ $T5g~ $T4*~ $T2~ $T1~ $T0s~ $T/6~ $T-~ $T, ~ $T+ ~ $T*B~ $T)~ $T'~ $ &,c %N&NT$~ $T"~ $T! ~ $T Z ~ $ ,c  T ~ $Tf &N*\T) &N*\T~ $T~ $Tr~ $T5 &N*\T ~ $ ,c ~ TA~ $T~ $T ~ $T ~ $ M- &NT ~ $T ~ $TY ~ $h. "Et X)9_0667445 (37)IfsCallProc.BR6675CallProc12066675L XcallProcQ12077033L CallProcProcess12057035L X7076202 (130)IfsDDMgrRes.BR7077DDPageType12107100P XDDPageGroupSize12117106P XDDPageGroupBase12127114P XDDPageGroupAlign12137124P XDDDOPAGEIO12147132P X7263165 (117)AltoQueue.BR7264Enqueue12047264L XDequeue12157301L XInsertBefore12177311L XInsertAfter12207324L XUnqueue12167337L XQueueLength12217360L X7372107 (71)AltoTimer.BR7373SetTimer12237373L XInitializeTimer12227401L XTimerHasExpired12247402L XDismiss12257412L X743341 (33)AltoByteBlt.BR7434ByteBlt12267434L X7606153 (107)TimeConvA.BR7607TimeDiv12277607L XTimeMul12307631L XmonthTable12317647L X766355 (45)IfsFastStreamsA.BR7664fastChStream12337664L XfastWstream12347713L XGetCh12407745L PutCh12417770L GetW124210021L PutW124310036L Fendof124410054L CurrentPos123510065L XDirty123610077L XSetDirty123710106L X10111226 (150)BfsMl.BR10112MoveBlock124510112L XZero110610123L XSetBlock106710125L XBitBlt124610136L XUsc124710150L XMin125110155L XMax125210160L XUmin125310163L XUmax125410166L XDoubleAdd125010171L XDisableInterrupts126010210L XEnableInterrupts126110214L XStartIO126210216L XNoop110310217L XIdle126310217L XBFSSetStartingVDA126710217L XTruePredicate126510222L XFalsePredicate126610225L XoneBits125510230L XfreePageFid125610250L XfreePageFp125710250L X10252141 (97)IfsBcplTricks.BR10253FrameSize127010253L XMyFrame127110267L XCallersFrame127210271L XFramesCaller127310300L XCallFrame127410363L XIfsScavenger.bs10-Aug-84 2:04:36Page 2 c8- a &NT`~ $T_~ $T^D~ $ ],c [ &NTZ ~ $TYP~ $TX~ $TV &N*\TU ~ $ T\,c S TQ~ $TP~ $TOh ~ $TN+ ~ $TL~ $TK ~ $ Jt,c I7 TG~ $TF~ $TE~ $TDC~ $ C- A &NT@~ $ ?O,c > T<~ $T;~ $T:[ ~ $ 9- 7&NT6 ~ $T5g ~ $T4*~ $T2~ $T1~ 9$T0s~ 9$T/6~ 9$T- ~ 9$T,~ 9$T+~ 9$ 9*B,c ) 9T'~ 9$T&~ 9$T%N~ 9$T$~ 9$T"~ 9$T!~ 9$T Z~ 9$T~ 9$T~ 9$T~ 9$Tf %*\T) %*\T~ 9$T~ 9$Tr~ 9$T5 %*\T ~ 9$T ~ 9$T~~ 9$TA ~ 9$T ~ 9$ 9 ,c %T M~ 9$T ~ 9$T ~ 9$T ~ 9$TY~ 9$h. "Et X(_0GotoFrame127510373L XCoCall127610376L XCoReturn127710402L XReturnTo130010405L XGotoLabel130110410L XRetryCall130210416L XReturnFrom110410435L X10472220 (144)IfsCalls.BR10473Call0130310473L XActOnDiskPages111610473L XOpenDD134010473L XCall1130410474L XWriteDiskPages111410474L XLockDD134110474L XCall2130510475L XCloses106110475L XCreateDiskFile133110475L XReadDDPage134210475L XCall3130610476L XGets132310476L XDeleteDiskPages133210476L XUnlockDD134310476L XCall4130710477L XPuts106010477L XAssignDiskPage111210477L XFlushDD134410477L XCall5131010500L XResets132410500L XReleaseDiskPage111110500L XCloseDD134510500L XCall6131110501L XPutbacks132510501L XVirtualDiskDA133310501L XDestroyDDMgr134610501L XCall7131210502L XErrors132610502L XRealDiskDA133410502L XCall8131310503L XEndofs132710503L XCall9131410504L XStateofs133010504L XInitializeDiskCBZ133510504L XCall10131510505L XDoDiskCommand133610505L XCall11131610506L XCall12131710507L XCall13132010510L XCall14132110511L XGetDiskCb133710511L XCall15132210512L XCloseDisk107310512L X1051220 (16)Calendar.BR10513Timer135210513L XReadCalendar135010534L XDayTime135410534L XSetCalendar135110543L XSetDayTime135310543L X10660146 (102)VMemA.BR10661VRR5010663L XVRRP5610670L XVRR15210675L XVRR25410677L XRDREF0136010700L XVWR5110735L XVWRP5710742L XVWR15310747L XVWR25510751L XWTREF0136210752L XREHASHMAP135710771L XRDREF1136110776L XDOUBLEADD16011003L XVmemRam136311013L X11025145 (101)IfsScavenger.bs10-Aug-84 2:04:36Page 3Tc8~ 9$Ta~ 9$T`~ 9$T_~ 9$T^D~ 9$T]~ 9$T[ ~ 9$ 9Z,c YP 9TX~ 9$TV ~ 9$TU~ 9$TT\~ 9$TS ~ 9$TQ~ 9$TP~ 9$TOh~ 9$TN+ ~ 9$TL ~ 9$TK~ 9$TJt~ 9$TI7~ 9$TG~ 9$TF~ 9$TE~ 9$TDC ~ 9$TC~ 9$TA~ 9$T@~ 9$T?O~ 9$T>~ 9$T<~ 9$T;~ 9$T:[ ~ 9$T9 ~ 9$T7~ 9$T6~ 9$T5g ~ 9$T4*~ 9$T2~ 9$T1~ 9$T0s~ 9$T/6 %*\T-~ 9$T, ~ 9$T+~ 9$T*B~ 9$T)~ 9$T'~ 9$T&~ 9$T%N~ 9$T$~ 9$ 9"- ! 9T Z~ 9$T ~ 9$T~ 9$T ~ 9$Tf ~ 9$ 9),c  9T 9$Tr 9$T5 9$T 9$T~ 9$T~ 9$TA 9$T 9$T  9$T ~ 9$T M~ 9$T ~ 9$T  9$T~ 9$ 9Y,ch. "Et X(_0TfsA.BR11026TFSIncrement136611026L XTFSModShift136711036L XTFSModShiftA137011045L XTFSRealDA136411073L XTFSVirtualDA136511137L XTFSSilentBoot137111206L X11214167 (119)DspStreamsB.BR11215CreateDisplayStream137211216P XCharWidth137311535P XResetLine137411671P XFontHeight137511715P Xxfont137611727P ClearDs137711745P ClearMap140012040P ReleaseDs140112067P ShowDisplayStream140212107P XPrevDCB140312253P GetFont140412302P XSetFont140512311P XGetBitPos140612347P XSetBitPos140712356P XGetLmarg141012434P XSetLmarg141112443P XGetRmarg141212460P XSetRmarg141312467P XGetLinePos141412531P XSetLinePos141512547P XInvertLine141612633P XScroll141712666P Xone143013212L Compact142013310P used143113432L GetMapSpace142113560P ScrollOK142213713P FreeBitMap142313736P EraseBits142413774P X142203004 (1540)DspStreamsA.BR14221DisplayPut142714221L X14370150 (104)Gacha10.BR14371sysFont142614373L X165602170 (1144)KeyStreamsB.BR16561CreateKeyboardStream143316562P XSetKeyboardProc143417010P XKeyGets143517037P KeyReset143617107P KeyEofs143717124P 17142362 (242)KeyStreamsA.BR17143kbInterrupt144317164L XkbTable144017250L XkbTransitionTable144717444L X17563421 (273)IfsResUtilB.BR17564IFSError106417565P X RSysErr110517615P X RLock146317653P X RUnlock146417765P X RIFSAllocate146520033P X RIFSFree146620431P X RIFSAddToZone146720664P X RSysAllocateZero147020724P X RFreePointer147120746P X RIFSIdle147221013P X R210641301 (705)IfsVMemRes.BR21065FindVMD150121066P X RIfsNoBufsProc147321163P X RCleanupLocks150221200P X RDOPAGEIO150321240P X RPageType150421360P X RPageGroupAlign150521406P X RIfsScavenger.bs10-Aug-84 2:04:36Page 4 c8 9Ta ~ 9$T` ~ 9$T_ ~ 9$T^D~ 9$T] ~ 9$T[ ~ 9$ 9Z,c YP %TX %*\TV~ 9$TU~ 9$TT\ ~ 9$TS~ 9$TQ~ 9$TP~ 9$TOh~ 9$TN+ %*\TL~ 9$TK~ 9$TJt~ 9$TI7~ 9$TG~ 9$TF~ 9$TE~ 9$TDC~ 9$TC~ 9$TA ~ 9$T@ ~ 9$T?O ~ 9$T>~ 9$T<~ 9$T;~ 9$T:[~ 9$T9 ~ 9$T7~ 9$T6 ~ 9$T5g~ 9$ 94*+ 2 %T1 ~ 9$ 90s,c /6 9T-~ 9$ 9,+ + %T*B %*\T)~ 9$T'~ 9$T&~ 9$T%N~ 9$ 9$,c " %T! ~ 9$T Z~ 9$T %*\ 9,c  %Tf~ 9$T)~ 9$T~ 9$T~ 9$Tr ~ 9$T5~ 9$T ~ 9$T~ 9$T~ ~ 9$TA~ 9$ 9+ %T ~ 9$T M ~ 9$T  ~ 9$T~ 9$T~ 9$TY ~ 9$h. "EtP X)9_0PageGroupBase150621431P X RPageGroupSize150721454P X R21476412 (266)IfsVMemFileRes.BR21477VFileReadPage151021500P X RVFileWritePage151121525P X RVFilePageType151221552P X RVFilePageGroupSize151321560P X RVFilePageGroupBase151421574P X RVFilePageGroupAlign151521613P X RVFileDOPAGEIO151621633P X R21731233 (155)IfsOverlays.BR21732ReadOv153621733P ROverlayLockProc153722003P X ROvCleanupLocks154022032P X ROvPageType154122315P X ROvPageGroupAlign154222323P X ROvPageGroupBase154322337P X ROvPageGroupSize154422345P X ROvDOPAGEIO154522370P X RSwappedOut100022475P X RFindOverlayFromPn154622505P X RGenerateOverlays154722545P X ROverlayFaultProc6322575P X RDeclareOverlayPresent155023171P X ROverlayFirstPn155123273P X ROverlayNpages155223304P X RReadOverlay155323323P X RReleaseOverlay155423457P X R235771646 (934)IfsBTreeRes.BR23600BVRRP156023601P X RBVWRP156123614P X RBtLockCell156223727P X RBtUnlockCell156323741P X R23761162 (114)Alloc.BR23762CheckFreeNode156423763P RCheckBounds156524032P RAllocBomb156624065P RInitializeZone147424125P X RAddToZone156724240P X RrAllocate157024402P RrFree157124717P R250241043 (547)FastStreamsB.BR25025InitializeFstream157225026P X RSetupFstream157325141P X RSetEof157425230P X REofError157525266P X RStreamError123225300P X RItemSize157625312P X R25323277 (191)IfsDVec.BR25324Dvec155725325P X RDefaultArgs142525603P X R25762437 (287)IfsIsf.BR25763IndexedPageIO151725764P X RMorePageIO157726573P X RWriteFmap160027542P X RLookupFmap160127607P X RExtendFmap160227771P RNextFmap160330274P RFreeFmap160430310P X R303372355 (1261)VMem.BR30340MAPTRAP135530341P X RdefaultNoBufsProc162630776P X RFlushMapStats162731026P X Rgetgroup163031077P RFindFreeBuf163131134P X Rbot1164631277L Rmergeblocks163231315P Rdown164731515L RIfsScavenger.bs10-Aug-84 2:04:36Page 5Tc8 ~ 9$Ta ~ 9$ 9`,c _%T^D ~ 9$T] ~ 9$T[ ~ 9$TZ %*\TYP %*\TX %*\TV ~ 9$ 9U,c T\ %TS~ 9$TQ~ 9$TP ~ 9$TOh ~ 9$TN+ %*\TL~ 9$TK~ 9$TJt ~ 9$TI7 ~ 9$TG %*\TF %*\TE"@%*\TDC %*\TC ~ 9$TA ~ 9$T@ ~ 9$T?O ~ 9$ 9>+ < %T;~ 9$T:[~ 9$T9 ~ 9$T7 ~ 9$ 96,c 5g 9T4* ~ 9$T2 ~ 9$T1~ 9$T0s ~ 9$T/6~ 9$T-~ 9$T,~ 9$ 9++ *B%T) %*\T' ~ 9$T&~ 9$T%N~ 9$T$ ~ 9$T"~ 9$ 9!,c Z 9T~ 9$T ~ 9$ 9,c f 9T) ~ 9$T ~ 9$T~ 9$Tr ~ 9$T5 ~ 9$T~ 9$T~ 9$ 9~+ A 9T~ 9$T  %*\T ~ 9$T M~ 9$T  ~ 9$T~ 9$T ~ 9$TY~ 9$h. "Et X)9_0RemoveBufs163331524P RUpdateChain163431614P RADDTOMAP163531733P RMakeMapEntry163632041P Rcorepage163732116P RDeleteMapEntry164032137P RFlushBufs164132312P X Rtry165032360L Rflushout164232677P RLockCell155532736P X RUnlockCell155633024P X RDoLocks164333101P X Rdlexit165133201L RLockReloc164433204P X RCheckBPT164533215P R332242665 (1461)VMemAux.BR33225AddBuffers147533226P X RSnarfBuffer106333306P X RUnsnarfBuffer165233452P X RFlushBuffers165333475P X RIsLocked165433515P X RVirtualPage165533530P X R33553327 (215)BfsBase.BR33554BFSVirtualDA165633555P X RBFSRealDA165733627P X RBFSNonEx166033726P X RDefaultBfsErrorRtn166133740P X RBfsInitializeCbStorage166233753P X RBfsDoDiskCommand166334107P X RBfsMakeFpFromLabel166434443P X RBfsGetCb166534465P X RBFSActOnPages166635073P X RAretry167035176L RBfsDefaultCleanupRtn166735464P R355331760 (1008)TfsBase.BR35534TFSInitializeCbStorage167535535P X RTFSDoDiskCommand167635664P X RTFSGetCb167736232P X RDoRecovery170037037P X RTFSWaitQuiet170137276P X RDefaultTFSErrorRtn170237443P X RTFSNonEx170337456P X RDataFix170437467P X RTFSActOnPages170537766P X RAretry170740065L RTFSDefaultCleanupRtn170640355P R404252672 (1466)IfsScavInit.BR40426InitIFSPart1100340427P X RInitIFSPart2100541747P X RInitIFSPart3100642160P X RMakeFree171542470P RIFSFinish171642645P X RInitTimeIO171742723P R430472422 (1298)IfsScavOvInit.BR43050DeclareAllOEPs175143051P X RInitDisksFinish174343274P X R43364315 (205)IfsContextInit.BR43365InitializeContext173643366P X R4346175 (61)IfsOverlaysInit.BR43462InitOverlays174243463P X RDeclareOEP175743764P X RDeclareXEP200744042P X RFixupSwappedOut174444123P X ROverlayInit201044175P ROEPinit201144434P ROverlayScan201244522P Radvancetopage201345434P R457732312 (1226)IfsVmemInit.BR45774IfsScavenger.bs10-Aug-84 2:04:36Page 6Tc8 ~ 9$Ta ~ 9$T`~ 9$T_ ~ 9$T^D~ 9$T] ~ 9$T[~ 9$TZ~ 9$TYP~ 9$TX~ 9$TV ~ 9$TU~ 9$TT\~ 9$TS~ 9$TQ~ 9$ 9P+ Oh 9TN+ ~ 9$TL ~ 9$TK ~ 9$TJt ~ 9$TI7~ 9$TG ~ 9$ 9F,c E 9TDC ~ 9$TC~ 9$TA~ 9$T@ %*\T?O %*\T> %*\T< %*\T;~ 9$T:[ ~ 9$T9~ 9$T7 %*\ 96+ 5g 9T4* %*\T2 %*\T1~ 9$T0s ~ 9$T/6 ~ 9$T- %*\T,~ 9$T+~ 9$T*B ~ 9$T)~ 9$T' %*\ 9&+ %N %T$ ~ 9$T" ~ 9$T! ~ 9$T Z~ 9$T~ 9$T ~ 9$ 9+ f%T) ~ 9$T~ 9$ 9,c r%T5 %*\ 9- %T~ ~ 9$TA ~ 9$T ~ 9$T ~ 9$T ~ 9$T M~ 9$T  ~ 9$T ~ 9$ 9+ Y %h. "Et X)9_0InitVMem173745775P X R46233240 (160)IfsVMemSwap.BR46234AllocateVMem201446235P X RFreeVMem201646410P X RPurgeVMem201746477P X R46601346 (230)ContextSchInit.BR46602InitContextSched173546603P X R4667473 (59)VMemInit.BR46675InitializeVmem201546676P X Rdummypage202047046P R47147253 (171)BfsInit.BR47150BFSInit174047151P X RBFSTryDisk202150342P X RSetPartition202250473P R505201351 (745)Template.BR50521PutTemplate173450522P X RInterpretTemplate202350571P RPutNum202451205P X R51433713 (459)IfsBTreeOEP.BR51434InitBTreeOEP175251435P X R5146025 (21)DiskStreamsOEP.BR51461InitDiskStreamsOEP175351462P X R5151636 (30)CmdScanOEP.BR51517InitCmdScanOEP175451520P X R5156547 (39)KeywordOEP.BR51566InitKeywordOEP175551567P X R5162336 (30)StringOEP.BR51624InitStringOEP175651625P X R5165025 (21)LoadRam.BR51651LoadRam172451652P X RSetBLV205752014P X RRamConfiguration206052101P X RCheckConsts206152304P RWRamVec206252434P RRRamVec206352525P RJRam206452621P R52637767 (503)IfsMc.BR52640IfsRamImage172352641L X R572404401 (2305)ScavInit.BB (IN IfsScavenger.RUN)IfsScavInit.BR0InitIFSPart1100340427P X RInitIFSPart2100541747P X RInitIFSPart3100642160P X RMakeFree171542470P RIFSFinish171642645P X RInitTimeIO171742723P R24212422 (1298)IfsOvXMInit.BR2422InitXMOverlays17452423P X RLoadOverlayIntoXM20653272P RCountBanks20664306P R44572036 (1054)IfsContextInit.BR4460InitializeContext173643366P X R455475 (61)ScavLpt.BB (IN IfsScavenger.RUN)IfsScavLpt.BR0OpenLPT20711P X RCloseLPT2072151P X RFlushLPT2073272P X RReadLPTE2074342P X RWriteLPTE2075425P X RGetLptLpte2076516P X RIfsScavenger.bs10-Aug-84 2:04:36Page 7Tc8~ 9$ 9a,c ` %T_ ~ 9$T^D~ 9$T]~ 9$ 9[,c Z%TYP %*\ 9X- V 9TU ~ 9$TT\~ 9$ 9S,c Q 9TP~ 9$TOh ~ 9$TN+ ~ 9$ 9L+ K 9TJt ~ 9$TI7 %*\TG~ 9$ 9F,c E %TDC ~ 9$ 9C- A%T@ %*\ 9?O- > %T< ~ 9$ 9;- :[ %T9 ~ 9$ 97- 6 9T5g ~ 9$ 94*- 2 9T1~ 9$T0s~ 9$T/6 %*\T- ~ 9$T,~ 9$T+~ 9$T*B~ 9$ 9),c ' 9T& ~ 9$ 9%N+ $! " (UT! ~ 9$T Z ~ 9$T ~ 9$T~ 9$T~ 9$Tf ~ 9$ )+  &NT ~ $Tr &N*\T5 ~ $ + &NT~ %*\ A-  (UT ~"$T M~!$T ~!$T~!$T~!$TY ~!$h. "Et X)9_0ZGetLptFs2077557P X RGetLptFa2100570P X RGetLptHome2101577P X RGetLptSorted2102611P X RSetLptSorted2103624P X REnumerateLPT2104637P X RGetLpteType21051131P X RGetLpteFlags21061144P X RGetLpteLength21071157P X RGetLpteIfp21101171P X RGetLpteFa21111200P X RGetLpteIfsName21121211P X RGetLpteTfsName21131240P X RGetLpteDIFRec21141266P X RSetLpteType21151310P X RSetLpteFlags21161327P X RSetLpteLength21171346P X RSetLpteIfp21201363P X RSetLpteFa21211404P X RSetLpteIfsName21221425P X RSetLpteTfsName21231535P X RSetLpteDIFRec21241650P X R17341735 (989)ScavKbd.BB (IN IfsScavenger.RUN)IfsScavKbd.BR0OpenDisk10721P X RPhraseTerminator2137304P RScavConfirm2140355P X R542543 (355)ScavPrint.BB (IN IfsScavenger.RUN)IfsScavPrint.BR0PrintTime21351P X RPrintPLME215176P X RPrintDiskError2152262P X RPrintDiskStatus2153415P RPrintRealDA20061154P X R12311232 (666)DiskEditor.BB (IN IfsScavenger.RUN)IfsScavDEdit.BR0DiskEditor10661P X RGetNumber2166543P ROop21671070P RExaminePage21701110P RDETransferPage21711322P RTransferRetry21771366L RTransferError21721457P REditPage21731506P RExamineCell21742022P RPrintChar21752437P RDepositCell21762504P R25512552 (1386)DirDumper.BB (IN IfsScavenger.RUN)IfsScavDump.BR0DumpLPT10521P X RInterpretLPT2203266P RDumpTree1053347P X RInterpretTree22041202P RPrintHome22051445P RPrintInfo22061661P R21462147 (1127)Pass1.BB (IN IfsScavenger.RUN)IfsScavPass1.BR0Pass110541P X RPVRR2217762P X RPVWR22201050P X R11321133 (603)DiskFindHole.BR1133DiskFindHole11101134P X RFindNextHole22301326P R1451317 (207)Pass1Phase1.BB (IN IfsScavenger.RUN)IfsScav1-1.BR0Pass1Phase122221P X RreadBplRetry223663L RPhase1Retry2237344L RReadBplError2233644P RIfsScavenger.bs10-Aug-84 2:04:36Page 8Tc8~!$Ta~!$T` ~!$T_ ~!$T^D ~!$T] ~!$T[ ~ $TZ ~ $TYP ~ $TX ~ $TV~ $TU ~ $TT\ ~ $TS ~ $TQ ~ $TP ~ $TOh ~ $TN+ ~ $TL~ $TK ~ $TJt ~ $TI7 ~ $ G+ F E (UTDC~"$TC &*\TA ~!$!@,c ?O" >(UT<~"$T;~"@$T:[ ~!$T9~!$T7 ~ $ 6+ 5g# 4*(UT2 ~"$T1~!$T0s~ $T/6 ~ $T- ~ $T, ~ $T+ ~ $T*B~ $T) ~ $T'~ $T& ~ $ %N+ $" " (UT!~"$T Z ~!$T~!$T ~ $T~ $Tf~ $ )+  (UTr~"$T5~!$T~ $ + ~&NTA ~ $T ~ $ ,c $ M (UT  ~"$T ~"@$T ~!$TY ~!$h. "Et X)9_0Phase1Cleanup2234673P RPhase1Error22352576P R26472650 (1448)Pass1Phase2.BB (IN IfsScavenger.RUN)IfsScav1-2.BR0Pass1Phase222231P X RCheckFile2245111P RPrintPage22461272P R14661467 (823)Pass1Phase3.BB (IN IfsScavenger.RUN)IfsScav1-3.BR0Pass1Phase322241P X RplmRetry2251450L RbplRetry2252713L RCheckLD22471042P RPhase3Error22501404P R14311432 (794)Pass1Phase4.BB (IN IfsScavenger.RUN)IfsScav1-4.BR0Pass1Phase422251P X RFillSysDir22601764P RScavAssignDiskPage22612316P RScavReleaseDiskPage22622502P RTransferPage22632564P RTransferRetry22652611L R26722673 (1467)Pass1Phase5.BB (IN IfsScavenger.RUN)IfsScav1-5.BR0Pass1Phase522261P X RCheckLPT22702361P RPrintDefaultType22713160P RBreakCr22723214P RInsertSFTE22733227P RMakeIFSName22743301P RSetLeaderPage22753413P R36063607 (1927)Pass2.BB (IN IfsScavenger.RUN)IfsScavPass2.BR0Pass210651P X R617620 (400)Pass2Phase2.BB (IN IfsScavenger.RUN)IfsScav2-1.BR0Pass2Phase123071P X RGetLpte2312274P RPutLpte2313327P R363364 (244)Pass2Phase2.BB (IN IfsScavenger.RUN)IfsScav2-2.BR0Pass2Phase223101P X RFollowPtr2321642P RCompareRecords23221540P R21372140 (1120)Pass2Phase3.BB (IN IfsScavenger.RUN)IfsScav2-3.BR0Pass2Phase323111P X RAddDuplicates23361201P RInsertRecGen23371454P RUpdateRecGen23401575P RTreeMapper23411647P RMapTreeFunction23421725P RReadNextTreeDR23431775P RReadNextLPTDR23442014P RDIFRecFromDR23453114P R31643165 (1653)SortPkg.BB (IN IfsScavenger.RUN)SortPkg.BR0Sort23141P X RInitialize2373604P RFreeAllocatedStuff23741013P RBuildRuns23751125P RMergePass23761416P RBuildHeap23771673P RMaintainHeap24001747P RGetHeap24012173P RSiftUp24022253P RSiftDown24032340P RIfsScavenger.bs10-Aug-84 2:04:36Page 9Tc8 ~!$Ta ~ $ `+ _$ ^D (UT] ~"$T[~!$TZ~ $ YP+ X$ V (UTU ~"$TT\~!$TS~!$TQ~ $TP ~ $ Oh+ N+$ L (UTK ~"$TJt ~ $TI7 &N*\TG &N*\TF ~ $TE ~ $ DC+ C$ A (UT@ ~"$T?O~ $T> &N*\T<~ $T; ~ $T:[ ~ $T9 ~ $ 7+ 6 5g(UT4*~"$!2,c 1$ 0s (UT/6 ~"$T-~!$T,~!$!+,c *B$ ) (UT' ~"$T&~!$T%N ~ $ $+ "$ ! (UT Z ~"$T ~ $T ~ $T ~ $Tf ~ $T)~ $T ~ $T ~ $Tr ~ $ 5+   "T~~"$TA ~!$T &N*\T ~ $T ~ $T M~ $T  ~ $T~ $T~ $TY~ $h. "Et X)9_0kMergeRun24042444P RReadRecord24052647P RFillBuffer24062756P RWriteRecord24073041P RFlushBuffer24103135P RUGR24113157P R32003201 (1665)IfsDirParse.BB (IN IfsScavenger.RUN)IfsDirParse.BR0CreateFD24151P X RDestroyFD2416313P X RParseFD2240341P X RUpdateFD24171060P X RScanFD24201143P RIFSParseVersion24211334P X RIFSAppendVersion24221440P X RSetDRLength24231513P X R15651566 (886)AltoDirs.BB (IN IfsScavenger.RUN)DirScanA.BR0ScanDirBuffer24250L X R6770 (56)Dirs.BR70FindFdEntry242771P X RAdvanceBuffer2430743P RMakeNewFdEntry24311002P X RDeleteFdEntry24321142P X RParseFileName24331205P X RExtractLegalFileName24341400P RSetWorkingDir17261563P X ROpenFile11131615P X ROpenFileFromFp24352145P X RDeleteFile21302171P X RStripVersion24362421P X RAppendVersion24372474P X R25042415 (1293)DiskStreamsScan.BR2505InitScanStream24402506P X RGetScanStreamBuffer24422667P X RSretry24462751L RScanCleanupCb24443162P RFinishScanStream24413227P X RFlushRetry24473247L R3312606 (390)DiskStreams.BB (IN IfsScavenger.RUN)DiskStreams.BR0CreateDiskStream11171P X RCloseDiskStream2033367P X RResetDiskStream2032520P X RTruncateDiskStream2125533P X RRewind2451647P RResetKsState2452710P X RReleaseKs2453733P X RReadLeaderPage21271002P X RWriteLeaderPage23051041P X RLnPageSize23041072P X RKsGetDisk24541104P X RKsHintLastPageFa24551113P X RKsBufferAddress24561123P X RKsSetBufferAddress24571133P X RAccessError20301154P X RKsHandleBfsError20311165P X R12071210 (648)DiskStreamsMain.BB (IN IfsScavenger.RUN)DiskStreamsMain.BR0FixupDiskStream20341P X RCleanupDiskStream213253P X RSetLengthHint2450245P X RMustBeKs2462324P X RWriteBlock2131343P X RReadBlock1727362P X RTransferPages2460667P X RPositionPtr24451433P X RPosPtr24611476P X R16521653 (939)DiskStreamsAux.BB (IN IfsScavenger.RUN)IfsScavenger.bs10-Aug-84 2:04:36Page 10Tc8~ $Ta ~ $T` ~ $T_ ~ $T^D ~ $T]~ $ [+ Z$ YP (UTX~"$TV~!$TU~!$TT\~ $TS~ $TQ~ $TP &N*\TOh ~ $ N++ L! K "TJt ~"$"@I7- G"@TF ~"@$TE ~!$TDC ~ $TC ~ $TA ~ $T@ &N*\T?O ~ $T>~ $T< ~ $T; ~ $T:[ ~ $T9 ~ $ 7+ 6&NT5g ~ $T4* &N*\T2~ $T1 ~ $T0s &N*\T/6 ~ $ -,c ,$ + (UT*B (U*\T)~!$T'~!$T& &*\T%N~!$T$ ~!$T"~!$T! ~ $T Z~ $T ~ $T~ $T &N*\Tf~ $T) &N*\T ~ $T &N*\ r+ 5( (UT~"$T~ '*\TA ~!$T~!$T ~!$T ~!$T M ~!$T  ~ $T~ $ + Y'h. "Et X)9_0DiskStreamsAux.BR0JumpToFa11201P X RGetCurrentFa1122135P X RGetCompleteFa2443166P X RPositionPage1121215P X RFilePos2133416P X RSetFilePos2134504P X RFileLength2126601P X R706707 (455)BTreeSwap.BB (IN IfsScavenger.RUN)IfsBTreeSwap.BR0OpenFPTree22101P X RSetBTreePageLength2470363P RCloseIFSTree2027421P X RFlushBTreeState2471455P X RWriteStatePage2472501P RBtAllocPage2025537P X RBtFreePage2026644P X R704705 (453)BTreeRead.BB (IN IfsScavenger.RUN)BTreeRead.BR0ReadRecLE24731P X RMapTree221153P X RPathRecLE2474416P X RBinSearchPage2475637P RGetRecord24761032P X RPathForMinKey24771133P RBackUpOneRecord25001215P X RRepairOffsets25011240P X RCheckProgression25021375P RReadStack25031467P X RReadPageAndLockBTreePtr25041506P X RReadStackAndLockBTreePtr25051524P X RPopStack25061542P X R15571560 (880)BTreeWrite0.BB (IN IfsScavenger.RUN)BTreeWrtMs0.BR0UpdateRecord23471P X RMakeEntSeqEnt2507574P X RAppendEntSeqEnt2510636P X RFabricateIS2511670P X RFreeIS2512776P X RInsertRecords25131027P X RComputeEntLens25141354P X RAppendEntSeqEntLens25151412P X RPageLength25161515P X RDepositESL25171560P X R17301731 (985)BTreeWrite1.BB (IN IfsScavenger.RUN)BTreeWrtMs1.BR0ComplexInsertRecords25241P X RFindRightBrother2526317P X RRemoveEntry2520564P X RBasicRemoveEntry2527651P X RRemoveESE2530764P RWriteRightBrother25311046P X RWritePage25321140P X REntryLength25331221P X RFillLeftPage25341242P X RFillRightPage25351320P X RPushEntSeqEnt25221376P X RPushEntSeqEntLens25231421P X R16251626 (918)BTreeWrite2.BB (IN IfsScavenger.RUN)BTreeWrtMs2.BR0HairyInsertRecords25251P X RMakeNewRoot2521544P X RFindLeftBrother2536641P X RAddToHeap25371135P X RTrickleDown25401161P X RRemoveFromHeap25411271P X RSiftUp25421367P X R15331534 (860)BTreeDelete.BB (IN IfsScavenger.RUN)BTreeDel.BR0DeleteKey23461P X RIfsScavenger.bs10-Aug-84 2:04:36Page 11 c8(UTa~"$T` ~!$T_ ~!$T^D ~!$T]~!$T[ ~!$TZ ~!$!YP,c X" V(UTU ~"$TT\ &*\TS ~!$TQ~!$TP ~!$TOh ~!$TN+ ~!$!L,c K" Jt "TI7~"$TG~"@$TF~!$TE ~!$TDC~ $TC ~ $TA~ $T@ ~ $T?O &N*\T>~ $T< &N*\T;&N+/T:[~ $ 9+ 7$ 6 (UT5g ~"$T4* ~!$T2~!$T1 ~!$T0s~!$T/6 ~ $T- ~ $T, &N*\T+ ~ $T*B ~ $ )+ '$ & (UT%N (U*\T$ &*\T" ~!$T! &*\T Z~!$T &N*\T~ $T ~ $Tf ~ $T) ~ $T ~ $T &N*\ r+ 5$  (UT (U*\T~ ~!$TA~!$T~ $T ~ $T ~ $T M~ $ + $  "TY~"$h. "Et X+_0FatherMayNeedWork2543404P RChangeInFather25441070P R11521153 (619)VMemSwap.BB (IN IfsScavenger.RUN)IfsVMemSwap.BR0AllocateVMem201446235P X RFreeVMem201646410P X RPurgeVMem201746477P X R345346 (230)IfsVMemFileSwap.BR346OpenVFile2545347P X ROpenVFileFromFP2221451P X RCloseVFile2227677P X RMarkDirtyVFiles2546742P X RMarkVFileIfDirty25471037P R1102535 (349)IfsIsfInit.BR1103InitFmap25511104P X Rfail25521441L R1534432 (282)TfsWrite.BB (IN IfsScavenger.RUN)TfsWrite.BR0TFSWritePages17651P X RWretry2555373L RCheckFreePage2553600P RCheckFreePageErr2554650P RTFSAssignDiskPage1770707P X R12011202 (642)TfsCreate.BB (IN IfsScavenger.RUN)TfsCreate.BR0TFSCreateFile17671P X RTFSDeletePages1766324P X RTFSReleaseDiskPage1771555P X R704705 (453)IfsDDMgrSwap.BR705IFSCreateDDMgr1746706P X RIFSLockDD17621016P X RIFSUnlockDD17631035P X RIFSReadDDPage17641102P X RIFSOpenDD17601140P X RIFSCloseDD17611222P X RFlushKDs25571240P X R1346442 (290)TfsInit.BB (IN IfsScavenger.RUN)TfsInit.BR0TFSInit21471P X RTFSTryDisk2563717P X RTryDisk2564770P RTFSDiskModel25651122P X RDetermineDiskModel25661132P RTFSSetDisk25671352P X R15561557 (879)TfsClose.BR1557TFSClose17721560P X RTFSWriteDiskDescriptor25621624P X R1710132 (90)BfsWrite.BB (IN IfsScavenger.RUN)BfsWrite.BR0BFSWritePages17321P X RWretry2572357L RCheckFreePage2571562P RBFSAssignDiskPage2003627P X R11371140 (608)BfsCreate.BB (IN IfsScavenger.RUN)BfsCreate.BR0BFSCreateFile20021P X RBFSDeletePages2001334P X RBFSReleaseDiskPage2004573P X R712713 (459)BfsDDMgr.BR713BFSCreateDDMgr1730714P X RBFSDestroyDDMgr2000772P X RBFSCloseDD17731012P X RBFSLockDD17741031P X RBFSUnlockDD17751055P X RBFSReadDDPage17761104P X RIfsScavenger.bs10-Aug-84 2:04:36Page 12Tc8 &*\Ta ~ $ `+ _! ^D (UT] ~ 9$T[~ 9$TZ~ 9$!YP,c X&TV~!$TU~!$TT\ ~!$TS~!$TQ &N*\ P,c Oh &NTN+~ $TL~ $ K,c Jt! I7 "TG ~"$TF~!$TE ~!$TDC &*\TC &*\ A+ @" ?O "T> ~"$T< ~!$T; &*\!:[,c 9&T7 ~!$T6~ $T5g ~ $T4* ~ $T2~ $T1 ~ $T0s~ $ /6,c - , "T+~"$T*B ~!$T)~!$T' ~ $T& &N*\T%N ~ $ $+ " T!~ $T Z &N*\ ,c !  "Tf ~"$T)~!$T ~!$T &*\ r+ 5"  "T ~"$T~ ~!$TA &*\!,c !T ~!$T M~!$T  ~ $T~ $T ~ $TY ~ $h. "Ett X(_0lBFSFlushDD17771152P X RBFSTransferDDPage25731200P R1301367 (247)BfsInit.BB (IN IfsScavenger.RUN)BfsInit.BR0BFSInit174047151P X RBFSTryDisk202150342P X RSetPartition202250473P R13501351 (745)BfsClose.BR1351BFSClose20051352P X RBFSWriteDiskDescriptor17311416P X R1477127 (87)CmdScan.BB (IN IfsScavenger.RUN)IfsCmdScan.BR0InitCmd10551P X RCSCloses2040211P X RCSGets2035233P X RCSEndofs2037304P X RCSPuts2036326P X RCSResets2041351P X RNextPhrase2574375P X RDefaultPhrase2277473P X RBeginDefaultPhrase2145524P X REndDefaultPhrase2146535P X REnableCatch2141605P X RXCatchPC2575633P RDisableCatch2576676P X REndCatch2143714P X RErasePhrase2577770P X RBackupPhrase23031065P X RDoBackup26001142P RCurrentPhrase26011233P X RTerminatingChar21441250P X RCmdErrorCode26021272P X R13071310 (712)CmdScanEdit.BB (IN IfsScavenger.RUN)CmdScanEdit.BR0GetPhrase26051P X REditPhrase2606141P RAppendChar2603505P X RBackupChars2607561P REraseInput2604702P X REraseBackTo2610746P RFindPhrase26111003P RRetypeCmd26121032P R11071110 (584)IfsScavCSDsp.BR1110DefErase20441111P X RDefBreak20421353P X RDefEcho20431407P X RDefError20451436P X RCmdError23021573P X RInvertWindow21501635P X R1676567 (375)CmdScanAux.BB (IN IfsScavenger.RUN)CmdScanAux.BR0GetNumber10711P X RNumberHelp2613251P RGetString2300355P X RGetFile2207464P X RConfirm1070616P X RGetKeyword1057775P X RKeywordHelp26141231P RPrintKeyword26151274P R13741375 (765)Keywords.BB (IN IfsScavenger.RUN)KeywordInit.BR0CreateKeywordTable10501P X RKTInsert2046110P X RKTDelete2047274P X R401402 (258)Keyword.BR402KTLookup2050403P X RKTEnumerate2051532P X RKTDestroy2052603P X RIfsScavenger.bs10-Aug-84 2:04:36Page 13Tc8 ~ $Ta &N*\ `,c _ ^D "T]~ 9$T[ ~ 9$TZ ~ 9$ YP+ X TV~ $TU &N*\ T\,c S Q (UTP~"$TOh~!$TN+~!$TL~!$TK~!$TJt~!$TI7 ~!$TG ~!$TF &*\TE &*\TDC ~!$TC~!$TA ~!$T@~!$T?O ~!$T> ~ $T<~ $T; ~ $T:[~ $T9 ~ $ 7+ 6$ 5g (UT4*~"$T2 ~!$T1 ~!$T0s ~!$T/6 ~!$T- ~!$T, ~ $T+~ $ *B+ )&NT'~ $T&~ $T%N~ $T$~ $T"~ $T! ~ $ Z,c #  (UT~"$Tf ~!$T)~!$T~!$T~!$Tr ~!$T5 ~ $T ~ $ + ~! A (UT (U*\T ~!$T ~!$! M,c  !T~!$T ~!$TY~!$h. "Etd X(_0GetKTE2621652P X RCompareKey2053671P X RBinarySearch2620713P X R773372 (250)Strings.BB (IN IfsScavenger.RUN)StringStreams.BR0CreateStringStream22411P X RStringGetOv2054106P X RStringPutOv2055126P X RStringCloses2056145P X R207210 (136)StringUtil.BR210ExtractSubstring1750211P X RConcatenateStrings2622277P X RCopyString2136435P X RStringCompare2264455P X R634425 (277)OsUtils.BB (IN IfsScavenger.RUN)OsUtils.BR0Wss10561P X RWs104534P X RWl262445P X RWns230161P X RWos2625246P X RWo2626265P X RGetFixedInit2627276P X RGetFixed2413306P X RFreeFixed2414353P X RFixedLeft2412432P X RSetEndCode2630456P X R465466 (310)Template.BR466PutTemplate173450522P X RInterpretTemplate202350571P RPutNum202451205P X R1400713 (459)Password.BB (IN IfsScavenger.RUN)Password.BR0Password23501P X R512513 (331)Time.BB (IN IfsScavenger.RUN)IfsTimeIO.BR0WRITEUDT10461P X RWritePackedDT2632433P X RMONTHNAME2633453P X RFINDMONTH2634465P X R553554 (364)TimeConvb.BR554UNPACKDT2212555P X RPACKDT26351126P X RWEEKDAY26361554P X RCheckDateGE26371600P RSetupULT26401675P R20761323 (723)SYS.BKJunta174115P XOsFinish1150100021P XCallSwat1075100032P XUpdateTimer1347100042P XCOMMON 5076STATICS10002641Undefined namesfirst referenced in IfsOvXMInit.BR:primaryIFS20670UNDEF Xfirst referenced in IfsDirParse.BR:MakeKPMTemplate24240UNDEF Xfirst referenced in IfsVMemFileSwap.BR:LookupIFSFile25500UNDEF Xfirst referenced in IfsDDMgrSwap.BR:ifsDDMgr25600UNDEF Xfirst referenced in IfsDDMgrSwap.BR:driveTab25610UNDEF Xfirst referenced in TfsInit.BR:IfsScavenger.bs10-Aug-84 2:04:36Page 14Tc8~!$Ta ~!$T` ~!$!_,c ^D ](UT[ (U*\TZ ~!$TYP ~!$TX ~!$!V,c U &TT\ &*\TS &*\TQ ~!$TP ~!$!Oh,c N+ L "TK~"$TJt~"@$TI7~"@$TG~"@$TF~!$TE~!$TDC ~!$TC~!$TA~!$T@~!$T?O ~!$!>,c < !T; ~ 9$T:[ %*\T9~ 9$ 7,c 6! 5g "T4*~"$!2,c 1 0s "T/6~"$T- ~!$T,~!$T+~!$!*B,c ) !T'~!$T&~ $T%N~ $T$ ~ $T"~ $ !+ ZT~"@$T~$T~$Tf ~$ p   #T~ ~"$ A#T~"$ 'T ~"$ M$T ~"$ $T~"$ Yh. "Et X(_0DTFSCreateDDMgr25700UNDEF XIfsScavenger.bs10-Aug-84 2:04:36Page 15Tc8 ~"$h. "EtD g7QIfs.BRIfsScavenger.BRscratchDisk10110V XscavDisk10120V XnumFiles10130V XnumPages10140V Xlpt10150V Xpass10160V Xphase10170V XeditHomeFlag10200V XinitTreeFlag10210V XinitLptFlag1022177777V XdebugFlag10230V XjustFixDirFlag10240V XkbdKT10250V kbdCS10260V IfsScavCompare.BRIfsResUtilA.BRIfsBcplRuntime.BRifsRuntime11540V XPupAl1A.BRHLookup11660V XHInsert11670V XHDelete11700V XHEnumerate11710V XContext.BRCtxCaller11740V XCtxSwitch11760V XContextSched.BRschedSavedUFP12020V XschedMask12030V XIfsCallProc.BRIfsDDMgrRes.BRAltoQueue.BRAltoTimer.BRAltoByteBlt.BRTimeConvA.BRIfsFastStreamsA.BRBfsMl.BRlvIdle12640V XIfsBcplTricks.BRIfsCalls.BRCalendar.BRVMemA.BRTfsA.BRDspStreamsB.BRDspStreamsA.BRGacha10.BRKeyStreamsB.BRkeys14320V XKeyStreamsA.BRkbUserProcStack14410V XkbInterruptReMask14440V XkbUserProc14450V XCursorLink1446177777V XIfsResUtilB.BRsnarfTable14500V XchunkQ14510V XoPageQ14520V XbigZone14530V XsmallZone14540V XsmallZoneOverflows14550V XbigZoneOverflows14560V XnumOverflowPages14570V XmaxOverflowPages14600V XnetAllocBlocks14610V XdontSnarf1462177777V XIfsVMemRes.BRvmdt14760V XvmStats14770V XvmemBufferShortages15000V XIfsVMemFileRes.BRIfsOverlays.BRoVmd15200V XovPageSize15210V XlogOvPageSize15220V XIfsScavenger.bs10-Aug-84 2:04:36Page 16 c8 aT` ~"$T_~"$T^D~"$T]~"$T[~"$TZ~"$TYP~"$TX ~"$TV ~"$TU ~$TT\~"$TS ~"$TQ~"$TP~"$ Oh N+ LTK ~"$ Jt TI7~"$TG~"$TF~"$TE ~"$ DC TC~"$TA~"$ @T?O ~"$T>~"$ < ; :[ 9 7 6 5g 4*T2~"$ 1 0s /6 - , + *B ) ' T&~"$ %N T$~"$T" (U*\T! ~"$T Z ~$  T ~"$T~"$Tf~"$T)~"$T~"$T (U*\Tr (U*\T5 (U*\T (U*\T ~"$T~~$ A T~"$T ~"$T  (U*\ M  T~"$T ~"$TY ~"$h. "Et X%+_02logOvVmPages15230V XovFirstPage15240V XnumOvXMPages15250V XnumOvXMPagesPerBank15260V XoffsetResidentXM15270V XOverlayEntry610V XOverlaySave620V XFirstOD15300V XEndOD15310V XFirstOEP15320V XEndOEP15330V XOverlayFp15340V XOverlayDisk15350V XIfsBTreeRes.BRAlloc.BRAllocate11010V XFree11230V XFastStreamsB.BRIfsDVec.BRIfsIsf.BRVMem.BRSOFTMAPFLAG13560V XHASHMAP640V XHASHMAPSIZE650V XHASHMAPSIZE2660V XHASHMAPMASK670V XHASHMAP1700V XHASHMAPTOP710V XMAPSTATBASE16050V XMapStatPtr720V XEMPTYXX16060V XNAXX16070V XMapStatProc16100V XBpt730V XBptLast740V XNoBufsProc16110V XLockedCells16120V XLastLockedCell16130V XEndLockedCells16140V XCheckBPTflag16150V XReprobeInc7532V XAnyDirty16160V LastTrapTime16170V TSA16200V TSA116210V AgingInterval16220V RefLockedCells1623177777V LockOnly16240V XLockZero16250V XVMemAux.BRBfsBase.BRTfsBase.BRTFSLeaveDisplay16710V XTFSSavedDisplay1672177777V XTFSLock16730V XTFSDebug16740V XIfsScavInit.BRifsCtxQ10100V XnumVMemBufs10620V XbfsDDMgr17100V XtfsDDMgr17110V XsavedUFP17120V spyBuffer17133200V isb17140V XIfsScavOvInit.BRIfsContextInit.BRIfsOverlaysInit.BRIfsVmemInit.BRIfsVMemSwap.BRContextSchInit.BRVMemInit.BRBfsInit.BRTemplate.BRIfsBTreeOEP.BRDiskStreamsOEP.BRCmdScanOEP.BRIfsScavenger.bs10-Aug-84 2:04:36Page 17Tc8 ~"$Ta ~"$T` ~"$T_ (U*\T^D (U*\T] "$T[ "$TZ~"$TYP~"$TX~"$TV~"$TU~"$TT\ ~"$ S QTP~"$TOh~"$ N+ L K JtTI7 ~"$TG"$TF "$TE "$TDC "$TC"$TA "$T@ ~"$T?O "$T>~"$T<~"$T; ~"$T:["$T9"$T7 ~"$T6 ~"$T5g ~"$T4* ~"$T2 ~"$T1 "@$T0s~"$T/6 ~"$T-~"$T,~"$T+ ~"$T*B ~$T)~"$T'~"$ & %N $ T"~"$T!~$T Z~"$T~"$  T~"$Tf ~"$T)~"$T~"$T~"$Tr~ $T5~"$   ~ A   M    Y h. "Et X%+_0bKeywordOEP.BRStringOEP.BRLoadRam.BRIfsMc.BRIfsScavInit.BRIfsOvXMInit.BRIfsContextInit.BRIfsScavLpt.BRIfsScavKbd.BRIfsScavPrint.BRIfsScavDEdit.BReditDisk21550V label21560V data21570V number21600V address21610V numberTyped21620V pageOpen21630V cellOpen21640V pageDirty21650V IfsScavDump.BRonlyDIFs22000V printTreeStructure22010V printFileIDs22020V IfsScavPass1.BRwordsPerPage11070V XbytesPerPage11150V Xplme21540V Xbpl22130V XmaxVDA22140V XifsPackFlag2215177777V XplmVmd22160V DiskFindHole.BRIfsScav1-1.BRfreeQ22310V cmdQ22320V IfsScav1-2.BRprintLPTE22420V printPLME22430V curVDA22440V IfsScav1-3.BRIfsScav1-4.BRbitTable22530V sysDirFp22540V newVDA22550V data22560V label22570V IfsScav1-5.BRsft22660V home22670V IfsScavPass2.BRtree23060V XIfsScav2-1.BRIfsScav2-2.BRbitTable23150V maxLevel23160V lastRecord23170V numRecords23200V IfsScav2-3.BRtreeDR23270V lptDR23300V difDR23310V dupLpt23320V giveMeATreeDR23330V leftoverLPTE23340V treeChanged23350V SortPkg.BRSortZone23510V SortDisk23520V ReleaseZone23530V Files23540V Level23550V ItemIsLeftOver23560V LeftoverItem23570V LeftoverItemLen23600V MaxHeapSize23610V IfsScavenger.bs10-Aug-84 2:04:36Page 18 c8 a ` _ ^D ] [ Z YP X VTU~"$TT\~"$TS~"$TQ~"$TP~"$TOh ~"$TN+~"$TL~"$TK~"$ Jt TI7~"$TG (U*\TF ~"$ ETDC ~"$TC ~"$TA~"$T@~"$T?O~"$T> ~$T<~"$ ; :[ T9~"$T7~"$ 6 T5g~"$T4*~"$T2~"$ 1 0s T/6~"$T-~"$T,~"$T+~"$T*B~"$ ) T'~"$T&~"$ %NT$~"$ " ! T Z~"$T~"$T ~"$T ~"$ f T)~"$T~"$T~"$Tr~"$T5 ~"$T ~"$T ~"$ ~ TA~"$T~"$T ~"$T ~"$T M~"$T  ~"$T ~"$T~"$TY ~"$h. "Et| X%+_0VRecordSize23620V BufferSize23630V InputFinished23640V Heap23650V HeapSize23660V FirstFreeEnt23670V MaxItemWords23700V OccItemWords23710V DeleteScratch23720V XIfsDirParse.BRDirScanA.BRDirs.BRdirVersions24260V XDiskStreamsScan.BRDiskStreams.BRDiskStreamsMain.BRDiskStreamsAux.BRIfsBTreeSwap.BRlenFMap1733144V XLockBTreePtr23230V XUnlockBTreePtr23240V XFreeBTreePage23250V XReadBTreePage23260V XbtQ24630V WriteBTreePage24640V XAllocateBTreePage24650V XBTreeBug24660V XCloseBTree24670V XBTreeRead.BRBTreeWrtMs0.BRBTreeWrtMs1.BRBTreeWrtMs2.BRBTreeDel.BRIfsVMemSwap.BRIfsVMemFileSwap.BRvFileVMI20700V XIfsIsfInit.BRTfsWrite.BRTfsCreate.BRIfsDDMgrSwap.BRddVMI25560V XTfsInit.BRTfsClose.BRBfsWrite.BRBfsCreate.BRBfsDDMgr.BRBfsInit.BRBfsClose.BRIfsCmdScan.BRCmdScanEdit.BRIfsScavCSDsp.BRCmdScanAux.BRKeywordInit.BRInsertKeyword10510V XDestroyKeywordTable21420V XEnumerateKeywordTable22760V XLookupKeyword26160V XDeleteKeyword26170V XKeyword.BRStringStreams.BRStringUtil.BROsUtils.BRfreeFixedList26230V Template.BRPassword.BRIfsTimeIO.BRmonthNames17470V XTimeConvb.BRSYS.BKdsp10472V XsysDisk1074143V XsysZone1102221V XlvUserFinishProc1151100027V XOsBuffer1442100015V XOsVersion1720100023V XlvSwatContextProc1721100034V XIfsScavenger.bs10-Aug-84 2:04:36Page 19Tc8 ~"$Ta ~"$T` ~"$T_~"$T^D~"$T] ~"$T[ ~"$TZ ~"$TYP ~"$ X V UTT\ ~"$ S Q P Oh N+TL~!$TK ~"$TJt ~"$TI7 ~"$TG ~"$TF~"$TE ~"$TDC (U*\TC~"$TA ~"$ @ ?O > < ; :[ 9T7~"$ 6 5g 4* 2T1~"$ 0s /6 - , + *B ) ' & %N $ " T! ~"$T Z (U*\T (U*\T ~"$T ~"$ f )   Tr ~"$ 5   T~ ~"$ A T ~"$T ~!$T M~!$T  $*\T~$T~$TY $*\h. "Et~ X%+_0AltoVersion1722100046V XlvSysZone1725222V XUserName2631100017V XIfsScavenger.bs10-Aug-84 2:04:36Page 20Tc8 ~$Ta~!$T`~$h. "Etv d0GACHA]H]G *<----gggAgoggg^gogeg|p&g'gpg'g|gpDggog'g\gxg'ggB Ϥh@ "gg"h:klW EMPRESS.RUN9,9,~|~ gxh!;@x9,~g𾴓?9,ghhhT#L*'07>bEcLSZb`agmsJxyZ" =i#B : Z" ic*J " : J4" =J+" =P#B" B " "@p %9HE% =;E-%E=]: Z" =$#i"Eb" =`E_%]K]Y: Z:Z =U]U" =#9Q  0123456789ia PZ9Z" PB =3Z" =#i*M)"* iY "P =Z" =֞#i*M" B ": -MU" PER"j/|zC=@IfsScavenger.bsU HBoggs10-Aug-84 2:04:36 7F 65 5g. 4*! 2* 1# 0s /6h. "Et 3546S// Pass2Phase2 (cont'd)if treeOK then[if numRecords ne tree>>TREE.RecordCount thenWs("*N[2-2] Record counts disagree")tree>>TREE.RecordCount = numRecordstree>>TREE.StateDirty = true// reconstruct the free listlet numFreePages = 0tree>>TREE.FirstFreePage = 0tree>>TREE.StateDirty = truefor i = 1 to tree>>TREE.GreatestPage doif (bitTable!(i/16) & (1 lshift (i rem 16))) eq 0 then[numFreePages = numFreePages +1FreeBTreePage(tree, i)]PutTemplate(dsp, "*N[2-2] $UD levels, $UD pages allocated, $UD used, $UD free.",maxLevel, tree>>TREE.GreatestPage, numPages, numFreePages)]if bitTable ne 0 then Free(sysZone, bitTable)if tree ne 0 then CloseIFSTree(tree)unless treeOK doif (initTreeFlag? true, ScavConfirm("*N[2-2] May I initialize the tree?")) then[CloseIFSTree(OpenFPTree(fpIfsDir, scavDisk, CallSwat, CallSwat, true))initTreeFlag = truetreeOK = true]FlushBuffers()resultis treeOK]IfsScav2-2.bcpl11-Feb-84 21:56:37Page 3 a _ ^D ], [$ Z# YP V U T\ S Q' P6OhN+LK JtP I7: G E- DC$ A @O ?O >F < ; :[ 7 6 5gh. "Et 9f80"//---------------------------------------------------------------------------and FollowPtr(ptr, level) = valof//---------------------------------------------------------------------------// ptr purports to be a pointer to (ie a page number of) a page at 'level'.// The root page is at level 0. Check and follow ptr if it appears ok.[if ptr eq 0 then //we touched bottom[if maxLevel eq 0 then maxLevel = level //first time onlytest level eq maxLevel //do we always touch bottom at the same level?ifso resultis trueifnot [ Ws("*N[2-2] Tree is not of uniform depth"); resultis false ]]// mark the page as accessible in the bit tableif Usc(ptr, tree>>TREE.GreatestPage) gr 0 then[ Ws("*N[2-2] Pointer gr TREE.GreatestPage"); resultis false ]let bitWord = bitTable!(ptr/16)let pageBit = 1 lshift (ptr rem 16)test (bitWord & pageBit) eq 0ifso bitTable!(ptr/16) = bitWord % pageBitifnot [ Ws("*N[2-2] Two pointers to same B-Tree page"); resultis false ]let page = 0; LockBTreePtr(tree, lv page)let ok = valof //ptr seems reasonable, follow it.[page = ReadBTreePage(tree, ptr)numPages = numPages +1if page>>BTP.FreeWords ls 0 then[ Ws("*N[2-2] Free page encountered"); resultis false ]let pageLength = 1 lshift tree>>TREE.LogPageLengthif page>>BTP.FreeWords gr 2*pageLength/3 & level ne 0 & debugFlag thenWs("*N[2-2] Page is < 1/3 full") //non fatal according to EMMif page>>BTP.FreeWords gr pageLength-PageOverhead then[ Ws("*N[2-2] BTP.Freewords > maxFreeWords"); resultis false ]unless FollowPtr(page>>BTP.MinPtr, level+1) resultis falselet recordsOnThisPage = 0let bte = lv page>>BTP.BTEBlocklet end = (page + pageLength) - page>>BTP.FreeWordswhile Usc(bte, end) ls 0 do[numRecords = numRecords +1recordsOnThisPage = recordsOnThisPage +1let record = lv bte>>BTE.Recordif (record>>DR.header & drHeaderMask) ne 0 then[ Ws("*N[2-2] Malformed dr"); resultis false ]if lastRecord ne 0 thenif CompareRecords(lastRecord, record) ge 0 then[ Ws("*N[2-2] Records out of order"); resultis false ]lastRecord = recordunless FollowPtr(bte>>BTE.GrPtr, level+1) resultis falsebte = bte + 1 + record>>DR.length]if bte ne end then [ Ws("*N[2-2] BTE overflow"); resultis false ]if level ne 0 & recordsOnThisPage ls 4 & debugFlag thenWs("*N[2-2] Page has < 4 records") //non fatal according to EMMresultis true]UnlockBTreePtr(tree, lv page)resultis ok]IfsScav2-2.bcpl11-Feb-84 21:56:37Page 4 aM `! _M ^DK ]G [ Z% YP X9 VF U T\D S P/ Oh. N+> L K# Jt I7* GH E) DC2 C A @ ?O >7 <2 ;F :[> 96 7> 5g: 2 1 0s3 /6 - , +( *B )/'. &%N/$6 " !8 Z!  A 7 f@ )   5 h. "Et H 4 Q//---------------------------------------------------------------------------and CompareRecords(r1, r2) = valof//---------------------------------------------------------------------------// Compares two B-Tree records in the same manner as DirCompareKey.// This differs from DirCompareKey in that it compares two records// rather than a key and a record.// If a dr is malformed, return 0, which will terminate the scan.// Returning 0 will cause a bogus "Records out of order" message.[// find position of last "!" in first recordlet lenBodyString = nilfor i = r1>>DR.pathName.length to 1 by -1 doif r1>>DR.pathName.char^i eq $! then [ lenBodyString = i; break ]// Compare chars in the "name!" (string) portionlet lenR2 = r2>>DR.pathName.lengthfor i = 1 to lenBodyString do[// If we run off the end of r2 then r1 is greater.if i gr lenR2 resultis 1let c1 = r1>>DR.pathName.char^ilet c2 = r2>>DR.pathName.char^iif c1 ne c2 then[// Lower-case alphabetics collate with upper-caseif c1 ge $a & c1 le $z then c1 = c1-($a-$A)if c2 ge $a & c2 le $z then c2 = c2-($a-$A)if c1 ne c2 then[// Definitely a mismatch. If all remaining characters of the// record are digits then the record body is an initial substring// of the key and we declare the key to be greater. Otherwise we// return the result of comparing the mismatching character codes.if c1 ls c2 thenfor j = i to lenR2 do[let digit = r2>>DR.pathName.char^j - $0if digit ls 0 % digit gr 9 resultis Usc(c1, c2)]resultis 1]]]// bodies equal, now parse the version strings and compare them numerically.// It must be possible to parse r1's version; if not, the record is malformed.// If the attempt at parsing r2's version is unsuccessful, then// return -1 so that, e.g., "foo!123" collates before "foo!xyz!1".let v1 = 0for i = lenBodyString+1 to r1>>DR.pathName.length do[let digit = r1>>DR.pathName.char^i - $0if digit ls 0 % digit gr 9 then[ Ws("*N[2-2] Malformed dr"); resultis 0 ] //see comment abovev1 = 10*v1+digit]let v2 = 0for i = lenBodyString+1 to lenR2 do[let digit = r2>>DR.pathName.char^i - $0if digit ls 0 % digit gr 9 resultis -1 //non-digit encounteredv2 = 10*v2+digit]resultis Usc(v1, v2)]IfsScav2-2.bcpl11-Feb-84 21:56:37Page 5 aM `" _M ^DC ]B [# ZA YPA X V, U T\, SA P5 Oh" N+ L K2 Jt G F E DC C1 A+ @+ ?O><=;A:[A9B765g4*'2/10s /6 - , *BL )N '? &C %N $4 " !' Z ?   f )#  ' r? 5   ~h. "Et }4T // IfsScav2-3.bcpl - Pass 2 Phase 3// Copyright Xerox Corporation 1980, 1981, 1982, 1983// Last modified June 16, 1983 8:25 PM by Boggsget "IfsScavenger.decl"get "IfsDirs.decl"get "BTree.decl"get "Disks.d"external[// outgoing proceduresPass2Phase3// incoming proceduresGets; Puts; Closes; ResetsOpenFile; CreateDiskStream; CreateDiskFileFileLength; GetCurrentFa; WriteBlock; ExtendFileAllocate; Free; IFSError; MoveBlock; Zero; ReadCalendarDoubleDifference; DoubleIncrement; MultEq; UscInitializeContext; Block; Enqueue; UnqueueCreateStringStream; CopyString; StringCompareReadLPTE; WriteLPTE; GetLptLpteOpenLPT; EnumerateLPT; CloseLPTGetLpteIfsName; GetLpteIfp; GetLpteFa; GetLpteDIFRecSetLpteIfsName; SetLpteIfp; GetLpteFlags; GetLpteTypeDirEntryLength; CompareRecords; PasswordMapTree; UpdateRecord; DeleteKeyOpenFPTree; CloseIFSTree; FlushBuffersWs; Wss; PutTemplate; PrintTime// incoming staticskeys; dsp; sysZone; ifsCtxQscavDisk; scratchDisk; tree; phase; lptinitTreeFlag; debugFlag]static[treeDR; lptDR; difDR; dupLptgiveMeATreeDR; leftoverLPTE; treeChanged]manifest[// error codesecMalformedLPTE = 508ecUpdateRecord = 509]IfsScav2-3.bcpl11-Feb-84 21:56:37Page 1 c8# a5 `0 ^D ] [ Z X V U T\ Q P Oh* N+0 L7 K. Jt* I7- G F E4 DC5 C( A @& ?O < ; :[' 9 7 5g 4* 2 1( 0s - , + *B ) 'h. "Et +%+=//-----------------------------------------------------------------------------------------let Pass2Phase3() = valof//-----------------------------------------------------------------------------------------// This phase enumerates the directory and the leader page table in parallel.// The LPT is the truth about what should be in the directory, so any// disagreements are resolved by changing the tree.// The algorithm is://lptDR > treeDR: delete treeDR, read next treeDR//lptDR = treeDR: read next lptDR, read next treeDR//lptDR < treeDR: insert lptDR, read next lptDR[phase = 3Ws("*N[2-3]"); if debugFlag then Gets(keys)if initTreeFlag & not debugFlag thenWs("*N[2-3] Initializing the directory B-Tree; only DIFs will be mentioned")// open the tree and set up its reader processlet fpIfsDir = vec lFP; Zero(fpIfsDir, lFP)let ifsDir = OpenFile("Ifs.dir", 0, 0, 0, fpIfsDir, 0, 0, 0, scavDisk)if ifsDir eq 0 then IFSError(ecScavengeeFile, "Ifs.dir")Closes(ifsDir)tree = OpenFPTree(fpIfsDir, scavDisk, CompareRecords, DirEntryLength, false)let treeMapper = InitializeContext(Allocate(sysZone, 1024), 1024, TreeMapper)Enqueue(ifsCtxQ, treeMapper)giveMeATreeDR, treeChanged = false, falseResets(lpt)dupLpt = 0leftoverLPTE = falselptDR = Allocate(sysZone, maxDRLength); Zero(lptDR, maxDRLength)difDR = Allocate(sysZone, maxDRLength); Zero(difDR, maxDRLength)treeDR = Allocate(sysZone, maxDRLength); Zero(treeDR, maxDRLength)CopyString(lv treeDR>>DR.pathName, "!1")IfsScav2-3.bcpl11-Feb-84 21:56:37Page 2 a[ ` _[ ^DM ]E [4 Z YPT/ XT1 VT- U T\ S+ Q$ PL N+. L+ KF Jt8 I7 GL FM E DC) A @ ?O >@ <@ ;B :[+h. "Et >Z=+.// Pass2Phase3 (cont'd)let startTime = vec 1; ReadCalendar(startTime)ReadNextLPTDR()ReadNextTreeDR()[switchon valof[if treeDR>>DR.type eq 0 & lptDR>>DR.type eq 0 break //all doneif lptDR>>DR.type eq 0 resultis -1 //lpt ran outif treeDR>>DR.type eq 0 resultis 1 //tree ran outresultis CompareRecords(treeDR, lptDR)] into[case -1: //treeDR < lptDR[PutTemplate(dsp, "*N[2-3] Deleting tree entry *"$S*"",lv treeDR>>DR.pathName)DeleteKey(tree, treeDR)treeChanged = trueReadNextTreeDR()endcase]case 0: //treeDR = lptDR[let update = falsetest lptDR>>DR.type eq drTypeDIFifso update = trueifnot[@lv treeDR>>DR.fp.unit = treeDR>>DR.fp.unit@lv lptDR>>DR.fp.unit = lptDR>>DR.fp.unitunless MultEq(lv treeDR>>DR.fp,lv lptDR>>DR.fp,lFP) do[PutTemplate(dsp, "*N[2-3] Updating tree entry *"$S*"",lv lptDR>>DR.pathName)update = true]]if update then UpdateRecord(tree, lptDR, UpdateRecGen, lptDR)ReadNextTreeDR()ReadNextLPTDR()endcase]case 1: //treeDR > lptDR[if not initTreeFlag % lptDR>>DR.type eq drTypeDIF % debugFlag doPutTemplate(dsp, "*N[2-3] Inserting tree entry *"$S*"",lv lptDR>>DR.pathName)UpdateRecord(tree, lptDR, InsertRecGen, lptDR)ReadNextLPTDR()endcase]]] repeatIfsScav2-3.bcpl11-Feb-84 21:56:37Page 3 a _. ^D ] [ Z YP X? V1 U2 T\& S Q POhN+6LKJtI7GF EDCCA@?O><+;):[697665g 4*21=0s/6-, +*B)@'7&%N.$"! Z h. "Et #1UFl// Pass2Phase3 (cont'd)UpdateRecord(tree, difDR, UpdateRecGen, difDR) //updates last difPrintTime(startTime)if dupLpt ne 0 then[EnumerateLPT(dupLpt, AddDuplicates)dupLpt = CloseLPT(dupLpt, true)]// If the tree is more than 90% full, extend it by 50% if there is room.let greatestPage = tree>>TREE.GreatestPagetree = CloseIFSTree(tree)let st = CreateDiskStream(fpIfsDir, 0, 0, 0, 0, 0, 0, scavDisk)let fa = vec lFA; FileLength(st); GetCurrentFa(st, fa)Closes(st)if (fa>>FA.pageNumber/10)*9 ls greatestPage thenExtendFile(st, (fa>>FA.pageNumber/2)*3, 0)// clean up and go awayUnqueue(ifsCtxQ, treeMapper)Free(sysZone, treeMapper)treeDR = Free(sysZone, treeDR)lptDR = Free(sysZone, lptDR)difDR = Free(sysZone, difDR)FlushBuffers()resultis true]//-----------------------------------------------------------------------------------------and AddDuplicates(lpt, lpte, nil) be//-----------------------------------------------------------------------------------------[let drName = lv lptDR>>DR.pathNamelet ss = CreateStringStream(drName, maxPathNameChars)let ifp = GetLpteIfp(lpte)PutTemplate(ss, "Duplicate>VDA$EUO", lv ifp>>IFP.da)let ifsName = GetLpteIfsName(lpte)for i = 1 to ifsName>>String.length do[if drName>>String.length ge maxPathNameChars break// turn directory punctuation into harmless dasheslet char = ifsName>>String.char^iif char eq $> % char eq $< then char = $-Puts(ss, char)]Closes(ss)PutTemplate(dsp, "*N[2-3] Inserting duplicate file *"$S*"", drName)MoveBlock(lv lptDR>>DR.fp, ifp, lFP)lptDR>>DR.type = drTypeNormallptDR>>DR.length = lenDRHeader + lptDR>>DR.pathName.length rshift 1 +1UpdateRecord(tree, lptDR, InsertRecGen, lptDR)]IfsScav2-3.bcpl11-Feb-84 21:56:37Page 4 a _B ^D [ Z YP# X V T\H S* Q P? Oh6 N+ L0 K* I7 G F E DC C A @ ?O <[ ;$ :[[ 9 7" 65 5g 4*< 2" 1& 0s /62 -2 ,! +) *B ) ' &C %N$ $ "F !. Zh. "Et $Y=E///-----------------------------------------------------------------------------------------and InsertRecGen(dr, newDR) = valof//-----------------------------------------------------------------------------------------// This record generator is passed to UpdateRecord when inserting a record[treeChanged = truetest dr ne 0 //two files with the same name?ifso[if dupLpt eq 0 thendupLpt = OpenLPT("IfsScavenger.dupLpt", true)let lpte = GetLptLpte(dupLpt, true)SetLpteIfsName(lpte, lv newDR>>DR.pathName)SetLpteIfp(lpte, lv newDR>>DR.fp)WriteLPTE(dupLpt)]ifnot[dr = Allocate(sysZone, newDR>>DR.length)MoveBlock(dr, newDR, newDR>>DR.length)]resultis dr]//-----------------------------------------------------------------------------------------and UpdateRecGen(dr, newDR) = valof//-----------------------------------------------------------------------------------------// This record generator is passed to UpdateRecord when updating a record[treeChanged = trueif dr eq 0 then IFSError(ecUpdateRecord)Free(sysZone,dr)dr = Allocate(sysZone, newDR>>DR.length)MoveBlock(dr, newDR, newDR>>DR.length)resultis dr]IfsScav2-3.bcpl11-Feb-84 21:56:37Page 5 a[ `# _[ ^DJ ] [ YP- X V UT\- S# Q+ P! Oh N+ L K Jt( I7& G E DC A[ @# ?O[ >I < ; :[( 9 7( 6& 5g 4*h. "Etz 8)=1_//-----------------------------------------------------------------------------------------and TreeMapper() be //a context used as a coroutine//-----------------------------------------------------------------------------------------[Block() repeatuntil giveMeATreeDR //wait for a requestif MapTree(tree, treeDR, MapTreeFunction, 0, 0, true) then[ //ran off the end of the treetreeDR>>DR.type = 0giveMeATreeDR = false //request satisfiedBlock() repeatuntil giveMeATreeDR //wait for a request] repeat] repeat//-----------------------------------------------------------------------------------------and MapTreeFunction(dr, nil, nil) = valof//-----------------------------------------------------------------------------------------[if treeChanged thenif CompareRecords(dr, treeDR) le 0 resultis true //we want the next onetreeChanged = falseMoveBlock(treeDR, dr, dr>>DR.length)giveMeATreeDR = false //request satisfiedBlock() repeatuntil giveMeATreeDR //wait for a requestresultis not treeChanged //return true unless our partner modifed tree]//-----------------------------------------------------------------------------------------and ReadNextTreeDR() be//-----------------------------------------------------------------------------------------// Pokes the B-Tree process for the next record.[giveMeATreeDR = true //make a requestBlock() repeatwhile giveMeATreeDR //wait for it to be satisfied]IfsScav2-3.bcpl11-Feb-84 21:56:37Page 6 a[ `4 _[ ^D ]7 [: Z YP X* V7 U T\ Q[ P) Oh[ N+ L KH Jt I7$ G* F7 EG DC A[ @ ?O[ >0 < ;& :[@ 9h. "Et ==,k//-----------------------------------------------------------------------------------------and ReadNextLPTDR() be//-----------------------------------------------------------------------------------------// Manufactures a directory record from the next leader page table entry.[let lpte = GetLptLpte(lpt)[unless leftoverLPTE do unless ReadLPTE(lpt) do[ lptDR>>DR.type = 0; return ] //no more LPTEsif GetLpteType(lpte) eq dvTypeFile break] repeatlet dirEnd = 1let ifsName = GetLpteIfsName(lpte)for i = 1 to ifsName>>String.length doif ifsName>>String.char^i eq $> then [ dirEnd = i; break ]if dirEnd eq 1 then IFSError(ecMalformedLPTE)test StringCompare(ifsName, lv difDR>>DR.pathName, 1, dirEnd) eq -2ifso //This file is in the same directory as the last file[CopyString(lv lptDR>>DR.pathName, ifsName)MoveBlock(lv lptDR>>DR.fp, GetLpteIfp(lpte), lFP)lptDR>>DR.type = drTypeNormallptDR>>DR.length = lenDRHeader + lptDR>>DR.pathName.length rshift 1 +1DoubleIncrement(lv (DIFRecFromDR(difDR)>>DIFRec.diskPageUsage),GetLpteFa(lpte)>>FA.pageNumber +1)leftoverLPTE = false]ifnot //New directory[if difDR>>DR.type eq drTypeDIF then //every time except the firstUpdateRecord(tree, difDR, UpdateRecGen, difDR)let difRec = difDR + lenDRHeaderlet pathName = lv difDR>>DR.pathNameZero(difDR, maxDRLength)test (GetLpteFlags(lpte) & lfDIF) ne 0ifso //This is the new directory's DIF.[CopyString(pathName, ifsName)MoveBlock(lv difDR>>DR.fp, GetLpteIfp(lpte), lFP)difRec = difRec + pathName>>String.length rshift 1 +1MoveBlock(difRec, GetLpteDIFRec(lpte), lenDIFRec)Zero(lv difRec>>DIFRec.diskPageUsage, 2)leftoverLPTE = false]IfsScav2-3.bcpl11-Feb-84 21:56:37Page 7 a[ ` _[ ^DI ] [ Z YP. X/ V( U S Q" P& Oh: N+- LC K; Jt I7* G1 F EF DC?C" A @ ?O > >String.char^i)Wss(s, "!1")Closes(s)// create the Directory Information FilePutTemplate(dsp, "*N[2-3] Creating *"$S*"", pathName)let pageLength = 1 lshift scavDisk>>DSK.lnPageSizelet ld = Allocate(sysZone, pageLength); Zero(ld, pageLength)CopyString(lv ld>>ILD.pathName, pathName)CopyString(lv ld>>ILD.author, "System")ld>>ILD.readProt.owner = trueld>>ILD.type = ftBinaryld>>ILD.byteSize = 8ld>>ILD.undeletable = trueCreateDiskFile(scavDisk, pathName, lv difDR>>DR.fp, 0, 0, 0, ld)Free(sysZone, ld)difDR>>DR.fp.unit = 0// fill the dif with vanilla thingslet dif = vec lenDIF; Zero(dif, lenDIF)Password("ifs", lv dif>>DIF.password, true)dif>>DIF.diskPageLimit^1 = 1000dif>>DIF.createProt.owner = truedif>>DIF.connectProt.owner = truedif>>DIF.readProt.owner = truedif>>DIF.readProt.world = truedif>>DIF.writeProt.owner = truedif>>DIF.appendProt.owner = truelet s = CreateDiskStream(lv difDR>>DR.fp, 0, 0, 0, 0, 0, 0, scavDisk)if s eq 0 then IFSError(ecCreateDiskStream, pathName)WriteBlock(s, dif, lenDIF)Closes(s)difRec = difRec + pathName>>String.length rshift 1 +1MoveBlock(difRec, dif, lenDIFRec)leftoverLPTE = true]difDR>>DR.type = drTypeDIFdifDR>>DR.length = lenDRHeader + lenDIFRec +difDR>>DR.pathName.length rshift 1 +1difRec>>DIFRec.diskPageUsage^1 = 2MoveBlock(lptDR, difDR, difDR>>DR.length)]]//-----------------------------------------------------------------------------------------and DIFRecFromDR(dr) = valof//-----------------------------------------------------------------------------------------[// returns pointer to the DIFRec portion of a directory entryif dr>>DR.type ne drTypeDIF then IFSError(ecNotDIFRec)resultis dr + dr>>DR.length - lenDIFRec]IfsScav2-3.bcpl11-Feb-84 21:56:37Page 8 a_1^D][6Z6YP XU(T\5S2Q<P)Oh'N+LKJtI7@GFDC#C'A+@?O>!<;:[97E655g4*251!0s/6 , +,*B% )" ') & %N "[ ! Z[  = 6 f' )h. "Ett (=K`// IfsScavDEdit.bcpl -- a simple disk editor// Copyright Xerox Corporation 1979// Last modified December 22, 1979 3:14 PM by Boggsget "AltoFileSys.d"get "Streams.d"get "Disks.d"get "Tfs.d"external[// outgoing proceduresDiskEditor// incoming proceduresOpenDisk; CloseDisk; VirtualDiskDAInitializeDiskCBZ; GetDiskCb; DoDiskCommandAllocate; Free; Resets; Puts; Gets; ClosesWs; PutTemplate; EraseBits; CharWidthShowDisplayStream; CreateDisplayStreamScavConfirm; UnsnarfBufferPrintDiskError; SysErr// incoming staticsdsp; keys; sysZone; sysFont; pass]static[editDisk; label; data; number; addressnumberTyped; pageOpen; cellOpen; pageDirty]IfsScavDEdit.bcpl11-Feb-84 21:56:37Page 1 c8, a# `4 ^D ] [ Z X V U T\ Q P" Oh+ N+* L% K& Jt I7 F E! DC A @ ?O& >* <h. "Et @#$(x//----------------------------------------------------------------------------let DiskEditor(buffPtr, numBuffs) be//----------------------------------------------------------------------------[pass = 0editDisk = OpenDisk("*NWhat disk would you like to edit? ", 0, true, false)if editDisk eq 0 then[for i = 0 to numBuffs-1 do UnsnarfBuffer(buffPtr+i*256)return]// replace the normal tiny display with a giant displaylet normalDsp = dsp>>ST.par1ShowDisplayStream(normalDsp, DSdelete)dsp>>ST.par1 = CreateDisplayStream(800/((sysFont!-2) & -2),buffPtr, 256*numBuffs)ShowDisplayStream(dsp>>ST.par1, DSalone)let lenData = 1 lshift editDisk>>DSK.lnPageSizelabel = Allocate(sysZone, 10)data = Allocate(sysZone, lenData)pageOpen = falseaddress, number = 0, 0Puts(dsp, $*N)switchon GetNumber() into[case $/:[address = numberExaminePage(not numberTyped)endcase]case $*L:[test numberTypedifso Oop()ifnot[address = address +1ExaminePage(true)]endcase]case $^:[test numberTypedifso Oop()ifnot[address = address -1ExaminePage(true)]endcase]case $\:[test numberTyped % not pageOpenifso Oop()ifnot[address = VirtualDiskDA(editDisk, lv label>>DL.previous)ExaminePage(true)]endcase]IfsScavDEdit.bcpl11-Feb-84 21:56:37Page 2 aN `$ _N ^D ] [K Z YP X7 V U S7 Q P& Oh; N+ L( Jt/ I7 G! F E DC A @ ?O > < ; :[ 9 7 6 5g4* 210s/6- , + *B ) '& %N$"! Z    f ) r58 ~ Ah. "Et @4UH// DiskEditor (cont'd)case $L: case $l:[test numberTyped % not pageOpenifso Oop()ifnot EditPage(label, 10)endcase]case $D: case $d:[test numberTyped % not pageOpenifso Oop()ifnot EditPage(data, lenData)endcase]case $Q: case $q:[if ScavConfirm("*NQuit Disk editor") breakendcase]case $*N:[Puts(dsp, $*N)pageOpen = falseendcase]case $*177: [ Ws(" XXX"); endcase ]default: [ Oop(); endcase ]] repeatFree(sysZone, label)Free(sysZone, data)CloseDisk(editDisk)Closes(dsp>>ST.par1)dsp>>ST.par1 = normalDspShowDisplayStream(dsp>>ST.par1, DSalone)Puts(dsp, $*N)for i = 0 to numBuffs-1 do UnsnarfBuffer(buffPtr+i*256)]IfsScavDEdit.bcpl11-Feb-84 21:56:37Page 3 a _ ^D ][ Z YP X V U T\S Q P Oh N+ L K* Jt I7 G F E DC C A @# ?O > ; :[ 9 6 5g 4*( 2 17 0sh. "Et 4r%+5//----------------------------------------------------------------------------and GetNumber() = valof //returns terminating character//----------------------------------------------------------------------------[manifest maxStringChars = 7 //6 octal digits + minus signlet string = vec maxStringChars //1 char per wordlet count = 0 //chars in stringlet char = nil[char = Gets(keys)switchon char into[case $0 to $7:case $-:[if (char eq $-) ? (count eq 0), (count ls maxStringChars) then[Puts(dsp, char)count = count +1string!count = char]endcase]case $*001: case $*010: //^A, BS[if count ne 0 then[EraseBits(dsp>>ST.par1, -CharWidth(dsp>>ST.par1, string!count))count = count -1]endcase]case $*027: //^W[for i = count to 1 by -1 doEraseBits(dsp>>ST.par1, -CharWidth(dsp>>ST.par1, string!i))count = 0endcase]case $*177: count = 0 //falls throughdefault: break]] repeatnumberTyped = count ne 0if numberTyped then[number = 0let minus = falseif string!1 eq $- then minus = truefor i = minus? 2,1 to count donumber = number lshift 3 + (string!i & 7)if minus then number = -number]resultis char]//----------------------------------------------------------------------------and Oop() be [ Ws(" ?"); Resets(keys) ]//----------------------------------------------------------------------------IfsScavDEdit.bcpl11-Feb-84 21:56:37Page 4 aN `8 _N ^D ]: [2 Z YP X V U T\ S QPOh>N+LKJtI7GF E!DCCA@??O><; :[976;5g4*2 1& 0s /6 - , + *B ) ' &# %N $) " ! Z  N f' )Nh. "Et4 (4K`//----------------------------------------------------------------------------and ExaminePage(displayAddress) be//----------------------------------------------------------------------------[if displayAddress then PutTemplate(dsp, "*N$UO", address)Ws("/*T")if DETransferPage(DCreadLD) then[PutTemplate(dsp, "FID $EUO;$UO, page number $UO, num chars $UO ",lv label>>DL.fileId, label!2, label>>DL.pageNumber, label>>DL.numChars)let previous = VirtualDiskDA(editDisk, lv label>>DL.previous)let next = VirtualDiskDA(editDisk, lv label>>DL.next)PutTemplate(dsp, "previous vda $UO, next vda $UO", previous, next)number = nextpageOpen = true]]//----------------------------------------------------------------------------and DETransferPage(action) = valof//----------------------------------------------------------------------------[if address eq eofDA then[Oop()pageOpen = falseresultis false]let cbz = Allocate(sysZone, CBzoneLength)InitializeDiskCBZ(editDisk, cbz, 0, CBzoneLength,TransferRetry, lv TransferError)TransferRetry:let cb = GetDiskCb(editDisk, cbz)cb>>CB.AddrL = labelDoDiskCommand(editDisk, cb, data, address, lv label>>DL.fileId,label>>DL.pageNumber, action)while @cbz>>CBZ.queueHead ne 0 do GetDiskCb(editDisk, cbz)Free(sysZone, cbz)pageOpen = action eq DCreadLDresultis true]//----------------------------------------------------------------------------and TransferError(nil, cb, errorCode) be//----------------------------------------------------------------------------test errorCode eq ecUnRecovDiskErrorifso PrintDiskError(cb)ifnot SysErr(0, errorCode, cb)IfsScavDEdit.bcpl11-Feb-84 21:56:37Page 5 aN `" _N ^D ]9 [ Z YP XA VG U= T\5 SB Q P Oh N+ KN Jt" I7N G F E DC C A @ ?O) >1 < ; :[! 9 7? 6 5g: 4* 2 1 0s -N ,( +N *B$ ) 'h. "EtP +4=//----------------------------------------------------------------------------and EditPage(buffer, length) be//----------------------------------------------------------------------------[PutTemplate(dsp, "*NEdit $S*N", buffer eq label? "label","data")let diskAddress = address; address = 0let diskNumber = number; number = 0pageDirty = falsecellOpen = falseswitchon GetNumber() into[case $/:[address = numberExamineCell(buffer, length, not numberTyped)endcase]case $*N:[DepositCell(buffer)Puts(dsp, $*N)endcase]case $*L:[if DepositCell(buffer) then[address = address +1ExamineCell(buffer, length, true)]endcase]case $^:[if DepositCell(buffer) then[address = address -1ExamineCell(buffer, length, true)]endcase]case $Q: case $q:[if ScavConfirm("*NQuit page editor") breakendcase]case $*177: [ Ws(" XXX"); endcase ]default: [ Oop(); endcase ]] repeatnumber = diskNumberaddress = diskAddressif pageDirty thenif ScavConfirm("*NRewrite page?") thenDETransferPage(DCwriteLD)Puts(dsp, $*N)]IfsScavDEdit.bcpl11-Feb-84 21:56:37Page 6 aN ` _N ^D ]@ [& Z# YP X V U T\ S Q P, Oh N+ L K Jt I7 G F E DC CA@?O!> < ; :[ 9 765g4*!2 1 0s /6 - ,* + *B )# ' & $ " ! Z&   h. "Et 4H//----------------------------------------------------------------------------and ExamineCell(buffer, length, printAddress) = valof//----------------------------------------------------------------------------[if printAddress then PutTemplate(dsp, "*N$UO", address)if buffer eq label thenWs(selecton address into[case 0: " = SN1 "case 1: " = SN2 "case 2: " = VN "case 3: " = PackID "case 4: " = numChars "case 5: " = PN "case 6: " = Prev cyl "case 7: " = Prev hd, sec "case 8: " = Next cyl "case 9: " = Next hd, sec "default: ""])Ws("/*T")if address ge length % address ls 0 then[Oop()cellOpen = falseresultis false]PutTemplate(dsp, "$6UO*T", buffer!address)if buffer eq data then //also display as characters[let left = buffer!address rshift 8let right = buffer!address & 377bPutTemplate(dsp, "$3UO $3UO*T", left, right)PrintChar(left)PrintChar(right)]number = buffer!addresscellOpen = trueresultis true]//----------------------------------------------------------------------------and PrintChar(char) be//----------------------------------------------------------------------------[if char ls 40b then PutTemplate(dsp, "^$C", char+100b)if char ge 40b & char ls 176b then Puts(dsp, char)]//----------------------------------------------------------------------------and DepositCell(buffer) = valof//----------------------------------------------------------------------------//Does nothing if no number was typed[if numberTyped test cellOpenifso[buffer!address = numberpageDirty = true]ifnot[Oop()resultis false]cellOpen = falseresultis true]IfsScavDEdit.bcpl11-Feb-84 21:56:37Page 7 aN `5 _N ^D ]7 [ Z YP X V U T\ S Q P Oh N+ L K Jt G F( E DC C A @ >* <4 ; :[" 9! 7, 6 5g 4* 1 0s /6 - +N *B )N ' &6 %N2 $ !N Z N %  f )   r 5   ~ A   Mh. "Etl L4Z<// IfsScavDump.bcpl// Copyright Xerox Corporation 1979, 1980, 1981// Last modified June 2, 1981 2:50 PM by Taftget "Streams.d"get "IfsFiles.decl"get "BTree.decl"external[// outgoing proceduresDumpLPT; DumpTree// incoming proceduresGetLpteIfsName; GetLpteIfp; GetLpteDIFRec; GetLptFaOpenLPT; EnumerateLPT; CloseLPT; GetLptHome; GetLpteTypeOpenDisk; CloseDisk; Scratch; DirEntryLengthOpenFile; Closes; Resets; PutsWs; Wss; PutTemplate; ReadBlock; GetCurrentFaAllocate; CallSwat; TruePredicate; ZeroOpenFPTree; CloseIFSTree; MapTreeInitCmd; GetFile; ConfirmUNPACKDT; WRITEUDT// incoming staticssysZone; scratchDisk]static [ onlyDIFs; printTreeStructure; printFileIDs ]structure String [ length byte; char^1,1 byte ]// These routines dump the contents of Scavenger.lpt and Ifs.dir.// They are mostly useful for debugging the scavenger, but may be// of use in getting an independant opinion on the contents of the// system directory.IfsScavDump.bcpl11-Feb-84 21:56:37Page 1 c8 a/ `. ^D ] [ YP X V U S Q3 P8 Oh, N+ L- K' Jt! I7 G E DC C @5 >/ ;A :[A 9C 7h. "Et ;-G-//----------------------------------------------------------------------------let DumpLPT() be//----------------------------------------------------------------------------[if scratchDisk eq 0 then unless Scratch(nil) returnlet ok, list, lpt = true, 0, 0if ok then[lpt = OpenLPT("IfsScavenger.lpt", false)Resets(lpt)GetCurrentFa(lpt, GetLptFa(lpt))]if ok then[let cs = InitCmd(100, 5); if cs ne 0 then[Ws("*NWhat shall I call the output file on DP0? ")list = GetFile(cs, ksTypeWriteOnly, charItem)onlyDIFs = Confirm(cs, "*NDo you want just page usage info? ")printFileIDs = not onlyDIFsPuts(cs, $*N)Closes(cs)]if cs eq 0 then ok = false]if ok then[PrintHome(list, GetLptHome(lpt))EnumerateLPT(lpt, InterpretLPT, list)]if lpt ne 0 then CloseLPT(lpt, false)if list ne 0 then Closes(list)]//----------------------------------------------------------------------------and InterpretLPT(lpt, lpte, list) be//----------------------------------------------------------------------------if GetLpteType(lpte) eq dvTypeFile thenunless onlyDIFs & GetLpteDIFRec(lpte) eq 0 doPrintInfo(list, GetLpteIfsName(lpte), GetLpteIfp(lpte),GetLpteDIFRec(lpte))IfsScavDump.bcpl11-Feb-84 21:56:37Page 2 aN ` _N ^D ]3 [ YP X V( U T\ S P Oh N+) L K2 Jt- I7> G F E DC C A ?O > < ;% :[ 7% 6 5g 2N 1$ 0sN /6' --,7+h. "Et /~4: //----------------------------------------------------------------------------and DumpTree() be//----------------------------------------------------------------------------[let ok, disk, tree, list = true, 0, 0, 0disk = OpenDisk("*NWhich disk is it on? ")if disk eq 0 then ok = falseif ok then[let fp = vec lFP; Zero(fp, lFP)let ifsDir = OpenFile("Ifs.dir", ksTypeReadOnly, 0, 0,fp, 0, 0, 0, disk)test ifsDir ne 0ifso Closes(ifsDir)ifnot[Ws("*NI can't open *"Ifs.dir*"")ok = false]if ok thentree = OpenFPTree(fp, disk, CallSwat, DirEntryLength, false)]if ok then[let cs = InitCmd(200, 5); if cs ne 0 then[Ws("*NWhat shall I call the output file on DP0? ")list = GetFile(cs, ksTypeWriteOnly, charItem)onlyDIFs = Confirm(cs, "*NDo you want just page usage info? ")printTreeStructure = onlyDIFs? false,Confirm(cs,"*nShow the tree structure? ")printFileIDs = onlyDIFs? false,Confirm(cs,"*nShow the file IDs? ")Closes(cs)]if cs eq 0 then ok = false]if ok then[let home = OpenFile("Ifs.home", ksTypeReadOnly, 0, 0, 0, 0, 0, 0, disk)test home eq 0ifso[Ws("*NI can't open *"Ifs.home*"")ok = false]ifnot[let h = vec lenHometest ReadBlock(home, h, lenHome) eq lenHomeifso PrintHome(list, h)ifnot[Ws("*NMalformed home block")ok = false]Closes(home)]]if ok then MapTree(tree, 0, InterpretTree, list, TruePredicate, true)if list ne 0 then Closes(list)if tree ne 0 then CloseIFSTree(tree)if disk ne 0 then CloseDisk(disk, true)]//----------------------------------------------------------------------------and InterpretTree(dr, list, pathStk) = valof//----------------------------------------------------------------------------[unless onlyDIFs & dr>>DR.type ne drTypeDIF doIfsScavDump.bcpl11-Feb-84 21:56:37Page 3 aN ` _N ^D ]( [* Z X V U T\6 S Q P OhN+LK Jt I7 G< F DC C A) @ ?O2 >- <> ;%:[) 97# 6 5g 4* 2 0s /6 -G , +*B)!' & %N$"!+ Zf )  r E ~ A$ ' MN , N  Y-h. "Et X4_0[if printTreeStructure then[let pse = lv pathStk>>PS.PSE^(pathStk>>PS.PathStkTop)let indentString = selecton pathStk>>PS.PathStkTop into[case 1: ""case 2: " "case 3: " "default: " " // never happens]if pse>>PSE.Offset eq Rec1Offset thenPutTemplate(list, "$S[Page $OB, $OB words free]*n",indentString, pse>>PSE.PageNo,(dr - offset BTE.Record/16 - Rec1Offset)>>BTP.FreeWords)Wss(list, indentString)]PrintInfo(list, lv dr>>DR.pathName, lv dr>>DR.fp,(dr>>DR.type eq drTypeDIF? dr+dr>>DR.length-lenDIFRec, 0))]resultis true]IfsScavDump.bcpl11-Feb-84 21:56:37Page 4 c8 a ` _5 ^D7][ Z YPX&V U%T\3SQ8 P Oh N+1 L: K Jt I7h. "EtD M6,Re//----------------------------------------------------------------------------and PrintHome(stream, home) be//----------------------------------------------------------------------------[PutTemplate(stream, "*NFile system name *"$S*", ID *"$S*"",lv home>>Home.name, lv home>>Home.id)PutTemplate(stream, "*Ntype $S, num units $D, created ",selecton home>>Home.type into[case ifsTypePrimary: "primary"case ifsTypeBackup: "backup"default: "unknown"], home>>Home.numUnits)let utv = vec 10UNPACKDT(lv home>>Home.created, utv)WRITEUDT(stream, utv, true)Wss(stream, "*n*n")]//----------------------------------------------------------------------------and PrintInfo(stream, pathName, fp, difRec) be//----------------------------------------------------------------------------// I recommend an 8pt fixed pitch font when listing this output[test onlyDIFsifnot Wss(stream, pathName)ifso for i = 2 to pathName>>String.length-3 doPuts(stream, pathName>>String.char^i)if printFileIDs % onlyDIFs then[let padding = onlyDIFs? 20,45test pathName>>String.length gr paddingifso Wss(stream, " ")ifnot for i = pathName>>String.length to padding do Puts(stream, $*S)]if printFileIDs thenPutTemplate(stream, "$EUO;$UO, un $UO vda $UO", lv fp>>IFP.serialNumber,fp>>IFP.version, @lv fp>>IFP.unit, fp>>IFP.page)if difRec ne 0 thenPutTemplate(stream, " $5EUD pages used out of $5EUD",lv difRec>>DIFRec.diskPageUsage, lv difRec>>DIFRec.diskPageLimit)Puts(stream, $*N)]IfsScavDump.bcpl11-Feb-84 21:56:37Page 5 aN ` _N ^D ]; [% Z8 YP X V U T\ S Q P$ Oh N+ L JtN I7. GN F? E DC C A. @% > < ; :[' 9 7E 6 4* 2H 10 /6 -6 ,A *B )h. "Et -4<GACHA]H]G *<----~ge-~gggf89,~|~8fg8ـ~ f9,~~g~P hNfuN5/f.g f*fg.~g644 ~ff~gggg5 ff~f~gkgggg5gA7~gYi~gggg,g,~gkN~glgg|  <8l %7(g,27Q=BHJPU|Z_d>i`kpuwKy}g|+g4  xg:C=$ Z Z"iW*K Z  :#:;J :#P:C"iW"iZ "iW"iU:;$J"iN:Z:;+Z"iEB :;.Z 9^Z"*i["*iX Z  B"i. j z cZ E B%R9RK!P)NiO!NB")KiK!J:C:C!E:C:C"9?9>Z*iX=WZ =V]T: ]S]R=R]R%R=RC ? 8<x 3'?9?Z!]i3%[9[9Y ;Z 44)F( %I9I* PB : #9i9h : #979a "  x8';Y" B " 9LJ%igB " !* i:;Z : #=XCPZ : ;Z " PP: #* =BC" B " : J%8:C%5=4;@:#:C:#:C%E9E B : ;+]=: ;.]?: ;?]=: ;A]>: ;D] E ?  8 3":#d0' f F 4 xsXSZ"B":JW:#9V*J:# O%P9P9N :CiI!HB:C:]a 9`9_:C:#:;@=VZ:;Z:;Z: %KB9GZ"*i`E_8Z":;@=8Z:Z:;Z:  %.  kCB9_Z"*i9EZ%Y)YiYEX%W9WEV=TC%P9RE:#=C*E:#=C%B==C%V=:C9TZ%*i3EO:Z%LiK%+)Ii(=,ED9BZ%A*i\%=9Z9YZ*iT%)iEQ=OCiN=KZ%)Ji -AB+6=JZ);iH"iE: =#=Z= C= ;]T 7@)7)=#=C]G=G;]F%F=CC=D]DiD%iBEA%fifZ=;Z 9ZZ%iWERP-TiT Z iKZiH*K8ZiS9R9Q@=#  j$<=;Z%^*i]"=;B=# =;Z%P*iM"=;B :B%A*iB <]a%a)a BZ%]*i\B"  "9B!N=NC%L9L:Z :Z 9GZ%ij%<*igif=9#ic ,x-Z iY=*#=(;B%=#+i=;  =#=;B%=+ii`i_E^%)]i 32 BA2 EQ9OZ%N-NiN9MZ%)i9Z"ic=>C=<#)^i^ IfsScavenger.logTPZ)HiI=!C=#  IfsScavenger.log!OiO%N= ;C%K=C  '=7=`Z%_)_i=]Z)Zi["iX8ZiU9T@ :B%G*iLG s" "#"" r9bZ!`i` 4?>Z  ":B"9QP9NB"9JB " P"iR")P B  , d" )B PB  * =cC%aE_" B " : J%WPP9UJ!Si":9!J":B"*iE": 9 J ": B"* i1 > Z  =n#im=j#ii%h=h %d %aia%` %]i[%XiXEWiW%V=VC)2x Z  >yxJanuaryFebruaryMarchAprilMayJuneJulyAugust SeptemberOctoberNovemberDecember '1 <; jiE Z  Z0"=?# '"=9#PPP-^J:# :Z"iU=T-S =R; ."iL"9JiI"B"9DJiB= +icB"PK\!\-\ E["P-W MV%ViV=#PB=;Z":P-C B%Vi = B":=8KL YjUTQin 7"-( B "-$ J " :=JZ " B " - B " :Eh"- B" PP  SWV6hB9VZ" *iS=RZ =;Z PZ: ;Z:Z ": #B&:+=c;Z"9=]C" 9[:C&=*:C&=R; "=MC"=KC&=G; "=BC"=@C"F"B":JZ=^#PX c`B"=R#B%O:C%M:C%K:C %I:C %G:C"B":J%\=\C%[=YC%Y=Ch-,=# %M=C%J=C=# %C=C=;Z%>:C%A:C%?:C%=:C%;=PC%O=MC%M=JC8%D=@C%B==C=@;Z%M:C%K:C%I:C%G:C%E:C%C:C=I]I6B7Eq=C]C=bZrstO:#: %W:C"9TB"=Q =C9KMNLQ Z  "=a)` JZfabdce"=S#:  <;"B"9EJ"iB=TB"iQB":=LKK"-K B"-G `J "-K B ":=7J!IiI"-> %ilB %$::Z* id" 9bY j: ;B : #P* 9J " 9B: Z7UkV W:;Z:;Z"9B: ZS":;34:#:C:#:C":C":C"PB":K"9B":J: Z: Z: Z: Z: ZcAl" 9`:;B:#9Y @:#9U ;:#9Q 6":"P:;B":':ZPZ"B:#93 :#9/  :#9+ "B:#9X "PB" ":":":": !Eif /Z &:;Z:;Z"9VB:Z:Z :#:C:#:C"PB":K":C":C"97B":JL=M;Z: Z7 PZ:;Z(2":#:+ "9B:;Z:#:C":C:;Z:#:C":C4"B":J"9B":": : C:Z: Z1 !:;Z" 9]:;B&=W-V=TiTK>Z =;Z"9=C"F" 9P:C":C"9B":J:# " P: :+" PJ* 9B" PJ"*iQ"-O B" PPB9IZ" * iF%E* iD [\Z  %W9W9U Wh9RZ%QPENPZ79KZ"iI"iFB9DZ"i>"i;B"94 "94  :ZScBT9)Z "PPB 9$Zi"B"9J%PE% P E "  + baUU*=Z  B:C"9/KZ"9*::C":9 B : C": C" :C" :;K" ) i " : C"  E W67 .=Z  B:C"9/KZ"9*::C":9 B : C": C" :C" :;K" ) i " : C"  E= +icB"PK\!\-\ E["P-W MV%ViV=#PB=;Z":P-C B%Vi = B":=8WZ B:#( "iB:#**i>"PJ: :#*i4:#)*i0 Z :#(  :;*Z"*iPZ"*iB9Z":+iZ"*i"*i   y ZB)\ +1`b:#C:ZB)I ":ZbEE!HMC#E<+M;1>bM8-4bM4:ZbBb 9&1bY I:%C%Cb=9=b9bi {:PPPP z{|}~Z >Z" "9YP:+ "9SȎ:# "9LP:# "9OĎ Z Z*0bJ:B:C" Z  B!>PZ =;Z 9:ZiX"B"* 9Q"iOB %M: C%K: C%I: C%G: C%E: C": C: C": C": C=I]I=I]I=I]I=I]I=I]I" B Z  :;Z =fZ 9eZ"*ibB"K")[i[:#:;   A'()*+")JiH"*inB":+ihPB)b":;.B N "PB":K:#:C":+iZZ :;Z 9Z"iP:C", E Z :;Z =Z 9Z"*iB"K")/i"*iB:#:+i$:#P:C":; ":;:+:B :# J"* i F TZ  B"9NK!LB:;Z =TZ 9SZ"*iPB"J""B "* i\B " B "K$" :;K ": +iXP F" :;K " B"*iP Z : #F"  Z  Z:#PB,"*iB " : ;Z :Z9UZ*"B":J Z Z:#PB:;Z"*i#"iR"B":J:#*iF Z "9L*B:# " Z :Z"*i#"i Z  Z"PB " :K"": B : Z"*B " " T" K" PB " B ('H()*Z+,Z  B"9NK!LB:;Z =TZ 9SZ"*iPB"J""B "* i\B " B "K$" :;K ": +iXP F" :;K " B"*iP Z : #F"  Z  Z:#PB,"*iB " : ;Z :Z9UZ*"B":J Z Z:#PB:;Z"*i#"iR"B":J:#*iF Z "9L*B:# " Z :Z"*i#"i Z  Z"PB " :K"": B : Z. 6Z PZ:#9fB "* "i^"B":J Z %Q*iP Z "iI%E)NiB Z " B!ZPZ 9WZ 9VZPiT!SB Z "K"B"K "BZ "PBZ Z3+0bK:B  * : C0'.%" B "  ")Hi"PB": K: ")Ti " PB " : #)D"i"  Z 9XZ 9Z 9TZ"*iQ Z %*iI Z  ]O Z !I9GB8Z":B"9T*iRJ -0":C"@" Z "PB":;8 "@=Z] :Z:;Z"i)"  %:C:] Z  !9B"899d Z  "@  Z " B!Q*9OJ"iKBPZ:#9EB "* "iF"B":J Z  !?B Z iKiJB"9G FiCB"9@ "*iI" :J")BiBZZ Z 9KZ J")O :9LJJZ FZ CiB >: " :#"iP#$ " :#BPZ:;Z0E":#"i"B":JO N" :#"iC 0 x9Z" :#: Z"i8o96Z" :#: Z"i+b.9Z" :#: Z"iT" :#* :+J"" B C") i: <" unw fkf U\e FYT 9 @?>=<;:987ilBj" B "*ied Z 2 :;Z :; :;Z:;Z:;Z "J* J :Z:;Z "J* J : Z!YB :  "*BJB  " PB Z Z+0bK+bK:B :# * : C 0 " B " "  ":+i" PB " : K: ")i" PB " : #) "i"  -0.%%1   .7^jZ " B!Q*9OJ"iKBPZ:#9EB "* "iF"B":J Z  !?B Z iKiJB"9G FiCB"9@ "*iI" :J")BiBZZ Z 9KZ J")O :9LJJZ FZ CiB >: " :#"iP#$ " :#BPZ:;Z0E":#"i"B":JO N" :#"iC 0 x9Z" :#: Z"i8o96Z" :#: Z"i+b.9Z" :#: ZA7X:@vv~vHz@v~+vHPQvHu  5 h,R.6ifssch,2-5F..vH h,fsBV;sEVvH o+Ih,Ro:WvHkY.h,k;2fsvH lrl~;Ul:vHkYlrScNvH ;Ul:h,+#h,lZkYh,h,lZkYElZly$lZh,lZ]kY lwEl~l!kYkYkYkY!h,h,1HkYPitvHkYlZ\vHh,*h,-M^@Ph,Q:MXh,A7C`h,XMX X _W_RHM_Savengeh,h,[\p!X_Sfh,h,lX >=th,)%A h!   Yd@loadifss ifsscavenger q ifsscavenger/fff  Boggse  qv0I %%E$9 1e0Ae9e #)A!_A  M!i i 9T+9 P%bLHP saHPikq a {HP{}a q Q {L!)ѥA)̍ % @m{^)^݁ X T LlT i *+QU]b 1U[1BpJqZspBt:]N#)P5!A))" ?*M68Aj0 . %͂ `b =K!i  X-!ib5Pi5 U =#2%0MbbE1  : ;"*%/A.* 0%*-ME% %*  )B9IY *I %E 9##+3;b@) @A!I!Y!pA 9 %%)")A  %` Z) 9` [9Yi! !)9_[bY Tl"C"C"C"C0Z'';Z'P>'b:'HX B YQI U T!i2%3 Q!jBi.!g L J0%") B![i %A܂ !) 70)P )"E!Ă P190YIb Uj !.iP "))) Q]!) 0Z'9:C W MMi P' !) `!BiHP }HXlHXl^Z):#)Ϧ)))"*JBZ(0Z&iZ(:# + :C K 0CCC C +:C^( 'QZ'J))BB9qZ(Z0CCCC )[K")9b('ZZ' :+ %ڂ # ]  )A9b I  )9 b!)/9b!)E:# )(&*&!Z*0CCC C C C C!]Y# ) I H1(Hb\IA3I3Y> )998!8b96#A*#A%#@A&0Cb! ,A#Ƃ C!%#PC% #)! 8lb!C#PC!킐C!)9bYb-9M9+!K+!K9~lh_}dnsxi 4. : A@U}*T xT)^VlQ4s" "#"" rQQ??"0V }/ @y1Cگ!g g UUUUUUUUUUUU"/_[j $uu%yy{xhhhhhhhhhh h h h hhhhhhhhhhhhh_[