--file GSort.mesa (converted from GPsortDefs 3-Mar-81)
--last modified by:
-- Evans on November 24, 1980 10:51 AM
-- Sandman on July 8, 1980 9:03 AM
-- Sweet on 9-Mar-81 9:23:17
-- Satterthwaite on August 13, 1982 2:29 pm
GSort: DEFINITIONS = {
GetProcType: TYPE = PROC [p: LONG POINTER] RETURNS [CARDINAL];
PutProcType: TYPE = PROC [p: LONG POINTER, len: CARDINAL];
CompareProcType: TYPE = PROC [p1: LONG POINTER, p2: LONG POINTER] RETURNS [INTEGER];
Sort: PROC [
get: GetProcType, put: PutProcType, compare: CompareProcType,
expectedItemSize: CARDINAL ← 30, maxItemSize: CARDINAL ← 1000,
pagesInHeap: CARDINAL ← 100];
RecordTooLong: ERROR;
-- The declarations below can be used to run the sort package as a coroutine
-- in the following way
--
-- OutToSort: GSort.SortItemPort;
-- buffer: LONG POINTER; (possibly TO YourDataItem)
-- LOOPHOLE[OutToSort, GSort.Port].out ← GSort.Sort;
-- buffer ← LOOPHOLE[OutToSort, GSort.SortStarter] [
-- nextItem: @OutToSort,
-- ... other params as in call to Sort];
-- ... construct a sort record in buffer
-- buffer ← OutToSort[(length of record currently in buffer)];
-- ... keep doing that until there are no more data
-- LOOPHOLE[OutToSort, GSort.SortStopper][];
-- ... at this point, the put proc gets called with the sorted records
Port: TYPE = MACHINE DEPENDENT RECORD [in, out: UNSPECIFIED];
SortItemPort: TYPE = PORT [len: CARDINAL] RETURNS [p: LONG POINTER];
SortStarter: TYPE = PORT [
nextItem: POINTER TO SortItemPort,
put: PutProcType,
compare: CompareProcType,
expectedItemSize: CARDINAL ← 30, maxItemSize: CARDINAL ← 1000,
pagesInHeap: CARDINAL ← 100] RETURNS [p: LONG POINTER];
SortStopper: TYPE = PORT [len: CARDINAL ← 0];
}.