stw.c

来自「gcc-2.95.3 Linux下最常用的C编译器」· C语言 代码 · 共 429 行

C
429
字号
/* stw.c -- Implementation File (module.c template V1.0)   Copyright (C) 1995 Free Software Foundation, Inc.   Contributed by James Craig Burley.This file is part of GNU Fortran.GNU Fortran 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 Fortran 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 Fortran; see the file COPYING.  If not, write tothe Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA02111-1307, USA.   Related Modules:      None (despite the name, it doesn't really depend on ffest*)   Description:      Provides abstraction and stack mechanism to track the block structure      of a Fortran program.   Modifications:*//* Include files. */#include "proj.h"#include "stw.h"#include "bld.h"#include "com.h"#include "info.h"#include "lab.h"#include "lex.h"#include "malloc.h"#include "sta.h"#include "stv.h"#include "symbol.h"#include "where.h"/* Externals defined here. */ffestw ffestw_stack_top_ = NULL;/* Simple definitions and enumerations. *//* Internal typedefs. *//* Private include files. *//* Internal structure definitions. *//* Static objects accessed by functions in this module. *//* Static functions (internal). *//* Internal macros. *//* ffestw_display_state -- DEBUGGING; display current block state   ffestw_display_state();  */voidffestw_display_state (void){  assert (ffestw_stack_top_ != NULL);  if (!ffe_is_ffedebug ())    return;  fprintf (dmpout, "; block %lu, state ", ffestw_stack_top_->blocknum_);  switch (ffestw_stack_top_->state_)    {    case FFESTV_stateNIL:      fputs ("NIL", dmpout);      break;    case FFESTV_statePROGRAM0:      fputs ("PROGRAM0", dmpout);      break;    case FFESTV_statePROGRAM1:      fputs ("PROGRAM1", dmpout);      break;    case FFESTV_statePROGRAM2:      fputs ("PROGRAM2", dmpout);      break;    case FFESTV_statePROGRAM3:      fputs ("PROGRAM3", dmpout);      break;    case FFESTV_statePROGRAM4:      fputs ("PROGRAM4", dmpout);      break;    case FFESTV_statePROGRAM5:      fputs ("PROGRAM5", dmpout);      break;    case FFESTV_stateSUBROUTINE0:      fputs ("SUBROUTINE0", dmpout);      break;    case FFESTV_stateSUBROUTINE1:      fputs ("SUBROUTINE1", dmpout);      break;    case FFESTV_stateSUBROUTINE2:      fputs ("SUBROUTINE2", dmpout);      break;    case FFESTV_stateSUBROUTINE3:      fputs ("SUBROUTINE3", dmpout);      break;    case FFESTV_stateSUBROUTINE4:      fputs ("SUBROUTINE4", dmpout);      break;    case FFESTV_stateSUBROUTINE5:      fputs ("SUBROUTINE5", dmpout);      break;    case FFESTV_stateFUNCTION0:      fputs ("FUNCTION0", dmpout);      break;    case FFESTV_stateFUNCTION1:      fputs ("FUNCTION1", dmpout);      break;    case FFESTV_stateFUNCTION2:      fputs ("FUNCTION2", dmpout);      break;    case FFESTV_stateFUNCTION3:      fputs ("FUNCTION3", dmpout);      break;    case FFESTV_stateFUNCTION4:      fputs ("FUNCTION4", dmpout);      break;    case FFESTV_stateFUNCTION5:      fputs ("FUNCTION5", dmpout);      break;    case FFESTV_stateMODULE0:      fputs ("MODULE0", dmpout);      break;    case FFESTV_stateMODULE1:      fputs ("MODULE1", dmpout);      break;    case FFESTV_stateMODULE2:      fputs ("MODULE2", dmpout);      break;    case FFESTV_stateMODULE3:      fputs ("MODULE3", dmpout);      break;    case FFESTV_stateMODULE4:      fputs ("MODULE4", dmpout);      break;    case FFESTV_stateMODULE5:      fputs ("MODULE5", dmpout);      break;    case FFESTV_stateBLOCKDATA0:      fputs ("BLOCKDATA0", dmpout);      break;    case FFESTV_stateBLOCKDATA1:      fputs ("BLOCKDATA1", dmpout);      break;    case FFESTV_stateBLOCKDATA2:      fputs ("BLOCKDATA2", dmpout);      break;    case FFESTV_stateBLOCKDATA3:      fputs ("BLOCKDATA3", dmpout);      break;    case FFESTV_stateBLOCKDATA4:      fputs ("BLOCKDATA4", dmpout);      break;    case FFESTV_stateBLOCKDATA5:      fputs ("BLOCKDATA5", dmpout);      break;    case FFESTV_stateUSE:      fputs ("USE", dmpout);      break;    case FFESTV_stateTYPE:      fputs ("TYPE", dmpout);      break;    case FFESTV_stateINTERFACE0:      fputs ("INTERFACE0", dmpout);      break;    case FFESTV_stateINTERFACE1:      fputs ("INTERFACE1", dmpout);      break;    case FFESTV_stateSTRUCTURE:      fputs ("STRUCTURE", dmpout);      break;    case FFESTV_stateUNION:      fputs ("UNION", dmpout);      break;    case FFESTV_stateMAP:      fputs ("MAP", dmpout);      break;    case FFESTV_stateWHERETHEN:      fputs ("WHERETHEN", dmpout);      break;    case FFESTV_stateWHERE:      fputs ("WHERE", dmpout);      break;    case FFESTV_stateIFTHEN:      fputs ("IFTHEN", dmpout);      break;    case FFESTV_stateIF:      fputs ("IF", dmpout);      break;    case FFESTV_stateDO:      fputs ("DO", dmpout);      break;    case FFESTV_stateSELECT0:      fputs ("SELECT0", dmpout);      break;    case FFESTV_stateSELECT1:      fputs ("SELECT1", dmpout);      break;    default:      assert ("bad state" == NULL);      break;    }  if (ffestw_stack_top_->top_do_ != NULL)    fputs (" (within DO)", dmpout);  fputc ('\n', dmpout);}/* ffestw_init_0 -- Initialize ffestw structures   ffestw_init_0();  */voidffestw_init_0 (){  ffestw b;  ffestw_stack_top_ = b = (ffestw) malloc_new_kp (malloc_pool_image (),					  "FFESTW stack base", sizeof (*b));  b->uses_ = 0;			/* catch if anyone uses, kills, &c this				   block. */  b->next_ = NULL;  b->previous_ = NULL;  b->top_do_ = NULL;  b->blocknum_ = 0;  b->shriek_ = NULL;  b->state_ = FFESTV_stateNIL;  b->line_ = ffewhere_line_unknown ();  b->col_ = ffewhere_column_unknown ();}/* ffestw_kill -- Kill block   ffestw b;   ffestw_kill(b);  */voidffestw_kill (ffestw b){  assert (b != NULL);  assert (b->uses_ > 0);  if (--b->uses_ != 0)    return;  ffewhere_line_kill (b->line_);  ffewhere_column_kill (b->col_);}/* ffestw_new -- Create block   ffestw b;   b = ffestw_new();  */ffestwffestw_new (void){  ffestw b;  b = (ffestw) malloc_new_kp (malloc_pool_image (), "FFESTW", sizeof (*b));  b->uses_ = 1;  return b;}/* ffestw_pop -- Pop block off stack   ffestw_pop();  */ffestwffestw_pop (void){  ffestw b;  ffestw oldb = ffestw_stack_top_;  assert (oldb != NULL);  ffestw_stack_top_ = b = ffestw_stack_top_->previous_;  assert (b != NULL);  if ((ffewhere_line_is_unknown (b->line_) || ffewhere_column_is_unknown (b->col_))      && (ffesta_tokens[0] != NULL))    {      assert (b->state_ == FFESTV_stateNIL);      if (ffewhere_line_is_unknown (b->line_))	b->line_	  = ffewhere_line_use (ffelex_token_where_line (ffesta_tokens[0]));      if (ffewhere_column_is_unknown (b->col_))	b->col_	  = ffewhere_column_use (ffelex_token_where_column (ffesta_tokens[0]));    }  return oldb;}/* ffestw_push -- Push block onto stack, return its address   ffestw b;  // NULL if new block to be obtained first.   ffestw_push(b);   Returns address of block if desired, also updates ffestw_stack_top_   to point to it.   30-Oct-91  JCB  2.0      Takes block as arg, or NULL if new block needed.	*/ffestwffestw_push (ffestw b){  if (b == NULL)    b = ffestw_new ();  b->next_ = NULL;  b->previous_ = ffestw_stack_top_;  b->line_ = ffewhere_line_unknown ();  b->col_ = ffewhere_column_unknown ();  ffestw_stack_top_ = b;  return b;}/* ffestw_update -- Update current block line/col info   ffestw_update();   Updates block to point to current statement.	 */ffestwffestw_update (ffestw b){  if (b == NULL)    {      b = ffestw_stack_top_;      assert (b != NULL);    }  if (ffesta_tokens[0] == NULL)    return b;  ffewhere_line_kill (b->line_);  ffewhere_column_kill (b->col_);  b->line_ = ffewhere_line_use (ffelex_token_where_line (ffesta_tokens[0]));  b->col_ = ffewhere_column_use (ffelex_token_where_column (ffesta_tokens[0]));  return b;}/* ffestw_use -- Mark extra use of block   ffestw b;   b = ffestw_use(b);  // will always return original copy of b   Increments use counter for b.  */ffestwffestw_use (ffestw b){  assert (b != NULL);  assert (b->uses_ != 0);  ++b->uses_;  return b;}

⌨️ 快捷键说明

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