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];
}.