1: /* 2: char id_util[] = "@(#)util.c 1.7"; 3: * 4: * utility routines 5: */ 6: 7: #include <sys/types.h> 8: #include <sys/stat.h> 9: #include "fio.h" 10: 11: extern short ccntrl_, blzero_; 12: 13: ini_std(u,F,w) FILE *F; 14: { unit *p; 15: p = &units[u]; 16: p->ufd = F; 17: p->ufnm = NULL; 18: p->useek = canseek(F); 19: p->ufmt = YES; 20: p->uwrt = (w==WRITE)? YES : NO; 21: p->uscrtch = p->uend = NO; 22: p->ublnk = blzero; 23: p->uprnt = ccntrl; 24: p->url = 0; 25: p->uinode = finode(F); 26: } 27: 28: canseek(f) FILE *f; /*SYSDEP*/ 29: { struct stat x; 30: return( (fstat(fileno(f),&x)==0) && 31: (x.st_nlink > 0 /*!pipe*/) && !isatty(fileno(f)) ); 32: } 33: 34: nowreading(x) unit *x; 35: { 36: return(now_acc(x,"r")); 37: } 38: 39: nowwriting(x) unit *x; 40: { 41: return(now_acc(x,"a")); 42: } 43: 44: now_acc(x,mode) 45: unit *x; char *mode; 46: { 47: long loc; 48: 49: if (!x->ufnm) 50: { 51: errno = EBADF; 52: return(NO); 53: } 54: if (x->useek) 55: loc=ftell(x->ufd); 56: if (freopen(x->ufnm,mode,x->ufd)) 57: { 58: if (x->useek) 59: fseek(x->ufd,loc,0); 60: x->uwrt = (*mode=='a'); 61: return(YES); 62: } 63: if (x->ufd = fopen(x->ufnm, (*mode=='a')? "r":"a")) 64: if (x->useek) 65: fseek(x->ufd,loc,0); 66: return(NO); 67: } 68: 69: g_char(a,alen,b) char *a,*b; ftnlen alen; 70: { char *x=a+alen-1, *y=b+alen-1; 71: while (x >= a && *x == ' ') {x--; y--;} 72: *(y+1) = '\0'; 73: while (x >= a) *y-- = *x--; 74: } 75: 76: b_char(from, to, tolen) char *from, *to; ftnlen tolen; 77: { int i=0; 78: while (*from && i < tolen) { 79: *to++ = *from++; 80: i++; 81: } 82: while (i++ < tolen) 83: *to++ = ' '; 84: } 85: 86: inode(a) char *a; 87: { struct stat x; 88: if(stat(a,&x)==0) return(x.st_ino); 89: else return(-1); 90: } 91: 92: finode(f) FILE *f; 93: { struct stat x; 94: if(fstat(fileno(f),&x)==0) return(x.st_ino); 95: else return(-1); 96: } 97: 98: char 99: last_char(f) FILE *f; 100: { 101: fseek(f,-2L,1); 102: if(ftell(f)) return(getc(f)); 103: else return('\n'); 104: }