-- CommandToolMXCode.mesa
DIRECTORY Atom, CedarProcess, ProcessorFace, Rope, SafeStorage, Scheme, ThisMachine, ViewerTools;
CommandToolMXCode: CEDAR PROGRAM
IMPORTS Atom, CedarProcess, ProcessorFace, SafeStorage, Scheme, ThisMachine, ViewerTools
= BEGIN OPEN Scheme;
SymbolFromRope: PROC [rope: Rope.ROPE] RETURNS [Symbol] ~ {RETURN[Atom.MakeAtom[rope]]};
RopeFromSymbol: PROC [Symbol] RETURNS [Rope.ROPE] ~ Atom.GetPName;
TheSymbol: PROC [a: Any] RETURNS [Scheme.Symbol] = {
WITH a SELECT FROM
a: Scheme.Symbol => RETURN [a];
ENDCASE => Complain[a, "not a Scheme.Symbol"];
};
SymbolForPriority: REF ARRAY CedarProcess.Priority OF Symbol = InitSymbolForPriority[];
InitSymbolForPriority: PROC RETURNS [a: REF ARRAY CedarProcess.Priority OF Symbol] = {
a ← NEW[ARRAY CedarProcess.Priority OF Symbol];
a[background] ← $background;
a[normal] ← $normal;
a[foreground] ← $foreground;
a[excited] ← $excited;
a[realTime] ← Atom.MakeAtom["real-time"];
};
ThePriority: PROC [a: Any] RETURNS [CedarProcess.Priority] = {
FOR k: CedarProcess.Priority IN CedarProcess.Priority DO
IF a=SymbolForPriority[k] THEN RETURN [k];
ENDLOOP;
ERROR Complain[a, "is not a CedarProcess.Priority"];
};
CommandToolPrim: PROC [SELF: Primitive, ARG1,ARG2,ARG3: Any, REST: ProperList] RETURNS [result: Any ← unspecified] = {
POP: PROC RETURNS [a: Any ← undefined] = {
IF REST#NIL THEN {a ← REST.car; REST ← NARROW[REST.cdr]}};
DATA: Pair ~ NARROW[SELF.data];
env: Environment ~ NARROW[DATA.cdr];
SELECT NAT[NARROW[DATA.car, REF INT]↑] FROM
7 => {
result ← StringFromRope[ViewerTools.GetSelectionContents[]];
};
6 => {
traceAndSweepP: Any ← ARG1;
SafeStorage.ReclaimCollectibleObjects[suspendMe: TRUE, traceAndSweep: traceAndSweepP=true];
};
5 => {
RETURN [MakeFixnum[SafeStorage.CurrentByteCount[]]];
};
4 => {
result ← ProcessorFace.GetProcessorTypeName[ProcessorFace.GetProcessorType[]];
};
3 => {
result ← StringFromRope[ThisMachine.ProcessorID[$Decimal]];
};
2 => {
namespace: Any ← ARG1;
result ← StringFromRope[ThisMachine.Address[SELECT namespace FROM $arpa => $Arpa, $xns => $XNS, $pup => $Pup, undefined => NIL, ENDCASE => TheSymbol[namespace]]];
};
1 => {
namespace: Any ← ARG1;
result ← StringFromRope[ThisMachine.Name[SELECT namespace FROM $arpa => $Arpa, $xns => $XNS, $pup => $Pup, undefined => NIL, ENDCASE => TheSymbol[namespace]]];
};
0 => {
priority: Any ← ARG1;
result ← SymbolForPriority[CedarProcess.GetPriority[]];
CedarProcess.SetPriority[ThePriority[priority]];
};
ENDCASE => ERROR
};
CommandToolInit: PROC [env: Environment] = {
DefinePrimitive[name: "get-selection-contents", nArgs: 0, proc: CommandToolPrim, doc: "() Return the contents of the Tioga selection as a string.", env: env, optional: 0, dotted: FALSE, data: Cons[MakeFixnum[7], env]];
DefinePrimitive[name: "gc", nArgs: 1, proc: CommandToolPrim, doc: "([ trace-and-sweep? ]) call the garbage collector", env: env, optional: 1, dotted: FALSE, data: Cons[MakeFixnum[6], env]];
DefinePrimitive[name: "bytes-allocated", nArgs: 0, proc: CommandToolPrim, doc: "() number of words allocated since the beginning", env: env, optional: 0, dotted: FALSE, data: Cons[MakeFixnum[5], env]];
DefinePrimitive[name: "this-machine-type", nArgs: 0, proc: CommandToolPrim, doc: "() Returns 'sun3, 'sun4, ...", env: env, optional: 0, dotted: FALSE, data: Cons[MakeFixnum[4], env]];
DefinePrimitive[name: "this-machine-id", nArgs: 0, proc: CommandToolPrim, doc: "() Returns a string like \"1-435-140-188\"", env: env, optional: 0, dotted: FALSE, data: Cons[MakeFixnum[3], env]];
DefinePrimitive[name: "this-machine-address", nArgs: 1, proc: CommandToolPrim, doc: "([ namespace ]) Returns a string; namespace is 'arpa, 'xns, 'pup, ...", env: env, optional: 1, dotted: FALSE, data: Cons[MakeFixnum[2], env]];
DefinePrimitive[name: "this-machine-name", nArgs: 1, proc: CommandToolPrim, doc: "([ namespace ]) Returns a string; namespace is 'arpa, 'xns, 'pup, ...", env: env, optional: 1, dotted: FALSE, data: Cons[MakeFixnum[1], env]];
DefinePrimitive[name: "set-priority", nArgs: 1, proc: CommandToolPrim, doc: "(priority) sets priority (background normal foreground excited real-time), returns old priority level", env: env, optional: 0, dotted: FALSE, data: Cons[MakeFixnum[0], env]];
};
ROPE: TYPE ~ Rope.ROPE;
RegisterInit[CommandToolInit];
END.