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

1.1     ! root        1: #include "../h/rt.h"
        !             2: 
        !             3: /*
        !             4:  * writes(a,b,...) - write arguments without newline terminator.
        !             5:  */
        !             6: 
        !             7: Xwrites(nargs)
        !             8: int nargs;
        !             9:    {
        !            10:    register int n;
        !            11:    char sbuf[MAXSTRING];
        !            12:    struct descrip arg;
        !            13:    FILE *f;
        !            14:    extern char *alcstr();
        !            15: 
        !            16:    f = stdout;
        !            17:    arg = nullstr;
        !            18: 
        !            19:    /*
        !            20:     * Loop through the arguments, dereferencing each in turn.
        !            21:     */
        !            22:    for (n = 1; n <= nargs; n++) {
        !            23:       arg = ARG(n);
        !            24:       DeRef(arg)
        !            25: 
        !            26:       if (!QUAL(arg) && TYPE(arg) == T_FILE) {/* Current argument is a file */
        !            27:          /*
        !            28:           * Switch the current file to the file named by the current argument
        !            29:           *  providing it is a file.  arg is made to be a empty string to
        !            30:           *  avoid a special case.
        !            31:           */
        !            32:          if ((BLKLOC(arg)->file.status & FS_WRITE) == 0)
        !            33:             runerr(213, &arg);
        !            34:          f = BLKLOC(arg)->file.fd;
        !            35:          arg = nullstr;
        !            36:          }
        !            37:       else {   /* Current argument is a string */
        !            38:          /*
        !            39:           * On first argument, check to be sure that &output is open
        !            40:           *  for output.
        !            41:           */
        !            42:          if (n == 1 && (k_output.status & FS_WRITE) == 0)
        !            43:             runerr(213, NULL);
        !            44:          /*
        !            45:           * Convert the argument to a string, defaulting to a empty string.
        !            46:           */
        !            47:          defany(&arg, &nullstr);
        !            48:          if (cvstr(&arg, sbuf) == NULL)
        !            49:             runerr(109, &arg);
        !            50:          /*
        !            51:           * Output the string and flush the file.
        !            52:           */
        !            53:          putstr(f, STRLOC(arg), STRLEN(arg));
        !            54:          fflush(f);
        !            55:          }
        !            56:       }
        !            57:    /*
        !            58:     * If the beginning of the last string output lies in sbuf,
        !            59:     *  allocate it as a real string.  Note that some of the string
        !            60:     *  conversions don't always leave the converted string at the
        !            61:     *  start of the conversion buffer, hence the range check.
        !            62:     */
        !            63:    if (STRLOC(arg) >= sbuf && STRLOC(arg) < sbuf + MAXSTRING) {
        !            64:       sneed(STRLEN(arg));
        !            65:       STRLOC(arg) = alcstr(STRLOC(arg), STRLEN(arg));
        !            66:       }
        !            67:    /*
        !            68:     * Return the string corresponding to the last argument.
        !            69:     */
        !            70:    ARG(0) = arg;
        !            71:    }
        !            72: 
        !            73: Procblock(writes,-1)

unix.superglobalmegacorp.com

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