11 extern char *malloc(), *mktemp();
12 extern integer f_clos();
18 extern int f__canseek(FILE*);
19 extern integer f_clos(cllist*);
22 #ifdef NON_ANSI_RW_MODES
23 char *f__r_mode[2] = {"r", "r"};
24 char *f__w_mode[4] = {"w", "w", "r+w", "r+w"};
26 char *f__r_mode[2] = {"rb", "r"};
27 char *f__w_mode[4] = {"wb", "w", "r+b", "r+"};
48 if(stat(s, &x) == -1) return(0);
50 switch(x.st_mode&S_IFMT) {
58 if(S_ISREG(x.st_mode) || S_ISDIR(x.st_mode))
62 Help! How does stat work on this system?
69 integer f_open(a) olist *a;
71 integer f_open(olist *a)
84 if(f__init != 1) f_init();
85 if(a->ounit>=MXUNIT || a->ounit<0)
86 err(a->oerr,101,"open");
87 f__curunit = b = &f__units[a->ounit];
92 b->ublnk = *a->oblnk == 'z' || *a->oblnk == 'Z';
97 && strlen(b->ufnm) == a->ofnmlen
98 && !strncmp(b->ufnm, b->ufnm, (unsigned)a->ofnmlen))
101 g_char(a->ofnm,a->ofnmlen,buf);
102 if (f__inode(buf,&n) == b->uinode && n == b->udev)
108 if ((rv = f_clos(&x)) != 0)
111 b->url = (int)a->orl;
112 b->ublnk = a->oblnk && (*a->oblnk == 'z' || *a->oblnk == 'Z');
114 { if(b->url>0) b->ufmt=0;
117 else if(*a->ofm=='f' || *a->ofm == 'F') b->ufmt=1;
125 g_char(a->ofnm,a->ofnmlen,buf);
127 err(a->oerr,107,"open");
130 sprintf(buf, "fort.%ld", a->ounit);
132 switch(a->osta ? *a->osta : 'u')
136 #ifdef NON_UNIX_STDIO
141 err(a->oerr,errno,"open");
146 #ifdef HAVE_TEMPNAM /* Allow use of TMPDIR preferentially. */
147 s = tempnam (0, buf);
148 if (strlen (s) >= sizeof (buf))
149 err (a->oerr, 132, "open");
150 (void) strcpy (buf, s);
152 #else /* ! defined (HAVE_TEMPNAM) */
156 (void) strcpy(buf,"tmp.FXXXXXX");
159 #endif /* ! defined (HAVE_TEMPNAM) */
163 #ifdef NON_UNIX_STDIO
168 err(a->oerr,128,"open");
170 case 'r': /* Fortran 90 replace option */
173 #ifdef NON_UNIX_STDIO
174 if (tf = fopen(buf,f__w_mode[0]))
177 (void) close(creat(buf, 0666));
181 b->ufnm=(char *) malloc((unsigned int)(strlen(buf)+1));
182 if(b->ufnm==NULL) err(a->oerr,113,"no space");
183 (void) strcpy(b->ufnm,buf);
186 #ifdef NON_UNIX_STDIO
187 if ((s = a->oacc) && (*s == 'd' || *s == 'D'))
191 { b->ufd = fopen(buf,f__r_mode[ufmt]);
192 if(b->ufd==NULL) err(a->oerr,errno,buf);
195 if(!(b->ufd = fopen(buf, f__r_mode[ufmt]))) {
196 #ifdef NON_UNIX_STDIO
197 if (b->ufd = fopen(buf, f__w_mode[ufmt|2]))
199 else if (b->ufd = fopen(buf, f__w_mode[ufmt]))
203 if ((n = open(buf,O_WRONLY)) >= 0)
206 n = creat(buf, 0666);
210 || (b->ufd = fdopen(n, f__w_mode[ufmt])) == NULL)
212 err(a->oerr, errno, "open");
215 b->useek=f__canseek(b->ufd);
216 #ifndef NON_UNIX_STDIO
217 if((b->uinode=f__inode(buf,&b->udev))==-1)
218 err(a->oerr,108,"open");
223 else if ((s = a->oacc) && (*s == 'a' || *s == 'A')
224 && fseek(b->ufd, 0L, SEEK_END))
225 err(a->oerr,129,"open");
229 fk_open(seq,fmt,n) ftnint n;
231 fk_open(int seq, int fmt, ftnint n)
238 (void) sprintf(nbuf,"fort.%ld",n);
242 a.ofnmlen=strlen(nbuf);
244 a.oacc= seq==SEQ?"s":"d";
245 a.ofm = fmt==FMT?"f":"u";
246 a.orl = seq==DIR?1:0;
251 f__init = save_init | 1;