4
#ifndef NON_POSIX_STDIO
8
#include "unistd.h" /* for access */
13
extern char *malloc();
15
extern char *mktemp();
17
extern integer f_clos();
26
extern int f__canseek(FILE*);
27
extern integer f_clos(cllist*);
30
#ifdef NON_ANSI_RW_MODES
31
char *f__r_mode[2] = {"r", "r"};
32
char *f__w_mode[4] = {"w", "w", "r+w", "r+w"};
34
char *f__r_mode[2] = {"rb", "rb"};
35
char *f__w_mode[4] = {"wb", "wb", "rb+", "rb+"};
37
char *f__r_mode[2] = {"rb", "r"};
38
char *f__w_mode[4] = {"wb", "w", "r+b", "r+"};
41
static char f__buf0[400], *f__buf = f__buf0;
42
int f__buflen = (int)sizeof(f__buf0);
46
f__bufadj(n, c) int n, c;
48
f__bufadj(int n, int c)
52
char *nbuf, *s, *t, *te;
54
if (f__buf == f__buf0)
58
len = (unsigned int)f__buflen;
59
if (len != f__buflen || !(nbuf = (char*)malloc(len)))
60
f__fatal(113, "malloc failure");
66
if (f__buf != f__buf0)
81
if (f__hiwater > f__recpos)
82
f__recpos = f__hiwater;
85
f__bufadj(n, f__recpos);
95
break; /* normally happens the first time */
108
if (f__recpos >= f__buflen)
109
f__bufadj(f__recpos, f__buflen);
110
f__buf[f__recpos++] = c;
113
#define opnerr(f,m,s) {if(f) errno= m; else opn_err(m,s,a); return(m);}
117
opn_err(m, s, a) int m; char *s; olist *a;
119
opn_err(int m, char *s, olist *a)
123
/* supply file name to error message */
124
if (a->ofnmlen >= f__buflen)
125
f__bufadj((int)a->ofnmlen, 0);
126
g_char(a->ofnm, a->ofnmlen, f__curunit->ufnm = f__buf);
132
integer f_open(a) olist *a;
134
integer f_open(olist *a)
142
#ifndef NON_UNIX_STDIO
146
if(a->ounit>=MXUNIT || a->ounit<0)
147
err(a->oerr,101,"open")
150
f__curunit = b = &f__units[a->ounit];
155
b->ublnk = *a->oblnk == 'z' || *a->oblnk == 'Z';
158
#ifdef NON_UNIX_STDIO
160
&& strlen(b->ufnm) == a->ofnmlen
161
&& !strncmp(b->ufnm, a->ofnm, (unsigned)a->ofnmlen))
164
g_char(a->ofnm,a->ofnmlen,buf);
165
if (f__inode(buf,&n) == b->uinode && n == b->udev)
171
if ((rv = f_clos(&x)) != 0)
174
b->url = (int)a->orl;
175
b->ublnk = a->oblnk && (*a->oblnk == 'z' || *a->oblnk == 'Z');
177
{ if(b->url>0) b->ufmt=0;
180
else if(*a->ofm=='f' || *a->ofm == 'F') b->ufmt=1;
188
g_char(a->ofnm,a->ofnmlen,buf);
190
opnerr(a->oerr,107,"open")
193
sprintf(buf, "fort.%ld", (long)a->ounit);
199
switch(a->osta ? *a->osta : 'u')
203
#ifdef NON_POSIX_STDIO
204
if (!(tf = FOPEN(buf,"r")))
205
opnerr(a->oerr,errno,"open")
209
opnerr(a->oerr,errno,"open")
215
#ifdef NON_ANSI_STDIO
216
(void) strcpy(buf,"tmp.FXXXXXX");
220
if (!(b->ufd = tmpfile()))
221
opnerr(a->oerr,errno,"open")
223
#ifndef NON_UNIX_STDIO
224
b->uinode = b->udev = -1;
232
#ifdef NON_POSIX_STDIO
233
if ((tf = FOPEN(buf,"r")) || (tf = FOPEN(buf,"a"))) {
235
opnerr(a->oerr,128,"open")
239
opnerr(a->oerr,128,"open")
242
case 'r': /* Fortran 90 replace option */
244
#ifdef NON_ANSI_STDIO
247
if (tf = FOPEN(buf,f__w_mode[0]))
251
b->ufnm=(char *) malloc((unsigned int)(strlen(buf)+1));
252
if(b->ufnm==NULL) opnerr(a->oerr,113,"no space");
253
(void) strcpy(b->ufnm,buf);
254
if ((s = a->oacc) && b->url)
256
if(!(tf = FOPEN(buf, f__w_mode[ufmt|2]))) {
257
if (tf = FOPEN(buf, f__r_mode[ufmt]))
259
else if (tf = FOPEN(buf, f__w_mode[ufmt])) {
264
err(a->oerr, errno, "open");
266
b->useek = f__canseek(b->ufd = tf);
267
#ifndef NON_UNIX_STDIO
268
if((b->uinode = f__inode(buf,&b->udev)) == -1)
269
opnerr(a->oerr,108,"open")
274
else if ((s = a->oacc) && (*s == 'a' || *s == 'A')
275
&& FSEEK(b->ufd, 0L, SEEK_END))
276
opnerr(a->oerr,129,"open");
282
fk_open(seq,fmt,n) ftnint n;
284
fk_open(int seq, int fmt, ftnint n)
288
(void) sprintf(nbuf,"fort.%ld",(long)n);
292
a.ofnmlen=strlen(nbuf);
294
a.oacc= (char*)(seq==SEQ?"s":"d");
295
a.ofm = (char*)(fmt==FMT?"f":"u");
296
a.orl = seq==DIR?1:0;