Subversion Repositories Kolibri OS

Rev

Rev 4874 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4874 Rev 4921
Line 19... Line 19...
19
#include <_ansi.h>
19
#include <_ansi.h>
20
#include 
20
#include 
21
#include 
21
#include 
22
#include 
22
#include 
23
#include 
23
#include 
-
 
24
#include 
24
#include "local.h"
25
#include "local.h"
25
#include "fvwrite.h"
26
#include "fvwrite.h"
Line 26... Line 27...
26
 
27
 
27
#define	MIN(a, b) ((a) < (b) ? (a) : (b))
28
#define	MIN(a, b) ((a) < (b) ? (a) : (b))
Line 50... Line 51...
50
       register struct __suio *uio)
51
       register struct __suio *uio)
51
{
52
{
52
  register size_t len;
53
  register size_t len;
53
  register _CONST char *p = NULL;
54
  register _CONST char *p = NULL;
54
  register struct __siov *iov;
55
  register struct __siov *iov;
55
  register int w, s;
56
  register _READ_WRITE_RETURN_TYPE w, s;
56
  char *nl;
57
  char *nl;
57
  int nlknown, nldist;
58
  int nlknown, nldist;
Line 58... Line 59...
58
 
59
 
59
  if ((len = uio->uio_resid) == 0)
60
  if ((len = uio->uio_resid) == 0)
Line 87... Line 88...
87
#endif
88
#endif
Line 88... Line 89...
88
 
89
 
89
  if (fp->_flags & __SNBF)
90
  if (fp->_flags & __SNBF)
90
    {
91
    {
91
      /*
92
      /*
-
 
93
       * Unbuffered: Split buffer in the largest multiple of BUFSIZ < INT_MAX
92
       * Unbuffered: write up to BUFSIZ bytes at a time.
94
       * as some legacy code may expect int instead of size_t.
93
       */
95
       */
94
      do
96
      do
95
	{
97
	{
96
	  GETIOV (;);
98
	  GETIOV (;);
-
 
99
	  w = fp->_write (ptr, fp->_cookie, p,
97
	  w = fp->_write (ptr, fp->_cookie, p, MIN (len, BUFSIZ));
100
			  MIN (len, INT_MAX - INT_MAX % BUFSIZ));
98
	  if (w <= 0)
101
	  if (w <= 0)
99
	    goto err;
102
	    goto err;
100
	  p += w;
103
	  p += w;
101
	  len -= w;
104
	  len -= w;
Line 153... Line 156...
153
		    {
156
		    {
154
		      str = (unsigned char *)_realloc_r (ptr, fp->_bf._base,
157
		      str = (unsigned char *)_realloc_r (ptr, fp->_bf._base,
155
							 newsize);
158
							 newsize);
156
		      if (!str)
159
		      if (!str)
157
			{
160
			{
158
			  /* Free buffer which is no longer used.  */
161
			  /* Free buffer which is no longer used and clear
-
 
162
			     __SMBF flag to avoid double free in fclose.  */
159
			  _free_r (ptr, fp->_bf._base);
163
			  _free_r (ptr, fp->_bf._base);
-
 
164
			  fp->_flags &=  ~__SMBF;
160
			  /* Ensure correct errno, even if free changed it.  */
165
			  /* Ensure correct errno, even if free changed it.  */
161
			  ptr->_errno = ENOMEM;
166
			  ptr->_errno = ENOMEM;
162
			  goto err;
167
			  goto err;
163
			}
168
			}
164
		    }
169
		    }
Line 173... Line 178...
173
	      COPY (w);		/* copy MIN(fp->_w,len), */
178
	      COPY (w);		/* copy MIN(fp->_w,len), */
174
	      fp->_w -= w;
179
	      fp->_w -= w;
175
	      fp->_p += w;
180
	      fp->_p += w;
176
	      w = len;		/* but pretend copied all */
181
	      w = len;		/* but pretend copied all */
177
	    }
182
	    }
178
	  else if (fp->_p > fp->_bf._base && len > w)
183
	  else if (fp->_p > fp->_bf._base || len < fp->_bf._size)
179
	    {
184
	    {
-
 
185
	      /* pass through the buffer */
180
	      /* fill and flush */
186
	      w = MIN (len, w);
181
	      COPY (w);
187
	      COPY (w);
182
	      /* fp->_w -= w; *//* unneeded */
188
	      fp->_w -= w;
183
	      fp->_p += w;
189
	      fp->_p += w;
184
	      if (_fflush_r (ptr, fp))
190
	      if (fp->_w == 0 && _fflush_r (ptr, fp))
185
		goto err;
191
		goto err;
186
	    }
192
	    }
187
	  else if (len >= (w = fp->_bf._size))
193
	  else
188
	    {
194
	    {
189
	      /* write directly */
195
	      /* write directly */
-
 
196
	      w = ((int)MIN (len, INT_MAX)) / fp->_bf._size * fp->_bf._size;
190
	      w = fp->_write (ptr, fp->_cookie, p, w);
197
	      w = fp->_write (ptr, fp->_cookie, p, w);
191
	      if (w <= 0)
198
	      if (w <= 0)
192
		goto err;
199
		goto err;
193
	    }
200
	    }
194
	  else
-
 
195
	    {
-
 
196
	      /* fill and done */
-
 
197
	      w = len;
-
 
198
	      COPY (w);
-
 
199
	      fp->_w -= w;
-
 
200
	      fp->_p += w;
-
 
201
	    }
-
 
202
	  p += w;
201
	  p += w;
203
	  len -= w;
202
	  len -= w;
204
	}
203
	}
205
      while ((uio->uio_resid -= w) != 0);
204
      while ((uio->uio_resid -= w) != 0);
206
    }
205
    }