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

1.1     ! root        1: #include "../h/rt.h"
        !             2: 
        !             3: /*
        !             4:  * write(a,b,...) - write arguments.
        !             5:  */
        !             6: 
        !             7: Xwrite(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:           * If this isn't the first argument, output a newline to the current
        !            29:           *  file and flush it.
        !            30:           */
        !            31:          if (n > 1) {
        !            32:             putc('\n', f);
        !            33:             fflush(f);
        !            34:             }
        !            35:          /*
        !            36:           * Switch the current file to the file named by the current argument
        !            37:           *  providing it is a file.  arg is made to be a empty string to
        !            38:           *  avoid a special case.
        !            39:           */
        !            40:          if ((BLKLOC(arg)->file.status & FS_WRITE) == 0)
        !            41:             runerr(213, &arg);
        !            42:          f = BLKLOC(arg)->file.fd;
        !            43:          arg = nullstr;
        !            44:          }
        !            45:       else {   /* Current argument is a string */
        !            46:          /*
        !            47:           * On first argument, check to be sure that &output is open
        !            48:           *  for output.
        !            49:           */
        !            50:          if (n == 1 && (k_output.status & FS_WRITE) == 0)
        !            51:             runerr(213, NULL);
        !            52:          /*
        !            53:           * Convert the argument to a string, defaulting to a empty string.
        !            54:           */
        !            55:          defany(&arg, &nullstr);
        !            56:          if (cvstr(&arg, sbuf) == NULL)
        !            57:             runerr(109, &arg);
        !            58:          /*
        !            59:           * Output the string.
        !            60:           */
        !            61:          putstr(f, STRLOC(arg), STRLEN(arg));
        !            62:          }
        !            63:       }
        !            64:    /*
        !            65:     * Append a newline to the file and flush it.
        !            66:     */
        !            67:    putc('\n', f);
        !            68:    fflush(f);
        !            69:    /*
        !            70:     * If the beginning of the last string output lies in sbuf,
        !            71:     *  allocate it as a real string.  Note that some of the string
        !            72:     *  conversions don't always leave the converted string at the
        !            73:     *  start of the conversion buffer, hence the range check.
        !            74:     */
        !            75:    if (STRLOC(arg) >= sbuf && STRLOC(arg) < sbuf + MAXSTRING) {
        !            76:       sneed(STRLEN(arg));
        !            77:       STRLOC(arg) = alcstr(STRLOC(arg), STRLEN(arg));
        !            78:       }
        !            79:    /*
        !            80:     * Return the string corresponding to the last argument.
        !            81:     */
        !            82:    ARG(0) = arg;
        !            83:    }
        !            84: 
        !            85: Procblock(write,-1)

unix.superglobalmegacorp.com

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