xref: /openbsd/lib/libc/stdio/freadptr.c (revision 24f9d669)
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