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