DIRECTORY BasicTime USING [GMT, nullGMT], Commander USING [Handle], IO USING [STREAM], List USING [AList], RefTab USING [Ref], Rope USING [ROPE]; MakeDo: CEDAR DEFINITIONS = BEGIN ROPE: TYPE = Rope.ROPE; RopeList: TYPE = LIST OF ROPE; RefTable: TYPE = RefTab.Ref; PropList: TYPE = List.AList; Time: TYPE = BasicTime.GMT; notExistTime: Time = BasicTime.nullGMT; unknownTime: Time = LOOPHOLE[FIRST[LONG CARDINAL]]; NodeList: TYPE = LIST OF Node; Node: TYPE = REF NodeRep; NodeRep: TYPE; ActionList: TYPE = LIST OF Action; Action: TYPE = REF ActionRep; ActionRep: TYPE; Warning: SIGNAL [message: ROPE]; IsNode: PROC [REF ANY] RETURNS [BOOL]; NarrowToNode: PROC [REF ANY] RETURNS [Node]; IsAction: PROC [REF ANY] RETURNS [BOOL]; NarrowToAction: PROC [REF ANY] RETURNS [Action]; existsFSWatch: READONLY BOOL; Ensure: PROC [goals: RefTable, modifiabilitySpec: ModifiabilitySpec, supportFiles: RefTable, PerMissedSupportFile: PROC [Node], parent: Commander.Handle] RETURNS [okGoalCount, nonOKGoalCount, nSteps: NAT, failedSteps: ActionList, nonOKGoalList: NodeList]; ModifiabilitySpec: TYPE = RefTable; Modifiability: TYPE = {yes, guess, no, uninitialized}; Explain: PROC [ch: Commander.Handle, nodes: RefTable]; GetActions: PROC [goals: RefTable, modifiabilitySpec: ModifiabilitySpec, report: ReportSpec, neededLeaves, optionalLeaves, determiningLeaves, brokenGoals: RefTable _ NIL] RETURNS [actions: ActionList]; ReportSpec: TYPE = {none, toBeDone, all}; DestructivelyReverseActionList: PROC [ActionList] RETURNS [ActionList]; Verify: PROC [pkgList: LIST OF ROPE]; SuspectNodeChange: PROC [n: Node]; SuspectNodesChange: PROC [RefTable]; UncurrentNode: PROC [n: Node]; UncurrentNodes: PROC [RefTable]; UncurrentProducer: PROC [n: Node]; UncurrentProducers: PROC [RefTable]; ForAll: PROC [suspectChange, uncurrent: BOOL]; DestroyGraph: PROC; RetryToProduce: PROC [Node]; MakeRefTable: PROC RETURNS [table: RefTable]; AddToRefTable: PROC [ra: REF ANY, t: RefTable]; EnsureRefInTable: PROC [ra: REF ANY, t: RefTable]; DeleteFromRefTable: PROC [ra: REF ANY, t: RefTable] RETURNS [found: BOOL]; RefInTable: PROC [ra: REF ANY, t: RefTable] RETURNS [BOOL]; ScanRefTable: PROC [table: RefTable, EachNode: PROC [REF ANY] RETURNS [stop: BOOL _ FALSE]]; EnumerateNodes: PROC[table: RefTable, EachNode: PROC [Node]]; AnalyzeDFFile: PROC [dfName: ROPE, goals, supportFiles: RefTable, modifiable: ModifiabilitySpec, doToVerifyGoals, doToOtherOwns, doToImports: DoToFile]; DoToFile: TYPE = {ignore, makeGoal, makeModifiable, makeSupport}; FindNode: PROC [someName: ROPE, class: NodeClass] RETURNS [node: Node]; LookupNodeClass: PROC [className: ROPE] RETURNS [class: NodeClass]; ForkParms: TYPE ~ REF ForkParmsRep; ForkParmsRep: TYPE; ForkParmsFromStream: PROC [in: IO.STREAM] RETURNS [ForkParms]; GetForkParms: PROC RETURNS [ForkParms]; SetForkParms: PROC [ForkParms]; ForkParmsFromProfile: PROC RETURNS [ForkParms]; 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, cmdFrom: NodeList, from: From, cmd: ROPE, class: ActionClass, foundData: REF ANY]; From: TYPE = RECORD [mustHave, optional: NodeList]; ActionClass: TYPE = REF ActionClassRep; ActionClassRep: TYPE = RECORD [ CheckConsistency: ConsistencyChecker, Rederive: RederiveProc, EnumHiddenDeps: HiddenDependencyEnumerator _ NIL, ClearCaches: ClearCachesProc _ NIL, classData: REF ANY _ NIL]; ConsistencyChecker: TYPE = PROC [a: Action, result: Node] RETURNS [consistent: BOOL, reason: ROPE]; RederiveProc: TYPE = PROC [a: Action] RETURNS [from: From, cmd: ROPE]; HiddenDependencyEnumerator: TYPE ~ PROC [a: Action, Consume: PROC [Node]]; ClearCachesProc: TYPE ~ PROC [ac: ActionClass]; GetNode: PROC [someName: ROPE, class: NodeClass, mayAdd: BOOL _ TRUE] RETURNS [node: Node]; NodeClass: TYPE = REF NodeClassRep; NodeClassRep: TYPE; IsNodeClass: PROC [REF ANY] RETURNS [BOOL]; NarrowToNodeClass: PROC [REF ANY] RETURNS [NodeClass]; DeclareNodeClass: PROC [ name: ROPE, CanonizeName: PROC [ROPE] RETURNS [ROPE], GetInfo: GetInfoProc ] RETURNS [nodeClass: NodeClass]; GetInfoProc: TYPE = PROC [n: Node] RETURNS [created: Time, length: INT]; fileClass: NodeClass; PublicPartsOfNode: PROC [n: Node] RETURNS [name: ROPE, class: NodeClass]; PublicPartsOfNodeClass: PROC [nc: NodeClass] RETURNS [name: ROPE, CanonizeName: PROC [ROPE] RETURNS [ROPE], GetInfo: GetInfoProc]; DescribeNode: PROC [n: Node] RETURNS [ROPE]; GetProp: PROC [n: Node, prop: REF ANY] RETURNS [val: REF ANY]; SetProp: PROC [n: Node, prop, val: REF ANY]; GetProducer: PROC [n: Node] RETURNS [producer: Action]; InnerGetInfo: GetInfoProc; InnerGetCreated: PROC [n: Node] RETURNS [t: Time]; InnerExists: PROC [n: Node, zeroLenExists: BOOL _ TRUE] RETURNS [exists: BOOL]; PublicPartsOfAction: PROC [a: Action] RETURNS [cmd: ROPE, foundData: REF ANY, class: ActionClass]; InnerEnumerateSources: PROC [a: Action, which: ActionDep, to: PROC [n: Node, which: ActionDep, optional: BOOL]]; ActionDep: TYPE = {cmd, data}; FmtTime: PROC [Time] RETURNS [ROPE]; GetCreated: PROC [n: Node] RETURNS [t: Time]; GetInfo: GetInfoProc; Exists: PROC [n: Node, zeroLenExists: BOOL _ TRUE] RETURNS [exists: BOOL]; EnumerateConsumers: PROC [n: Node, which: ActionDep, to: PROC [Action, ActionDep]]; EnumerateResults: PROC [a: Action, to: PROC [Node]]; EnumerateSources: PROC [a: Action, which: ActionDep, to: PROC [n: Node, which: ActionDep, optional: BOOL]]; END. rMakeDo.Mesa Last Edited by: Spreitzer, May 9, 1986 8:37:53 pm PDT Eduardo Pelegri-Llopart November 18, 1988 8:49:52 am PST Last tweaked by Mike Spreitzer on October 5, 1992 11:54 am PDT Carl Hauser, April 11, 1985 3:34:27 pm PST New Types & Stuff: For deriving dependecies and ensuring consistency: Ensure that given goal nodes are current. If supportFiles is non-nil, every leaf file node that the goals recursively depend on and that wasn't already in supportFiles is added and passed to PerMissedSupportFile (if given). NIL means guess, #NIL means modifiable iff in Table. List edges of the nodes, and give status of their producers. Recursively explores graph to leaves. Returns some actions, according to report. The order of those actions is: actions to do later appear earlier. It is recommended that you not try to interrupt the following: If it has no producer (other than leaf), try (again) to get one. class may not be NIL. For controlling concurrency: ForkParms is dependent on the target system For Stating dependency rules: Missing inputs necessitate any result being consistent; but then, this won't be called if there are missing inputs. Called when one of the action's determiners changes. When destroying the entire dependency graph, this PROC is also called to clear any caches the ActionClass may be keeping. class may not be NIL. name will first be canonized. = {exists _ (created # notExistTime) AND (zeroLenExists OR length#0)} Should only be used from inside ActionClass procs only when called from MakeDo impl. For Extracting the Dependency Graph: = {exists _ (created # notExistTime) AND (zeroLenExists OR length#0)} Êò– "cedar" style˜code™ J™5K™8K™>K™*—K˜šÏk ˜ Jšœ œœ ˜Jšœ œ ˜Jšœœœ˜Jšœœ ˜Jšœœ˜Jšœœœ˜—K˜KšÑbnxœœ œ˜K˜Kš˜K˜Kšœœœ˜Kš œ œœœœ˜Kšœ œ˜Kšœ œ˜Kšœœ œ˜K˜'Kš œœœœœ˜3head™Kšœ œœœ˜Kšœœœœ˜(Kšœ œœœ˜"Kšœœœœ˜.K˜KšÑblnœœ œ˜ K˜Kš Ïnœœœœœœ˜&Kš   œœœœœ˜,Kš  œœœœœœ˜(Kš  œœœœœ ˜0K˜Kšœœœ˜—™2š  œœQ œœ#œ'œ4˜ÿKšœ)™)KšœÏe œb¡ œ8™µ—K˜šœœ ˜#K™4—K˜Kšœœ#˜6K˜š œœ)˜6K™<—K˜š  œœ–œœ˜ÉK™%Kšœ#¡œ™*K™BK˜Kšœ œ˜)Kš œœœ˜G—K˜Kš  œœ œœœ˜%K˜K™>Kš œœ ˜"Kš œœ ˜$Kš  œœ ˜Kš œœ ˜ Kš œœ ˜"Kš œœ ˜$Kš œœœ˜.Kš  œœ˜š œœ˜K™@—K˜Kš  œœœ˜-Kš  œœœœ˜/Kš œœœœ˜2Kš  œœœœœ œ˜JKš   œœœœœœ˜;Kš  œœ œœœœœœœ˜\Kš œœ œœ ˜=K˜K˜š  œœ œw˜˜Kšœ œ3˜A—K˜š œœ œœ˜GK™—K˜Kš œœ œœ˜C—™Kšœ œœœ˜7Kš  œœœœœ ˜>Kš  œœœ ˜'Kš  œœ ˜š œœœ ˜/K™+——™Kš  œœ˜+Kšœœ˜K˜Kš œœœœ&œœœ˜VK˜Kšœ œœœœœœ œ;œ!œœ˜ÀK˜Kšœœœ ˜3K˜Kšœ œœ˜'šœœœ˜Kš œ˜%Kš œ˜Kš œœ˜1Kš  œœ˜#Kšœ œœœ˜—K˜š œœœœœ œ˜cK™s—K˜š œœœ œœ˜FK™4—K˜Kš œœœ  œœ ˜JK˜šœœœ˜/Kšœy™yK˜—š  œœ œœœœ˜[K™K™—K˜Kšœ œœ˜#Kšœœ˜K˜Kš   œœœœœœ˜+Kš  œœœœœ ˜6K˜š œ˜šœ˜Kšœœ˜ Kš   œœœœœ˜)Kš œ ˜Kšœ˜—Kšœ˜—K˜Kš   œœœ œœ˜HK˜K˜Kš œœ œœ˜IKš œœœœ  œœœœœ œ˜‚Kš  œœ œœ˜,Kš œœœœœœœ˜>Kš œœœœ˜,Kš  œœ œ˜7Kš  œ˜Kš œœ œ ˜2š   œœœœœ œ˜OKšœE™E—K˜Kš  œœ œœ œœ˜bš œœ#œ'œ˜pKšœT™T—K˜Kšœ œ˜K˜Kš œœœœ˜$—K˜™$Kš  œœ œ ˜-Kš œ˜š  œœœœœ œ˜JKšœE™E—Kš œœ!œ˜SKš œœœ ˜4Kš œœ#œ'œ˜k—K˜Kšœ˜—…—â%F