newlib-2.1.0

git-svn-id: svn://kolibrios.org@4921 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Sergey Semyonov (Serge)
2014-05-10 22:12:19 +00:00
parent 914e67bd24
commit 7315bb05c0
204 changed files with 10781 additions and 3986 deletions

View File

@@ -21,6 +21,7 @@
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <limits.h>
#include "local.h"
#include "fvwrite.h"
@@ -52,7 +53,7 @@ _DEFUN(__sfvwrite_r, (ptr, fp, uio),
register size_t len;
register _CONST char *p = NULL;
register struct __siov *iov;
register int w, s;
register _READ_WRITE_RETURN_TYPE w, s;
char *nl;
int nlknown, nldist;
@@ -89,12 +90,14 @@ _DEFUN(__sfvwrite_r, (ptr, fp, uio),
if (fp->_flags & __SNBF)
{
/*
* Unbuffered: write up to BUFSIZ bytes at a time.
* Unbuffered: Split buffer in the largest multiple of BUFSIZ < INT_MAX
* as some legacy code may expect int instead of size_t.
*/
do
{
GETIOV (;);
w = fp->_write (ptr, fp->_cookie, p, MIN (len, BUFSIZ));
w = fp->_write (ptr, fp->_cookie, p,
MIN (len, INT_MAX - INT_MAX % BUFSIZ));
if (w <= 0)
goto err;
p += w;
@@ -155,8 +158,10 @@ _DEFUN(__sfvwrite_r, (ptr, fp, uio),
newsize);
if (!str)
{
/* Free buffer which is no longer used. */
/* Free buffer which is no longer used and clear
__SMBF flag to avoid double free in fclose. */
_free_r (ptr, fp->_bf._base);
fp->_flags &= ~__SMBF;
/* Ensure correct errno, even if free changed it. */
ptr->_errno = ENOMEM;
goto err;
@@ -175,29 +180,23 @@ _DEFUN(__sfvwrite_r, (ptr, fp, uio),
fp->_p += w;
w = len; /* but pretend copied all */
}
else if (fp->_p > fp->_bf._base && len > w)
else if (fp->_p > fp->_bf._base || len < fp->_bf._size)
{
/* fill and flush */
/* pass through the buffer */
w = MIN (len, w);
COPY (w);
/* fp->_w -= w; *//* unneeded */
fp->_w -= w;
fp->_p += w;
if (_fflush_r (ptr, fp))
goto err;
}
else if (len >= (w = fp->_bf._size))
{
/* write directly */
w = fp->_write (ptr, fp->_cookie, p, w);
if (w <= 0)
if (fp->_w == 0 && _fflush_r (ptr, fp))
goto err;
}
else
{
/* fill and done */
w = len;
COPY (w);
fp->_w -= w;
fp->_p += w;
/* write directly */
w = ((int)MIN (len, INT_MAX)) / fp->_bf._size * fp->_bf._size;
w = fp->_write (ptr, fp->_cookie, p, w);
if (w <= 0)
goto err;
}
p += w;
len -= w;