TermProgsImpl.Mesa
Copyright Ó 1990 by Xerox Corporation. All rights reserved.
Last Edited by: Spreitzer, May 5, 1985 2:13:01 pm PDT
Last tweaked by Mike Spreitzer on July 18, 1990 10:13 am PDT
TermProgsImpl:
CEDAR
PROGRAM
IMPORTS CommandTool, FamousPath, FS, IO, MessageWindow, RedBlackTree, Rope
EXPORTS TermProgs
= {OPEN TermProgs;
TermData: TYPE = REF TermDataRep;
TermDataRep:
TYPE =
RECORD [
termName, bcdBase, bcdDir: ROPE ← NIL,
term: Term ← NIL];
terms: RedBlackTree.Table ~ RedBlackTree.Create[GetTermKey, CompareTermDatas];
GetTerm:
PUBLIC
PROC [name:
ROPE, cmd: Commander.Handle]
RETURNS [term: Term] = {
td: TermData ← NARROW[terms.Lookup[name]];
IF td = NIL THEN RETURN [NIL];
IF td.term # NIL THEN RETURN [td.term];
[] ← CommandTool.DoCommand[
commandLine: IO.PutFR["TerminalRun%g", [rope[td.bcdBase]]],
parent: cmd];
td ← NARROW[terms.Lookup[name]];
term ← IF td # NIL THEN td.term ELSE NIL;
};
RegTerm:
PUBLIC
PROC [name:
ROPE, term: Term] = {
td: TermData ← NARROW[terms.Lookup[name]];
IF td =
NIL
THEN {
td ← NEW [TermDataRep ← [termName: name]];
terms.Insert[td, name]};
td.term ← term;
};
EnumerateTerms:
PUBLIC
PROC [consume:
PROC [name:
ROPE, term: Term]] = {
PerTermData:
PROC [item:
REF
ANY]
RETURNS [stop:
BOOL] = {
td: TermData ← NARROW[item];
consume[td.termName, td.term];
stop ← FALSE};
terms.EnumerateIncreasing[PerTermData];
};
CompareTermDatas:
PROC [k, data:
REF
ANY]
RETURNS [c: Basics.Comparison] = {
r1: ROPE ← NARROW[k];
r2: ROPE ← GetTermKey[data];
c ← r1.Compare[r2, FALSE]};
GetTermKey:
PROC [data:
REF
ANY]
RETURNS [key:
ROPE] =
{td: TermData ← NARROW[data]; key ← td.termName};
Start:
PROC = {
ConsumeTerms:
PROC [fullFName:
ROPE]
RETURNS [continue:
BOOL] = {
termsFName, bcdDir: ROPE;
cp: FS.ComponentPositions;
fromTerms: IO.STREAM ← NIL;
continue ← TRUE;
[termsFName, cp] ← FS.ExpandName[fullFName];
bcdDir ← termsFName.Substr[start: 0, len: cp.subDirs.start+cp.subDirs.length];
fromTerms ← FS.StreamOpen[termsFName];
FOR i:
INT ← fromTerms.SkipWhitespace[], fromTerms.SkipWhitespace[]
WHILE
NOT fromTerms.EndOf[]
DO
termName: ROPE ← fromTerms.GetRopeLiteral[];
td: TermData ←
NEW [TermDataRep ← [
termName: termName,
bcdBase: termsFName.Substr[cp.base.start, cp.base.length],
bcdDir: bcdDir
]];
terms.Insert[td, termName !RedBlackTree.DuplicateKey => CONTINUE];
ENDLOOP;
fromTerms.Close[];
};
enumErr ← [ok, NIL, NIL];
FOR dl: FamousPath.DirectoryList ← FamousPath.Get["TerminalEmulator"], dl.rest
WHILE dl#
NIL
DO
FS.EnumerateForNames[FS.ExpandName[Rope.Cat[dl.first, "Em*.terms", SELECT Basics.bitsPerWord FROM 16 => "!H", 32 => NIL, ENDCASE => ERROR]].fullFName, ConsumeTerms !FS.Error => {enumErr ← error; CONTINUE}];
IF enumErr.group # ok THEN SayErr[];
ENDLOOP;
RETURN};
SayErr:
PROC ~ {
MessageWindow.Append[enumErr.explanation]};
enumErr: FS.ErrorDesc;
Start[];
}.