12489Sdlw /* 2*20984Slibs char id_douio[] = "@(#)douio.c 1.4"; 32489Sdlw * 42489Sdlw * unformatted external i/o 52489Sdlw */ 62489Sdlw 72489Sdlw #include "fio.h" 82489Sdlw 9*20984Slibs LOCAL char *eor = "eor/uio"; 10*20984Slibs LOCAL char *uio = "uio"; 112489Sdlw 12*20984Slibs LOCAL 132489Sdlw do_us(number,ptr,len) ftnint *number; ftnlen len; char *ptr; /* sequential */ 142489Sdlw { 152489Sdlw if(reading) 162489Sdlw { 172489Sdlw recpos += *number * len; 1819918Slibs if (recpos > reclen) { 1919918Slibs recpos -= *number * len; 2019918Slibs e_rsue(); /* in case tries another read */ 212587Sdlw err(errflag,F_EREREC,eor); 2219918Slibs } 232489Sdlw 242489Sdlw if (fread(ptr,(int)len,(int)(*number),cf) != *number) 252489Sdlw return(due_err(uio)); 262489Sdlw } 272489Sdlw else 282489Sdlw { 292489Sdlw reclen += *number * len; 302489Sdlw fwrite(ptr,(int)len,(int)(*number),cf); 312489Sdlw } 322489Sdlw return(OK); 332489Sdlw } 342489Sdlw 352489Sdlw do_uio(number,ptr,len) ftnint *number; ftnlen len; char *ptr; 362489Sdlw { 372489Sdlw if(sequential) 382489Sdlw return(do_us(number,ptr,len)); 392489Sdlw else 402489Sdlw return(do_ud(number,ptr,len)); 412489Sdlw } 422489Sdlw 43*20984Slibs LOCAL 442489Sdlw do_ud(number,ptr,len) ftnint *number; ftnlen len; char *ptr; /* direct */ 452489Sdlw { 462489Sdlw recpos += *number * len; 472489Sdlw if(recpos > curunit->url && curunit->url!=1) 482587Sdlw err(errflag,F_EREREC,eor); 492489Sdlw if(reading) 502489Sdlw { 512489Sdlw if (fread(ptr, (int)len, (int)(*number), cf) != *number) 522489Sdlw return(due_err(uio)); 532489Sdlw } 542489Sdlw else 552489Sdlw fwrite(ptr,(int)len,(int)(*number),cf); 562489Sdlw return(OK); 572489Sdlw } 582489Sdlw 592489Sdlw due_err(s) char *s; 602489Sdlw { 612489Sdlw if(feof(cf)) 622489Sdlw err(endflag,EOF,s) 632489Sdlw else 642489Sdlw { clearerr(cf); 652489Sdlw err(errflag,errno,s) 662489Sdlw } 672489Sdlw } 68