OpenCoverage

fpurge.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/coreutils/src/gnulib/lib/fpurge.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* Flushing buffers of a FILE stream.-
2 Copyright (C) 2007-2018 Free Software Foundation, Inc.-
3-
4 This program is free software: you can redistribute it and/or modify-
5 it under the terms of the GNU General Public License as published by-
6 the Free Software Foundation; either version 3 of the License, or-
7 (at your option) any later version.-
8-
9 This program is distributed in the hope that it will be useful,-
10 but WITHOUT ANY WARRANTY; without even the implied warranty of-
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the-
12 GNU General Public License for more details.-
13-
14 You should have received a copy of the GNU General Public License-
15 along with this program. If not, see <https://www.gnu.org/licenses/>. */-
16-
17#include <config.h>-
18-
19/* Specification. */-
20#include <stdio.h>-
21-
22#if HAVE___FPURGE /* glibc >= 2.2, Haiku, Solaris >= 7 */-
23# include <stdio_ext.h>-
24#endif-
25#include <stdlib.h>-
26-
27#include "stdio-impl.h"-
28-
29int-
30fpurge (FILE *fp)-
31{-
32#if HAVE___FPURGE /* glibc >= 2.2, Haiku, Solaris >= 7, musl libc */-
33-
34 __fpurge (fp);-
35 /* The __fpurge function does not have a return value. */-
36 return 0;
never executed: return 0;
0
37-
38#elif HAVE_FPURGE /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin 1.7 */-
39-
40 /* Call the system's fpurge function. */-
41# undef fpurge-
42# if !HAVE_DECL_FPURGE-
43 extern int fpurge (FILE *);-
44# endif-
45 int result = fpurge (fp);-
46# if defined __sferror || defined __DragonFly__ || defined __ANDROID__-
47 /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */-
48 if (result == 0)-
49 /* Correct the invariants that fpurge broke.-
50 <stdio.h> on BSD systems says:-
51 "The following always hold: if _flags & __SRD, _w is 0."-
52 If this invariant is not fulfilled and the stream is read-write but-
53 currently reading, subsequent putc or fputc calls will write directly-
54 into the buffer, although they shouldn't be allowed to. */-
55 if ((fp_->_flags & __SRD) != 0)-
56 fp_->_w = 0;-
57# endif-
58 return result;-
59-
60#else-
61-
62 /* Most systems provide FILE as a struct and the necessary bitmask in-
63 <stdio.h>, because they need it for implementing getc() and putc() as-
64 fast macros. */-
65# if defined _IO_EOF_SEEN || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */-
66 fp->_IO_read_end = fp->_IO_read_ptr;-
67 fp->_IO_write_ptr = fp->_IO_write_base;-
68 /* Avoid memory leak when there is an active ungetc buffer. */-
69 if (fp->_IO_save_base != NULL)-
70 {-
71 free (fp->_IO_save_base);-
72 fp->_IO_save_base = NULL;-
73 }-
74 return 0;-
75# elif defined __sferror || defined __DragonFly__ || defined __ANDROID__-
76 /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */-
77 fp_->_p = fp_->_bf._base;-
78 fp_->_r = 0;-
79 fp_->_w = ((fp_->_flags & (__SLBF | __SNBF | __SRD)) == 0 /* fully buffered and not currently reading? */-
80 ? fp_->_bf._size-
81 : 0);-
82 /* Avoid memory leak when there is an active ungetc buffer. */-
83 if (fp_ub._base != NULL)-
84 {-
85 if (fp_ub._base != fp_->_ubuf)-
86 free (fp_ub._base);-
87 fp_ub._base = NULL;-
88 }-
89 return 0;-
90# elif defined __EMX__ /* emx+gcc */-
91 fp->_ptr = fp->_buffer;-
92 fp->_rcount = 0;-
93 fp->_wcount = 0;-
94 fp->_ungetc_count = 0;-
95 return 0;-
96# elif defined __minix /* Minix */-
97 fp->_ptr = fp->_buf;-
98 if (fp->_ptr != NULL)-
99 fp->_count = 0;-
100 return 0;-
101# elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, MSVC, NonStop Kernel, OpenVMS */-
102 fp_->_ptr = fp_->_base;-
103 if (fp_->_ptr != NULL)-
104 fp_->_cnt = 0;-
105 return 0;-
106# elif defined __UCLIBC__ /* uClibc */-
107# ifdef __STDIO_BUFFERS-
108 if (fp->__modeflags & __FLAG_WRITING)-
109 fp->__bufpos = fp->__bufstart;-
110 else if (fp->__modeflags & (__FLAG_READONLY | __FLAG_READING))-
111 fp->__bufpos = fp->__bufread;-
112# endif-
113 return 0;-
114# elif defined __QNX__ /* QNX */-
115 fp->_Rback = fp->_Back + sizeof (fp->_Back);-
116 fp->_Rsave = NULL;-
117 if (fp->_Mode & 0x2000 /* _MWRITE */)-
118 /* fp->_Buf <= fp->_Next <= fp->_Wend */-
119 fp->_Next = fp->_Buf;-
120 else-
121 /* fp->_Buf <= fp->_Next <= fp->_Rend */-
122 fp->_Rend = fp->_Next;-
123 return 0;-
124# elif defined __MINT__ /* Atari FreeMiNT */-
125 if (fp->__pushed_back)-
126 {-
127 fp->__bufp = fp->__pushback_bufp;-
128 fp->__pushed_back = 0;-
129 }-
130 /* Preserve the current file position. */-
131 if (fp->__target != -1)-
132 fp->__target += fp->__bufp - fp->__buffer;-
133 fp->__bufp = fp->__buffer;-
134 /* Nothing in the buffer, next getc is nontrivial. */-
135 fp->__get_limit = fp->__bufp;-
136 /* Nothing in the buffer, next putc is nontrivial. */-
137 fp->__put_limit = fp->__buffer;-
138 return 0;-
139# elif defined EPLAN9 /* Plan9 */-
140 fp->rp = fp->wp = fp->lp = fp->buf;-
141 return 0;-
142# else-
143# error "Please port gnulib fpurge.c to your platform! Look at the definitions of fflush, setvbuf and ungetc on your system, then report this to bug-gnulib."-
144# endif-
145-
146#endif-
147}-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.1.2