Doxygen Source Code Documentation
open.c File Reference
#include "stdlib.h"#include "sys/types.h"#include "sys/stat.h"#include "f2c.h"#include "fio.h"#include "string.h"#include "rawio.h"#include <unistd.h>Go to the source code of this file.
Functions | |
| int | f__canseek (FILE *) |
| integer | f_clos (cllist *) |
| int | f__isdev (char *s) |
| integer | f_open (olist *a) |
| int | fk_open (int seq, int fmt, ftnint n) |
Variables | |
| char * | f__r_mode [2] = {"rb", "r"} |
| char * | f__w_mode [4] = {"wb", "w", "r+b", "r+"} |
Function Documentation
|
|
Definition at line 86 of file err.c. References isatty(), and S_ISDIR. Referenced by f_init(), and f_open().
00088 {
00089 #ifdef NON_UNIX_STDIO
00090 return !isatty(fileno(f));
00091 #else
00092 struct stat x;
00093
00094 if (fstat(fileno(f),&x) < 0)
00095 return(0);
00096 #ifdef S_IFMT
00097 switch(x.st_mode & S_IFMT) {
00098 case S_IFDIR:
00099 case S_IFREG:
00100 if(x.st_nlink > 0) /* !pipe */
00101 return(1);
00102 else
00103 return(0);
00104 case S_IFCHR:
00105 if(isatty(fileno(f)))
00106 return(0);
00107 return(1);
00108 #ifdef S_IFBLK
00109 case S_IFBLK:
00110 return(1);
00111 #endif
00112 }
00113 #else
00114 #ifdef S_ISDIR
00115 /* POSIX version */
00116 if (S_ISREG(x.st_mode) || S_ISDIR(x.st_mode)) {
00117 if(x.st_nlink > 0) /* !pipe */
00118 return(1);
00119 else
00120 return(0);
00121 }
00122 if (S_ISCHR(x.st_mode)) {
00123 if(isatty(fileno(f)))
00124 return(0);
00125 return(1);
00126 }
00127 if (S_ISBLK(x.st_mode))
00128 return(1);
00129 #else
00130 Help! How does fstat work on this system?
00131 #endif
00132 #endif
00133 return(0); /* who knows what it is? */
00134 #endif
00135 }
|
|
|
Definition at line 37 of file open.c. References close(), i, isatty(), and S_ISDIR. Referenced by f_open().
00039 {
00040 #ifdef NON_UNIX_STDIO
00041 int i, j;
00042
00043 i = open(s,O_RDONLY);
00044 if (i == -1)
00045 return 0;
00046 j = isatty(i);
00047 close(i);
00048 return j;
00049 #else
00050 struct stat x;
00051
00052 if(stat(s, &x) == -1) return(0);
00053 #ifdef S_IFMT
00054 switch(x.st_mode&S_IFMT) {
00055 case S_IFREG:
00056 case S_IFDIR:
00057 return(0);
00058 }
00059 #else
00060 #ifdef S_ISREG
00061 /* POSIX version */
00062 if(S_ISREG(x.st_mode) || S_ISDIR(x.st_mode))
00063 return(0);
00064 else
00065 #else
00066 Help! How does stat work on this system?
00067 #endif
00068 #endif
00069 return(1);
00070 #endif
00071 }
|
|
|
Definition at line 27 of file close.c. References a, free, MXUNIT, t_runc(), unit::uend, unit::ufd, unit::ufnm, unlink, unit::uscrtch, and unit::uwrt. Referenced by f_exit(), f_open(), and MAIN__().
00029 { unit *b;
00030
00031 if(a->cunit >= MXUNIT) return(0);
00032 b= &f__units[a->cunit];
00033 if(b->ufd==NULL)
00034 goto done;
00035 if (!a->csta)
00036 if (b->uscrtch == 1)
00037 goto Delete;
00038 else
00039 goto Keep;
00040 switch(*a->csta) {
00041 default:
00042 Keep:
00043 case 'k':
00044 case 'K':
00045 if(b->uwrt == 1)
00046 t_runc((alist *)a);
00047 if(b->ufnm) {
00048 fclose(b->ufd);
00049 free(b->ufnm);
00050 }
00051 break;
00052 case 'd':
00053 case 'D':
00054 Delete:
00055 if(b->ufnm) {
00056 fclose(b->ufd);
00057 unlink(b->ufnm); /*SYSDEP*/
00058 free(b->ufnm);
00059 }
00060 }
00061 b->ufd=NULL;
00062 done:
00063 b->uend=0;
00064 b->ufnm=NULL;
00065 return(0);
00066 }
|
|
|
Definition at line 75 of file open.c. References a, cllist::cerr, close(), cllist::csta, cllist::cunit, err, f__canseek(), f__inode(), f__isdev(), f__r_mode, f__w_mode, f_clos(), f_init(), fdopen(), g_char(), L, malloc, mktemp(), MXUNIT, O_WRONLY, unit::ublnk, unit::udev, unit::uend, unit::ufd, unit::ufmt, unit::ufnm, unit::uinode, unit::url, unit::uscrtch, unit::useek, and unit::uwrt. Referenced by fk_open(), and MAIN__().
00077 { unit *b;
00078 integer rv;
00079 char buf[256], *s;
00080 cllist x;
00081 int ufmt;
00082 #ifdef NON_UNIX_STDIO
00083 FILE *tf;
00084 #else
00085 int n;
00086 struct stat stb;
00087 #endif
00088 if(a->ounit>=MXUNIT || a->ounit<0)
00089 err(a->oerr,101,"open")
00090 if (!f__init)
00091 f_init();
00092 f__curunit = b = &f__units[a->ounit];
00093 if(b->ufd) {
00094 if(a->ofnm==0)
00095 {
00096 same: if (a->oblnk)
00097 b->ublnk = *a->oblnk == 'z' || *a->oblnk == 'Z';
00098 return(0);
00099 }
00100 #ifdef NON_UNIX_STDIO
00101 if (b->ufnm
00102 && strlen(b->ufnm) == a->ofnmlen
00103 && !strncmp(b->ufnm, b->ufnm, (unsigned)a->ofnmlen))
00104 goto same;
00105 #else
00106 g_char(a->ofnm,a->ofnmlen,buf);
00107 if (f__inode(buf,&n) == b->uinode && n == b->udev)
00108 goto same;
00109 #endif
00110 x.cunit=a->ounit;
00111 x.csta=0;
00112 x.cerr=a->oerr;
00113 if ((rv = f_clos(&x)) != 0)
00114 return rv;
00115 }
00116 b->url = (int)a->orl;
00117 b->ublnk = a->oblnk && (*a->oblnk == 'z' || *a->oblnk == 'Z');
00118 if(a->ofm==0)
00119 { if(b->url>0) b->ufmt=0;
00120 else b->ufmt=1;
00121 }
00122 else if(*a->ofm=='f' || *a->ofm == 'F') b->ufmt=1;
00123 else b->ufmt=0;
00124 ufmt = b->ufmt;
00125 #ifdef url_Adjust
00126 if (b->url && !ufmt)
00127 url_Adjust(b->url);
00128 #endif
00129 if (a->ofnm) {
00130 g_char(a->ofnm,a->ofnmlen,buf);
00131 if (!buf[0])
00132 err(a->oerr,107,"open")
00133 }
00134 else
00135 sprintf(buf, "fort.%ld", a->ounit);
00136 b->uscrtch = 0;
00137 switch(a->osta ? *a->osta : 'u')
00138 {
00139 case 'o':
00140 case 'O':
00141 #ifdef NON_UNIX_STDIO
00142 if(access(buf,0))
00143 #else
00144 if(stat(buf,&stb))
00145 #endif
00146 err(a->oerr,errno,"open")
00147 break;
00148 case 's':
00149 case 'S':
00150 b->uscrtch=1;
00151 #ifdef _POSIX_SOURCE
00152 tmpnam(buf);
00153 #else
00154 (void) strcpy(buf,"tmp.FXXXXXX");
00155 (void) mktemp(buf);
00156 #endif
00157 goto replace;
00158 case 'n':
00159 case 'N':
00160 #ifdef NON_UNIX_STDIO
00161 if(!access(buf,0))
00162 #else
00163 if(!stat(buf,&stb))
00164 #endif
00165 err(a->oerr,128,"open")
00166 /* no break */
00167 case 'r': /* Fortran 90 replace option */
00168 case 'R':
00169 replace:
00170 #ifdef NON_UNIX_STDIO
00171 if (tf = fopen(buf,f__w_mode[0]))
00172 fclose(tf);
00173 #else
00174 (void) close(creat(buf, 0666));
00175 #endif
00176 }
00177
00178 b->ufnm=(char *) malloc((unsigned int)(strlen(buf)+1));
00179 if(b->ufnm==NULL) err(a->oerr,113,"no space");
00180 (void) strcpy(b->ufnm,buf);
00181 b->uend=0;
00182 b->uwrt = 0;
00183 #ifdef NON_UNIX_STDIO
00184 if ((s = a->oacc) && (*s == 'd' || *s == 'D'))
00185 ufmt = 0;
00186 #endif
00187 if(f__isdev(buf))
00188 { b->ufd = fopen(buf,f__r_mode[ufmt]);
00189 if(b->ufd==NULL) err(a->oerr,errno,buf)
00190 }
00191 else {
00192 if(!(b->ufd = fopen(buf, f__r_mode[ufmt]))) {
00193 #ifdef NON_UNIX_STDIO
00194 if (b->ufd = fopen(buf, f__w_mode[ufmt|2]))
00195 b->uwrt = 2;
00196 else if (b->ufd = fopen(buf, f__w_mode[ufmt]))
00197 b->uwrt = 1;
00198 else
00199 #else
00200 if ((n = open(buf,O_WRONLY)) >= 0)
00201 b->uwrt = 2;
00202 else {
00203 n = creat(buf, 0666);
00204 b->uwrt = 1;
00205 }
00206 if (n < 0
00207 || (b->ufd = fdopen(n, f__w_mode[ufmt])) == NULL)
00208 #endif
00209 err(a->oerr, errno, "open");
00210 }
00211 }
00212 b->useek=f__canseek(b->ufd);
00213 #ifndef NON_UNIX_STDIO
00214 if((b->uinode=f__inode(buf,&b->udev))==-1)
00215 err(a->oerr,108,"open")
00216 #endif
00217 if(b->useek)
00218 if (a->orl)
00219 rewind(b->ufd);
00220 else if ((s = a->oacc) && (*s == 'a' || *s == 'A')
00221 && fseek(b->ufd, 0L, SEEK_END))
00222 err(a->oerr,129,"open");
00223 return(0);
00224 }
|
|
||||||||||||||||
|
Definition at line 228 of file open.c. References a, DIR, f_open(), FMT, olist::oacc, olist::oblnk, olist::oerr, olist::ofm, olist::ofnm, olist::ofnmlen, olist::orl, olist::osta, and olist::ounit. Referenced by c_dfe(), c_due(), c_le(), c_sfe(), c_sue(), and f_back().
00230 { char nbuf[10];
00231 olist a;
00232 (void) sprintf(nbuf,"fort.%ld",n);
00233 a.oerr=1;
00234 a.ounit=n;
00235 a.ofnm=nbuf;
00236 a.ofnmlen=strlen(nbuf);
00237 a.osta=NULL;
00238 a.oacc= seq==SEQ?"s":"d";
00239 a.ofm = fmt==FMT?"f":"u";
00240 a.orl = seq==DIR?1:0;
00241 a.oblnk=NULL;
00242 return(f_open(&a));
00243 }
|
Variable Documentation
|
|
|
|
|
|