DIRECTORY BasicTime, FS, IO, MakeDo, Rope; LupineDeps: CEDAR PROGRAM IMPORTS BasicTime, FS, IO, MakeDo, Rope = BEGIN ROPE: TYPE = Rope.ROPE; LupineCommand: TYPE = REF LupineCommandRep; LupineCommandRep: TYPE = RECORD [ resultPrefix: ROPE, sourceNode: MakeDo.Node, earliestResultNode, lateIngredientNode: MakeDo.Node _ NIL, earliestResultTime, lateIngredientTime: BasicTime.GMT _ BasicTime.nullGMT, cmd: ROPE _ NIL]; lupineClass: MakeDo.CommandClass _ NEW [MakeDo.CommandClassRep _ [ NotCurrent: LupineNotCurrent, Rederive: RederiveLupine, UpdateTime: MakeDo.FileTime, Explain: ExplainLupine ]]; LupineFind: PROC [resultName: ROPE, finderData: REF ANY] RETURNS [found: BOOLEAN, sought: MakeDo.Node, makes, from, why: MakeDo.NodeList, cmd: ROPE, class: MakeDo.CommandClass, foundData: REF ANY] -- MakeDo.FinderProc -- = BEGIN EndsIn: PROC [ending: ROPE] RETURNS [ans: BOOL] = { elen: INT = ending.Length[]; IF elen > slen THEN RETURN [FALSE]; IF (ans _ resultShort.Substr[start: slen - elen, len: elen].Equal[s2: ending, case: FALSE]) THEN {plen _ slen - elen; sending _ ending}}; Tail: PROC [ending: ROPE] RETURNS [node: MakeDo.Node] = { node _ MakeDo.GetNode[resultPrefix.Cat[ending]]; IF ending.Equal[sending] THEN sought _ node}; resultCP: FS.ComponentPositions; resultFull, resultPrefix, resultShort, interfaceName, sourceName, sending: ROPE; sourceNode: MakeDo.Node; lc: LupineCommand; slen, plen: INT; sought _ NIL; [resultFull, resultCP, ] _ FS.ExpandName[resultName]; resultShort _ resultFull.Substr[start: resultCP.base.start, len: (resultCP.ext.start + resultCP.ext.length) - resultCP.base.start]; slen _ resultShort.Length[]; found _ EndsIn["RpcControl.Mesa"] OR EndsIn["RpcClientImpl.Mesa"] OR EndsIn["RpcBinderImpl.Mesa"] OR EndsIn["RpcServerImpl.Mesa"]; IF NOT found THEN RETURN; interfaceName _ resultShort.Substr[start: 0, len: plen]; resultPrefix _ resultFull.Substr[start: 0, len: resultCP.base.start].Concat[interfaceName]; why _ LIST[sourceNode _ MakeDo.GetNode[sourceName _ resultPrefix.Cat[".BCD"]]]; foundData _ lc _ NEW [LupineCommandRep _ [ resultPrefix: resultPrefix, sourceNode: sourceNode, cmd: cmd _ IO.PutFR["Lupine %g TranslateInterface[%g]", IO.rope[GetSwitches[resultPrefix]], IO.rope[interfaceName]] ]]; makes _ LIST[ Tail["RpcControl.Mesa"], Tail["RpcClientImpl.Mesa"], Tail["RpcBinderImpl.Mesa"], Tail["RpcServerImpl.Mesa"]]; IF sought = NIL THEN ERROR; from _ DeriveFrom[lc]; class _ lupineClass; END; GetSwitches: PROC [resultPrefix: ROPE] RETURNS [switches: ROPE] = { ss: IO.STREAM _ NIL; ss _ FS.StreamOpen[resultPrefix.Cat[".LupineSwitches"] !FS.Error => CONTINUE]; IF ss = NIL THEN RETURN [NIL]; [] _ ss.SkipWhitespace[]; IF ss.EndOf[] THEN RETURN [NIL]; switches _ ss.GetLineRope[]; ss.Close[]; }; DeriveFrom: PROC [lc: LupineCommand] RETURNS [from: MakeDo.NodeList] = BEGIN from _ LIST[lc.sourceNode]; END; RederiveLupine: PROC [c: MakeDo.Command] RETURNS [from: MakeDo.NodeList, cmd: ROPE] --MakeDo.RederiveProc-- = { lc: LupineCommand _ NARROW[c.PublicPartsOfCommand[].foundData]; from _ DeriveFrom[lc]; cmd _ lc.cmd}; LupineNotCurrent: MakeDo.NotCurrentProc --PROC [c: Command] RETURNS [notCurrent: BOOLEAN]-- = BEGIN lc: LupineCommand; foundData: REF ANY; makes, from: MakeDo.NodeList; [foundData: foundData, makes: makes, from: from] _ c.PublicPartsOfCommand[]; lc _ NARROW[foundData]; lc.earliestResultTime _ BasicTime.latestGMT; lc.earliestResultNode _ lc.lateIngredientNode _ NIL; FOR ml: MakeDo.NodeList _ makes, ml.rest WHILE ml # NIL DO thisTime: BasicTime.GMT; IF NOT MakeDo.Needed[ml.first] THEN LOOP; thisTime _ MakeDo.Latest[ml.first]; IF thisTime # BasicTime.nullGMT AND thisTime.Period[lc.earliestResultTime] > 0 THEN {lc.earliestResultTime _ thisTime; lc.earliestResultNode _ ml.first}; ENDLOOP; IF lc.earliestResultNode = NIL THEN RETURN [FALSE]; FOR fl: MakeDo.NodeList _ from, fl.rest WHILE fl # NIL DO fromTime: BasicTime.GMT _ MakeDo.Latest[fl.first]; IF (fromTime # BasicTime.nullGMT) AND (fromTime.Period[lc.earliestResultTime] < 0) THEN { lc.lateIngredientTime _ fromTime; lc.lateIngredientNode _ fl.first; RETURN [TRUE]}; ENDLOOP; notCurrent _ FALSE; END; ExplainLupine: MakeDo.ExplainProc --PROC [c: Command, to: IO.STREAM]-- = BEGIN lc: LupineCommand _ NARROW[c.PublicPartsOfCommand[].foundData]; IF lc.earliestResultNode = NIL THEN to.PutRope["\tno result files existed yet.\n"] ELSE IF lc.lateIngredientNode = NIL THEN to.PutRope["\tall result files were dated later than any ingredient file.\n"] ELSE to.PutF["\tresult %g of %g predated ingredient %g of %g.\n", IO.rope[lc.earliestResultNode.PublicPartsOfNode[].name], IO.time[lc.earliestResultTime], IO.rope[lc.lateIngredientNode.PublicPartsOfNode[].name], IO.time[lc.lateIngredientTime]]; END; MakeDo.AddFinder[[LupineFind], back]; END. ‚LupineDeps.Mesa Last Edited by: Spreitzer, April 8, 1985 4:48:11 pm PST Last Edited by: Pavel, May 28, 1984 3:06:54 pm PDT ÊQ˜Icode™J™7J™2K˜KšÏk œ œœ˜*K˜šÐbx œœ˜Kšœ œœ˜)—K˜Kš˜K˜Kšœœœ˜K˜Kšœœœ˜+šœœœ˜!Kšœœ˜Kšœ˜Kšœ6œ˜:Kšœ2œ˜JKšœœœ˜—K˜šœ#œ˜BK˜K˜Kšœ˜K˜K˜—K˜šÏn œœœœœœ œ?œ)œœÏcœ˜ÞKš˜š Ÿœœ œœœ˜3Kšœœ˜Kšœ œœœ˜#KšœRœœ)˜‰—šŸœœ œœ˜9Kšœ0˜0Kšœœ˜-—Kšœ œ˜ KšœKœ˜PK˜K˜Kšœ œ˜Kšœ œ˜ Kšœœ˜5Kšœƒ˜ƒK˜Kšœ"œœœ˜‚Kšœœœœ˜Kšœ8˜8Kšœ[˜[KšœœE˜Ošœœ˜*Kšœ˜Kšœ˜Kšœ œ+œ"œ˜sK˜—šœœ˜ Kšœ˜Kšœ˜Kšœ˜Kšœ˜—Kšœ œœœ˜K˜Kšœ˜Kšœ˜—K˜š Ÿ œœœœ œ˜CKšœœœœ˜Kšœœ1œ œ˜NKš œœœœœ˜K˜Kšœ œœœ˜ Kšœ˜K˜ K˜—K˜šŸ œœœ˜FKš˜Kšœœ˜Kšœ˜—K˜š Ÿœœœœ œ˜oKšœœ%˜?K˜K˜—K˜šŸœ 3œ˜]Kš˜Kšœ˜Kšœ œœ˜K˜KšœL˜LKšœœ ˜Kšœ,˜,Kšœ0œ˜4šœ&œœ˜:Kšœœ˜Kšœœœœ˜)Kšœ#˜#šœœ+˜NKšœF˜J—Kšœ˜—Kš œœœœœ˜3šœ%œœ˜9Kšœœ˜2šœ œ.œ˜YKšœ!˜!Kšœ!˜!Kšœœ˜—Kšœ˜—Kšœ œ˜Kšœ˜—K˜šŸ œ $œ˜HKš˜Kšœœ%˜?Kšœœœ/˜RKšœœœœN˜vKš œ>œ7œœ7œ˜ôKšœ˜—K˜Kšœ%˜%K˜Kšœ˜J˜—…—®