Lines Matching +full:- +full:c
1 /* Copyright (C) 2007 Eric Blake
8 <<fmemopen>>---open a stream around a fixed-length string
20 fixed-length buffer of <[size]> bytes starting at <[buf]>. The stream
46 stream has exceeded <[size]>, so that a write-only <[buf]> is always
47 NUL-terminated when the stream is flushed or closed (and the initial
80 char writeonly; /* 1 if write-only */
81 char saved; /* saved character that lived at pos before write-only NUL */
84 /* Read up to non-zero N bytes into BUF from stream described by
92 fmemcookie *c = (fmemcookie *) cookie; in fmemreader() local
94 if (c->pos > c->eof) in fmemreader()
96 if (n >= c->eof - c->pos) in fmemreader()
97 n = c->eof - c->pos; in fmemreader()
98 memcpy (buf, c->buf + c->pos, n); in fmemreader()
99 c->pos += n; in fmemreader()
103 /* Write up to non-zero N bytes of BUF into the stream described by COOKIE,
111 fmemcookie *c = (fmemcookie *) cookie; in fmemwriter() local
116 if (c->append) in fmemwriter()
117 c->pos = c->eof; in fmemwriter()
118 else if (c->pos > c->eof) in fmemwriter()
119 memset (c->buf + c->eof, '\0', c->pos - c->eof); in fmemwriter()
120 /* Do not write beyond EOF; saving room for NUL on write-only stream. */ in fmemwriter()
121 if (c->pos + n > c->max - c->writeonly) in fmemwriter()
123 adjust = c->writeonly; in fmemwriter()
124 n = c->max - c->pos; in fmemwriter()
128 write-only; or if read-write, eof changed, and there is still in fmemwriter()
131 if (c->pos + n > c->eof) in fmemwriter()
133 c->eof = c->pos + n; in fmemwriter()
134 if (c->eof - adjust < c->max) in fmemwriter()
135 c->saved = c->buf[c->eof - adjust] = '\0'; in fmemwriter()
137 else if (c->writeonly) in fmemwriter()
141 c->saved = c->buf[c->pos + n - adjust]; in fmemwriter()
142 c->buf[c->pos + n - adjust] = '\0'; in fmemwriter()
147 c->pos += n; in fmemwriter()
148 if (n - adjust) in fmemwriter()
149 memcpy (c->buf + c->pos - n, buf, n - adjust); in fmemwriter()
166 fmemcookie *c = (fmemcookie *) cookie; in fmemseeker() local
174 offset += c->pos; in fmemseeker()
176 offset += c->eof; in fmemseeker()
180 offset = -1; in fmemseeker()
182 else if (offset > (off_t) c->max) in fmemseeker()
185 offset = -1; in fmemseeker()
191 offset = -1; in fmemseeker()
196 if (c->writeonly && c->pos < c->eof) in fmemseeker()
198 c->buf[c->pos] = c->saved; in fmemseeker()
199 c->saved = '\0'; in fmemseeker()
201 c->pos = offset; in fmemseeker()
202 if (c->writeonly && c->pos < c->eof) in fmemseeker()
204 c->saved = c->buf[c->pos]; in fmemseeker()
205 c->buf[c->pos] = '\0'; in fmemseeker()
221 fmemcookie *c = (fmemcookie *) cookie; in fmemseeker64() local
223 offset += c->pos; in fmemseeker64()
225 offset += c->eof; in fmemseeker64()
229 offset = -1; in fmemseeker64()
231 else if (offset > (_off64_t) c->max) in fmemseeker64()
234 offset = -1; in fmemseeker64()
238 if (c->writeonly && c->pos < c->eof) in fmemseeker64()
240 c->buf[c->pos] = c->saved; in fmemseeker64()
241 c->saved = '\0'; in fmemseeker64()
243 c->pos = offset; in fmemseeker64()
244 if (c->writeonly && c->pos < c->eof) in fmemseeker64()
246 c->saved = c->buf[c->pos]; in fmemseeker64()
247 c->buf[c->pos] = '\0'; in fmemseeker64()
259 fmemcookie *c = (fmemcookie *) cookie; in fmemcloser() local
260 free (c->storage); in fmemcloser()
273 fmemcookie *c; in fmemopen() local
286 if ((c = (fmemcookie *) malloc (sizeof *c + (buf ? 0 : size))) in fmemopen()
290 fp->_flags = 0; /* release */ in fmemopen()
292 __lock_close_recursive (fp->_lock); in fmemopen()
298 c->storage = c; in fmemopen()
299 c->max = size; in fmemopen()
302 c->writeonly = (flags & __SWR) != 0; in fmemopen()
303 c->saved = '\0'; in fmemopen()
307 c->buf = (char *) (c + 1); in fmemopen()
308 c->buf[0] = '\0'; in fmemopen()
309 c->pos = c->eof = 0; in fmemopen()
310 c->append = (flags & __SAPP) != 0; in fmemopen()
314 c->buf = (char *) buf; in fmemopen()
319 buf = memchr (c->buf, '\0', size); in fmemopen()
320 c->eof = c->pos = buf ? (size_t) ((char *) buf - c->buf) : size; in fmemopen()
321 if (!buf && c->writeonly) in fmemopen()
323 c->buf[size - 1] = '\0'; in fmemopen()
324 c->append = 1; in fmemopen()
328 c->pos = c->append = 0; in fmemopen()
329 c->eof = size; in fmemopen()
333 c->pos = c->append = c->eof = 0; in fmemopen()
334 *c->buf = '\0'; in fmemopen()
342 fp->_file = -1; in fmemopen()
343 fp->_flags = flags; in fmemopen()
344 fp->_cookie = c; in fmemopen()
345 fp->_read = flags & (__SRD | __SRW) ? fmemreader : NULL; in fmemopen()
346 fp->_write = flags & (__SWR | __SRW) ? fmemwriter : NULL; in fmemopen()
347 fp->_seek = fmemseeker; in fmemopen()
349 fp->_seek64 = fmemseeker64; in fmemopen()
350 fp->_flags |= __SL64; in fmemopen()
352 fp->_close = fmemcloser; in fmemopen()