1 /*- 2 * Copyright (c) 1980 The Regents of the University of California. 3 * All rights reserved. 4 * 5 * %sccs.include.proprietary.c% 6 */ 7 8 #ifndef lint 9 static char sccsid[] = "@(#)douio.c 5.2 (Berkeley) 04/12/91"; 10 #endif /* not lint */ 11 12 /* 13 * unformatted external i/o 14 */ 15 16 #include "fio.h" 17 18 LOCAL char *eor = "eor/uio"; 19 LOCAL char *uio = "uio"; 20 21 LOCAL 22 do_us(number,ptr,len) ftnint *number; ftnlen len; char *ptr; /* sequential */ 23 { 24 if(reading) 25 { 26 recpos += *number * len; 27 if (recpos > reclen) { 28 recpos -= *number * len; 29 e_rsue(); /* in case tries another read */ 30 err(errflag,F_EREREC,eor); 31 } 32 33 if (fread(ptr,(int)len,(int)(*number),cf) != *number) 34 return(due_err(uio)); 35 } 36 else 37 { 38 reclen += *number * len; 39 fwrite(ptr,(int)len,(int)(*number),cf); 40 } 41 return(OK); 42 } 43 44 do_uio(number,ptr,len) ftnint *number; ftnlen len; char *ptr; 45 { 46 if(sequential) 47 return(do_us(number,ptr,len)); 48 else 49 return(do_ud(number,ptr,len)); 50 } 51 52 LOCAL 53 do_ud(number,ptr,len) ftnint *number; ftnlen len; char *ptr; /* direct */ 54 { 55 recpos += *number * len; 56 if(recpos > curunit->url && curunit->url!=1) 57 err(errflag,F_EREREC,eor); 58 if(reading) 59 { 60 if (fread(ptr, (int)len, (int)(*number), cf) != *number) 61 return(due_err(uio)); 62 } 63 else 64 fwrite(ptr,(int)len,(int)(*number),cf); 65 return(OK); 66 } 67 68 due_err(s) char *s; 69 { 70 if(feof(cf)) 71 err(endflag,EOF,s) 72 else 73 { clearerr(cf); 74 err(errflag,errno,s) 75 } 76 } 77