⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 input.c

📁 GUN开源阻止下的编译器GCC
💻 C
字号:
/* Input handling for G++.   Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.   Written by Ken Raeburn (raeburn@cygnus.com) while at Watchmaker Computing.This file is part of GNU CC.GNU CC is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 2, or (at your option)any later version.GNU CC 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 theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with GNU CC; see the file COPYING.  If not, write tothe Free Software Foundation, 59 Temple Place - Suite 330,Boston, MA 02111-1307, USA.  *//* G++ needs to do enough saving and re-parsing of text that it is   necessary to abandon the simple FILE* model and use a mechanism where   we can pre-empt one input stream with another derived from saved text;   we may need to do this arbitrarily often, and cannot depend on having   the GNU library available, so FILE objects just don't cut it.   This file is written as a separate module, but can be included by   lex.c for very minor efficiency gains (primarily in function   inlining).  */#include <stdio.h>#include "obstack.h"extern FILE *finput;struct pending_input *save_pending_input ();void restore_pending_input ();struct input_source {  /* saved string */  char *str;  int length;  /* current position, when reading as input */  int offset;  /* obstack to free this input string from when finished, if any */  struct obstack *obstack;  /* linked list maintenance */  struct input_source *next;  /* values to restore after reading all of current string */  char *filename;  int lineno;  struct pending_input *input;  int putback_char;};static struct input_source *input, *free_inputs;extern char *input_filename;extern int lineno;#ifdef __GNUC__#define inline __inline__#else#define inline#endifstatic inline struct input_source *allocate_input (){  struct input_source *inp;  if (free_inputs)    {      inp = free_inputs;      free_inputs = inp->next;      inp->next = 0;      return inp;    }  inp = (struct input_source *) xmalloc (sizeof (struct input_source));  inp->next = 0;  inp->obstack = 0;  return inp;}static inline voidfree_input (inp)     struct input_source *inp;{  if (inp->obstack)    obstack_free (inp->obstack, inp->str);  inp->obstack = 0;  inp->str = 0;  inp->length = 0;  inp->next = free_inputs;  free_inputs = inp;}static int putback_char = -1;/* Some of these external functions are declared inline in case this file   is included in lex.c.  */inlinevoidfeed_input (str, len, delete)     char *str;     int len;     struct obstack *delete;{  struct input_source *inp = allocate_input ();  /* This shouldn't be necessary.  */  while (len && !str[len-1])    len--;  inp->str = str;  inp->length = len;  inp->obstack = delete;  inp->offset = 0;  inp->next = input;  inp->filename = input_filename;  inp->lineno = lineno;  inp->input = save_pending_input ();  inp->putback_char = putback_char;  putback_char = -1;  input = inp;}struct pending_input *to_be_restored; /* XXX */extern int end_of_file;static inline intsub_getch (){  if (putback_char != -1)    {      int ch = putback_char;      putback_char = -1;      return ch;    }  if (input)    {      if (input->offset == input->length)	{	  struct input_source *inp = input;	  my_friendly_assert (putback_char == -1, 223);	  to_be_restored = inp->input;	  input->offset++;	  return EOF;	}      else if (input->offset > input->length)	{	  struct input_source *inp = input;	  end_of_file = 0;	  input = inp->next;	  input_filename = inp->filename;	  lineno = inp->lineno;	  /* Get interface/implementation back in sync. */	  extract_interface_info ();	  putback_char = inp->putback_char;	  free_input (inp);	  return getch ();	}      if (input)	return input->str[input->offset++];    }  return getc (finput);}inlinevoidput_back (ch)     int ch;{  if (ch != EOF)    {      my_friendly_assert (putback_char == -1, 224);      putback_char = ch;    }}extern int linemode;intgetch (){  int ch = sub_getch ();  if (linemode && ch == '\n')    {      put_back (ch);      ch = EOF;    }  return ch;}inlineintinput_redirected (){  return input != 0;}

⌨️ 快捷键说明

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