* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
* open.c - f77 file open and I/O library initialization routines
#define SCRATCH (st=='s')
#define FROM_OPEN "\2" /* for use in f_clos() */
LOCAL
char *tmplate
= "tmp.FXXXXXX"; /* scratch file template */
LOCAL
char *fortfile
= "fort.%d"; /* default file template */
char buf
[BUF_LEN
], env_name
[BUF_LEN
];
char *env_val
, *p1
, *p2
, ch
, st
;
external
= YES
; /* for err */
if(not_legal(lunit
)) err(errflag
,F_ERUNIT
,"open")
if(a
->osta
) st
= lcase(*a
->osta
);
/* make a new temp file name, err if mktemp fails */
if( strcmp( mktemp(buf
), "/" ) == 0 )
err(errflag
, F_ERSYS
, "open")
if(a
->ofnm
) g_char(a
->ofnm
,a
->ofnmlen
,buf
);
else sprintf(buf
,fortfile
,lunit
);
/* check if overriding file name via environment variable
* first copy tail of name - delete periods as Bourne Shell
* croaks if any periods in name
while ((ch
= *p1
++) != '\0') {
if(ch
== '/') p2
= env_name
;
else if(ch
!= '.') *p2
++ = ch
;
if( (env_val
= getenv( env_name
)) != NULL
) {
if(strlen(env_val
) >= BUF_LEN
-1 )
err(errflag
,F_ERSTAT
,"open: file name too long");
if(!a
->ofnm
|| inode(buf
)==b
->uinode
)
if(a
->oblnk
) b
->ublnk
= (lcase(*a
->oblnk
)== 'z');
if(a
->ofm
&& b
->ufmt
) b
->uprnt
= (lcase(*a
->ofm
)== 'p');
if(n
=f_clos(&x
)) return(n
);
exists
= (stat(buf
,&sbuf
)==NULL
);
if(!exists
&& OLD
) err(errflag
,F_EROLDF
,"open");
if( exists
&& NEW
) err(errflag
,F_ERNEWF
,"open");
{ if((b
->ufd
= fopen(buf
,"r")) != NULL
) b
->uwrt
= NO
;
else err(errflag
,errno
,buf
)
if((b
->ufd
= fopen(buf
, "a")) != NULL
)
{ if(freopen(buf
, "r", b
->ufd
) != NULL
)
else if((b
->ufd
= fopen(buf
, "r")) != NULL
)
else err(errflag
, errno
, buf
)
if((b
->uinode
=finode(b
->ufd
))==-1) err(errflag
,F_ERSTAT
,"open")
b
->ufnm
= (char *) calloc(strlen(buf
)+1,sizeof(char));
if(b
->ufnm
==NULL
) err(errflag
,F_ERSPACE
,"open")
b
->useek
= canseek(b
->ufd
);
if (lcase(*a
->oacc
)=='s' && a
->orl
> 0)
fputs("Warning: open: record length ignored on sequential access\n", units
[0].ufd
);
else if (a
->orl
< 0 || (lcase(*a
->oacc
)=='d' && a
->orl
== 0))
err(errflag
,F_ERARG
,"recl on open")
b
->ublnk
= (lcase(*a
->oblnk
)=='z');
else if (lunit
== STDERR
)
case 'p': /* print file *** NOT STANDARD FORTRAN ***/
err(errflag
,F_ERARG
,"open form=")
if(b
->url
&& b
->useek
) rewind(b
->ufd
);
fk_open(rd
,seq
,fmt
,n
) ftnint n
;
sprintf(nbuf
, fortfile
, (int)n
);
a
.oacc
= seq
==SEQ
?"s":"d";
a
.ofm
= fmt
==FMT
?"f":"u";
if(stat(s
, &x
) == -1) return(NO
);
if((j
= (x
.st_mode
&S_IFMT
)) == S_IFREG
|| j
== S_IFDIR
) return(NO
);
/*initialization routine*/
ini_std(STDERR
, stderr
, WRITE
);
ini_std(STDIN
, stdin
, READ
);
ini_std(STDOUT
, stdout
, WRITE
);
p
->uwrt
= (w
==WRITE
)? YES
: NO
;
p
->uscrtch
= p
->uend
= NO
;
canseek(f
) FILE *f
; /*SYSDEP*/
return( (fstat(fileno(f
),&x
)==0) &&
(x
.st_nlink
> 0 /*!pipe*/) && !isatty(fileno(f
)) );
if(fstat(fileno(f
),&x
)==0) return(x
.st_ino
);
if(stat(a
,&x
)==0) return(x
.st_ino
);