12503Sdlw /* 2*4119Sdlw char id_util[] = "@(#)util.c 1.5"; 32503Sdlw * 42503Sdlw * utility routines 52503Sdlw */ 62503Sdlw 72503Sdlw #include <sys/types.h> 82503Sdlw #include <sys/stat.h> 92503Sdlw #include "fio.h" 102503Sdlw 112503Sdlw 123634Sdlw ini_std(u,F,w,i66) FILE *F; 132503Sdlw { unit *p; 142503Sdlw p = &units[u]; 152503Sdlw p->ufd = F; 162503Sdlw p->ufnm = NULL; 172503Sdlw p->useek = canseek(F); 182503Sdlw p->ufmt = YES; 192503Sdlw p->uwrt = (w==WRITE)? YES : NO; 203637Sdlw p->uscrtch = p->uend = NO; 213637Sdlw p->ublnk = p->uprnt = (i66!=0)? YES : NO; 222503Sdlw p->url = 0; 232503Sdlw p->uinode = finode(F); 242503Sdlw } 252503Sdlw 262503Sdlw canseek(f) FILE *f; /*SYSDEP*/ 272503Sdlw { struct stat x; 282503Sdlw return( (fstat(fileno(f),&x)==0) && 292503Sdlw (x.st_nlink > 0 /*!pipe*/) && !isatty(fileno(f)) ); 302503Sdlw } 312503Sdlw 322503Sdlw nowreading(x) unit *x; 332503Sdlw { 34*4119Sdlw return(now_acc(x,"r")); 352503Sdlw } 362503Sdlw 372503Sdlw nowwriting(x) unit *x; 382503Sdlw { 39*4119Sdlw return(now_acc(x,"a")); 40*4119Sdlw } 41*4119Sdlw 42*4119Sdlw now_acc(x,mode) 43*4119Sdlw unit *x; char *mode; 44*4119Sdlw { 452503Sdlw long loc; 46*4119Sdlw 47*4119Sdlw if (!x->ufnm) 48*4119Sdlw { 49*4119Sdlw errno = EBADF; 50*4119Sdlw return(NO); 51*4119Sdlw } 52*4119Sdlw if (x->useek) 53*4119Sdlw loc=ftell(x->ufd); 54*4119Sdlw if (freopen(x->ufnm,mode,x->ufd)) 55*4119Sdlw { 56*4119Sdlw if (x->useek) 57*4119Sdlw fseek(x->ufd,loc,0); 58*4119Sdlw x->uwrt = (*mode=='a'); 59*4119Sdlw return(YES); 60*4119Sdlw } 61*4119Sdlw if (x->ufd = fopen(x->ufnm, (*mode=='a')? "r":"a")) 62*4119Sdlw if (x->useek) 63*4119Sdlw fseek(x->ufd,loc,0); 64*4119Sdlw return(NO); 652503Sdlw } 662503Sdlw 672503Sdlw g_char(a,alen,b) char *a,*b; ftnlen alen; 682503Sdlw { char *x=a+alen-1, *y=b+alen-1; 692503Sdlw while (x >= a && *x == ' ') {x--; y--;} 702503Sdlw *(y+1) = '\0'; 712503Sdlw while (x >= a) *y-- = *x--; 722503Sdlw } 732503Sdlw 742503Sdlw b_char(from, to, tolen) char *from, *to; ftnlen tolen; 752503Sdlw { int i=0; 762503Sdlw while (*from && i < tolen) { 772503Sdlw *to++ = *from++; 782503Sdlw i++; 792503Sdlw } 802503Sdlw while (i++ < tolen) 812503Sdlw *to++ = ' '; 822503Sdlw } 832503Sdlw 842503Sdlw inode(a) char *a; 852503Sdlw { struct stat x; 862503Sdlw if(stat(a,&x)==0) return(x.st_ino); 872503Sdlw else return(-1); 882503Sdlw } 892503Sdlw 902503Sdlw finode(f) FILE *f; 912503Sdlw { struct stat x; 922503Sdlw if(fstat(fileno(f),&x)==0) return(x.st_ino); 932503Sdlw else return(-1); 942503Sdlw } 952503Sdlw 962503Sdlw char 972503Sdlw last_char(f) FILE *f; 982503Sdlw { 992503Sdlw fseek(f,-2L,1); 1002503Sdlw if(ftell(f)) return(getc(f)); 1012503Sdlw else return('\n'); 1022503Sdlw } 103