UnixFileDescriptorStreamImpl
Copyright Ó 1992 by Xerox Corporation. All rights reserved.
Norman Adams, February 23, 1990 2:59 pm PST
Willie-s, June 12, 1992 2:44 pm PDT
DIRECTORY UnixFileDescriptorStream, RefText, IO, UnixErrno, UnixSysCalls, UnixSysCallExtensions, UnixTypes;
UnixFileDescriptorStreamImpl: CEDAR PROGRAM
IMPORTS IO, UnixSysCalls
EXPORTS UnixFileDescriptorStream
~ BEGIN
Data: TYPE = RECORD [
fd: UnixTypes.FileDescriptor
];
DataHandle: TYPE = REF Data;
Create: PUBLIC PROC [ fd: UnixTypes.FileDescriptor] RETURNS [IO.STREAM] = {
selfData: DataHandle = NEW [ Data ¬ [ fd: fd ] ];
RETURN [IO.CreateStream[procs, selfData]];
};
CharsAvail: PROC [self: IO.STREAM, wait: BOOL ¬ FALSE] RETURNS [INT] ~ {
selfData: DataHandle = NARROW[self.streamData];
selected: INT;
fds: UnixTypes.PollFD;
fds.fd ¬ selfData.fd;
fds.events.in ¬ UnixTypes.Flag.true;
TRUSTED { selected ¬ UnixSysCalls.Poll[ fds: @fds, nfds: 1, timeout: 0] };
RETURN[ IF (fds.revents.in = UnixTypes.Flag.true) THEN 1 ELSE 0 ];
};
SetTerminalSize: PUBLIC PROC [self: IO.STREAM, r,c: INT] ~ {
selfData: DataHandle = NARROW[self.streamData];
result: UnixTypes.SysCallResult;
TCSETSW: INT = LOOPHOLE[ 80087467H ];
winsize: WORD16 MACHINE DEPENDENT RECORD [
wsRow(0): CARD16,
wsCol(1): CARD16,
wsXpixel(2): CARD16,
wsYpixel(3): CARD16
];
winsize.wsRow ¬ r;
winsize.wsCol ¬ c;
TRUSTED {
result ¬ UnixSysCalls.IOCtl[
d: selfData.fd,
request: TCSETSW,
argp: LOOPHOLE[@winsize] ]
};
};
SetFD: PUBLIC PROC [self: IO.STREAM, fd: UnixTypes.FileDescriptor] ~ {
selfData: DataHandle = NARROW[self.streamData];
selfData.fd ¬ fd;
};
procs: REF IO.StreamProcs = IO.CreateStreamProcs [
variety: $input,
class: $plumberHack,
charsAvail: CharsAvail
];
END.