Mercurial > emacs
diff src/sysdep.c @ 525:44213fc1fbb6
*** empty log message ***
| author | Jim Blandy <jimb@redhat.com> |
|---|---|
| date | Fri, 31 Jan 1992 21:29:35 +0000 |
| parents | 77c38d1bc8a8 |
| children | e2782df984a2 |
line wrap: on
line diff
--- a/src/sysdep.c Fri Jan 31 21:19:17 1992 +0000 +++ b/src/sysdep.c Fri Jan 31 21:29:35 1992 +0000 @@ -3257,19 +3257,38 @@ { register char *p; register char *e; - int retval, sum; + int sum = 0; + struct stat st; + + fstat (fildes, &st); p = buf; - sum = 0; while (nbytes > 0) { - e = p + min (MAXIOSIZE, nbytes) - 1; - while (*e != '\n' && e > p) e--; - if (p == e) /* Ok.. so here we add a newline... sigh. */ - e = p + min (MAXIOSIZE, nbytes) - 1; - retval = write (fildes, p, e - p + 1); - if (retval != e - p + 1) return -1; - p = e + 1; - sum = sum + retval; + int len, retval; + + /* Handle fixed-length files with carriage control. */ + if (st.st_fab_rfm == FAB$C_FIX + && ((st.st_fab_rat & (FAB$M_FTN | FAB$M_CR)) != 0)) + { + len = st.st_fab_mrs; + retval = write (fildes, p, min (len, nbytes)); + if (retval != len) + return -1; + retval++; /* This skips the implied carriage control */ + } + else + { + e = p + min (MAXIOSIZE, nbytes) - 1; + while (*e != '\n' && e > p) e--; + if (p == e) /* Ok.. so here we add a newline... sigh. */ + e = p + min (MAXIOSIZE, nbytes) - 1; + len = e + 1 - p; + retval = write (fildes, p, len); + if (retval != len) + return -1; + } + p += retval; + sum += retval; nbytes -= retval; } return sum;
