xref: /csrg-svn/usr.bin/f77/libI77/util.c (revision 12007)
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