-- File: ScriptParseInterface.mesa - last edit by:
-- Karlton, 19-Aug-82 18:43:28
DIRECTORY
FormSW USING [
AllocateItemDescriptor, ClientItemsProcType, CommandItem, newLine,
ProcType, StringItem],
Heap USING [Create, Delete, systemZone],
Helvetica12 USING [],
Helvetica12b USING [],
Helvetica12i USING [],
Helvetica12bi USING [],
MStream USING [Error, ReadOnly, WriteOnly],
Runtime USING [GetTableBase, GlobalFrame],
Put USING [Char, LongDecimal, Line, Text],
ScriptHash USING [Destroy, Handle],
ScriptParse USING [Error, Externalize, Internalize, ShowTree],
ScriptTree USING [Destroy, TreeHandle],
Storage USING [CopyString, StringLength],
Stream USING [Delete, Handle],
Tool USING [Create, MakeFormSW, MakeMsgSW, MakeSWsProc],
ToolWindow USING [TransitionProcType],
UserTerminal USING [BlinkDisplay],
Window USING [Handle],
WindowFont USING [Handle, Initialize, Object];
ScriptParseInterface: PROGRAM
IMPORTS
FormSW, Heap, Helvetica12, Helvetica12b, Helvetica12i, Helvetica12bi,
MStream, Put, Runtime, ScriptHash, ScriptParse, ScriptTree, Stream, Storage,
Tool, UserTerminal, WindowFont =
BEGIN
-- TYPEs
Fonts: TYPE = {normal, bold, italic, boldItalic};
DataHandle: TYPE = LONG POINTER TO Data;
Data: TYPE = RECORD [
msgSW: Window.Handle ← NIL,
formSW: Window.Handle ← NIL,
hadFailure: BOOLEAN ← FALSE,
input, output, debug: LONG STRING ← NIL,
univ, id: ScriptHash.Handle ← NIL,
tree: ScriptTree.TreeHandle ← NIL,
z: UNCOUNTED ZONE ← NULL];
fonts: ARRAY Fonts OF WindowFont.Object ← ALL[[address: NIL]];
toolData: DataHandle ← NIL;
wh: Window.Handle; -- Tool's window
GiveUp: ERROR = CODE;
Failed: PROCEDURE [w: Window.Handle, s: LONG STRING, pos: LONG CARDINAL ← 0] = {
IF pos # 0 THEN {Put.Char[w, '(]; Put.LongDecimal[w, pos]; Put.Text[w, ") "L]};
Put.Line[w, s];
UserTerminal.BlinkDisplay[];
ERROR GiveUp};
FreeTree: PROCEDURE [d: DataHandle] = {
IF d.tree = NIL THEN RETURN;
ScriptHash.Destroy[d.univ];
ScriptHash.Destroy[d.id];
ScriptTree.Destroy[d.tree];
Heap.Delete[d.z];
d.tree ← NIL};
Command: FormSW.ProcType = {
ENABLE GiveUp => CONTINUE;
SELECT index FROM
0 => Parse[toolData];
2 => ShowTree[toolData];
4 => Unparse[toolData];
ENDCASE};
GetStream: PROC [
w: Window.Handle, name: LONG STRING, rw: {read, write}, prompt: STRING]
RETURNS [s: Stream.Handle] = {
Put.Text[w, prompt];
IF Storage.StringLength[name] = 0 THEN Failed[w, "No file specified."L];
Put.Text[w, name];
s ← SELECT rw FROM
read => MStream.ReadOnly[name, [] ! MStream.Error =>
Failed[w, " can't be read."L]],
write => MStream.WriteOnly[name, [], text ! MStream.Error =>
Failed[w, " can't be written."L]],
ENDCASE => ERROR GiveUp};
Unparse: PROC [d: DataHandle] = {
output: Stream.Handle;
IF d.tree = NIL THEN Failed[d.msgSW, "No current tree."L];
output ← GetStream[d.msgSW, d.output, write, "Externalizing: "L];
ScriptParse.Externalize[output, d.univ, d.id, d.tree];
Put.Line[toolData.msgSW, " ... done"L];
output.Delete[]};
ShowTree: PROC [d: DataHandle] = {
output: Stream.Handle;
IF d.tree = NIL THEN Failed[d.msgSW, "No current tree."L];
output ← GetStream[d.msgSW, d.debug, write, "Showing Tree: "L];
ScriptParse.ShowTree[output, d.univ, d.id, d.tree];
Put.Line[toolData.msgSW, " ... done"L];
output.Delete[]};
Parse: PROC [d: DataHandle] = {
input: Stream.Handle ← GetStream[d.msgSW, d.input, read, "Internalizing: "L];
FreeTree[d];
d.z ← Heap.Create[initial: 4];
[d.univ, d.id, d.tree] ← ScriptParse.Internalize[input, d.z !
ScriptParse.Error => Failed[toolData.msgSW, ": Parse failure"L, position];
UNWIND => {Heap.Delete[d.z]; input.Delete[]}];
Put.Line[toolData.msgSW, " ... done"L];
input.Delete[]};
ClientTransition: ToolWindow.TransitionProcType =
BEGIN
SELECT TRUE FROM
old = inactive =>
IF toolData = NIL THEN toolData ← Heap.systemZone.NEW[Data ← []];
new = inactive =>
IF toolData # NIL THEN {
FreeTree[toolData]; Heap.systemZone.FREE[@toolData]};
ENDCASE;
END;
Init: PROCEDURE =
BEGIN
MakeFont[Helvetica12, @fonts[normal]];
MakeFont[Helvetica12b, @fonts[bold]];
MakeFont[Helvetica12i, @fonts[italic]];
MakeFont[Helvetica12bi, @fonts[boldItalic]];
wh ← Tool.Create[
initialBox: [[0, 30], [350, 100]],
makeSWsProc: MakeSWs, initialState: default,
clientTransition: ClientTransition, name: "Interscript Tool"L,
symbioteId: "ScriptParseTool"L, tinyName1: "Inter-"L, tinyName2: "script"L];
END;
MakeFont: PROCEDURE [program: UNSPECIFIED, f: WindowFont.Handle] = {
f.address ← Runtime.GetTableBase[Runtime.GlobalFrame[program]];
WindowFont.Initialize[f]};
MakeForm: FormSW.ClientItemsProcType =
BEGIN OPEN FormSW;
-- This procedure creates a sample FormSW.
nItems: CARDINAL = 6;
items ← AllocateItemDescriptor[nItems];
toolData.input ← Storage.CopyString["Sample.script"L];
toolData.output ← Storage.CopyString["Canonical.script"L];
toolData.debug ← Storage.CopyString["Sample.tree"L];
items[0] ← CommandItem[tag: "Internalize"L, place: newLine, proc: Command];
items[1] ← StringItem[tag: "File"L, string: @toolData.input, inHeap: TRUE];
items[2] ← CommandItem[tag: "Show Tree"L, place: newLine, proc: Command];
items[3] ← StringItem[tag: "File"L, string: @toolData.debug, inHeap: TRUE];
items[4] ← CommandItem[tag: "Externalize"L, place: newLine, proc: Command];
items[5] ← StringItem[tag: "File"L, string: @toolData.output, inHeap: TRUE];
RETURN[items: items, freeDesc: TRUE];
END;
MakeSWs: Tool.MakeSWsProc =
BEGIN
logName: STRING ← [40];
toolData.msgSW ← Tool.MakeMsgSW[window: window];
toolData.formSW ← Tool.MakeFormSW[window: window, formProc: MakeForm];
END;
-- Mainline code
Init[]; -- this gets string out of global frame
END...