1*24f9d669Sguenther /* $OpenBSD: freadptr.c,v 1.1 2024/08/12 20:56:55 guenther Exp $ */
2*24f9d669Sguenther /*
3*24f9d669Sguenther * Copyright (c) 2024 Philip Guenther <guenther@openbsd.org>
4*24f9d669Sguenther *
5*24f9d669Sguenther * Permission to use, copy, modify, and distribute this software for any
6*24f9d669Sguenther * purpose with or without fee is hereby granted, provided that the above
7*24f9d669Sguenther * copyright notice and this permission notice appear in all copies.
8*24f9d669Sguenther *
9*24f9d669Sguenther * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10*24f9d669Sguenther * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11*24f9d669Sguenther * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12*24f9d669Sguenther * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13*24f9d669Sguenther * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14*24f9d669Sguenther * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15*24f9d669Sguenther * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16*24f9d669Sguenther */
17*24f9d669Sguenther
18*24f9d669Sguenther #include <stdlib.h>
19*24f9d669Sguenther #include <stdio_ext.h>
20*24f9d669Sguenther #include "local.h"
21*24f9d669Sguenther
22*24f9d669Sguenther const char *
__freadptr(FILE * fp,size_t * sizep)23*24f9d669Sguenther __freadptr(FILE *fp, size_t *sizep)
24*24f9d669Sguenther {
25*24f9d669Sguenther if ((fp->_flags & __SRD) && fp->_r > 0) {
26*24f9d669Sguenther *sizep = fp->_r;
27*24f9d669Sguenther return fp->_p;
28*24f9d669Sguenther }
29*24f9d669Sguenther return NULL;
30*24f9d669Sguenther }
31*24f9d669Sguenther
32*24f9d669Sguenther void
__freadptrinc(FILE * fp,size_t inc)33*24f9d669Sguenther __freadptrinc(FILE *fp, size_t inc)
34*24f9d669Sguenther {
35*24f9d669Sguenther if (fp->_flags & __SRD) {
36*24f9d669Sguenther fp->_r -= inc;
37*24f9d669Sguenther fp->_p += inc;
38*24f9d669Sguenther if (fp->_r == 0 && HASUB(fp)) {
39*24f9d669Sguenther /* consumed the pushback buffer; switch back */
40*24f9d669Sguenther FREEUB(fp);
41*24f9d669Sguenther if ((fp->_r = fp->_ur) != 0)
42*24f9d669Sguenther fp->_p = fp->_up;
43*24f9d669Sguenther }
44*24f9d669Sguenther }
45*24f9d669Sguenther }
46