Patch to improve CLHS compliance of file-position
authorNils Bruin <nbruin@sfu.ca>
Tue, 27 Jan 2015 02:30:04 +0000 (18:30 -0800)
committerNils Bruin <nbruin@sfu.ca>
Tue, 27 Jan 2015 02:30:04 +0000 (18:30 -0800)
CLHS mandates that failure to determine or set the file position on a
stream should be signalled by returning NIL rather than raising an error.

Also, POSIX does not mandate that lseek fail on terminals, but these devices
obviously are not seekable. Hence, CLHS compliance is improved by explicitly
returning NIL when the requested stream is a tty.

src/c/file.d

index 31fe108..578cc27 100755 (executable)
@@ -2774,6 +2774,8 @@ static cl_object
 io_file_get_position(cl_object strm)
 {
        int f = IO_FILE_DESCRIPTOR(strm);
+        if (isatty(f)) return(ECL_NIL);
+
        cl_object output;
        ecl_off_t offset;
 
@@ -2781,7 +2783,10 @@ io_file_get_position(cl_object strm)
        offset = lseek(f, 0, SEEK_CUR);
        ecl_enable_interrupts();
        unlikely_if (offset < 0)
-               io_error(strm);
+               if (errno == ESPIPE)
+                       return(ECL_NIL);
+                else
+                       io_error(strm);
        if (sizeof(ecl_off_t) == sizeof(long)) {
                output = ecl_make_integer(offset);
        } else {
@@ -2806,6 +2811,7 @@ static cl_object
 io_file_set_position(cl_object strm, cl_object large_disp)
 {
        int f = IO_FILE_DESCRIPTOR(strm);
+        if (isatty(f)) return(ECL_NIL);
        ecl_off_t disp;
        int mode;
        if (Null(large_disp)) {