X-Git-Url: http://git.jankratochvil.net/?a=blobdiff_plain;f=lib%2Fmsvcrt%2Fstdio%2Fflsbuf.c;h=6d5ccb576445f0a7ad01f04e77e397526bdd2089;hb=e3ed2d773259cc445c7ff8181ebd934931365328;hp=4af1ee9e86b1804fa18f4e830b100acebd814f69;hpb=d378c68f5a9bb25c9e671dacd482d2e25d211df3;p=reactos.git diff --git a/lib/msvcrt/stdio/flsbuf.c b/lib/msvcrt/stdio/flsbuf.c index 4af1ee9..6d5ccb5 100644 --- a/lib/msvcrt/stdio/flsbuf.c +++ b/lib/msvcrt/stdio/flsbuf.c @@ -9,171 +9,148 @@ #include #include -int cntcr(char *bufp, int bufsiz); -int convert(char *endp, int bufsiz,int n); -int _writecnv(int fn, void *buf, size_t bufsiz); - -int -_flsbuf(int c, FILE *f) -{ - char *base; - int n, rn; - char c1; - int size; - +int cntcr(char* bufp, int bufsiz); +int convert(char* endp, int bufsiz, int n); +int _writecnv(int fn, void* buf, size_t bufsiz); - if (!OPEN4WRITING(f)) { - __set_errno (EINVAL); - return EOF; - } -// no file associated with buffer -// this is a memory stream - - if ( fileno(f) == -1 ) - return c; +int _flsbuf(int c, FILE* f) +{ + char* base; + int n, rn; + char c1; + int size; + + if (!OPEN4WRITING(f)) { + __set_errno(EINVAL); + return EOF; + } - /* if the buffer is not yet allocated, allocate it */ - if ((base = f->_base) == NULL && (f->_flag & _IONBF) == 0) - { - size = 4096; - if ((f->_base = base = malloc (size)) == NULL) - { - f->_flag |= _IONBF; - f->_flag &= ~(_IOFBF|_IOLBF); + // no file associated with buffer, this is a memory stream + if (fileno(f) == -1) { + return c; } - else - { - f->_flag |= _IOMYBUF; - f->_cnt = f->_bufsiz = size; - f->_ptr = base; - rn = 0; - if (f == stdout && isatty (fileno (stdout))) - f->_flag |= _IOLBF; + + /* if the buffer is not yet allocated, allocate it */ + if ((base = f->_base) == NULL && (f->_flag & _IONBF) == 0) { + size = 4096; + if ((f->_base = base = malloc(size)) == NULL) { + f->_flag |= _IONBF; + f->_flag &= ~(_IOFBF|_IOLBF); + } else { + f->_flag |= _IOMYBUF; + f->_cnt = f->_bufsiz = size; + f->_ptr = base; + rn = 0; + if (f == stdout && isatty(fileno(stdout))) { + f->_flag |= _IOLBF; + } + } } - } - if (f->_flag & _IOLBF) - { - /* in line-buffering mode we get here on each character */ - *f->_ptr++ = c; - rn = f->_ptr - base; - if (c == '\n' || rn >= f->_bufsiz) - { - /* time for real flush */ - f->_ptr = base; - f->_cnt = 0; + if (f->_flag & _IOLBF) { + /* in line-buffering mode we get here on each character */ + *f->_ptr++ = c; + rn = f->_ptr - base; + if (c == '\n' || rn >= f->_bufsiz) { + /* time for real flush */ + f->_ptr = base; + f->_cnt = 0; + } else { + /* we got here because _cnt is wrong, so fix it */ + /* Negative _cnt causes all output functions to call */ + /* _flsbuf for each character, thus realizing line-buffering */ + f->_cnt = -rn; + return c; + } + } else if (f->_flag & _IONBF) { + c1 = c; + rn = 1; + base = &c1; + f->_cnt = 0; + } else { /* _IOFBF */ + rn = f->_ptr - base; + f->_ptr = base; + if ((f->_flag & _IOAHEAD) == _IOAHEAD) + _lseek(fileno(f), -(rn+f->_cnt), SEEK_CUR); + f->_cnt = f->_bufsiz; + f->_flag &= ~_IOAHEAD; } - else - { - /* we got here because _cnt is wrong, so fix it */ - /* Negative _cnt causes all output functions - to call _flsbuf for each character, thus realizing line-buffering */ - f->_cnt = -rn; - return c; + f->_flag &= ~_IODIRTY; + while (rn > 0) { + n = _write(fileno(f), base, rn); + if (n <= 0) { + f->_flag |= _IOERR; + return EOF; + } + rn -= n; + base += n; } - } - else if (f->_flag & _IONBF) - { - c1 = c; - rn = 1; - base = &c1; - f->_cnt = 0; - } - else /* _IOFBF */ - { - rn = f->_ptr - base; - f->_ptr = base; - if ( (f->_flag & _IOAHEAD) == _IOAHEAD ) - _lseek(fileno(f),-(rn+f->_cnt), SEEK_CUR); - f->_cnt = f->_bufsiz; - f->_flag &= ~_IOAHEAD; - } - - - - f->_flag &= ~_IODIRTY; - while (rn > 0) - { - n = _write(fileno(f), base, rn); - if (n <= 0) - { - f->_flag |= _IOERR; - return EOF; + if ((f->_flag & (_IOLBF|_IONBF)) == 0) { + f->_cnt--; + *f->_ptr++ = c; } - rn -= n; - base += n; - } - - - if ((f->_flag&(_IOLBF|_IONBF)) == 0) - { - f->_cnt--; - *f->_ptr++ = c; - } - return c; + return c; } -wint_t _flswbuf(wchar_t c,FILE *fp) +wint_t _flswbuf(wchar_t c, FILE* fp) { - return (wint_t )_flsbuf((int)c,fp); -} + int result; + result = _flsbuf((int)c, fp); + if (result == EOF) + return WEOF; + return (wint_t)result; +} -int _writecnv(int fn, void *buf, size_t siz) +int _writecnv(int fn, void* buf, size_t siz) { - char *bufp = (char *)buf; - int bufsiz = siz; - - char *tmp; - int cr1 = 0; - int cr2 = 0; - - int n; - - - cr1 = cntcr(bufp,bufsiz); - - tmp = malloc(cr1); - memcpy(tmp,bufp+bufsiz-cr1,cr1); - cr2 = cntcr(tmp,cr1); - - convert(bufp,bufsiz-cr2,cr1-cr2); - n = _write(fn, bufp, bufsiz + cr1); - - convert(tmp,cr1,cr2); - n += _write(fn, tmp, cr1 + cr2); - free(tmp); - return n; - - + char* bufp = (char*)buf; + int bufsiz = siz; + char* tmp; + int cr1 = 0; + int cr2 = 0; + int n; + + cr1 = cntcr(bufp, bufsiz); + tmp = malloc(cr1); + memcpy(tmp, bufp + bufsiz - cr1, cr1); + cr2 = cntcr(tmp, cr1); + convert(bufp, bufsiz - cr2, cr1 - cr2); + n = _write(fn, bufp, bufsiz + cr1); + convert(tmp, cr1, cr2); + n += _write(fn, tmp, cr1 + cr2); + free(tmp); + return n; } -int convert(char *endp, int bufsiz,int n) -{ - endp = endp + bufsiz + n; - while (bufsiz > 0) { - *endp = *(endp - n); - if (*endp == '\n') { - *endp--; - n--; - *endp = '\r'; - } - endp--; - bufsiz--; - } - return n; +int convert(char* endp, int bufsiz, int n) +{ + endp = endp + bufsiz + n; + while (bufsiz > 0) { + *endp = *(endp - n); + if (*endp == '\n') { + *endp--; + n--; + *endp = '\r'; + } + endp--; + bufsiz--; + } + return n; } -int cntcr(char *bufp, int bufsiz) -{ - int cr = 0; - while (bufsiz > 0) { - if (*bufp == '\n') - cr++; - bufp++; - bufsiz--; - } - return cr; +int cntcr(char* bufp, int bufsiz) +{ + int cr = 0; + + while (bufsiz > 0) { + if (*bufp == '\n') { + cr++; + } + bufp++; + bufsiz--; + } + return cr; }