Lines Matching refs:shf
39 static int shf_fillbuf(struct shf *);
40 static int shf_emptybuf(struct shf *, int);
47 struct shf *
50 struct shf *shf; in shf_open() local
57 shf = alloc(sizeof(struct shf) + bsize, ATEMP); in shf_open()
58 shf->areap = ATEMP; in shf_open()
59 shf->buf = (unsigned char *)&shf[1]; in shf_open()
60 shf->bsize = bsize; in shf_open()
61 shf->flags = SHF_ALLOCS; in shf_open()
66 afree(shf, shf->areap); in shf_open()
75 afree(shf, shf->areap); in shf_open()
84 return (shf_reopen(fd, sflags, shf)); in shf_open()
121 struct shf *
122 shf_fdopen(int fd, int sflags, struct shf *shf) in shf_fdopen() argument
129 if (shf) { in shf_fdopen()
131 shf->buf = alloc(bsize, ATEMP); in shf_fdopen()
134 shf->buf = NULL; in shf_fdopen()
136 shf = alloc(sizeof(struct shf) + bsize, ATEMP); in shf_fdopen()
137 shf->buf = (unsigned char *)&shf[1]; in shf_fdopen()
140 shf->areap = ATEMP; in shf_fdopen()
141 shf->fd = fd; in shf_fdopen()
142 shf->rp = shf->wp = shf->buf; in shf_fdopen()
143 shf->rnleft = 0; in shf_fdopen()
144 shf->rbsize = bsize; in shf_fdopen()
145 shf->wnleft = 0; /* force call to shf_emptybuf() */ in shf_fdopen()
146 shf->wbsize = sflags & SHF_UNBUF ? 0 : bsize; in shf_fdopen()
147 shf->flags = sflags; in shf_fdopen()
148 shf->errnosv = 0; in shf_fdopen()
149 shf->bsize = bsize; in shf_fdopen()
152 return (shf); in shf_fdopen()
156 struct shf *
157 shf_reopen(int fd, int sflags, struct shf *shf) in shf_reopen() argument
164 if (!shf || !shf->buf || shf->bsize < bsize) in shf_reopen()
168 shf->fd = fd; in shf_reopen()
169 shf->rp = shf->wp = shf->buf; in shf_reopen()
170 shf->rnleft = 0; in shf_reopen()
171 shf->rbsize = bsize; in shf_reopen()
172 shf->wnleft = 0; /* force call to shf_emptybuf() */ in shf_reopen()
173 shf->wbsize = sflags & SHF_UNBUF ? 0 : bsize; in shf_reopen()
174 shf->flags = (shf->flags & (SHF_ALLOCS | SHF_ALLOCB)) | sflags; in shf_reopen()
175 shf->errnosv = 0; in shf_reopen()
178 return (shf); in shf_reopen()
190 struct shf *
191 shf_sopen(char *buf, ssize_t bsize, int sflags, struct shf *shf) in shf_sopen() argument
197 if (!shf) { in shf_sopen()
198 shf = alloc(sizeof(struct shf), ATEMP); in shf_sopen()
201 shf->areap = ATEMP; in shf_sopen()
206 buf = alloc(bsize, shf->areap); in shf_sopen()
208 shf->fd = -1; in shf_sopen()
209 shf->buf = shf->rp = shf->wp = (unsigned char *)buf; in shf_sopen()
210 shf->rnleft = bsize; in shf_sopen()
211 shf->rbsize = bsize; in shf_sopen()
212 shf->wnleft = bsize - 1; /* space for a '\0' */ in shf_sopen()
213 shf->wbsize = bsize; in shf_sopen()
214 shf->flags = sflags | SHF_STRING; in shf_sopen()
215 shf->errnosv = 0; in shf_sopen()
216 shf->bsize = bsize; in shf_sopen()
218 return (shf); in shf_sopen()
223 shf_close(struct shf *shf) in shf_close() argument
227 if (shf->fd >= 0) { in shf_close()
228 ret = shf_flush(shf); in shf_close()
229 if (close(shf->fd) < 0) in shf_close()
232 if (shf->flags & SHF_ALLOCS) in shf_close()
233 afree(shf, shf->areap); in shf_close()
234 else if (shf->flags & SHF_ALLOCB) in shf_close()
235 afree(shf->buf, shf->areap); in shf_close()
242 shf_fdclose(struct shf *shf) in shf_fdclose() argument
246 if (shf->fd >= 0) { in shf_fdclose()
247 ret = shf_flush(shf); in shf_fdclose()
248 if (close(shf->fd) < 0) in shf_fdclose()
250 shf->rnleft = 0; in shf_fdclose()
251 shf->rp = shf->buf; in shf_fdclose()
252 shf->wnleft = 0; in shf_fdclose()
253 shf->fd = -1; in shf_fdclose()
265 shf_sclose(struct shf *shf) in shf_sclose() argument
267 unsigned char *s = shf->buf; in shf_sclose()
270 if (shf->flags & SHF_WR) { in shf_sclose()
271 shf->wnleft++; in shf_sclose()
272 shf_putc('\0', shf); in shf_sclose()
274 if (shf->flags & SHF_ALLOCS) in shf_sclose()
275 afree(shf, shf->areap); in shf_sclose()
284 shf_flush(struct shf *shf) in shf_flush() argument
286 if (shf->flags & SHF_STRING) in shf_flush()
287 return ((shf->flags & SHF_WR) ? EOF : 0); in shf_flush()
289 if (shf->fd < 0) in shf_flush()
292 if (shf->flags & SHF_ERROR) { in shf_flush()
293 errno = shf->errnosv; in shf_flush()
297 if (shf->flags & SHF_READING) { in shf_flush()
298 shf->flags &= ~(SHF_EOF | SHF_READING); in shf_flush()
299 if (shf->rnleft > 0) { in shf_flush()
300 lseek(shf->fd, (off_t)-shf->rnleft, SEEK_CUR); in shf_flush()
301 shf->rnleft = 0; in shf_flush()
302 shf->rp = shf->buf; in shf_flush()
305 } else if (shf->flags & SHF_WRITING) in shf_flush()
306 return (shf_emptybuf(shf, 0)); in shf_flush()
316 shf_emptybuf(struct shf *shf, int flags) in shf_emptybuf() argument
320 if (!(shf->flags & SHF_STRING) && shf->fd < 0) in shf_emptybuf()
323 if (shf->flags & SHF_ERROR) { in shf_emptybuf()
324 errno = shf->errnosv; in shf_emptybuf()
328 if (shf->flags & SHF_READING) { in shf_emptybuf()
332 ret = shf_flush(shf); in shf_emptybuf()
333 shf->flags &= ~SHF_READING; in shf_emptybuf()
335 if (shf->flags & SHF_STRING) { in shf_emptybuf()
343 if (!(flags & EB_GROW) || !(shf->flags & SHF_DYNAMIC) || in shf_emptybuf()
344 !(shf->flags & SHF_ALLOCB)) in shf_emptybuf()
347 nbuf = aresize2(shf->buf, 2, shf->wbsize, shf->areap); in shf_emptybuf()
348 shf->rp = nbuf + (shf->rp - shf->buf); in shf_emptybuf()
349 shf->wp = nbuf + (shf->wp - shf->buf); in shf_emptybuf()
350 shf->rbsize += shf->wbsize; in shf_emptybuf()
351 shf->wnleft += shf->wbsize; in shf_emptybuf()
352 shf->wbsize <<= 1; in shf_emptybuf()
353 shf->buf = nbuf; in shf_emptybuf()
355 if (shf->flags & SHF_WRITING) { in shf_emptybuf()
356 ssize_t n, ntowrite = shf->wp - shf->buf; in shf_emptybuf()
357 unsigned char *buf = shf->buf; in shf_emptybuf()
360 n = write(shf->fd, buf, ntowrite); in shf_emptybuf()
363 !(shf->flags & SHF_INTERRUPT)) in shf_emptybuf()
365 shf->flags |= SHF_ERROR; in shf_emptybuf()
366 shf->errnosv = errno; in shf_emptybuf()
367 shf->wnleft = 0; in shf_emptybuf()
368 if (buf != shf->buf) { in shf_emptybuf()
373 memmove(shf->buf, buf, in shf_emptybuf()
375 shf->wp = shf->buf + ntowrite; in shf_emptybuf()
383 shf->wp = shf->buf; in shf_emptybuf()
384 shf->wnleft = 0; in shf_emptybuf()
385 shf->flags &= ~SHF_WRITING; in shf_emptybuf()
389 shf->wp = shf->buf; in shf_emptybuf()
390 shf->wnleft = shf->wbsize; in shf_emptybuf()
392 shf->flags |= SHF_WRITING; in shf_emptybuf()
399 shf_fillbuf(struct shf *shf) in shf_fillbuf() argument
403 if (shf->flags & SHF_STRING) in shf_fillbuf()
406 if (shf->fd < 0) in shf_fillbuf()
409 if (shf->flags & (SHF_EOF | SHF_ERROR)) { in shf_fillbuf()
410 if (shf->flags & SHF_ERROR) in shf_fillbuf()
411 errno = shf->errnosv; in shf_fillbuf()
415 if ((shf->flags & SHF_WRITING) && shf_emptybuf(shf, EB_READSW) == EOF) in shf_fillbuf()
418 shf->flags |= SHF_READING; in shf_fillbuf()
420 shf->rp = shf->buf; in shf_fillbuf()
422 n = blocking_read(shf->fd, (char *)shf->buf, shf->rbsize); in shf_fillbuf()
423 if (n < 0 && errno == EINTR && !(shf->flags & SHF_INTERRUPT)) in shf_fillbuf()
428 shf->flags |= SHF_ERROR; in shf_fillbuf()
429 shf->errnosv = errno; in shf_fillbuf()
430 shf->rnleft = 0; in shf_fillbuf()
431 shf->rp = shf->buf; in shf_fillbuf()
434 if ((shf->rnleft = n) == 0) in shf_fillbuf()
435 shf->flags |= SHF_EOF; in shf_fillbuf()
445 shf_read(char *buf, ssize_t bsize, struct shf *shf) in shf_read() argument
449 if (!(shf->flags & SHF_RD)) in shf_read()
450 internal_errorf("%s: flags 0x%X", "shf_read", shf->flags); in shf_read()
456 if (shf->rnleft == 0 && in shf_read()
457 (shf_fillbuf(shf) == EOF || shf->rnleft == 0)) in shf_read()
459 ncopy = shf->rnleft; in shf_read()
462 memcpy(buf, shf->rp, ncopy); in shf_read()
465 shf->rp += ncopy; in shf_read()
466 shf->rnleft -= ncopy; in shf_read()
469 return (orig_bsize == bsize ? (shf_error(shf) ? EOF : 0) : in shf_read()
480 shf_getse(char *buf, ssize_t bsize, struct shf *shf) in shf_getse() argument
486 if (!(shf->flags & SHF_RD)) in shf_getse()
487 internal_errorf("%s: flags 0x%X", "shf_getse", shf->flags); in shf_getse()
495 if (shf->rnleft == 0) { in shf_getse()
496 if (shf_fillbuf(shf) == EOF) in shf_getse()
498 if (shf->rnleft == 0) { in shf_getse()
503 end = (unsigned char *)memchr((char *)shf->rp, '\n', in shf_getse()
504 shf->rnleft); in shf_getse()
505 ncopy = end ? end - shf->rp + 1 : shf->rnleft; in shf_getse()
508 memcpy(buf, (char *) shf->rp, ncopy); in shf_getse()
509 shf->rp += ncopy; in shf_getse()
510 shf->rnleft -= ncopy; in shf_getse()
520 shf_getchar(struct shf *shf) in shf_getchar() argument
522 if (!(shf->flags & SHF_RD)) in shf_getchar()
523 internal_errorf("%s: flags 0x%X", "shf_getchar", shf->flags); in shf_getchar()
525 if (shf->rnleft == 0 && (shf_fillbuf(shf) == EOF || shf->rnleft == 0)) in shf_getchar()
527 --shf->rnleft; in shf_getchar()
528 return (*shf->rp++); in shf_getchar()
536 shf_ungetc(int c, struct shf *shf) in shf_ungetc() argument
538 if (!(shf->flags & SHF_RD)) in shf_ungetc()
539 internal_errorf("%s: flags 0x%X", "shf_ungetc", shf->flags); in shf_ungetc()
541 if ((shf->flags & SHF_ERROR) || c == EOF || in shf_ungetc()
542 (shf->rp == shf->buf && shf->rnleft)) in shf_ungetc()
545 if ((shf->flags & SHF_WRITING) && shf_emptybuf(shf, EB_READSW) == EOF) in shf_ungetc()
548 if (shf->rp == shf->buf) in shf_ungetc()
549 shf->rp = shf->buf + shf->rbsize; in shf_ungetc()
550 if (shf->flags & SHF_STRING) { in shf_ungetc()
555 if ((int)(shf->rp[-1]) != c) in shf_ungetc()
557 shf->flags &= ~SHF_EOF; in shf_ungetc()
558 shf->rp--; in shf_ungetc()
559 shf->rnleft++; in shf_ungetc()
562 shf->flags &= ~SHF_EOF; in shf_ungetc()
563 *--(shf->rp) = c; in shf_ungetc()
564 shf->rnleft++; in shf_ungetc()
573 shf_putchar(int c, struct shf *shf) in shf_putchar() argument
575 if (!(shf->flags & SHF_WR)) in shf_putchar()
576 internal_errorf("%s: flags 0x%X", "shf_putchar", shf->flags); in shf_putchar()
581 if (shf->flags & SHF_UNBUF) { in shf_putchar()
585 if (shf->fd < 0) in shf_putchar()
587 if (shf->flags & SHF_ERROR) { in shf_putchar()
588 errno = shf->errnosv; in shf_putchar()
591 while ((n = write(shf->fd, &cc, 1)) != 1) in shf_putchar()
594 !(shf->flags & SHF_INTERRUPT)) in shf_putchar()
596 shf->flags |= SHF_ERROR; in shf_putchar()
597 shf->errnosv = errno; in shf_putchar()
602 if (shf->wnleft == 0 && shf_emptybuf(shf, EB_GROW) == EOF) in shf_putchar()
604 shf->wnleft--; in shf_putchar()
605 *shf->wp++ = c; in shf_putchar()
616 shf_puts(const char *s, struct shf *shf) in shf_puts() argument
621 return (shf_write(s, strlen(s), shf)); in shf_puts()
626 shf_write(const char *buf, ssize_t nbytes, struct shf *shf) in shf_write() argument
630 if (!(shf->flags & SHF_WR)) in shf_write()
631 internal_errorf("%s: flags 0x%X", "shf_write", shf->flags); in shf_write()
637 if ((ncopy = shf->wnleft) && in shf_write()
638 (shf->wp != shf->buf || nbytes < shf->wnleft)) { in shf_write()
641 memcpy(shf->wp, buf, ncopy); in shf_write()
644 shf->wp += ncopy; in shf_write()
645 shf->wnleft -= ncopy; in shf_write()
648 if (shf->flags & SHF_STRING) { in shf_write()
650 while (nbytes > shf->wnleft) in shf_write()
651 if (shf_emptybuf(shf, EB_GROW) == EOF) in shf_write()
656 if (shf_emptybuf(shf, EB_GROW) == EOF) in shf_write()
659 if (nbytes > shf->wbsize) { in shf_write()
661 if (shf->wbsize) in shf_write()
662 ncopy -= nbytes % shf->wbsize; in shf_write()
665 n = write(shf->fd, buf, ncopy); in shf_write()
668 !(shf->flags & SHF_INTERRUPT)) in shf_write()
670 shf->flags |= SHF_ERROR; in shf_write()
671 shf->errnosv = errno; in shf_write()
672 shf->wnleft = 0; in shf_write()
687 memcpy(shf->wp, buf, nbytes); in shf_write()
688 shf->wp += nbytes; in shf_write()
689 shf->wnleft -= nbytes; in shf_write()
697 shf_fprintf(struct shf *shf, const char *fmt, ...) in shf_fprintf() argument
703 n = shf_vfprintf(shf, fmt, args); in shf_fprintf()
712 struct shf shf; in shf_snprintf() local
720 shf_sopen(buf, bsize, SHF_WR, &shf); in shf_snprintf()
722 n = shf_vfprintf(&shf, fmt, args); in shf_snprintf()
725 shf_sclose(&shf); in shf_snprintf()
732 struct shf shf; in shf_smprintf() local
735 shf_sopen(NULL, 0, SHF_WR|SHF_DYNAMIC, &shf); in shf_smprintf()
737 shf_vfprintf(&shf, fmt, args); in shf_smprintf()
740 return (shf_sclose(&shf)); in shf_smprintf()
759 shf_vfprintf(struct shf *shf, const char *fmt, va_list args) in shf_vfprintf() argument
783 shf_putc(c, shf); in shf_vfprintf()
1019 shf_putc(*s, shf); in shf_vfprintf()
1024 shf_putc(*s, shf); in shf_vfprintf()
1029 shf_putc(*s, shf); in shf_vfprintf()
1041 shf_putc(c, shf); in shf_vfprintf()
1054 shf_putc(*s, shf); in shf_vfprintf()
1060 shf_putc(c, shf); in shf_vfprintf()
1064 return (shf_error(shf) ? EOF : nwritten); in shf_vfprintf()
1069 shf_getc(struct shf *shf) in shf_getc() argument
1071 return (shf_getc_i(shf)); in shf_getc()
1075 shf_putc(int c, struct shf *shf) in shf_putc() argument
1077 return (shf_putc_i(c, shf)); in shf_putc()