DIRECTORY Atom, CD, CDApplications, CDProperties, CDOps, CDSequencer, IO, Rope, TerminalIO, TokenIO; CDSignalNamesImpl: CEDAR PROGRAM IMPORTS Atom, CDApplications, CDProperties, CDOps, CDSequencer, IO, Rope, TerminalIO = BEGIN specialRights: BOOL _ FALSE; -- gives the right to access exclusive properties EnterSignalNameSP: PROC [comm: CDSequencer.Command] = BEGIN aptr: CD.ApplicationPtr; TerminalIO.WriteRope["read signal-name\n"]; aptr _ GiveApplication[comm: comm, selected: comm.a=$EnterNameS]; IF aptr#NIL THEN { name: Rope.ROPE _ TerminalIO.RequestRope[" type name: "]; CDProperties.PutPropOnApplication[onto: aptr, prop: $SignalName, val: name]; TerminalIO.WriteRope[" done\n"]; } END; RemoveDollar: PROC [r: Rope.ROPE] RETURNS [Rope.ROPE] = BEGIN IF Rope.Length[r]>1 AND Rope.Fetch[r]='$ THEN r _ Rope.Substr[r, 1, Rope.Length[r]-1]; RETURN [r] END; WriteValue: PROC [x: REF] = BEGIN IF x=NIL THEN TerminalIO.WriteRope["NIL"] ELSE WITH x SELECT FROM ip: REF INT => TerminalIO.WriteInt[ip^]; r: Rope.ROPE => TerminalIO.WriteRope[r]; a: ATOM => TerminalIO.WriteRope[Rope.Concat["$", Atom.GetPName[a]]]; ENDCASE => TerminalIO.WriteRope[IO.PutR[IO.refAny[x]]]; END; RequestValue: PROC [default: REF] RETURNS [REF] = BEGIN n: CARDINAL_0; WHILE n=0 DO n _ TerminalIO.RequestSelection["property value", LIST["leave it", "remove", "INT", "ROPE", "ATOM", "REF ANY"]]; SELECT n FROM 2 => {default _ NIL}; 3 => {default _ NEW[INT_TerminalIO.RequestInt["int > "]]}; 4 => {default _ TerminalIO.RequestRope["rope > "]}; 5 => {default _ Atom.MakeAtom[RemoveDollar[TerminalIO.RequestRope["atom > "]]]}; 6 => {default _ IO.GetRefAny[IO.RIS[TerminalIO.RequestRope["ref any > "]]]}; ENDCASE --0, 1-- => {NULL}; ENDLOOP; RETURN [default] END; GiveApplication: PROC [comm: CDSequencer.Command, selected: BOOL_TRUE] RETURNS [CD.ApplicationPtr] = BEGIN multiple: BOOL; aptr: CD.ApplicationPtr_NIL; IF selected THEN { [aptr, multiple] _ CDOps.SelectedApplication[comm.design]; IF multiple THEN {TerminalIO.WriteRope[" multiple selection\n"]; RETURN [NIL]}; } ELSE -- pointed -- { aptr _ CDApplications.AplicationAt[CDOps.AppList[comm.design], comm.pos]; }; IF aptr=NIL THEN {TerminalIO.WriteRope[" no selection\n"]; RETURN [NIL]}; IF aptr.ob=NIL THEN {TerminalIO.WriteRope[" bad application\n"]; RETURN [NIL]}; RETURN [aptr] END; EnterPropertySP: PROC [comm: CDSequencer.Command] = BEGIN aptr: CD.ApplicationPtr; TerminalIO.WriteRope["enter property\n"]; aptr _ GiveApplication[comm: comm, selected: comm.a=$EnterPropertyS]; IF aptr#NIL THEN { pType: CDProperties.PropertyProcs; atom: ATOM; value: REF; name: Rope.ROPE _ RemoveDollar[TerminalIO.RequestRope["type property name: "]]; IF Rope.IsEmpty[name] THEN { TerminalIO.WriteRope[" empty name; not done\n"]; RETURN }; atom _ Atom.MakeAtom[name]; value _ CDProperties.GetPropFromApplication[aptr, atom]; TerminalIO.WriteRope[" old value: "]; WriteValue[value]; TerminalIO.WriteLn[]; pType _ CDProperties.FetchProcs[atom]; IF pType#NIL AND pType.exclusive THEN { TerminalIO.WriteRope[" this property is used exclusively by the program; "]; IF ~specialRights THEN { TerminalIO.WriteRope["interactive access is not possible\n"]; RETURN } }; value _ RequestValue[value]; CDProperties.PutPropOnApplication[onto: aptr, prop: atom, val: value]; TerminalIO.WriteRope[" done\n"]; } END; ShowProperties: PROC [from: REF] = BEGIN WITH from SELECT FROM a: CD.ApplicationPtr => ShowPropertyList[a.properties]; o: CD.ObPtr => ShowPropertyList[o.properties]; d: CD.Design => ShowPropertyList[d.properties]; t: CD.Technology => ShowPropertyList[t.properties]; ENDCASE => TerminalIO.WriteRope[" no showable CD properties"]; END; ShowPropertyList: PROC [pl: CD.Properties] = BEGIN FOR list: CD.Properties _ pl, list.rest WHILE list#NIL DO ShowProperty[list.first] ENDLOOP END; ShowProperty: PROC [pp: Atom.DottedPair] = BEGIN TerminalIO.WriteRope[" name: "]; WriteValue[pp.key]; TerminalIO.WriteRope[" value: "]; WriteValue[pp.val]; TerminalIO.WriteLn[]; END; ShowPropertiesSP: PROC [comm: CDSequencer.Command] = BEGIN aptr: CD.ApplicationPtr; TerminalIO.WriteRope["Show Properties\n"]; aptr _ GiveApplication[comm: comm, selected: comm.a=$ShowPropertiesS]; IF aptr#NIL THEN { IF aptr.properties#NIL THEN { TerminalIO.WriteRope[" --properties on instance\n"]; ShowPropertyList[aptr.properties]; }; IF aptr.ob.properties#NIL THEN { TerminalIO.WriteRope[" --properties on object itself\n"]; ShowPropertyList[aptr.ob.properties]; }; TerminalIO.WriteRope[" --\n"]; } END; CDSequencer.ImplementCommand[$EnterNameS, EnterSignalNameSP]; CDSequencer.ImplementCommand[$EnterNameP, EnterSignalNameSP]; CDSequencer.ImplementCommand[$EnterPropertyS, EnterPropertySP]; CDSequencer.ImplementCommand[$EnterPropertyP, EnterPropertySP]; CDSequencer.ImplementCommand[$ShowPropertiesP, ShowPropertiesSP]; CDSequencer.ImplementCommand[$ShowPropertiesS, ShowPropertiesSP]; END. ÈCDSignalNamesImpl.mesa (part of Chipndale) by Christian Jacobi November 7, 1983 5:39 pm last edited Christian Jacobi December 14, 1983 12:11 pm --if name = nil, property will be removed --returns a single application --verbose if not done, quiet if done --move this procedure to CDProperties --l: CD.LevelRef => ...; --at: ATOM => ...; -- module initialization Registration removed from this place, to port this module to commandlevel IF NOT CDProperties.RegisterProperty[$SignalName] THEN ERROR; IF NOT CDProperties.RegisterProperty[$InstanceName] THEN ERROR; CDProperties.InstallProcs[prop: $SignalName, new: CDProperties.PropertyProcsRec[ makeCopy: CDProperties.CopyVal, internalWrite: CDProperties.RopePWrite, internalRead: CDProperties.RopePRead ]]; CDProperties.InstallProcs[prop: $InstanceName, new: CDProperties.PropertyProcsRec[ makeCopy: CDProperties.CopyVal, internalWrite: CDProperties.RopePWrite, internalRead: CDProperties.RopePRead ]]; ʘJšœ,™,Jšœ/™/Jšœ9™9J˜šÏk ˜ Jšœ˜Jšœ˜J˜J˜ Jšœ˜Jšœ ˜ Jšœ˜Jšœ˜Jšœ ˜ Jšœ˜J˜—šÏnœœœ˜!JšœP˜W—Jš˜J˜JšœœœÏc1˜OJ˜šžœœ˜5Jšœ˜Jšœœ˜Jšœ+˜+JšœA˜Ašœœœ˜Jšœ œ*˜9Jšœ)™)JšœL˜LJšœ!˜!J˜—Jšœ˜—J˜š ž œœ œœœ˜7Jš˜Jšœœœ)˜VJšœ˜ Jšœ˜—J˜šž œœœ˜Jš˜Jšœœœ˜*š˜šœœ˜Jšœœœ˜(Jšœœ˜(Jšœœ=˜DJšœœœ ˜7——Jšœ˜J˜—š ž œœ œœœ˜1Jš˜Jšœœ˜šœ˜ Jšœ2œ:˜pšœ˜ Jšœœ˜Jšœœœ#˜:Jšœ3˜3JšœP˜PJšœœ œœ)˜LJšœŸœœ˜—Jšœ˜—Jšœ ˜Jšœ˜—J˜š žœœ'œœœœ˜dJšœ™Jšœ$™$Jš˜Jšœ œ˜Jšœœœ˜šœ œ˜Jšœ:˜:Jšœ œ3œœ˜QJ˜—šœŸ œ˜JšœI˜IJ˜—Jš œœœ-œœ˜KJš œ œœ0œœ˜QJšœ˜ Jšœ˜J˜—šžœœ˜3Jšœ˜Jšœœ˜Jšœ)˜)JšœE˜Ešœœœ˜Jšœ"˜"Jšœœ˜ Jšœœ˜ Jšœ œ@˜Ošœœ˜Jšœ0˜0Jš˜J˜—Jšœ˜Jšœ8˜8Jšœ&˜&Jšœ˜Jšœ˜Jšœ&˜&šœœœœ˜'JšœN˜Nšœœ˜Jšœ=˜=Jš˜J˜—J˜—Jšœ˜JšœF˜FJšœ!˜!J˜—Jšœ˜—J˜Jšœ%™%šžœœœ˜"Jš˜šœœ˜Jšœœ2˜7Jšœœ)˜.Jšœœ*˜/Jšœœ.˜3Jšœ™Jšœœ™Jšœ7˜>—Jšœ˜—J˜šžœœœ˜,Jš˜š œœœœ˜9Jšœ˜Jš˜—Jšœ˜J˜—šž œœ˜*Jš˜Jšœ!˜!Jšœ˜Jšœ"˜"Jšœ˜Jšœ˜Jšœ˜—J˜šžœœ˜4Jšœ˜Jšœœ˜Jšœ*˜*JšœF˜Fšœœœ˜šœœœ˜Jšœ5˜5Jšœ"˜"J˜—šœœœ˜ Jšœ:˜:Jšœ%˜%J˜—Jšœ˜J˜—Jšœ˜—J˜Jšœ™J™JJšœœ,œœ™=Jšœœ.œœ™?šœ2™2šœ™Jšœ™Jšœ'™'Jšœ$™$Jšœ™——šœ4™4šœ™Jšœ™Jšœ'™'Jšœ$™$Jšœ™——Jšœ=˜=Jšœ=˜=Jšœ?˜?Jšœ?˜?JšœA˜AJšœA˜AJšœ˜J˜J˜—…—6