glue.c

来自「一个C源代码分析器」· C语言 代码 · 共 115 行

C
115
字号
/* Copyright (C) 1991, 1992 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/ormodify it under the terms of the GNU Library General Public License aspublished by the Free Software Foundation; either version 2 of theLicense, 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 ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNULibrary General Public License for more details.You should have received a copy of the GNU Library General PublicLicense along with the GNU C Library; see the file COPYING.LIB.  Ifnot, write to the Free Software Foundation, Inc., 675 Mass Ave,Cambridge, MA 02139, USA.  *//* This file provides glue between Unix stdio and GNU stdio.   It supports use of Unix stdio `getc' and `putc' (and, by extension,   `getchar' and `putchar') macros on GNU stdio streams (they are slow, but   they work).  It also supports all stdio operations (including Unix   `getc' and `putc') on Unix's stdin, stdout, and stderr (the elements of   `_iob').   The reasoning behind this is to allow programs (and especially   libraries) compiled with Unix header files to work with the GNU C   library.  */#include <ansidecl.h>#include <stdio.h>#include <errno.h>typedef union  {    struct      {	int magic;	FILE **streamp;		/* Overlaps GNU stdio `bufp' member.  */	/* These two overlap the GNU stdio `get_limit' and `put_limit'	   members.  They must be <= `streamp'/`bufp' for GNU getc and putc	   to do the right thing.  */	FILE **streamp2, **streamp3;      } glue;    struct _iobuf      {	int _cnt;	unsigned char *_ptr;	unsigned char *_base;	int _bufsiz;	short int _flag;	char _file;      } unix_iobuf;    FILE gnu_stream;  } unix_FILE;/* These are the Unix stdio's stdin, stdout, and stderr.   In Unix stdin is (&_iob[0]), stdout is (&_iob[1]), and stderr is   (&_iob[2]).  The magic number marks these as glued streams.  The   __validfp macro in stdio.h is used by every stdio function.  It checks   for glued streams, and replaces them with the GNU stdio stream.  */unix_FILE _iob[] =  {#define	S(name)	{ { _GLUEMAGIC, &name, &name, &name } }    S (stdin),    S (stdout),    S (stderr),#undef	S  };/* Called by the Unix stdio `getc' macro.   The macro is assumed to look something like:       (--file->_cnt < 0 ? _filbuf (file) ...)   In a Unix stdio FILE `_cnt' is the first element.   In a GNU stdio or glued FILE, the first element is the magic number.  */intDEFUN(_filbuf, (file), unix_FILE *file){  switch (++file->glue.magic)	/* Compensate for Unix getc's decrement.  */    {    case _GLUEMAGIC:      /* This is a glued stream.  */      return getc (*file->glue.streamp);    case  _IOMAGIC:      /* This is a normal GNU stdio stream.  */      return getc ((FILE *) file);    default:      /* Bogus stream.  */      errno = EINVAL;      return EOF;    }}/* Called by the Unix stdio `putc' macro.  Much like getc, above.  */intDEFUN(_flsbuf, (c, file),      int c AND unix_FILE *file){  /* Compensate for putc's decrement.  */  switch (++file->glue.magic)    {    case _GLUEMAGIC:      return putc (c, *file->glue.streamp);    case  _IOMAGIC:      return putc (c, (FILE *) file);    default:      errno = EINVAL;      return EOF;    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?