1*53ee8cc1Swenshuai.xi /* Optimizing macros and inline functions for stdio functions.
2*53ee8cc1Swenshuai.xi Copyright (C) 1998, 2000, 2001, 2004, 2007 Free Software Foundation, Inc.
3*53ee8cc1Swenshuai.xi This file is part of the GNU C Library.
4*53ee8cc1Swenshuai.xi
5*53ee8cc1Swenshuai.xi The GNU C Library is free software; you can redistribute it and/or
6*53ee8cc1Swenshuai.xi modify it under the terms of the GNU Lesser General Public
7*53ee8cc1Swenshuai.xi License as published by the Free Software Foundation; either
8*53ee8cc1Swenshuai.xi version 2.1 of the License, or (at your option) any later version.
9*53ee8cc1Swenshuai.xi
10*53ee8cc1Swenshuai.xi The GNU C Library is distributed in the hope that it will be useful,
11*53ee8cc1Swenshuai.xi but WITHOUT ANY WARRANTY; without even the implied warranty of
12*53ee8cc1Swenshuai.xi MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13*53ee8cc1Swenshuai.xi Lesser General Public License for more details.
14*53ee8cc1Swenshuai.xi
15*53ee8cc1Swenshuai.xi You should have received a copy of the GNU Lesser General Public
16*53ee8cc1Swenshuai.xi License along with the GNU C Library; if not, write to the Free
17*53ee8cc1Swenshuai.xi Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18*53ee8cc1Swenshuai.xi 02111-1307 USA. */
19*53ee8cc1Swenshuai.xi
20*53ee8cc1Swenshuai.xi #ifndef _STDIO_H
21*53ee8cc1Swenshuai.xi # error "Never include <bits/stdio.h> directly; use <stdio.h> instead."
22*53ee8cc1Swenshuai.xi #endif
23*53ee8cc1Swenshuai.xi
24*53ee8cc1Swenshuai.xi #ifndef __extern_inline
25*53ee8cc1Swenshuai.xi # define __STDIO_INLINE inline
26*53ee8cc1Swenshuai.xi #else
27*53ee8cc1Swenshuai.xi # define __STDIO_INLINE __extern_inline
28*53ee8cc1Swenshuai.xi #endif
29*53ee8cc1Swenshuai.xi
30*53ee8cc1Swenshuai.xi
31*53ee8cc1Swenshuai.xi #ifdef __USE_EXTERN_INLINES
32*53ee8cc1Swenshuai.xi /* For -D_FORTIFY_SOURCE{,=2} bits/stdio2.h will define a different
33*53ee8cc1Swenshuai.xi inline. */
34*53ee8cc1Swenshuai.xi # if !(__USE_FORTIFY_LEVEL > 0 && defined __extern_always_inline)
35*53ee8cc1Swenshuai.xi /* Write formatted output to stdout from argument list ARG. */
36*53ee8cc1Swenshuai.xi __STDIO_INLINE int
vprintf(__const char * __restrict __fmt,_G_va_list __arg)37*53ee8cc1Swenshuai.xi vprintf (__const char *__restrict __fmt, _G_va_list __arg)
38*53ee8cc1Swenshuai.xi {
39*53ee8cc1Swenshuai.xi return vfprintf (stdout, __fmt, __arg);
40*53ee8cc1Swenshuai.xi }
41*53ee8cc1Swenshuai.xi # endif
42*53ee8cc1Swenshuai.xi
43*53ee8cc1Swenshuai.xi /* Read a character from stdin. */
44*53ee8cc1Swenshuai.xi __STDIO_INLINE int
getchar(void)45*53ee8cc1Swenshuai.xi getchar (void)
46*53ee8cc1Swenshuai.xi {
47*53ee8cc1Swenshuai.xi return _IO_getc (stdin);
48*53ee8cc1Swenshuai.xi }
49*53ee8cc1Swenshuai.xi
50*53ee8cc1Swenshuai.xi
51*53ee8cc1Swenshuai.xi # ifdef __USE_MISC
52*53ee8cc1Swenshuai.xi /* Faster version when locking is not necessary. */
53*53ee8cc1Swenshuai.xi __STDIO_INLINE int
fgetc_unlocked(FILE * __fp)54*53ee8cc1Swenshuai.xi fgetc_unlocked (FILE *__fp)
55*53ee8cc1Swenshuai.xi {
56*53ee8cc1Swenshuai.xi return _IO_getc_unlocked (__fp);
57*53ee8cc1Swenshuai.xi }
58*53ee8cc1Swenshuai.xi # endif /* misc */
59*53ee8cc1Swenshuai.xi
60*53ee8cc1Swenshuai.xi
61*53ee8cc1Swenshuai.xi # if defined __USE_POSIX || defined __USE_MISC
62*53ee8cc1Swenshuai.xi /* This is defined in POSIX.1:1996. */
63*53ee8cc1Swenshuai.xi __STDIO_INLINE int
getc_unlocked(FILE * __fp)64*53ee8cc1Swenshuai.xi getc_unlocked (FILE *__fp)
65*53ee8cc1Swenshuai.xi {
66*53ee8cc1Swenshuai.xi return _IO_getc_unlocked (__fp);
67*53ee8cc1Swenshuai.xi }
68*53ee8cc1Swenshuai.xi
69*53ee8cc1Swenshuai.xi /* This is defined in POSIX.1:1996. */
70*53ee8cc1Swenshuai.xi __STDIO_INLINE int
getchar_unlocked(void)71*53ee8cc1Swenshuai.xi getchar_unlocked (void)
72*53ee8cc1Swenshuai.xi {
73*53ee8cc1Swenshuai.xi return _IO_getc_unlocked (stdin);
74*53ee8cc1Swenshuai.xi }
75*53ee8cc1Swenshuai.xi # endif /* POSIX || misc */
76*53ee8cc1Swenshuai.xi
77*53ee8cc1Swenshuai.xi
78*53ee8cc1Swenshuai.xi /* Write a character to stdout. */
79*53ee8cc1Swenshuai.xi __STDIO_INLINE int
putchar(int __c)80*53ee8cc1Swenshuai.xi putchar (int __c)
81*53ee8cc1Swenshuai.xi {
82*53ee8cc1Swenshuai.xi return _IO_putc (__c, stdout);
83*53ee8cc1Swenshuai.xi }
84*53ee8cc1Swenshuai.xi
85*53ee8cc1Swenshuai.xi
86*53ee8cc1Swenshuai.xi # ifdef __USE_MISC
87*53ee8cc1Swenshuai.xi /* Faster version when locking is not necessary. */
88*53ee8cc1Swenshuai.xi __STDIO_INLINE int
fputc_unlocked(int __c,FILE * __stream)89*53ee8cc1Swenshuai.xi fputc_unlocked (int __c, FILE *__stream)
90*53ee8cc1Swenshuai.xi {
91*53ee8cc1Swenshuai.xi return _IO_putc_unlocked (__c, __stream);
92*53ee8cc1Swenshuai.xi }
93*53ee8cc1Swenshuai.xi # endif /* misc */
94*53ee8cc1Swenshuai.xi
95*53ee8cc1Swenshuai.xi
96*53ee8cc1Swenshuai.xi # if defined __USE_POSIX || defined __USE_MISC
97*53ee8cc1Swenshuai.xi /* This is defined in POSIX.1:1996. */
98*53ee8cc1Swenshuai.xi __STDIO_INLINE int
putc_unlocked(int __c,FILE * __stream)99*53ee8cc1Swenshuai.xi putc_unlocked (int __c, FILE *__stream)
100*53ee8cc1Swenshuai.xi {
101*53ee8cc1Swenshuai.xi return _IO_putc_unlocked (__c, __stream);
102*53ee8cc1Swenshuai.xi }
103*53ee8cc1Swenshuai.xi
104*53ee8cc1Swenshuai.xi /* This is defined in POSIX.1:1996. */
105*53ee8cc1Swenshuai.xi __STDIO_INLINE int
putchar_unlocked(int __c)106*53ee8cc1Swenshuai.xi putchar_unlocked (int __c)
107*53ee8cc1Swenshuai.xi {
108*53ee8cc1Swenshuai.xi return _IO_putc_unlocked (__c, stdout);
109*53ee8cc1Swenshuai.xi }
110*53ee8cc1Swenshuai.xi # endif /* POSIX || misc */
111*53ee8cc1Swenshuai.xi
112*53ee8cc1Swenshuai.xi
113*53ee8cc1Swenshuai.xi # ifdef __USE_GNU
114*53ee8cc1Swenshuai.xi /* Like `getdelim', but reads up to a newline. */
115*53ee8cc1Swenshuai.xi __STDIO_INLINE _IO_ssize_t
getline(char ** __lineptr,size_t * __n,FILE * __stream)116*53ee8cc1Swenshuai.xi getline (char **__lineptr, size_t *__n, FILE *__stream)
117*53ee8cc1Swenshuai.xi {
118*53ee8cc1Swenshuai.xi return __getdelim (__lineptr, __n, '\n', __stream);
119*53ee8cc1Swenshuai.xi }
120*53ee8cc1Swenshuai.xi # endif /* GNU */
121*53ee8cc1Swenshuai.xi
122*53ee8cc1Swenshuai.xi
123*53ee8cc1Swenshuai.xi # ifdef __USE_MISC
124*53ee8cc1Swenshuai.xi /* Faster versions when locking is not required. */
125*53ee8cc1Swenshuai.xi __STDIO_INLINE int
__NTH(feof_unlocked (FILE * __stream))126*53ee8cc1Swenshuai.xi __NTH (feof_unlocked (FILE *__stream))
127*53ee8cc1Swenshuai.xi {
128*53ee8cc1Swenshuai.xi return _IO_feof_unlocked (__stream);
129*53ee8cc1Swenshuai.xi }
130*53ee8cc1Swenshuai.xi
131*53ee8cc1Swenshuai.xi /* Faster versions when locking is not required. */
132*53ee8cc1Swenshuai.xi __STDIO_INLINE int
__NTH(ferror_unlocked (FILE * __stream))133*53ee8cc1Swenshuai.xi __NTH (ferror_unlocked (FILE *__stream))
134*53ee8cc1Swenshuai.xi {
135*53ee8cc1Swenshuai.xi return _IO_ferror_unlocked (__stream);
136*53ee8cc1Swenshuai.xi }
137*53ee8cc1Swenshuai.xi # endif /* misc */
138*53ee8cc1Swenshuai.xi
139*53ee8cc1Swenshuai.xi #endif /* Use extern inlines. */
140*53ee8cc1Swenshuai.xi
141*53ee8cc1Swenshuai.xi
142*53ee8cc1Swenshuai.xi #if defined __USE_MISC && defined __GNUC__ && defined __OPTIMIZE__ \
143*53ee8cc1Swenshuai.xi && !defined __cplusplus
144*53ee8cc1Swenshuai.xi /* Perform some simple optimizations. */
145*53ee8cc1Swenshuai.xi # define fread_unlocked(ptr, size, n, stream) \
146*53ee8cc1Swenshuai.xi (__extension__ ((__builtin_constant_p (size) && __builtin_constant_p (n) \
147*53ee8cc1Swenshuai.xi && (size_t) (size) * (size_t) (n) <= 8 \
148*53ee8cc1Swenshuai.xi && (size_t) (size) != 0) \
149*53ee8cc1Swenshuai.xi ? ({ char *__ptr = (char *) (ptr); \
150*53ee8cc1Swenshuai.xi FILE *__stream = (stream); \
151*53ee8cc1Swenshuai.xi size_t __cnt; \
152*53ee8cc1Swenshuai.xi for (__cnt = (size_t) (size) * (size_t) (n); \
153*53ee8cc1Swenshuai.xi __cnt > 0; --__cnt) \
154*53ee8cc1Swenshuai.xi { \
155*53ee8cc1Swenshuai.xi int __c = _IO_getc_unlocked (__stream); \
156*53ee8cc1Swenshuai.xi if (__c == EOF) \
157*53ee8cc1Swenshuai.xi break; \
158*53ee8cc1Swenshuai.xi *__ptr++ = __c; \
159*53ee8cc1Swenshuai.xi } \
160*53ee8cc1Swenshuai.xi ((size_t) (size) * (size_t) (n) - __cnt) \
161*53ee8cc1Swenshuai.xi / (size_t) (size); }) \
162*53ee8cc1Swenshuai.xi : (((__builtin_constant_p (size) && (size_t) (size) == 0) \
163*53ee8cc1Swenshuai.xi || (__builtin_constant_p (n) && (size_t) (n) == 0)) \
164*53ee8cc1Swenshuai.xi /* Evaluate all parameters once. */ \
165*53ee8cc1Swenshuai.xi ? ((void) (ptr), (void) (stream), (void) (size), \
166*53ee8cc1Swenshuai.xi (void) (n), (size_t) 0) \
167*53ee8cc1Swenshuai.xi : fread_unlocked (ptr, size, n, stream))))
168*53ee8cc1Swenshuai.xi
169*53ee8cc1Swenshuai.xi # define fwrite_unlocked(ptr, size, n, stream) \
170*53ee8cc1Swenshuai.xi (__extension__ ((__builtin_constant_p (size) && __builtin_constant_p (n) \
171*53ee8cc1Swenshuai.xi && (size_t) (size) * (size_t) (n) <= 8 \
172*53ee8cc1Swenshuai.xi && (size_t) (size) != 0) \
173*53ee8cc1Swenshuai.xi ? ({ const char *__ptr = (const char *) (ptr); \
174*53ee8cc1Swenshuai.xi FILE *__stream = (stream); \
175*53ee8cc1Swenshuai.xi size_t __cnt; \
176*53ee8cc1Swenshuai.xi for (__cnt = (size_t) (size) * (size_t) (n); \
177*53ee8cc1Swenshuai.xi __cnt > 0; --__cnt) \
178*53ee8cc1Swenshuai.xi if (_IO_putc_unlocked (*__ptr++, __stream) == EOF) \
179*53ee8cc1Swenshuai.xi break; \
180*53ee8cc1Swenshuai.xi ((size_t) (size) * (size_t) (n) - __cnt) \
181*53ee8cc1Swenshuai.xi / (size_t) (size); }) \
182*53ee8cc1Swenshuai.xi : (((__builtin_constant_p (size) && (size_t) (size) == 0) \
183*53ee8cc1Swenshuai.xi || (__builtin_constant_p (n) && (size_t) (n) == 0)) \
184*53ee8cc1Swenshuai.xi /* Evaluate all parameters once. */ \
185*53ee8cc1Swenshuai.xi ? ((void) (ptr), (void) (stream), (void) (size), \
186*53ee8cc1Swenshuai.xi (void) (n), (size_t) 0) \
187*53ee8cc1Swenshuai.xi : fwrite_unlocked (ptr, size, n, stream))))
188*53ee8cc1Swenshuai.xi #endif
189*53ee8cc1Swenshuai.xi
190*53ee8cc1Swenshuai.xi /* Define helper macro. */
191*53ee8cc1Swenshuai.xi #undef __STDIO_INLINE
192