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