Annotation of 43BSD/contrib/icon/functions/open.c, revision 1.1

1.1     ! root        1: #include "../h/rt.h"
        !             2: 
        !             3: /*
        !             4:  * open(s1,s2) - open file s1 with specification s2.
        !             5:  */
        !             6: Xopen(nargs, arg2, arg1, arg0)
        !             7: int nargs;
        !             8: struct descrip arg2, arg1, arg0;
        !             9:    {
        !            10:    register int slen, i;
        !            11:    register char *s;
        !            12:    int status;
        !            13:    char sbuf1[MAXSTRING], sbuf2[MAXSTRING], mode[3];
        !            14:    FILE *f;
        !            15:    extern struct b_file *alcfile();
        !            16:    extern char *alcstr();
        !            17:    extern FILE *fopen(), *popen();
        !            18: 
        !            19:    /*
        !            20:     * s1 must be a string and a C string copy of it is also needed.
        !            21:     *  Make it a string if it isn't one; make a C string if s1 is
        !            22:     *  a string.
        !            23:     */
        !            24:    switch (cvstr(&arg1, sbuf1)) {
        !            25:       case 1:
        !            26:          sneed(STRLEN(arg1));
        !            27:          STRLOC(arg1) = alcstr(STRLOC(arg1), STRLEN(arg1));
        !            28:          break;
        !            29:       case 2:
        !            30:          qtos(&arg1, sbuf1);
        !            31:          break;
        !            32:       default:
        !            33:          runerr(103, &arg1);
        !            34:       }
        !            35:    /*
        !            36:     * s2 defaults to "r".
        !            37:     */
        !            38:    defstr(&arg2, sbuf2, &letr);
        !            39: 
        !            40:    hneed(sizeof(struct b_file));
        !            41:    status = 0;
        !            42: 
        !            43:    /*
        !            44:     * Scan s2, setting appropriate bits in status.  Produce a runerr
        !            45:     *  if an unknown character is encountered.
        !            46:     */
        !            47:    s = STRLOC(arg2);
        !            48:    slen = STRLEN(arg2);
        !            49:    for (i = 0; i < slen; i++) {
        !            50:       switch (*s++) {
        !            51:          case 'a': case 'A':
        !            52:             status |= FS_WRITE|FS_APPEND;
        !            53:             continue;
        !            54:          case 'b': case 'B':
        !            55:             status |= FS_READ|FS_WRITE;
        !            56:             continue;
        !            57:          case 'c': case 'C':
        !            58:             status |= FS_CREATE|FS_WRITE;
        !            59:             continue;
        !            60:          case 'p': case 'P':
        !            61:             status |= FS_PIPE;
        !            62:             continue;
        !            63:          case 'r': case 'R':
        !            64:             status |= FS_READ;
        !            65:             continue;
        !            66:          case 'w': case 'W':
        !            67:             status |= FS_WRITE;
        !            68:             continue;
        !            69:          default:
        !            70:             runerr(209, &arg2);
        !            71:          }
        !            72:       }
        !            73: 
        !            74:    /*
        !            75:     * Construct a mode field for fopen/popen.
        !            76:     */
        !            77:    mode[0] = '\0';
        !            78:    mode[1] = '\0';
        !            79:    mode[2] = '\0';
        !            80:    if ((status & (FS_READ|FS_WRITE)) == 0)   /* default: read only */
        !            81:       status |= FS_READ;
        !            82:    if (status & FS_CREATE)
        !            83:       mode[0] = 'w';
        !            84:    else if (status & FS_APPEND)
        !            85:       mode[0] = 'a';
        !            86:    else if (status & FS_READ)
        !            87:       mode[0] = 'r';
        !            88:    else
        !            89:       mode[0] = 'w';
        !            90:    if ((status & (FS_READ|FS_WRITE)) == (FS_READ|FS_WRITE))
        !            91:       mode[1] = '+';
        !            92: 
        !            93:    /*
        !            94:     * Open the file with fopen or popen.
        !            95:     */
        !            96:    if (status & FS_PIPE) {
        !            97:       if (status != (FS_READ|FS_PIPE) && status != (FS_WRITE|FS_PIPE))
        !            98:          runerr(209, &arg2);
        !            99:       f = popen(sbuf1, mode);
        !           100:       }
        !           101:    else
        !           102:       f = fopen(sbuf1, mode);
        !           103:    /*
        !           104:     * Fail if the file can't be opened.
        !           105:     */
        !           106:    if (f == NULL)
        !           107:       fail();
        !           108:    /*
        !           109:     * If the file isn't a terminal and a buffer is available, assign
        !           110:     *  it to the file.
        !           111:     */
        !           112:    if (!isatty(fileno(f))) {
        !           113:       for (i = 0; i < numbufs; i++)
        !           114:          if (bufused[i] == NULL)
        !           115:             break;
        !           116:       if (i < numbufs) {              /* Use buffer if any free. */
        !           117:          setbuf(f, bufs[i]);
        !           118:          bufused[i] = f;
        !           119:          }
        !           120:       else
        !           121:          setbuf(f, NULL);
        !           122:       }
        !           123:    else
        !           124:       setbuf(f, NULL);
        !           125:    /*
        !           126:     * Return the resulting file value.
        !           127:     */
        !           128:    arg0.type = D_FILE;
        !           129:    BLKLOC(arg0) = (union block *) alcfile(f, status, &arg1);
        !           130:    }
        !           131: 
        !           132: Procblock(open,2)

unix.superglobalmegacorp.com

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