mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-11-03 20:53:13 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			191 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			191 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* Optimizing macros and inline functions for stdio functions.
 | 
						|
   Copyright (C) 1998-2017 Free Software Foundation, Inc.
 | 
						|
   This file is part of the GNU C Library.
 | 
						|
 | 
						|
   The GNU C Library is free software; you can redistribute it and/or
 | 
						|
   modify it under the terms of the GNU Lesser General Public
 | 
						|
   License as published by the Free Software Foundation; either
 | 
						|
   version 2.1 of the License, or (at your option) any later version.
 | 
						|
 | 
						|
   The GNU C Library is distributed in the hope that it will be useful,
 | 
						|
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
						|
   Lesser General Public License for more details.
 | 
						|
 | 
						|
   You should have received a copy of the GNU Lesser General Public
 | 
						|
   License along with the GNU C Library; if not, see
 | 
						|
   <http://www.gnu.org/licenses/>.  */
 | 
						|
 | 
						|
#ifndef _STDIO_H
 | 
						|
# error "Never include <bits/stdio.h> directly; use <stdio.h> instead."
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef __extern_inline
 | 
						|
# define __STDIO_INLINE inline
 | 
						|
#else
 | 
						|
# define __STDIO_INLINE __extern_inline
 | 
						|
#endif
 | 
						|
 | 
						|
 | 
						|
#ifdef __USE_EXTERN_INLINES
 | 
						|
/* For -D_FORTIFY_SOURCE{,=2} bits/stdio2.h will define a different
 | 
						|
   inline.  */
 | 
						|
# if !(__USE_FORTIFY_LEVEL > 0 && defined __fortify_function)
 | 
						|
/* Write formatted output to stdout from argument list ARG.  */
 | 
						|
__STDIO_INLINE int
 | 
						|
vprintf (const char *__restrict __fmt, _G_va_list __arg)
 | 
						|
{
 | 
						|
  return vfprintf (stdout, __fmt, __arg);
 | 
						|
}
 | 
						|
# endif
 | 
						|
 | 
						|
/* Read a character from stdin.  */
 | 
						|
__STDIO_INLINE int
 | 
						|
getchar (void)
 | 
						|
{
 | 
						|
  return _IO_getc (stdin);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
# ifdef __USE_MISC
 | 
						|
/* Faster version when locking is not necessary.  */
 | 
						|
__STDIO_INLINE int
 | 
						|
fgetc_unlocked (FILE *__fp)
 | 
						|
{
 | 
						|
  return _IO_getc_unlocked (__fp);
 | 
						|
}
 | 
						|
# endif /* misc */
 | 
						|
 | 
						|
 | 
						|
# ifdef __USE_POSIX
 | 
						|
/* This is defined in POSIX.1:1996.  */
 | 
						|
__STDIO_INLINE int
 | 
						|
getc_unlocked (FILE *__fp)
 | 
						|
{
 | 
						|
  return _IO_getc_unlocked (__fp);
 | 
						|
}
 | 
						|
 | 
						|
/* This is defined in POSIX.1:1996.  */
 | 
						|
__STDIO_INLINE int
 | 
						|
getchar_unlocked (void)
 | 
						|
{
 | 
						|
  return _IO_getc_unlocked (stdin);
 | 
						|
}
 | 
						|
# endif	/* POSIX */
 | 
						|
 | 
						|
 | 
						|
/* Write a character to stdout.  */
 | 
						|
__STDIO_INLINE int
 | 
						|
putchar (int __c)
 | 
						|
{
 | 
						|
  return _IO_putc (__c, stdout);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
# ifdef __USE_MISC
 | 
						|
/* Faster version when locking is not necessary.  */
 | 
						|
__STDIO_INLINE int
 | 
						|
fputc_unlocked (int __c, FILE *__stream)
 | 
						|
{
 | 
						|
  return _IO_putc_unlocked (__c, __stream);
 | 
						|
}
 | 
						|
# endif /* misc */
 | 
						|
 | 
						|
 | 
						|
# ifdef __USE_POSIX
 | 
						|
/* This is defined in POSIX.1:1996.  */
 | 
						|
__STDIO_INLINE int
 | 
						|
putc_unlocked (int __c, FILE *__stream)
 | 
						|
{
 | 
						|
  return _IO_putc_unlocked (__c, __stream);
 | 
						|
}
 | 
						|
 | 
						|
/* This is defined in POSIX.1:1996.  */
 | 
						|
__STDIO_INLINE int
 | 
						|
putchar_unlocked (int __c)
 | 
						|
{
 | 
						|
  return _IO_putc_unlocked (__c, stdout);
 | 
						|
}
 | 
						|
# endif	/* POSIX */
 | 
						|
 | 
						|
 | 
						|
# ifdef	__USE_GNU
 | 
						|
/* Like `getdelim', but reads up to a newline.  */
 | 
						|
__STDIO_INLINE _IO_ssize_t
 | 
						|
getline (char **__lineptr, size_t *__n, FILE *__stream)
 | 
						|
{
 | 
						|
  return __getdelim (__lineptr, __n, '\n', __stream);
 | 
						|
}
 | 
						|
# endif /* GNU */
 | 
						|
 | 
						|
 | 
						|
# ifdef __USE_MISC
 | 
						|
/* Faster versions when locking is not required.  */
 | 
						|
__STDIO_INLINE int
 | 
						|
__NTH (feof_unlocked (FILE *__stream))
 | 
						|
{
 | 
						|
  return _IO_feof_unlocked (__stream);
 | 
						|
}
 | 
						|
 | 
						|
/* Faster versions when locking is not required.  */
 | 
						|
__STDIO_INLINE int
 | 
						|
__NTH (ferror_unlocked (FILE *__stream))
 | 
						|
{
 | 
						|
  return _IO_ferror_unlocked (__stream);
 | 
						|
}
 | 
						|
# endif /* misc */
 | 
						|
 | 
						|
#endif /* Use extern inlines.  */
 | 
						|
 | 
						|
 | 
						|
#if defined __USE_MISC && defined __GNUC__ && defined __OPTIMIZE__ \
 | 
						|
    && !defined __cplusplus
 | 
						|
/* Perform some simple optimizations.  */
 | 
						|
# define fread_unlocked(ptr, size, n, stream) \
 | 
						|
  (__extension__ ((__builtin_constant_p (size) && __builtin_constant_p (n)    \
 | 
						|
		   && (size_t) (size) * (size_t) (n) <= 8		      \
 | 
						|
		   && (size_t) (size) != 0)				      \
 | 
						|
		  ? ({ char *__ptr = (char *) (ptr);			      \
 | 
						|
		       FILE *__stream = (stream);			      \
 | 
						|
		       size_t __cnt;					      \
 | 
						|
		       for (__cnt = (size_t) (size) * (size_t) (n);	      \
 | 
						|
			    __cnt > 0; --__cnt)				      \
 | 
						|
			 {						      \
 | 
						|
			   int __c = _IO_getc_unlocked (__stream);	      \
 | 
						|
			   if (__c == EOF)				      \
 | 
						|
			     break;					      \
 | 
						|
			   *__ptr++ = __c;				      \
 | 
						|
			 }						      \
 | 
						|
		       ((size_t) (size) * (size_t) (n) - __cnt)		      \
 | 
						|
			/ (size_t) (size); })				      \
 | 
						|
		  : (((__builtin_constant_p (size) && (size_t) (size) == 0)   \
 | 
						|
		      || (__builtin_constant_p (n) && (size_t) (n) == 0))     \
 | 
						|
			/* Evaluate all parameters once.  */		      \
 | 
						|
		     ? ((void) (ptr), (void) (stream), (void) (size),	      \
 | 
						|
			(void) (n), (size_t) 0)				      \
 | 
						|
		     : fread_unlocked (ptr, size, n, stream))))
 | 
						|
 | 
						|
# define fwrite_unlocked(ptr, size, n, stream) \
 | 
						|
  (__extension__ ((__builtin_constant_p (size) && __builtin_constant_p (n)    \
 | 
						|
		   && (size_t) (size) * (size_t) (n) <= 8		      \
 | 
						|
		   && (size_t) (size) != 0)				      \
 | 
						|
		  ? ({ const char *__ptr = (const char *) (ptr);	      \
 | 
						|
		       FILE *__stream = (stream);			      \
 | 
						|
		       size_t __cnt;					      \
 | 
						|
		       for (__cnt = (size_t) (size) * (size_t) (n);	      \
 | 
						|
			    __cnt > 0; --__cnt)				      \
 | 
						|
			 if (_IO_putc_unlocked (*__ptr++, __stream) == EOF)   \
 | 
						|
			   break;					      \
 | 
						|
		       ((size_t) (size) * (size_t) (n) - __cnt)		      \
 | 
						|
			/ (size_t) (size); })				      \
 | 
						|
		  : (((__builtin_constant_p (size) && (size_t) (size) == 0)   \
 | 
						|
		      || (__builtin_constant_p (n) && (size_t) (n) == 0))     \
 | 
						|
			/* Evaluate all parameters once.  */		      \
 | 
						|
		     ? ((void) (ptr), (void) (stream), (void) (size),	      \
 | 
						|
			(void) (n), (size_t) 0)				      \
 | 
						|
		     : fwrite_unlocked (ptr, size, n, stream))))
 | 
						|
#endif
 | 
						|
 | 
						|
/* Define helper macro.  */
 | 
						|
#undef __STDIO_INLINE
 |