-- Copyright (C) 1986 by Xerox Corporation. All rights reserved.
-- CWindowLibImpl.mesa
-- NFS 31-Jan-86 10:05:14
DIRECTORY
CEnvUtil USING[IsItDefaultStdin, SetOutputMode, StdinHandle, SystemCall, zone],
CIOLib USING[FilePtr],
CRuntime USING [ConfigHandle,GetConfigHandle, GetStdout, SetConfigHandle,
ProcessNotRegistered, StopIfUserAborted],
CString USING [CString, CStringToLongString],
CWindowLib USING [sgttyb, TIOCGETP, TIOCSETP];
CWindowLibImpl:PROGRAM
IMPORTS CEnvUtil, CRuntime, CString
EXPORTS CWindowLib = {
failure:INTEGER = -1;
success:INTEGER = 0;
ioctl:PUBLIC PROCEDURE[
stream:CIOLib.FilePtr, request:INTEGER,argp:LONG POINTER TO CWindowLib.sgttyb]
RETURNS[INTEGER ← success] = {
IF ~CEnvUtil.IsItDefaultStdin[stream↑] THEN RETURN[failure];
SELECT request FROM
CWindowLib.TIOCGETP => argp↑ ← LOOPHOLE[stream↑,CEnvUtil.StdinHandle].mode;
CWindowLib.TIOCSETP => LOOPHOLE[stream↑,CEnvUtil.StdinHandle].mode ← argp↑;
ENDCASE => RETURN[failure];
IF stream = CRuntime.GetStdout[] THEN
CEnvUtil.SetOutputMode[stream↑.clientData, argp↑];
};
system:PUBLIC PROCEDURE[string:CString.CString] RETURNS[INTEGER] = {
mString:LONG STRING ← CString.CStringToLongString[string,CEnvUtil.zone];
exitCode:INTEGER;
cH:CRuntime.ConfigHandle ← NIL;
CRuntime.StopIfUserAborted[]; -- since user abort will be reset.
cH ← CRuntime.GetConfigHandle[!CRuntime.ProcessNotRegistered => CONTINUE];
exitCode ← SIGNAL CEnvUtil.SystemCall[mString];
IF cH # NIL THEN CRuntime.SetConfigHandle[cH];
CEnvUtil.zone.FREE[@mString];
RETURN[exitCode];
};
}.