<> <> <> 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: "]; <<--if name = nil, property will be removed>> 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] = <<--returns a single application>> <<--verbose if not done, quiet if done>> 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; <<--move this procedure to CDProperties>> 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]; <<--l: CD.LevelRef => ...;>> <<--at: ATOM => ...;>> 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; <<-- module initialization>> <> <> <> <> <> <> <> <> <<]];>> <> <> <> <> <> <<]];>> 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.