DIRECTORY AMBridge USING [TVForReferent], Atom USING [MakeAtom], Commander USING [CommandProc, Register], CommandTool USING [ArgumentVector, Failed, Parse, StarExpansion], Convert USING [Error, IntFromRope], IO USING [PutChar, PutRope, STREAM], List USING [AList, Assoc, DottedPair, PutAssoc], PrintTV USING [Print], ProcessExtras USING [CheckForAbort], ProcessProps USING [GetPropList], Rope USING [Equal, Fetch, Length, ROPE, Substr]; PropertyCommandsImpl: CEDAR PROGRAM IMPORTS AMBridge, Atom, Commander, CommandTool, Convert, IO, List, PrintTV, ProcessExtras, ProcessProps, Rope = BEGIN Properties: Commander.CommandProc = TRUSTED { argv: CommandTool.ArgumentVector; depth: INT _ 5; width: INT _ 32; props: List.AList; i: NAT _ 1; token: Rope.ROPE; any: BOOL _ FALSE; verboseFlag: BOOL _ FALSE; key: REF ANY; { argv _ CommandTool.Parse[cmd ! CommandTool.Failed => { msg _ errorMsg; CONTINUE; }]; IF argv = NIL THEN RETURN[$Failure, msg]; IF cmd.procData.clientData = $ProcessProperties THEN { props _ ProcessProps.GetPropList[]; cmd.out.PutRope["process properties:\n"]; } ELSE { props _ cmd.propertyList; cmd.out.PutRope["commander properties:\n"]; }; DO ProcessExtras.CheckForAbort[]; IF i >= argv.argc THEN EXIT; token _ argv[i]; i _ i + 1; IF token.Equal["-d", FALSE] THEN { IF i = argv.argc THEN GOTO BadArgs; depth _ Convert.IntFromRope[argv[i] ! Convert.Error => GOTO BadArgs]; IF width < 0 THEN GOTO BadArgs; i _ i + 1; LOOP; }; IF token.Equal["-w", FALSE] THEN { IF i = argv.argc THEN GOTO BadArgs; width _ Convert.IntFromRope[argv[i] ! Convert.Error => GOTO BadArgs]; IF width < 0 THEN GOTO BadArgs; i _ i + 1; LOOP; }; IF token.Equal["-v", FALSE] THEN { verboseFlag _ TRUE; LOOP; }; any _ TRUE; IF token.Length[] > 1 AND token.Fetch[0] = '$ THEN key _ Atom.MakeAtom[Rope.Substr[base: token, start: 1]] ELSE key _ Atom.MakeAtom[token]; cmd.out.PutRope[token]; cmd.out.PutRope[" = "]; PrintTV.Print[tv: AMBridge.TVForReferent[NEW[REF ANY _ List.Assoc[key: key, aList: props]]], put: cmd.out, depth: depth, width: width, verbose: verboseFlag]; cmd.out.PutChar['\n]; ENDLOOP; IF NOT any THEN { PrintTV.Print[tv: AMBridge.TVForReferent[NEW[REF ANY _ props]], put: cmd.out, depth: depth, width: width, verbose: verboseFlag]; cmd.out.PutChar['\n]; }; EXITS BadArgs => RETURN[$Failure, "Bad args"]; }; }; SetProperty: Commander.CommandProc = { argv: CommandTool.ArgumentVector; aList: List.AList; key: REF ANY; CommandTool.StarExpansion[cmd]; argv _ CommandTool.Parse[cmd ! CommandTool.Failed => { msg _ errorMsg; CONTINUE; }]; IF argv = NIL THEN RETURN[$Failure, msg]; IF cmd.procData.clientData = $ProcessProperties THEN aList _ ProcessProps.GetPropList[] ELSE aList _ cmd.propertyList; IF argv.argc # 3 THEN cmd.out.PutRope["Usage: SetProperty key value\n"] ELSE { dp: List.DottedPair; val: REF ANY; IF argv[1].Length[] > 1 AND argv[1].Fetch[0] = '$ THEN key _ Atom.MakeAtom[Rope.Substr[base: argv[1], start: 1]] ELSE key _ Atom.MakeAtom[argv[1]]; val _ IF Rope.Equal[argv[2], "NIL"] THEN NIL ELSE argv[2]; dp _ FindLastProp[key: key, aList: aList]; IF dp # NIL THEN dp.val _ val ELSE [] _ List.PutAssoc[key: key, val: val, aList: aList]; }; }; FindLastProp: PROC [key: REF, aList: List.AList] RETURNS [dp: List.DottedPair _ NIL] = { UNTIL aList = NIL DO IF aList.first.key = key THEN dp _ NARROW[aList.first]; aList _ aList.rest; ENDLOOP; RETURN[dp]; }; Init: PROC = { Commander.Register[key: "///Commands/GetProperties", proc: Properties, doc: "Display command tool property list"]; Commander.Register[key: "///Commands/GetProcessProperties", proc: Properties, doc: "Display process properties list", clientData: $ProcessProperties]; Commander.Register[key: "///Commands/SetProperty", proc: SetProperty, doc: "SetProperty propertyName value - change or add to the command tool property list"]; Commander.Register[key: "///Commands/SetProcessProperty", proc: SetProperty, doc: "SetProperty propertyName value - change or add to the process property list", clientData: $ProcessProperties]; }; Init[]; END. January 17, 1984 4:29 pm, Stewart, change SetProperty to add FindLastProp FPropertyCommandsImpl.mesa L. Stewart, January 17, 1984 4:29 pm ʧ˜šœ™J™%—J˜šÏk ˜ Jšœ œ˜Jšœœ ˜Jšœ œ˜(Jšœ œ0˜AJšœœ˜#Jšœœœ˜$Jšœœ&˜0Jšœœ ˜Jšœœ˜$Jšœ œ˜!Jšœœœ ˜0—J˜Jšœœ˜#š˜Jšœ1œ4˜g—Jš˜J˜šœ$œ˜-Jšœ!˜!Jšœœ˜Jšœœ˜Jšœ˜Jšœœ˜ Jšœ œ˜Jšœœœ˜Jšœ œœ˜Jšœœœ˜ J˜JšœHœ˜UJšœœœœ˜)šœ.œ˜6Jšœ#˜#Jšœ)˜)J˜—šœ˜Jšœ˜Jšœ+˜+J˜—š˜Jšœ˜Jšœœœ˜J˜J˜ šœœœ˜"Jšœœœ ˜$Jšœ7œ ˜FJšœ œœ ˜J˜ Jšœ˜J˜—šœœœ˜"Jšœœœ ˜#Jšœ7œ ˜FJšœ œœ ˜J˜ Jšœ˜J˜—šœœœ˜"Jšœœ˜Jšœ˜J˜—Jšœœ˜ Jšœœœ8˜jJšœ˜ Jšœ˜Jšœ˜Jšœ)œœœi˜J˜Jšœ˜—šœœœ˜Jšœ)œœœL˜€J˜J˜—Jš˜Jšœ œ˜(J˜J˜—J˜šœ&˜&Jšœ!˜!J˜Jšœœœ˜ Jšœ˜JšœHœ˜UJšœœœœ˜)Jšœ.œ#˜WJšœ˜Jšœœ2˜Gšœ˜Jšœ˜Jšœœœ˜ Jšœœœ:˜pJšœ˜"Jš œœœœœ ˜:Jšœ*˜*Jšœœœ ˜Jšœ6˜:J˜—J˜—J˜š Ïn œœœœœ˜Xšœ œ˜Jšœœœ˜7J˜Jšœ˜—Jšœ˜ J˜—J˜šžœœ˜J˜rJ˜–J˜ŸJ˜ÁJ˜—J˜J˜J˜Jšœ˜J˜I—…—õ