Annotation of researchv10dc/libI77/notused/fwrite.c, revision 1.1

1.1     ! root        1: /*     @(#)fwrite.c    3.6     */
        !             2: /*LINTLIBRARY*/
        !             3: /*
        !             4:  * This version writes directly to the buffer rather than looping on putc.
        !             5:  * Ptr args aren't checked for NULL because the program would be a
        !             6:  * catastrophic mess anyway.  Better to abort than just to return NULL.
        !             7:  *
        !             8:  * This version does buffered writes larger than BUFSIZ directly, when
        !             9:  * the buffer is empty.
        !            10:  */
        !            11: #include <stdio.h>
        !            12: #include "stdiom.h"
        !            13: 
        !            14: #define MIN(x, y)       (x < y ? x : y)
        !            15: 
        !            16: extern char *memcpy();
        !            17: 
        !            18: int
        !            19: fwrite(ptr, size, count, iop)
        !            20: char *ptr;
        !            21: int size, count;
        !            22: register FILE *iop;
        !            23: {
        !            24:        register unsigned nleft;
        !            25:        register int n;
        !            26:        register unsigned char *cptr, *bufend;
        !            27: 
        !            28:        if (size <= 0 || count <= 0 || _WRTCHK(iop))
        !            29:                return (0);
        !            30: 
        !            31:        bufend = _bufend(iop);
        !            32:        nleft = count*size;
        !            33: 
        !            34:        /* if the file is unbuffered, or if the iop->ptr = iop->base, and there
        !            35:           is > BUFSZ chars to write, we can do a direct write */
        !            36:        if (iop->_base >= iop->_ptr)  { /*this covers the unbuffered case, too*/
        !            37:                if (((iop->_flag & _IONBF) != 0) || (nleft >= BUFSIZ))  {
        !            38:                        if ((n=write(fileno(iop),ptr,nleft)) != nleft)
        !            39:                            {
        !            40:                                iop->_flag |= _IOERR;
        !            41:                                n = (n >= 0) ? n : 0;
        !            42:                        }
        !            43:                        return n/size;
        !            44:                }
        !            45:        }
        !            46:        /* Put characters in the buffer */
        !            47:        /* note that the meaning of n when just starting this loop is
        !            48:           irrelevant.  It is defined in the loop */
        !            49:        for (; ; ptr += n) {
        !            50:                while ((n = bufend - (cptr = iop->_ptr)) <= 0)  /* full buf */
        !            51:                        if (_xflsbuf(iop) == EOF)
        !            52:                                return (count - (nleft + size - 1)/size);
        !            53:                n = MIN(nleft, n);
        !            54:                (void) memcpy((char *) cptr, ptr, n);
        !            55:                iop->_cnt -= n;
        !            56:                iop->_ptr += n;
        !            57:                _BUFSYNC(iop);
        !            58:                /* done; flush if linebuffered with a newline */
        !            59:                if ((nleft -= n) == 0)  { 
        !            60:                        if (iop->_flag & (_IOLBF | _IONBF)) {
        !            61:                                if ((iop->_flag & _IONBF) || (memchr(iop->_base,
        !            62:                                        '\n',count * size) != NULL))  {
        !            63:                                        (void) _xflsbuf(iop);
        !            64:                                }
        !            65:                        }
        !            66:                        return (count);
        !            67:                }
        !            68:        }
        !            69: }

unix.superglobalmegacorp.com

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