Lines Matching +full:- +full:c

1 /* Copyright (C) 2007 Eric Blake
8 <<open_memstream>>, <<open_wmemstream>>---open a write stream around an arbitrary-length string
25 <<open_memstream>> creates a seekable, byte-oriented <<FILE>> stream that
26 wraps an arbitrary-length buffer, created as if by <<malloc>>. The current
37 stream being wide-oriented. The size set in <[size]> in subsequent
40 The stream is write-only, since the user can directly read *<[buf]>
47 is always NUL-terminated after at most *<[size]> bytes (or wide characters
59 POSIX.1-2008
65 #pragma GCC diagnostic ignored "-Wpragmas"
66 #pragma GCC diagnostic ignored "-Wunknown-warning-option"
67 #pragma GCC diagnostic ignored "-Wanalyzer-malloc-leak"
94 char c; member
97 int8_t wide; /* wide-oriented (>0) or byte-oriented (<0) */
100 /* Write up to non-zero N bytes of BUF into the stream described by COOKIE,
108 memstream *c = (memstream *) cookie; in memwriter() local
109 char *cbuf = *c->pbuf; in memwriter()
113 if (sizeof (OFF_T) == sizeof (size_t) && (ssize_t) (c->pos + n) < 0) in memwriter()
122 allocation should thus be max(prev_size*1.5, c->pos+n+1). */ in memwriter()
123 if (c->pos + n >= c->max) in memwriter()
125 size_t newsize = c->max * 3 / 2; in memwriter()
126 if (newsize < c->pos + n + 1) in memwriter()
127 newsize = c->pos + n + 1; in memwriter()
131 *c->pbuf = cbuf; in memwriter()
132 c->max = newsize; in memwriter()
136 if (c->pos > c->eof) in memwriter()
137 memset (cbuf + c->eof, '\0', c->pos - c->eof); in memwriter()
138 memcpy (cbuf + c->pos, buf, n); in memwriter()
139 c->pos += n; in memwriter()
142 if (c->pos > c->eof) in memwriter()
143 c->eof = c->pos; in memwriter()
144 else if (c->wide > 0) in memwriter()
145 c->saved.w = *(wchar_t *)(cbuf + c->pos); in memwriter()
147 c->saved.c = cbuf[c->pos]; in memwriter()
148 cbuf[c->pos] = '\0'; in memwriter()
149 *c->psize = (c->wide > 0) ? c->pos / sizeof (wchar_t) : c->pos; in memwriter()
161 memstream *c = (memstream *) cookie; in memseeker() local
165 offset += c->pos; in memseeker()
167 offset += c->eof; in memseeker()
171 offset = -1; in memseeker()
176 offset = -1; in memseeker()
182 offset = -1; in memseeker()
187 if (c->pos < c->eof) in memseeker()
189 if (c->wide > 0) in memseeker()
190 *(wchar_t *)((*c->pbuf) + c->pos) = c->saved.w; in memseeker()
192 (*c->pbuf)[c->pos] = c->saved.c; in memseeker()
193 c->saved.w = L'\0'; in memseeker()
195 c->pos = offset; in memseeker()
196 if (c->pos < c->eof) in memseeker()
198 if (c->wide > 0) in memseeker()
200 c->saved.w = *(wchar_t *)((*c->pbuf) + c->pos); in memseeker()
201 *(wchar_t *)((*c->pbuf) + c->pos) = L'\0'; in memseeker()
202 *c->psize = c->pos / sizeof (wchar_t); in memseeker()
206 c->saved.c = (*c->pbuf)[c->pos]; in memseeker()
207 (*c->pbuf)[c->pos] = '\0'; in memseeker()
208 *c->psize = c->pos; in memseeker()
211 else if (c->wide > 0) in memseeker()
212 *c->psize = c->eof / sizeof (wchar_t); in memseeker()
214 *c->psize = c->eof; in memseeker()
229 memstream *c = (memstream *) cookie; in memseeker64() local
232 offset += c->pos; in memseeker64()
234 offset += c->eof; in memseeker64()
238 offset = -1; in memseeker64()
243 offset = -1; in memseeker64()
247 if (c->pos < c->eof) in memseeker64()
249 if (c->wide > 0) in memseeker64()
250 *(wchar_t *)((*c->pbuf) + c->pos) = c->saved.w; in memseeker64()
252 (*c->pbuf)[c->pos] = c->saved.c; in memseeker64()
253 c->saved.w = L'\0'; in memseeker64()
255 c->pos = offset; in memseeker64()
256 if (c->pos < c->eof) in memseeker64()
258 if (c->wide > 0) in memseeker64()
260 c->saved.w = *(wchar_t *)((*c->pbuf) + c->pos); in memseeker64()
261 *(wchar_t *)((*c->pbuf) + c->pos) = L'\0'; in memseeker64()
262 *c->psize = c->pos / sizeof (wchar_t); in memseeker64()
266 c->saved.c = (*c->pbuf)[c->pos]; in memseeker64()
267 (*c->pbuf)[c->pos] = '\0'; in memseeker64()
268 *c->psize = c->pos; in memseeker64()
271 else if (c->wide > 0) in memseeker64()
272 *c->psize = c->eof / sizeof (wchar_t); in memseeker64()
274 *c->psize = c->eof; in memseeker64()
285 memstream *c = (memstream *) cookie; in memcloser() local
289 buf = realloc (*c->pbuf, in memcloser()
290 c->wide > 0 ? (*c->psize + 1) * sizeof (wchar_t) in memcloser()
291 : *c->psize + 1); in memcloser()
293 *c->pbuf = buf; in memcloser()
294 free (c->storage); in memcloser()
307 memstream *c; in internalopen_memstream() local
316 if ((c = (memstream *) malloc (sizeof *c)) == NULL) in internalopen_memstream()
319 fp->_flags = 0; /* release */ in internalopen_memstream()
321 __lock_close_recursive (fp->_lock); in internalopen_memstream()
330 c->max = *size; in internalopen_memstream()
332 c->max *= sizeof(wchar_t); in internalopen_memstream()
333 if (c->max < 64) in internalopen_memstream()
334 c->max = 64; in internalopen_memstream()
336 else if (c->max > (size_t)64 * 1024) in internalopen_memstream()
337 c->max = (size_t)64 * 1024; in internalopen_memstream()
340 *buf = malloc (c->max); in internalopen_memstream()
344 fp->_flags = 0; /* release */ in internalopen_memstream()
346 __lock_close_recursive (fp->_lock); in internalopen_memstream()
349 free (c); in internalopen_memstream()
357 c->storage = c; in internalopen_memstream()
358 c->pbuf = buf; in internalopen_memstream()
359 c->psize = size; in internalopen_memstream()
360 c->pos = 0; in internalopen_memstream()
361 c->eof = 0; in internalopen_memstream()
362 c->saved.w = L'\0'; in internalopen_memstream()
363 c->wide = (int8_t) wide; in internalopen_memstream()
366 fp->_file = -1; in internalopen_memstream()
367 fp->_flags = __SWR; in internalopen_memstream()
368 fp->_cookie = c; in internalopen_memstream()
369 fp->_read = NULL; in internalopen_memstream()
370 fp->_write = memwriter; in internalopen_memstream()
371 fp->_seek = memseeker; in internalopen_memstream()
373 fp->_seek64 = memseeker64; in internalopen_memstream()
374 fp->_flags |= __SL64; in internalopen_memstream()
376 fp->_close = memcloser; in internalopen_memstream()
387 return internalopen_memstream ( buf, size, -1); in open_memstream()