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 * 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 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