<> <> <> DIRECTORY BasicTime, Commander, IO, List, RedBlackTree, Rope, TimeStamp; MakeDo: CEDAR DEFINITIONS = BEGIN ROPE: TYPE = Rope.ROPE; RopeList: TYPE = LIST OF ROPE; Table: TYPE = RedBlackTree.Table; PropList: TYPE = List.AList; Time: TYPE = BasicTime.GMT; notExistTime: Time = BasicTime.nullGMT; unknownTime: Time = LOOPHOLE[FIRST[LONG CARDINAL]]; Stamp: TYPE = TimeStamp.Stamp; notExistStamp: Stamp = [255, 255, LAST[LONG CARDINAL]]; unknownStamp: Stamp = TimeStamp.Null; NodeList: TYPE = LIST OF Node; Node: TYPE = REF NodeRep; NodeRep: TYPE; CommandList: TYPE = LIST OF Command; Command: TYPE = REF CommandRep; CommandRep: TYPE; Warning: SIGNAL [message: ROPE]; <> Ensure: PROC [ch: Commander.Handle, goals, modifiable: Table, guessBoundary, assumeAllInconsistent, suspectAll, do, record: BOOL] RETURNS [nFailed, nSucceeded, nSteps: NAT, failedSteps: CommandList, cmds: ROPE]; <> <> <> <> Explain: PROC [ch: Commander.Handle, nodes: Table, verbosely: BOOL]; <> <> DestroyGraph: PROC; SuspectAll: PROC [change, remake: BOOL]; NodeMayNeedRemaking: PROC [n: Node, stack: Table]; SuspectProducer: PROC [n: Node, stack: Table]; RetryToProduce: PROC [Node]; <> MakeNodeTable: PROC RETURNS [table: Table]; AddNodeToTable: PROC [n: Node, t: Table]; FindNode: PROC [someName: ROPE, class: NodeClass] RETURNS [node: Node]; <> SetProcessAllocation: PROC [n: NAT]; <> AddFinder: PROC [finder: Finder, end: End]; End: TYPE = {front, back}; Finder: TYPE = RECORD [name: ROPE, finderProc: FinderProc, finderData: REF ANY _ NIL]; FinderProc: TYPE = PROC [resultName: ROPE, finderData: REF ANY] RETURNS [found: BOOLEAN, sought: Node, makes: NodeList, from, cmdFrom: From, cmd: ROPE, class: CommandClass, foundData: REF ANY]; From: TYPE = RECORD [mustHave, optional: NodeList]; CommandClass: TYPE = REF CommandClassRep; CommandClassRep: TYPE = RECORD [ NotCurrent: NotCurrentProc, Rederive: RederiveProc, Explain: ExplainProc, classData: REF ANY _ NIL]; NotCurrentProc: TYPE = PROC [c: Command, Needed: PROC [Node] RETURNS [BOOL]] RETURNS [whyNotCurrent: ROPE--NIL means all outputs up-to-date--]; RederiveProc: TYPE = PROC [c: Command] RETURNS [from: From, cmd: ROPE]; ExplainProc: TYPE = PROC [c: Command, to: IO.STREAM]; GetNode: PROC [someName: ROPE, class: NodeClass, mayAdd: BOOL _ TRUE] RETURNS [node: Node]; <> NodeClass: TYPE = REF NodeClassRep; NodeClassRep: TYPE = RECORD [ CanonizeName: PROC [ROPE] RETURNS [ROPE], GetTime: GetTimeProc ]; GetTimeProc: TYPE = PROC [n: Node] RETURNS [created: Time]; fileClass: NodeClass; PublicPartsOfNode: PROC [n: Node] RETURNS [name: ROPE, class: NodeClass]; GetProp: PROC [n: Node, prop: REF ANY] RETURNS [val: REF ANY]; SetProp: PROC [n: Node, prop, val: REF ANY]; EnumerateConsumers: PROC [n: Node, which: CmdDep, to: PROC [Command, CmdDep]]; GetCreated: PROC [n: Node] RETURNS [t: Time]; Exists: PROC [n: Node] RETURNS [exists: BOOL]; <<= {exists _ GetCreated[n] # notExistTime}>> PublicPartsOfCommand: PROC [c: Command] RETURNS [cmd: ROPE, foundData: REF ANY, failed: BOOL, reasonWhyLastDone: ROPE]; EnumerateResults: PROC [c: Command, to: PROC [Node]]; InnerEnumerateSources: PROC [c: Command, which: CmdDep, to: PROC [n: Node, which: CmdDep, optional: BOOL]]; <> CmdDep: TYPE = {cmd, data}; FmtTime: PROC [Time] RETURNS [ROPE]; <> EnumerateSources: PROC [c: Command, which: CmdDep, to: PROC [n: Node, which: CmdDep, optional: BOOL]]; GetProducer: PROC [n: Node] RETURNS [producer: Command]; <> SuspectNodeChange: PROC [n: Node, stack: Table--of Nodes & Commands, for dependency cycle detection--]; NewRefTable: PROC RETURNS [Table--of REF ANYs, identified by address--]; END.