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