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