-- LUserImpl.mesa
-- Last trashed by D. Swinehart, September 22, 1982 8:32 am
-- Last modified by L. Stewart, October 4, 1982 2:55 pm
DIRECTORY
ConvertUnsafe USING [ ToRope ],
Inline USING [LowByte],
IO,
LarkServer,
LarkServerRpcControl USING [ ImportInterface ],
LarkUser USING [ Machine ],
LarkUserRpcControl USING [ ExportInterface ],
Names USING [ CurrentPasskey, CurrentRName ],
Process USING [ Detach, Pause, SecondsToTicks ],
PupDefs USING [ AppendPupAddress, PupAddress, PupAddressLookup, PupNameTrouble ],
Rope USING [ROPE],
RPC USING [ ShortROPE ],
RPCBcstListen USING [ BcstListenInitialize ]
;
LUserImpl: PROGRAM
IMPORTS
ConvertUnsafe, Inline, IO, LarkServer, LarkServerRpcControl, LarkUserRpcControl, Names,
Process, PupDefs, RPCBcstListen
EXPORTS LarkUser = {
in, out: IO.STREAM;
Register: PUBLIC PROC [ machine: LarkUser.Machine ] RETURNS [ instance: RPC.ShortROPE] = {
pa: PupDefs.PupAddress = [ net: [machine.net], host: [machine.host], socket: [a: 0, b: 0]];
res: STRING←[100];
res.length←0;
PupDefs.PupAddressLookup[res, pa!PupDefs.PupNameTrouble => {
PupDefs.AppendPupAddress[res, pa]; res.length←res.length-1; CONTINUE}];
instance ← ConvertUnsafe.ToRope[LONG[res]];
Process.Detach[FORK LarkServerProc[instance]]; -- start Diagnostic user.
};
GetChar: PUBLIC PROC [ value: CARDINAL ] = {
c: CHAR = LOOPHOLE[Inline.LowByte[value]];
out.PutF["%c", IO.char[c]];
};
LarkServerProc: PROC[instance: RPC.ShortROPE] = {
c: CHAR;
Process.Pause[Process.SecondsToTicks[1]]; -- let Register results settle.
LarkServerRpcControl.ImportInterface[interfaceName: [ type: "LarkServer.lark", instance: instance ]];
-- This here's the main loop.
out.PutF["LarkServer ready for business.\n"];
DO ENABLE IO.Signal => TRUSTED { CONTINUE; };
out.PutF["%% "];
c ← in.GetChar[];
IF c # ' THEN LarkServer.PutChar[LOOPHOLE[c]]
ELSE LarkServer.PutString[in.GetLine[]];
IF c = '← THEN EXIT;
ENDLOOP; -- for example.
};
-- Set up user interface
[in: in, out: out] ← IO.CreateTTYStreams[name: "LarkServer"];
LarkUserRpcControl.ExportInterface[
interfaceName: [ type: "LarkUser.lark", instance: "Einstein.lark"],
user: Names.CurrentRName[],
password: Names.CurrentPasskey[]
];
RPCBcstListen.BcstListenInitialize[];
}.