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
 |