-- StateCold.mesa last edit: Sandman July 18, 1980 11:44 AM
-- last edit: Bruce 26-Sep-80 13:04:07
DIRECTORY
Commands USING [DispatchChar, StringId],
DebugOps USING [fileSW],
Event USING [Notify],
DHeap USING [FreeEverything, Zero],
HeapString USING [Replace],
Init USING [],
Nub USING [DoCommand],
Profile USING [],
State USING [Context, GSHandle, GState, Handle, SetParse, Stack, StringArray, StringProc, Strings],
Storage USING [Free, FreeString, Node, String],
TajoMisc USING [],
TextSource USING [Handle],
TextSW USING [Adjust, GetSource],
ToolWindow USING [AdjustProcType, TransitionProcType],
UserInput USING [SetStringIn];
StateCold: PROGRAM
IMPORTS
Commands, DebugOps, Event, DHeap, HeapString, Nub, State,
Storage, TextSW, UserInput
EXPORTS Init, Profile, State, TajoMisc =
BEGIN OPEN State;
debugging: PUBLIC BOOLEAN ← FALSE;
librarian: PUBLIC STRING ← NIL;
registry: PUBLIC STRING ← NIL;
userName: PUBLIC STRING;
userPassword: PUBLIC STRING;
top: PUBLIC Handle ← NIL;
strings: PUBLIC Strings;
gstate: GState ← [];
gs: PUBLIC GSHandle ← @gstate;
OutOfState: PUBLIC ERROR = CODE;
Adjust: PUBLIC ToolWindow.AdjustProcType =
BEGIN
IF when = after THEN
TextSW.Adjust[DebugOps.fileSW, [[0,0], box.dims], when];
END;
Transition: PUBLIC ToolWindow.TransitionProcType = {
source: TextSource.Handle;
IF new # tiny THEN RETURN;
source ← TextSW.GetSource[DebugOps.fileSW];
[] ← source.actOn[source,truncate]};
-- TajoMisc
SetDebugging: PUBLIC PROC [debug: BOOLEAN] =
BEGIN
debugging ← debug;
Event.Notify[setDefaults];
END;
SetLibrarian: PUBLIC PROCEDURE [s: STRING] =
BEGIN
HeapString.Replace[to: @librarian, from: s];
Event.Notify[setDefaults];
END;
SetRegistry: PUBLIC PROCEDURE [s: STRING] =
BEGIN
HeapString.Replace[to: @registry, from: s];
Event.Notify[setDefaults];
END;
-- strings
SetString: PUBLIC PROCEDURE [id: Commands.StringId, val: STRING] =
BEGIN
IF strings[id] # NIL THEN Storage.FreeString[strings[id]];
strings[id] ← val;
END;
-- context
Push: PUBLIC PROCEDURE =
BEGIN
temp: Handle ← MakeContext[];
temp.prev ← top;
IF top.prev = NIL THEN DHeap.FreeEverything[];
gs.level ← gs.level+1;
top←temp;
top.howSet ← state;
END;
Pop: PUBLIC PROCEDURE =
BEGIN
temp: Handle;
i, next: POINTER TO Stack;
IF top = NIL THEN ERROR OutOfState;
temp ← top.prev;
FOR i ← top.fooStack, next UNTIL i = NIL DO
next ← i.link;
Storage.Free[i];
ENDLOOP;
DHeap.FreeEverything[];
Storage.Free[top];
top ← temp;
gs.level ← gs.level-1;
END;
ResetParse: PUBLIC PROC =
{SetParse[IF gs.inNub THEN Nub.DoCommand ELSE Commands.DispatchChar]};
MakeContext: PROCEDURE RETURNS [h: Handle] =
BEGIN
h ← Storage.Node[SIZE[Context]];
h↑ ← [];
END;
Go: PUBLIC PROCEDURE =
BEGIN
top ← MakeContext[];
[] ← UserInput.SetStringIn[DebugOps.fileSW, State.StringProc, FALSE]
END;
OnYourMark: PUBLIC PROCEDURE =
BEGIN
p: POINTER ← Storage.Node[SIZE[StringArray]];
strings ← DESCRIPTOR[p,SIZE[StringArray]];
DHeap.Zero[p,SIZE[StringArray]];
gs.parse ← Commands.DispatchChar;
strings[user] ← userName ← Storage.String[30];
strings[password] ← userPassword ← Storage.String[30];
END;
END.