// IfsScav2-1.bcpl - Pass 2 Phase 1
// Copyright Xerox Corporation 1979, 1980, 1981
// Last modified July 14, 1981  3:55 PM by Boggs

get "AltoFileSys.d"

// outgoing procedures

// incoming procedures
PutTemplate; Ws; InitializeZone; Sort
ReadLPTE; WriteLPTE; GetLptSorted; SetLptSorted
Gets; Resets; TruncateDiskStream; FlushLPT; CompareLPTEs
GetLpteIfsName; GetLpteLength; GetLpteType
PrintTime; ReadCalendar; Usc; SysErr; Unqueue

// incoming statics
dsp; keys; debugFlag; scratchDisk; numFiles; phase; lpt

structure String [ length byte; char↑1,1 byte ]

let Pass2Phase1(buffPtr, numBuffs) = valof
// This phase sorts the leader page table for use by phase 3.
// The more memory available to the sort package, the faster things go.
// Pass2 starts in resident code with no paging buffers in use and
//  allocates as much contiguous space as it can, leaving just enough
//  slop for the intermediate sort files and the sort overlays.
Ws("*N[2-1]"); if debugFlag then Gets(keys)
if GetLptSorted(lpt) then
   [ Ws("*N[2-1] LPT is already sorted"); resultis true ]
phase, numFiles = 1, 0
let sortZone = InitializeZone(buffPtr, 256*numBuffs, SysErr, 0)
// InitializeZone calls IfsAddToZone, which queues a chunk descriptor
//  on chunkQ.  Since sortZone is not part of sysZone, this is bad.
Unqueue(chunkQ, chunkQ!1)
let startTime = vec 1; ReadCalendar(startTime)
Sort(GetLpte, PutLpte, CompareLPTEs, 25, 256, sortZone, scratchDisk)
PutTemplate(dsp, "*N[2-1] Number of files = $UD", numFiles)
PutTemplate(dsp, "*N[2-1] SortZone size = $D words", 256*numBuffs)
TruncateDiskStream(lpt)  //we may have squeezed out some deleted entries
SetLptSorted(lpt, true)
resultis true
and GetLpte(lpte, nil) = valof
// Gets the next lpte to be added to the sort
unless ReadLPTE(lpt, lpte) resultis 0
if GetLpteType(lpte) ne dvTypeFile loop
resultis GetLpteLength(lpte)
] repeat

and PutLpte(lpte, length) be
// Puts a sorted lpte into the output file
if numFiles eq 0 then
   //first output record - overwrite input!
   ReadLPTE(lpt)  //don't overwrite home block
numFiles = numFiles +1
WriteLPTE(lpt, lpte)