scsh-0.6/ps-compiler/prescheme/c-stuff

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