int s_rsfe(cilist *a) /* start */ { int n; if(!init) f_init(); if((n=c_sfe(a,READ))) return(n); reading=1; sequential=1; formatted=1; external=1; elist=a; cursor=recpos=0; scale=0; fmtbuf=a->cifmt; if(pars_f(fmtbuf)<0) err(a->cierr,100,"startio"); curunit= &units[a->ciunit]; cf=curunit->ufd; getn= x_getc; doed= rd_ed; doned= rd_ned; fmt_bg(); doend=x_endp; donewrec=xrd_SL; dorevert=x_rev; cblank=curunit->ublnk; cplus=0; if(curunit->uwrt) nowreading(curunit); return(0); }
int s_rdue(cilist *a) { int n; if((n=c_due(a,READ))) return(n); reading=1; if(curunit->uwrt) nowreading(curunit); return(0); }
int f_back(alist *a) { unit *b; int n,i; long x; char buf[32]; if(a->aunit >= MXUNIT || a->aunit < 0) err(a->aerr,101,"backspace") b= &units[a->aunit]; if(b->useek==0) err(a->aerr,106,"backspace") if(b->ufd==NULL) err(a->aerr,114,"backspace") if(b->uend==1) { b->uend=0; return(0); } if(b->uwrt) { t_runc(b); nowreading(b); } if(b->url>0) { x=ftell(b->ufd); x /= b->url; x *= b->url; fseek(b->ufd,x,0); return(0); } if(b->ufmt==0) { fseek(b->ufd,-(long)sizeof(int),1); fread((char *)&n,sizeof(int),1,b->ufd); fseek(b->ufd,-(long)n-2*sizeof(int),1); return(0); } for(;;) { x=ftell(b->ufd); if(x<sizeof(buf)) x=0; else x -= sizeof(buf); fseek(b->ufd,x,0); n=fread(buf,1,sizeof(buf),b->ufd); for(i=n-1;i>=0;i--) { if(buf[i]!='\n') continue; fseek(b->ufd,(long)(i-n),1); return(0); } if(x==0) return(0); else if(n==0) err(a->aerr,(EOF),"backspace") else err(a->aerr,errno,"backspace"); } }
int f_end(alist *a) { unit *b; if(a->aunit>=MXUNIT || a->aunit<0) err(a->aerr,101,"endfile"); b = &units[a->aunit]; if(b->ufd==NULL) return(0); b->uend=1; if( b->useek==0) return(0); ax=a; if(b->uwrt) nowreading(b); return(t_runc(b)); }
int f_rew(alist *a) { unit *b; if(a->aunit>=MXUNIT || a->aunit<0) err(a->aerr,101,"rewind"); b = &units[a->aunit]; if(b->ufd==NULL && fk_open(READ,SEQ,FMT,a->aunit)) err(a->aerr,114,"rewind") if(!b->useek) err(a->aerr,106,"rewind") if(b->uwrt) { nowreading(b); t_runc(b); } rewind(b->ufd); b->uend=0; return(0); }
int t_runc(unit *b) { char buf[128],nm[16]; FILE *tmp; int n,m, fd; long loc,len; if(b->url) return(0); /*don't truncate direct files*/ loc=ftell(b->ufd); fseek(b->ufd,0L,2); len=ftell(b->ufd); if(loc==len || b->useek==0 || b->ufnm==NULL) return(0); strcpy(nm,"tmp.FXXXXXX"); if(b->uwrt) nowreading(b); fd = mkstemp(nm); tmp=fdopen(fd,"w"); fseek(b->ufd,0L,0); for(;loc>0;) { n=fread(buf,1,loc>128?128:(int)loc,b->ufd); if(n>loc) n=loc; loc -= n; fwrite(buf,1,n,tmp); } fflush(tmp); for(n=0;n<10;n++) { if((m=fork())==-1) continue; else if(m==0) { execl("/bin/cp","cp",nm,b->ufnm,NULL); execl("/usr/bin/cp","cp",nm,b->ufnm,NULL); fprintf(stdout,"no cp\n"); exit(1); } wait(&m); if(m!=0) err(ax->aerr,111,"endfile"); fclose(tmp); unlink(nm); return(0); } err(ax->aerr,111,"endfile"); }
int s_rsue(cilist *a) { int n; if(!init) f_init(); if((n=c_sue(a,READ))) return(n); reading=1; recpos=0; if(curunit->uwrt) nowreading(curunit); if(fread(&reclen,sizeof(int),1,cf) != 1) { if(feof(cf)) { curunit->uend = 1; err(a->ciend, EOF, "start"); } clearerr(cf); err(a->cierr, errno, "start"); } return(0); }