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