12498Sdlw /* 2*12008Sdlw char id_open[] = "@(#)open.c 1.6"; 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 */ 19*12008Sdlw short ccntrl_; /* recognize carriage control */ 20*12008Sdlw 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 6911907Sdlw { if(!opnbof_ && (b->ufd = fopen(buf, "a")) != NULL) 7011907Sdlw b->uwrt = YES; 712498Sdlw else if((b->ufd = fopen(buf, "r")) != NULL) 7211907Sdlw { if (!opnbof_) 7311907Sdlw fseek(b->ufd, 0L, 2); 742498Sdlw b->uwrt = NO; 752498Sdlw } 762498Sdlw else err(errflag, errno, buf) 772498Sdlw } 782597Sdlw if((b->uinode=finode(b->ufd))==-1) err(errflag,F_ERSTAT,"open") 792498Sdlw b->ufnm = (char *) calloc(strlen(buf)+1,sizeof(char)); 802597Sdlw if(b->ufnm==NULL) err(errflag,F_ERSPACE,"open") 812498Sdlw strcpy(b->ufnm,buf); 822498Sdlw b->uscrtch = SCRATCH; 832498Sdlw b->uend = NO; 842498Sdlw b->useek = canseek(b->ufd); 858943Sdlw if (a->oacc == NULL) 868943Sdlw a->oacc = "seq"; 878943Sdlw if (lcase(*a->oacc)=='s' && a->orl > 0) 888943Sdlw { 896604Sdlw fputs("Warning: open: record length ignored on sequential access\n", units[0].ufd); 908943Sdlw b->url = 0; 918943Sdlw } 928943Sdlw else if (a->orl < 0 || (lcase(*a->oacc)=='d' && a->orl == 0)) 936604Sdlw err(errflag,F_ERARG,"recl on open") 946604Sdlw else 956604Sdlw b->url = a->orl; 96*12008Sdlw if (a->oblnk) 97*12008Sdlw b->ublnk = (lcase(*a->oblnk)=='z'); 98*12008Sdlw else if (lunit == STDERR) 99*12008Sdlw b->ublnk = NO; 100*12008Sdlw else 101*12008Sdlw b->ublnk = blzero_; 1022498Sdlw if (a->ofm) 1032498Sdlw { 1042498Sdlw switch(lcase(*a->ofm)) 1052498Sdlw { 1062498Sdlw case 'f': 1072498Sdlw b->ufmt = YES; 1082498Sdlw b->uprnt = NO; 1092498Sdlw break; 1102498Sdlw #ifndef KOSHER 1112498Sdlw case 'p': /* print file *** NOT STANDARD FORTRAN ***/ 1122498Sdlw b->ufmt = YES; 1132498Sdlw b->uprnt = YES; 1142498Sdlw break; 1152498Sdlw #endif 1162498Sdlw case 'u': 1172498Sdlw b->ufmt = NO; 1182498Sdlw b->uprnt = NO; 1192498Sdlw break; 1202498Sdlw default: 1212597Sdlw err(errflag,F_ERARG,"open form=") 1222498Sdlw } 1232498Sdlw } 1242498Sdlw else /* not specified */ 1252498Sdlw { b->ufmt = (b->url==0); 126*12008Sdlw if (lunit == STDERR) 127*12008Sdlw b->uprnt = NO; 128*12008Sdlw else 129*12008Sdlw b->uprnt = ccntrl_; 1302498Sdlw } 1312498Sdlw if(b->url && b->useek) rewind(b->ufd); 1322498Sdlw return(OK); 1332498Sdlw } 1342498Sdlw 1352498Sdlw fk_open(rd,seq,fmt,n) ftnint n; 1362498Sdlw { char nbuf[10]; 1372498Sdlw olist a; 1382498Sdlw sprintf(nbuf, fortfile, (int)n); 1392498Sdlw a.oerr=errflag; 1402498Sdlw a.ounit=n; 1412498Sdlw a.ofnm=nbuf; 1422498Sdlw a.ofnmlen=strlen(nbuf); 1432498Sdlw a.osta=NULL; 1442498Sdlw a.oacc= seq==SEQ?"s":"d"; 1452498Sdlw a.ofm = fmt==FMT?"f":"u"; 1462498Sdlw a.orl = seq==DIR?1:0; 1472498Sdlw a.oblnk=NULL; 1482498Sdlw return(f_open(&a)); 1492498Sdlw } 1502498Sdlw 1512498Sdlw isdev(s) char *s; 1522498Sdlw { struct stat x; 1532498Sdlw int j; 1542498Sdlw if(stat(s, &x) == -1) return(NO); 1552498Sdlw if((j = (x.st_mode&S_IFMT)) == S_IFREG || j == S_IFDIR) return(NO); 1562498Sdlw else return(YES); 1572498Sdlw } 1582498Sdlw 159