12503Sdlw /* 2*12007Sdlw char id_util[] = "@(#)util.c 1.6"; 32503Sdlw * 42503Sdlw * utility routines 52503Sdlw */ 62503Sdlw 72503Sdlw #include <sys/types.h> 82503Sdlw #include <sys/stat.h> 92503Sdlw #include "fio.h" 102503Sdlw 11*12007Sdlw extern short ccntrl_, blzero_; 122503Sdlw 13*12007Sdlw ini_std(u,F,w) FILE *F; 142503Sdlw { unit *p; 152503Sdlw p = &units[u]; 162503Sdlw p->ufd = F; 172503Sdlw p->ufnm = NULL; 182503Sdlw p->useek = canseek(F); 192503Sdlw p->ufmt = YES; 202503Sdlw p->uwrt = (w==WRITE)? YES : NO; 213637Sdlw p->uscrtch = p->uend = NO; 22*12007Sdlw p->ublnk = blzero_; 23*12007Sdlw p->uprnt = ccntrl_; 242503Sdlw p->url = 0; 252503Sdlw p->uinode = finode(F); 262503Sdlw } 272503Sdlw 282503Sdlw canseek(f) FILE *f; /*SYSDEP*/ 292503Sdlw { struct stat x; 302503Sdlw return( (fstat(fileno(f),&x)==0) && 312503Sdlw (x.st_nlink > 0 /*!pipe*/) && !isatty(fileno(f)) ); 322503Sdlw } 332503Sdlw 342503Sdlw nowreading(x) unit *x; 352503Sdlw { 364119Sdlw return(now_acc(x,"r")); 372503Sdlw } 382503Sdlw 392503Sdlw nowwriting(x) unit *x; 402503Sdlw { 414119Sdlw return(now_acc(x,"a")); 424119Sdlw } 434119Sdlw 444119Sdlw now_acc(x,mode) 454119Sdlw unit *x; char *mode; 464119Sdlw { 472503Sdlw long loc; 484119Sdlw 494119Sdlw if (!x->ufnm) 504119Sdlw { 514119Sdlw errno = EBADF; 524119Sdlw return(NO); 534119Sdlw } 544119Sdlw if (x->useek) 554119Sdlw loc=ftell(x->ufd); 564119Sdlw if (freopen(x->ufnm,mode,x->ufd)) 574119Sdlw { 584119Sdlw if (x->useek) 594119Sdlw fseek(x->ufd,loc,0); 604119Sdlw x->uwrt = (*mode=='a'); 614119Sdlw return(YES); 624119Sdlw } 634119Sdlw if (x->ufd = fopen(x->ufnm, (*mode=='a')? "r":"a")) 644119Sdlw if (x->useek) 654119Sdlw fseek(x->ufd,loc,0); 664119Sdlw return(NO); 672503Sdlw } 682503Sdlw 692503Sdlw g_char(a,alen,b) char *a,*b; ftnlen alen; 702503Sdlw { char *x=a+alen-1, *y=b+alen-1; 712503Sdlw while (x >= a && *x == ' ') {x--; y--;} 722503Sdlw *(y+1) = '\0'; 732503Sdlw while (x >= a) *y-- = *x--; 742503Sdlw } 752503Sdlw 762503Sdlw b_char(from, to, tolen) char *from, *to; ftnlen tolen; 772503Sdlw { int i=0; 782503Sdlw while (*from && i < tolen) { 792503Sdlw *to++ = *from++; 802503Sdlw i++; 812503Sdlw } 822503Sdlw while (i++ < tolen) 832503Sdlw *to++ = ' '; 842503Sdlw } 852503Sdlw 862503Sdlw inode(a) char *a; 872503Sdlw { struct stat x; 882503Sdlw if(stat(a,&x)==0) return(x.st_ino); 892503Sdlw else return(-1); 902503Sdlw } 912503Sdlw 922503Sdlw finode(f) FILE *f; 932503Sdlw { struct stat x; 942503Sdlw if(fstat(fileno(f),&x)==0) return(x.st_ino); 952503Sdlw else return(-1); 962503Sdlw } 972503Sdlw 982503Sdlw char 992503Sdlw last_char(f) FILE *f; 1002503Sdlw { 1012503Sdlw fseek(f,-2L,1); 1022503Sdlw if(ftell(f)) return(getc(f)); 1032503Sdlw else return('\n'); 1042503Sdlw } 105