DIRECTORY Basics, CharDisplays, Commander, CommandTool, DisplayControllers, FS, IO, OrderedSymbolTableRef, Rope, TermProgs; TermProgsImpl: CEDAR PROGRAM IMPORTS CommandTool, FS, IO, OrderedSymbolTableRef, Rope EXPORTS TermProgs = {OPEN TermProgs; TermData: TYPE = REF TermDataRep; TermDataRep: TYPE = RECORD [ termName, bcdBase, bcdDir: ROPE _ NIL, term: Term _ NIL]; terms: OrderedSymbolTableRef.Table; 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[ "Push %g\nRun %g\nPop", IO.rope[td.bcdDir], IO.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]}; 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 [r1, r2: REF ANY] RETURNS [c: Basics.Comparison] = { Key: PROC [ra: REF ANY] RETURNS [kr: ROPE] = { WITH ra SELECT FROM r: ROPE => kr _ r; td: TermData => kr _ td.termName; ENDCASE => ERROR}; c _ Key[r1].Compare[Key[r2], FALSE]}; 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]; IF termsFName.Substr[cp.server.start, cp.server.length].Length[] > 0 THEN ERROR; IF termsFName.Substr[cp.dir.start, cp.dir.length].Length[] > 0 THEN ERROR; bcdDir _ Rope.Cat[ "[]<>", termsFName.Substr[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]; ENDLOOP; fromTerms.Close[]; }; terms _ OrderedSymbolTableRef.CreateTable[CompareTermDatas]; FS.EnumerateForNames["Em*.terms!H", ConsumeTerms]; }; Start[]; }. RTermProgsImpl.Mesa Last Edited by: Spreitzer, April 6, 1985 12:45:23 pm PST สฝ– "cedar" style˜Icode™J™8K˜Kšฯk œCœœ)˜{K˜šะbx œœ˜Kšœœœ˜8Kšœ ˜K˜Kšœœ ˜K˜Kšœ œœ ˜!šœ œœ˜Kšœœœ˜&Kšœ œ˜—K˜Kšœ#˜#K˜š ฯnœœœœœ˜QKšœœ˜*Kš œœœœœ˜Kšœ œœœ ˜'˜šœ œ˜Kšœ˜Kšœ˜Kšœ˜—K˜ —Kšœœ˜ Kš œœœœ œœ˜)K˜—K˜šŸœœœœ˜1Kšœœ˜*šœœœ˜Kšœœ"˜*K˜—K˜K˜—K˜š Ÿœœœ œœ˜Hš Ÿ œœœœœœ˜:Kšœœ˜K˜Kšœœ˜—K˜'K˜—K˜š Ÿœœ œœœ˜Kš Ÿœœœœœœ˜.šœœ˜Kšœœ ˜K˜!Kšœœ˜——Kšœœ˜%—K˜šŸœœ˜š Ÿ œœ œœ œ˜AKšœœ˜Kšœœ˜Kšœ œœœ˜Kšœ œ˜Kšœœ˜,KšœCœœ˜PKšœ=œœ˜Jšœ˜Kšœ˜Kšœ6˜6Kšœ˜—Kšœ œ˜&š œœ:œœ˜bKšœ œ˜,šœœ˜#Kšœ˜Kšœ:˜:Kšœ˜Kšœ˜—K˜Kšœ˜—K˜K˜—Kšœ<˜