Annotation of researchv10dc/libI77/open.c, revision 1.1

1.1     ! root        1: #include "sys/types.h"
        !             2: #include "sys/stat.h"
        !             3: #include "f2c.h"
        !             4: #include "fio.h"
        !             5: #include "string.h"
        !             6: #include "rawio.h"
        !             7: 
        !             8: #ifdef KR_headers
        !             9: extern char *malloc(), *mktemp();
        !            10: extern integer f_clos();
        !            11: #else
        !            12: #undef abs
        !            13: #undef min
        !            14: #undef max
        !            15: #include "stdlib.h"
        !            16: extern int f__canseek(FILE*);
        !            17: extern integer f_clos(cllist*);
        !            18: #endif
        !            19: 
        !            20: #ifdef NON_ANSI_RW_MODES
        !            21: char *f__r_mode[2] = {"r", "r"};
        !            22: char *f__w_mode[4] = {"w", "w", "r+w", "r+w"};
        !            23: #else
        !            24: char *f__r_mode[2] = {"rb", "r"};
        !            25: char *f__w_mode[4] = {"wb", "w", "r+b", "r+"};
        !            26: #endif
        !            27: 
        !            28: #ifdef KR_headers
        !            29: f__isdev(s) char *s;
        !            30: #else
        !            31: f__isdev(char *s)
        !            32: #endif
        !            33: {
        !            34: #ifdef NON_UNIX_STDIO
        !            35:        int i, j;
        !            36: 
        !            37:        i = open(s,O_RDONLY);
        !            38:        if (i == -1)
        !            39:                return 0;
        !            40:        j = isatty(i);
        !            41:        close(i);
        !            42:        return j;
        !            43: #else
        !            44:        struct stat x;
        !            45: 
        !            46:        if(stat(s, &x) == -1) return(0);
        !            47: #ifdef S_IFMT
        !            48:        switch(x.st_mode&S_IFMT) {
        !            49:                case S_IFREG:
        !            50:                case S_IFDIR:
        !            51:                        return(0);
        !            52:                }
        !            53: #else
        !            54: #ifdef S_ISREG
        !            55:        /* POSIX version */
        !            56:        if(S_ISREG(x.st_mode) || S_ISDIR(x.st_mode))
        !            57:                return(0);
        !            58:        else
        !            59: #else
        !            60:        Help! How does stat work on this system?
        !            61: #endif
        !            62: #endif
        !            63:                return(1);
        !            64: #endif
        !            65: }
        !            66: #ifdef KR_headers
        !            67: integer f_open(a) olist *a;
        !            68: #else
        !            69: integer f_open(olist *a)
        !            70: #endif
        !            71: {      unit *b;
        !            72:        int n;
        !            73:        integer rv;
        !            74:        char buf[256], *s;
        !            75:        cllist x;
        !            76: #ifdef NON_UNIX_STDIO
        !            77:        FILE *tf;
        !            78: #else
        !            79:        struct stat stb;
        !            80: #endif
        !            81:        if(a->ounit>=MXUNIT || a->ounit<0)
        !            82:                err(a->oerr,101,"open")
        !            83:        f__curunit = b = &f__units[a->ounit];
        !            84:        if(b->ufd) {
        !            85:                if(a->ofnm==0)
        !            86:                {
        !            87:                same:   if (a->oblnk)
        !            88:                                b->ublnk = *a->oblnk == 'z' || *a->oblnk == 'Z';
        !            89:                        return(0);
        !            90:                }
        !            91: #ifdef NON_UNIX_STDIO
        !            92:                if (b->ufnm
        !            93:                 && strlen(b->ufnm) == a->ofnmlen
        !            94:                 && !strncmp(b->ufnm, b->ufnm, (unsigned)a->ofnmlen))
        !            95:                        goto same;
        !            96: #else
        !            97:                g_char(a->ofnm,a->ofnmlen,buf);
        !            98:                if (f__inode(buf,&n) == b->uinode && n == b->udev)
        !            99:                        goto same;
        !           100: #endif
        !           101:                x.cunit=a->ounit;
        !           102:                x.csta=0;
        !           103:                x.cerr=a->oerr;
        !           104:                if ((rv = f_clos(&x)) != 0)
        !           105:                        return rv;
        !           106:                }
        !           107:        b->url = (int)a->orl;
        !           108:        b->ublnk = a->oblnk && (*a->oblnk == 'z' || *a->oblnk == 'Z');
        !           109:        if(a->ofm==0)
        !           110:        {       if(b->url>0) b->ufmt=0;
        !           111:                else b->ufmt=1;
        !           112:        }
        !           113:        else if(*a->ofm=='f' || *a->ofm == 'F') b->ufmt=1;
        !           114:        else b->ufmt=0;
        !           115: #ifdef url_Adjust
        !           116:        if (b->url && !b->ufmt)
        !           117:                url_Adjust(b->url);
        !           118: #endif
        !           119:        if (a->ofnm) {
        !           120:                g_char(a->ofnm,a->ofnmlen,buf);
        !           121:                if (!buf[0])
        !           122:                        err(a->oerr,107,"open")
        !           123:                }
        !           124:        else
        !           125:                sprintf(buf, "fort.%ld", a->ounit);
        !           126:        b->uscrtch = 0;
        !           127:        switch(a->osta ? *a->osta : 'u')
        !           128:        {
        !           129:        case 'o':
        !           130:        case 'O':
        !           131: #ifdef NON_UNIX_STDIO
        !           132:                if(access(buf,0))
        !           133: #else
        !           134:                if(stat(buf,&stb))
        !           135: #endif
        !           136:                        err(a->oerr,errno,"open")
        !           137:                break;
        !           138:         case 's':
        !           139:         case 'S':
        !           140:                b->uscrtch=1;
        !           141: #ifdef _POSIX_SOURCE
        !           142:                tmpnam(buf);
        !           143: #else
        !           144:                (void) strcpy(buf,"tmp.FXXXXXX");
        !           145:                (void) mktemp(buf);
        !           146: #endif
        !           147:                goto replace;
        !           148:        case 'n':
        !           149:        case 'N':
        !           150: #ifdef NON_UNIX_STDIO
        !           151:                if(!access(buf,0))
        !           152: #else
        !           153:                if(!stat(buf,&stb))
        !           154: #endif
        !           155:                        err(a->oerr,128,"open")
        !           156:                /* no break */
        !           157:        case 'r':       /* Fortran 90 replace option */
        !           158:        case 'R':
        !           159:  replace:
        !           160: #ifdef NON_UNIX_STDIO
        !           161:                if (tf = fopen(buf,f__w_mode[0]))
        !           162:                        fclose(tf);
        !           163: #else
        !           164:                (void) close(creat(buf, 0666));
        !           165: #endif
        !           166:        }
        !           167: 
        !           168:        b->ufnm=(char *) malloc((unsigned int)(strlen(buf)+1));
        !           169:        if(b->ufnm==NULL) err(a->oerr,113,"no space");
        !           170:        (void) strcpy(b->ufnm,buf);
        !           171:        b->uend=0;
        !           172:        b->uwrt = 0;
        !           173:        if(f__isdev(buf))
        !           174:        {       b->ufd = fopen(buf,f__r_mode[b->ufmt]);
        !           175:                if(b->ufd==NULL) err(a->oerr,errno,buf)
        !           176:        }
        !           177:        else {
        !           178:                if(!(b->ufd = fopen(buf, f__r_mode[b->ufmt]))) {
        !           179: #ifdef NON_UNIX_STDIO
        !           180:                        if (b->ufd = fopen(buf, f__w_mode[b->ufmt+2]))
        !           181:                                b->uwrt = 2;
        !           182:                        else if (b->ufd = fopen(buf, f__w_mode[b->ufmt]))
        !           183:                                b->uwrt = 1;
        !           184:                        else
        !           185: #else
        !           186:                        if ((n = open(buf,O_WRONLY)) >= 0)
        !           187:                                b->uwrt = 2;
        !           188:                        else {
        !           189:                                n = creat(buf, 0666);
        !           190:                                b->uwrt = 1;
        !           191:                                }
        !           192:                        if (n < 0
        !           193:                        || (b->ufd = fdopen(n, f__w_mode[b->ufmt])) == NULL)
        !           194: #endif
        !           195:                                err(a->oerr, errno, "open");
        !           196:                        }
        !           197:        }
        !           198:        b->useek=f__canseek(b->ufd);
        !           199: #ifndef NON_UNIX_STDIO
        !           200:        if((b->uinode=f__inode(buf,&b->udev))==-1)
        !           201:                err(a->oerr,108,"open")
        !           202: #endif
        !           203:        if(b->useek)
        !           204:                if (a->orl)
        !           205:                        rewind(b->ufd);
        !           206:                else if ((s = a->oacc) && (*s == 'a' || *s == 'A')
        !           207:                        && fseek(b->ufd, 0L, SEEK_END))
        !           208:                                err(a->oerr,129,"open");
        !           209:        return(0);
        !           210: }
        !           211: #ifdef KR_headers
        !           212: fk_open(seq,fmt,n) ftnint n;
        !           213: #else
        !           214: fk_open(int seq, int fmt, ftnint n)
        !           215: #endif
        !           216: {      char nbuf[10];
        !           217:        olist a;
        !           218:        (void) sprintf(nbuf,"fort.%ld",n);
        !           219:        a.oerr=1;
        !           220:        a.ounit=n;
        !           221:        a.ofnm=nbuf;
        !           222:        a.ofnmlen=strlen(nbuf);
        !           223:        a.osta=NULL;
        !           224:        a.oacc= seq==SEQ?"s":"d";
        !           225:        a.ofm = fmt==FMT?"f":"u";
        !           226:        a.orl = seq==DIR?1:0;
        !           227:        a.oblnk=NULL;
        !           228:        return(f_open(&a));
        !           229: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.