declare init66_ in err.c. DLW
[unix-history] / usr / src / usr.bin / f77 / libI77 / open.c
CommitLineData
796e5234 1/*
4cc5540e 2char id_open[] = "@(#)open.c 1.5";
796e5234
DW
3 *
4 * open.c - f77 file open routines
5 */
6
7#include <sys/types.h>
8#include <sys/stat.h>
9#include <errno.h>
10#include "fio.h"
11
12#define SCRATCH (st=='s')
13#define NEW (st=='n')
14#define OLD (st=='o')
15#define OPEN (b->ufd)
16#define FROM_OPEN "\1" /* for use in f_clos() */
17
4cc5540e 18short opnbof_; /* open at beginning of file */
796e5234
DW
19extern char *tmplate;
20extern char *fortfile;
21
22f_open(a) olist *a;
23{ unit *b;
24 int n,exists;
25 char buf[256],st;
26 cllist x;
27
28 lfname = NULL;
29 elist = NO;
30 external = YES; /* for err */
31 errflag = a->oerr;
32 lunit = a->ounit;
43666f58 33 if(not_legal(lunit)) err(errflag,F_ERUNIT,"open")
796e5234
DW
34 b= &units[lunit];
35 if(a->osta) st = lcase(*a->osta);
36 else st = 'u';
37 if(SCRATCH)
38 { strcpy(buf,tmplate);
39 mktemp(buf);
40 }
41 else if(a->ofnm) g_char(a->ofnm,a->ofnmlen,buf);
42 else sprintf(buf,fortfile,lunit);
43 lfname = &buf[0];
44 if(OPEN)
45 {
46 if(!a->ofnm || inode(buf)==b->uinode)
47 {
48 if(a->oblnk) b->ublnk= (lcase(*a->oblnk)== 'z');
49#ifndef KOSHER
50 if(a->ofm && b->ufmt) b->uprnt = (lcase(*a->ofm)== 'p');
51#endif
52 return(OK);
53 }
54 x.cunit=lunit;
55 x.csta=FROM_OPEN;
56 x.cerr=errflag;
57 if(n=f_clos(&x)) return(n);
58 }
59 exists = (access(buf,0)==NULL);
43666f58
DW
60 if(!exists && OLD) err(errflag,F_EROLDF,"open");
61 if( exists && NEW) err(errflag,F_ERNEWF,"open");
796e5234
DW
62 if(isdev(buf))
63 { if((b->ufd = fopen(buf,"r")) != NULL) b->uwrt = NO;
64 else err(errflag,errno,buf)
65 }
66 else
4cc5540e
DW
67 { if(!opnbof_ && (b->ufd = fopen(buf, "a")) != NULL)
68 b->uwrt = YES;
796e5234 69 else if((b->ufd = fopen(buf, "r")) != NULL)
4cc5540e
DW
70 { if (!opnbof_)
71 fseek(b->ufd, 0L, 2);
796e5234
DW
72 b->uwrt = NO;
73 }
74 else err(errflag, errno, buf)
75 }
43666f58 76 if((b->uinode=finode(b->ufd))==-1) err(errflag,F_ERSTAT,"open")
796e5234 77 b->ufnm = (char *) calloc(strlen(buf)+1,sizeof(char));
43666f58 78 if(b->ufnm==NULL) err(errflag,F_ERSPACE,"open")
796e5234
DW
79 strcpy(b->ufnm,buf);
80 b->uscrtch = SCRATCH;
81 b->uend = NO;
82 b->useek = canseek(b->ufd);
42e14fca
DW
83 if (a->oacc == NULL)
84 a->oacc = "seq";
85 if (lcase(*a->oacc)=='s' && a->orl > 0)
86 {
4c9938d8 87 fputs("Warning: open: record length ignored on sequential access\n", units[0].ufd);
42e14fca
DW
88 b->url = 0;
89 }
90 else if (a->orl < 0 || (lcase(*a->oacc)=='d' && a->orl == 0))
4c9938d8
DW
91 err(errflag,F_ERARG,"recl on open")
92 else
93 b->url = a->orl;
796e5234
DW
94 b->ublnk = (a->oblnk && (lcase(*a->oblnk)=='z'));
95 if (a->ofm)
96 {
97 switch(lcase(*a->ofm))
98 {
99 case 'f':
100 b->ufmt = YES;
101 b->uprnt = NO;
102 break;
103#ifndef KOSHER
104 case 'p': /* print file *** NOT STANDARD FORTRAN ***/
105 b->ufmt = YES;
106 b->uprnt = YES;
107 break;
108#endif
109 case 'u':
110 b->ufmt = NO;
111 b->uprnt = NO;
112 break;
113 default:
43666f58 114 err(errflag,F_ERARG,"open form=")
796e5234
DW
115 }
116 }
117 else /* not specified */
118 { b->ufmt = (b->url==0);
119 b->uprnt = NO;
120 }
121 if(b->url && b->useek) rewind(b->ufd);
122 return(OK);
123}
124
125fk_open(rd,seq,fmt,n) ftnint n;
126{ char nbuf[10];
127 olist a;
128 sprintf(nbuf, fortfile, (int)n);
129 a.oerr=errflag;
130 a.ounit=n;
131 a.ofnm=nbuf;
132 a.ofnmlen=strlen(nbuf);
133 a.osta=NULL;
134 a.oacc= seq==SEQ?"s":"d";
135 a.ofm = fmt==FMT?"f":"u";
136 a.orl = seq==DIR?1:0;
137 a.oblnk=NULL;
138 return(f_open(&a));
139}
140
141isdev(s) char *s;
142{ struct stat x;
143 int j;
144 if(stat(s, &x) == -1) return(NO);
145 if((j = (x.st_mode&S_IFMT)) == S_IFREG || j == S_IFDIR) return(NO);
146 else return(YES);
147}
148