xref: /aosp_15_r20/bionic/libc/include/stdio_ext.h (revision 8d67ca893c1523eb926b9080dbe4e2ffd2a27ba1)
1 /*
2  * Copyright (C) 2014 The Android Open Source Project
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *  * Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  *  * Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in
12  *    the documentation and/or other materials provided with the
13  *    distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  */
28 
29 #pragma once
30 
31 /**
32  * @file stdio_ext.h
33  * @brief Extra standard I/O functionality. See also `<stdio.h>`.
34  */
35 
36 #include <sys/cdefs.h>
37 #include <stdio.h>
38 
39 __BEGIN_DECLS
40 
41 /**
42  * [__fbufsize(3)](https://man7.org/linux/man-pages/man3/__fbufsize.3.html) returns the size of
43  * the stream's buffer.
44  *
45  * Available since API level 23.
46  */
47 
48 #if __BIONIC_AVAILABILITY_GUARD(23)
49 size_t __fbufsize(FILE* _Nonnull __fp) __INTRODUCED_IN(23);
50 
51 /**
52  * [__freadable(3)](https://man7.org/linux/man-pages/man3/__freadable.3.html) returns non-zero if
53  * the stream allows reading, 0 otherwise.
54  *
55  * Available since API level 23.
56  */
57 int __freadable(FILE* _Nonnull __fp) __INTRODUCED_IN(23);
58 #endif /* __BIONIC_AVAILABILITY_GUARD(23) */
59 
60 
61 /**
62  * [__freading(3)](https://man7.org/linux/man-pages/man3/__freading.3.html) returns non-zero if
63  * the stream's last operation was a read, 0 otherwise.
64  *
65  * Available since API level 28.
66  */
67 
68 #if __BIONIC_AVAILABILITY_GUARD(28)
69 int __freading(FILE* _Nonnull __fp) __INTRODUCED_IN(28);
70 #endif /* __BIONIC_AVAILABILITY_GUARD(28) */
71 
72 
73 /**
74  * [__fwritable(3)](https://man7.org/linux/man-pages/man3/__fwritable.3.html) returns non-zero if
75  * the stream allows writing, 0 otherwise.
76  *
77  * Available since API level 23.
78  */
79 
80 #if __BIONIC_AVAILABILITY_GUARD(23)
81 int __fwritable(FILE* _Nonnull __fp) __INTRODUCED_IN(23);
82 #endif /* __BIONIC_AVAILABILITY_GUARD(23) */
83 
84 
85 /**
86  * [__fwriting(3)](https://man7.org/linux/man-pages/man3/__fwriting.3.html) returns non-zero if
87  * the stream's last operation was a write, 0 otherwise.
88  *
89  * Available since API level 28.
90  */
91 
92 #if __BIONIC_AVAILABILITY_GUARD(28)
93 int __fwriting(FILE* _Nonnull __fp) __INTRODUCED_IN(28);
94 #endif /* __BIONIC_AVAILABILITY_GUARD(28) */
95 
96 
97 /**
98  * [__flbf(3)](https://man7.org/linux/man-pages/man3/__flbf.3.html) returns non-zero if
99  * the stream is line-buffered, 0 otherwise.
100  *
101  * Available since API level 23.
102  */
103 
104 #if __BIONIC_AVAILABILITY_GUARD(23)
105 int __flbf(FILE* _Nonnull __fp) __INTRODUCED_IN(23);
106 #endif /* __BIONIC_AVAILABILITY_GUARD(23) */
107 
108 
109 /**
110  * [__fpurge(3)](https://man7.org/linux/man-pages/man3/__fpurge.3.html) discards the contents of
111  * the stream's buffer.
112  */
113 void __fpurge(FILE* _Nonnull __fp) __RENAME(fpurge);
114 
115 /**
116  * [__fpending(3)](https://man7.org/linux/man-pages/man3/__fpending.3.html) returns the number of
117  * bytes in the output buffer. See __freadahead() for the input buffer.
118  *
119  * Available since API level 23.
120  */
121 
122 #if __BIONIC_AVAILABILITY_GUARD(23)
123 size_t __fpending(FILE* _Nonnull __fp) __INTRODUCED_IN(23);
124 #endif /* __BIONIC_AVAILABILITY_GUARD(23) */
125 
126 
127 /**
128  * __freadahead(3) returns the number of bytes in the input buffer.
129  * See __fpending() for the output buffer.
130  *
131  * Available since API level 34.
132  */
133 
134 #if __BIONIC_AVAILABILITY_GUARD(34)
135 size_t __freadahead(FILE* _Nonnull __fp) __INTRODUCED_IN(34);
136 #endif /* __BIONIC_AVAILABILITY_GUARD(34) */
137 
138 
139 /**
140  * [_flushlbf(3)](https://man7.org/linux/man-pages/man3/_flushlbf.3.html) flushes all
141  * line-buffered streams.
142  *
143  * Available since API level 23.
144  */
145 
146 #if __BIONIC_AVAILABILITY_GUARD(23)
147 void _flushlbf(void) __INTRODUCED_IN(23);
148 #endif /* __BIONIC_AVAILABILITY_GUARD(23) */
149 
150 
151 /**
152  * `__fseterr` sets the
153  * stream's error flag (as tested by ferror() and cleared by fclearerr()).
154  *
155  * Available since API level 28.
156  */
157 
158 #if __BIONIC_AVAILABILITY_GUARD(28)
159 void __fseterr(FILE* _Nonnull __fp) __INTRODUCED_IN(28);
160 #endif /* __BIONIC_AVAILABILITY_GUARD(28) */
161 
162 
163 /** __fsetlocking() constant to query locking type. */
164 #define FSETLOCKING_QUERY 0
165 /** __fsetlocking() constant to set locking to be maintained by stdio. */
166 #define FSETLOCKING_INTERNAL 1
167 /** __fsetlocking() constant to set locking to be maintained by the caller. */
168 #define FSETLOCKING_BYCALLER 2
169 
170 /**
171  * [__fsetlocking(3)](https://man7.org/linux/man-pages/man3/__fsetlocking.3.html) sets the
172  * stream's locking mode to one of the `FSETLOCKING_` types.
173  *
174  * Returns the current locking style, `FSETLOCKING_INTERNAL` or `FSETLOCKING_BYCALLER`.
175  *
176  * Available since API level 23.
177  */
178 
179 #if __BIONIC_AVAILABILITY_GUARD(23)
180 int __fsetlocking(FILE* _Nonnull __fp, int __type) __INTRODUCED_IN(23);
181 #endif /* __BIONIC_AVAILABILITY_GUARD(23) */
182 
183 
184 __END_DECLS
185