xref: /csrg-svn/usr.bin/f77/libI77/open.c (revision 12010)
12498Sdlw /*
2*12010Sdlw char id_open[] = "@(#)open.c	1.7";
32498Sdlw  *
42498Sdlw  * open.c  -  f77 file open routines
52498Sdlw  */
62498Sdlw 
72498Sdlw #include	<sys/types.h>
82498Sdlw #include	<sys/stat.h>
92498Sdlw #include	<errno.h>
102498Sdlw #include	"fio.h"
112498Sdlw 
122498Sdlw #define SCRATCH	(st=='s')
132498Sdlw #define NEW	(st=='n')
142498Sdlw #define OLD	(st=='o')
152498Sdlw #define OPEN	(b->ufd)
162498Sdlw #define FROM_OPEN	"\1"	/* for use in f_clos() */
172498Sdlw 
1811907Sdlw short	opnbof_;		/* open at beginning of file */
1912008Sdlw short	ccntrl_;		/* recognize carriage control */
2012008Sdlw short	blzero_;		/* blanks count as zero */
212498Sdlw extern char *tmplate;
222498Sdlw extern char *fortfile;
232498Sdlw 
242498Sdlw f_open(a) olist *a;
252498Sdlw {	unit *b;
262498Sdlw 	int n,exists;
272498Sdlw 	char buf[256],st;
282498Sdlw 	cllist x;
292498Sdlw 
302498Sdlw 	lfname = NULL;
312498Sdlw 	elist = NO;
322498Sdlw 	external = YES;			/* for err */
332498Sdlw 	errflag = a->oerr;
342498Sdlw 	lunit = a->ounit;
352597Sdlw 	if(not_legal(lunit)) err(errflag,F_ERUNIT,"open")
362498Sdlw 	b= &units[lunit];
372498Sdlw 	if(a->osta) st = lcase(*a->osta);
382498Sdlw 	else st = 'u';
392498Sdlw 	if(SCRATCH)
402498Sdlw 	{	strcpy(buf,tmplate);
412498Sdlw 		mktemp(buf);
422498Sdlw 	}
432498Sdlw 	else if(a->ofnm) g_char(a->ofnm,a->ofnmlen,buf);
442498Sdlw 	else sprintf(buf,fortfile,lunit);
452498Sdlw 	lfname = &buf[0];
462498Sdlw 	if(OPEN)
472498Sdlw 	{
482498Sdlw 		if(!a->ofnm || inode(buf)==b->uinode)
492498Sdlw 		{
502498Sdlw 			if(a->oblnk) b->ublnk= (lcase(*a->oblnk)== 'z');
512498Sdlw #ifndef KOSHER
522498Sdlw 			if(a->ofm && b->ufmt) b->uprnt = (lcase(*a->ofm)== 'p');
532498Sdlw #endif
542498Sdlw 			return(OK);
552498Sdlw 		}
562498Sdlw 		x.cunit=lunit;
572498Sdlw 		x.csta=FROM_OPEN;
582498Sdlw 		x.cerr=errflag;
592498Sdlw 		if(n=f_clos(&x)) return(n);
602498Sdlw 	}
612498Sdlw 	exists = (access(buf,0)==NULL);
622597Sdlw 	if(!exists && OLD) err(errflag,F_EROLDF,"open");
632597Sdlw 	if( exists && NEW) err(errflag,F_ERNEWF,"open");
642498Sdlw 	if(isdev(buf))
652498Sdlw 	{	if((b->ufd = fopen(buf,"r")) != NULL) b->uwrt = NO;
662498Sdlw 		else	err(errflag,errno,buf)
672498Sdlw 	}
682498Sdlw 	else
69*12010Sdlw 	{	if((b->ufd = fopen(buf, "a")) != NULL)
70*12010Sdlw 		{	if(opnbof_)
71*12010Sdlw 			{	if(freopen(buf, "r", b->ufd) != NULL)
72*12010Sdlw 					b->uwrt = NO;
73*12010Sdlw 				else
74*12010Sdlw 					err(errflag, errno, buf)
75*12010Sdlw 			}
76*12010Sdlw 			else
77*12010Sdlw 				b->uwrt = YES;
78*12010Sdlw 		}
792498Sdlw 		else if((b->ufd = fopen(buf, "r")) != NULL)
8011907Sdlw 		{	if (!opnbof_)
8111907Sdlw 				fseek(b->ufd, 0L, 2);
822498Sdlw 			b->uwrt = NO;
832498Sdlw 		}
842498Sdlw 		else	err(errflag, errno, buf)
852498Sdlw 	}
862597Sdlw 	if((b->uinode=finode(b->ufd))==-1) err(errflag,F_ERSTAT,"open")
872498Sdlw 	b->ufnm = (char *) calloc(strlen(buf)+1,sizeof(char));
882597Sdlw 	if(b->ufnm==NULL) err(errflag,F_ERSPACE,"open")
892498Sdlw 	strcpy(b->ufnm,buf);
902498Sdlw 	b->uscrtch = SCRATCH;
912498Sdlw 	b->uend = NO;
922498Sdlw 	b->useek = canseek(b->ufd);
938943Sdlw 	if (a->oacc == NULL)
948943Sdlw 		a->oacc = "seq";
958943Sdlw 	if (lcase(*a->oacc)=='s' && a->orl > 0)
968943Sdlw 	{
976604Sdlw 		fputs("Warning: open: record length ignored on sequential access\n", units[0].ufd);
988943Sdlw 		b->url = 0;
998943Sdlw 	}
1008943Sdlw 	else if (a->orl < 0 || (lcase(*a->oacc)=='d' && a->orl == 0))
1016604Sdlw 		err(errflag,F_ERARG,"recl on open")
1026604Sdlw 	else
1036604Sdlw 		b->url = a->orl;
10412008Sdlw 	if (a->oblnk)
10512008Sdlw 		b->ublnk = (lcase(*a->oblnk)=='z');
10612008Sdlw 	else if (lunit == STDERR)
10712008Sdlw 		b->ublnk = NO;
10812008Sdlw 	else
10912008Sdlw 		b->ublnk = blzero_;
1102498Sdlw 	if (a->ofm)
1112498Sdlw 	{
1122498Sdlw 		switch(lcase(*a->ofm))
1132498Sdlw 		{
1142498Sdlw 		case 'f':
1152498Sdlw 			b->ufmt = YES;
1162498Sdlw 			b->uprnt = NO;
1172498Sdlw 			break;
1182498Sdlw #ifndef KOSHER
1192498Sdlw 		case 'p':	/* print file *** NOT STANDARD FORTRAN ***/
1202498Sdlw 			b->ufmt = YES;
1212498Sdlw 			b->uprnt = YES;
1222498Sdlw 			break;
1232498Sdlw #endif
1242498Sdlw 		case 'u':
1252498Sdlw 			b->ufmt = NO;
1262498Sdlw 			b->uprnt = NO;
1272498Sdlw 			break;
1282498Sdlw 		default:
1292597Sdlw 			err(errflag,F_ERARG,"open form=")
1302498Sdlw 		}
1312498Sdlw 	}
1322498Sdlw 	else	/* not specified */
1332498Sdlw 	{	b->ufmt = (b->url==0);
13412008Sdlw 		if (lunit == STDERR)
13512008Sdlw 			b->uprnt = NO;
13612008Sdlw 		else
13712008Sdlw 			b->uprnt = ccntrl_;
1382498Sdlw 	}
1392498Sdlw 	if(b->url && b->useek) rewind(b->ufd);
1402498Sdlw 	return(OK);
1412498Sdlw }
1422498Sdlw 
1432498Sdlw fk_open(rd,seq,fmt,n) ftnint n;
1442498Sdlw {	char nbuf[10];
1452498Sdlw 	olist a;
1462498Sdlw 	sprintf(nbuf, fortfile, (int)n);
1472498Sdlw 	a.oerr=errflag;
1482498Sdlw 	a.ounit=n;
1492498Sdlw 	a.ofnm=nbuf;
1502498Sdlw 	a.ofnmlen=strlen(nbuf);
1512498Sdlw 	a.osta=NULL;
1522498Sdlw 	a.oacc= seq==SEQ?"s":"d";
1532498Sdlw 	a.ofm = fmt==FMT?"f":"u";
1542498Sdlw 	a.orl = seq==DIR?1:0;
1552498Sdlw 	a.oblnk=NULL;
1562498Sdlw 	return(f_open(&a));
1572498Sdlw }
1582498Sdlw 
1592498Sdlw isdev(s) char *s;
1602498Sdlw {	struct stat x;
1612498Sdlw 	int j;
1622498Sdlw 	if(stat(s, &x) == -1) return(NO);
1632498Sdlw 	if((j = (x.st_mode&S_IFMT)) == S_IFREG || j == S_IFDIR) return(NO);
1642498Sdlw 	else	return(YES);
1652498Sdlw }
1662498Sdlw 
167