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 + -
显示快捷键?