-- file TestCompilerImpl.Mesa
-- last edited by Satterthwaite, June 30, 1982 11:55 am
DIRECTORY
Ascii: TYPE USING [CR],
Exec: TYPE USING [AddCommand, commandLine],
ExecOps: TYPE USING [Command],
Feedback: TYPE USING [FinishItemProc, Handle, NoteProgressProc, Procs, ProcsHandle],
Heap: TYPE USING [MakeNode, FreeNode],
TemporarySpecialExecOps: TYPE USING [CompileUsingFeedback],
UserTerminal: TYPE USING [
Coordinate, CursorArray, GetCursorPattern, SetCursorPattern, SetMousePosition,
mouse, screenHeight, screenWidth];
TestCompilerImpl: PROGRAM
IMPORTS Exec, Heap, TemporarySpecialExecOps, UserTerminal = {
Main: PROC = {
nChars: CARDINAL = (Exec.commandLine.s.length - Exec.commandLine.i) + 1;
command: ExecOps.Command ← Heap.MakeNode[n: (nChars+1)/2];
cursorBits: UserTerminal.CursorArray ← ALL[177777b];
cursorCoord: UserTerminal.Coordinate ← [64, 64];
L1: WORD = 147777b;
R1: WORD = 177763b;
M1: WORD = 177177b;
Two: WORD = 147763b;
ClearCursor: PROC = {
cursorBits ← ALL[177777b]; UserTerminal.SetCursorPattern[cursorBits]};
SetCursor: PROC [position: {upper, middle, lower}, row: WORD] = {
SELECT position FROM
upper => cursorBits[2] ← cursorBits[3] ← row;
middle => cursorBits[7] ← cursorBits[8] ← row;
lower => cursorBits[12] ← cursorBits[13] ← row;
ENDCASE};
ChangeCursor: Feedback.NoteProgressProc = {
ClearCursor[];
SELECT state FROM
1 => SetCursor[middle, M1];
2 => {SetCursor[upper, L1]; SetCursor[lower, R1]};
3 => {SetCursor[upper, R1]; SetCursor[middle, M1]; SetCursor[lower, L1]};
4 => {SetCursor[upper, Two]; SetCursor[lower, Two]};
5 => {SetCursor[upper, Two]; SetCursor[middle, M1]; SetCursor[lower, Two]};
6 => {SetCursor[upper, Two]; SetCursor[middle, Two]; SetCursor[lower, Two]}
ENDCASE;
UserTerminal.SetCursorPattern[cursorBits]};
StepCursor: Feedback.FinishItemProc = {
IF (cursorCoord.y ← cursorCoord.y + 16) > UserTerminal.screenHeight - 64 THEN
cursorCoord.y ← 64;
IF (outcome = errors) OR (outcome = errorsAndWarnings) THEN {
cursorCoord.x ← cursorCoord.x + 16;
IF cursorCoord.x > UserTerminal.screenWidth - 64 THEN cursorCoord.x ← 64};
UserTerminal.SetMousePosition[cursorCoord]};
saveCursor: UserTerminal.CursorArray = UserTerminal.GetCursorPattern[];
saveCoord: UserTerminal.Coordinate = UserTerminal.mouse↑;
fProcs: Feedback.Procs ← [noteProgress: ChangeCursor, finishItem: StepCursor];
j: CARDINAL ← 0;
FOR i: CARDINAL IN [Exec.commandLine.i..Exec.commandLine.s.length) DO
command[j] ← Exec.commandLine.s[i]; j ← j+1;
ENDLOOP;
command[j] ← Ascii.CR;
UserTerminal.SetCursorPattern[cursorBits]; UserTerminal.SetMousePosition[cursorCoord];
[] ← TemporarySpecialExecOps.CompileUsingFeedback[command, @fProcs];
UserTerminal.SetCursorPattern[saveCursor]; UserTerminal.SetMousePosition[saveCoord];
Heap.FreeNode[p: command]};
Init: PROC = {Exec.AddCommand["TestCompiler.~"L, Main]};
Init[];
}.