132 lines
2.8 KiB
Plaintext
132 lines
2.8 KiB
Plaintext
Put the case defn and the system-status enumeration in a file and load
|
|
it into the base package.
|
|
|
|
Have system status be a enumeration macro that doesn't give numbers
|
|
but instead calls to (named-c-constant "FOO") with the obvious translation.
|
|
Need a normal enumerated definition for running with Scheme.
|
|
Of course, if there is no overlap we can just use negative numbers for
|
|
the error numbers visible in Pre-Scheme.
|
|
|
|
PS_READ_CHAR(port_10X, Kchar_27X, eofP_15X, status_16X)
|
|
|
|
|
|
#define PS_PEEK_CHAR(PORT,RESULT,EOFP,STATUS)
|
|
{
|
|
FILE * TTport = PORT;
|
|
|
|
if (EOF == (RESULT = getc(TTport)))
|
|
RESULT = ps_read_char(TTport, &EOFP, &STATUS);
|
|
else {
|
|
EOFP = 0;
|
|
STATUS = 0; }
|
|
}
|
|
|
|
#define PS_GETC(PORT,RESULT) /* RESULT = getc(PORT); */ \
|
|
|
|
{ \
|
|
FILE * TTport = PORT; \
|
|
int errorp; \
|
|
while (EOF == (RESULT = getc(TTport)) \
|
|
&& (errorp = ferror(TTport), \
|
|
clearerr(TTport), \
|
|
(errorp && errno == EINTR))) \
|
|
; \
|
|
}
|
|
|
|
char
|
|
ps_read_char( FILE *filep, int *eofp )
|
|
{
|
|
int value;
|
|
|
|
while (TRUE) {
|
|
value = getc(filep);
|
|
if (EOF != value) {
|
|
*eofp = FALSE;
|
|
return value; }
|
|
if (ferror(filep)) {
|
|
clearerr(filep);
|
|
if (errno != EINTR) {
|
|
ps_status_errno = errno;
|
|
*eofp = FALSE;
|
|
return 0; } }
|
|
else {
|
|
*eofp = TRUE;
|
|
return 0; }}
|
|
}
|
|
|
|
/* Identical to ps_read_char except that we give the character back. */
|
|
|
|
char
|
|
ps_peek_char( FILE *filep )
|
|
{
|
|
int value;
|
|
|
|
while (TRUE) {
|
|
value = getc(filep);
|
|
if (EOF != value) {
|
|
ungetc(value);
|
|
return value;
|
|
}
|
|
if (ferror(filep)) {
|
|
clearerr(filep);
|
|
if (errno != EINTR) {
|
|
ps_status_errno = errno;
|
|
return 0;
|
|
}
|
|
}
|
|
else {
|
|
ps_status_errno = EOF_ERRNO;
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
void
|
|
ps_write_char( char c; FILE *filep )
|
|
{
|
|
while (TRUE) {
|
|
if (EOF != putc(c, filep);
|
|
return;
|
|
if (ferror(filep)) {
|
|
clearerr(filep);
|
|
if (errno != EINTR) {
|
|
ps_status_errno = errno;
|
|
return;
|
|
}
|
|
}
|
|
else {
|
|
ps_status_errno = EOF_ERRNO;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
; no status
|
|
current-input-port current-output-port current-error-port
|
|
|
|
; -> port status
|
|
open-input-file open-output-file
|
|
|
|
; -> status
|
|
close-output-port close-input-port
|
|
|
|
; -> value eof? status
|
|
read-char peek-char read-integer
|
|
|
|
; -> status
|
|
write-char newline write-string write-integer force-output
|
|
|
|
|
|
Error status:
|
|
|
|
no-errors 0
|
|
parse-error EINVAL invalid argument
|
|
pending-i/o EAGAIN? resource temporarily unavailable
|
|
file-not-found ENOENT no such
|
|
EISDIR is a directory
|
|
out-of-memory ENOMEM not enough space
|
|
out-of-channels EMFILE too many open files
|
|
channel-closed EBADF bad file descriptor
|
|
no-such-channel EBADF bad file descriptor
|