📄 stc.c
字号:
}/* ffestc_labeldef_useless_ -- Define label as a useless one ffestc_labeldef_useless_(); */static voidffestc_labeldef_useless_ (){ if ((ffesta_label_token == NULL) || (ffestc_shriek_after1_ != NULL) || !ffestc_labeldef_begin_ ()) return; switch (ffelab_type (ffestc_label_)) { case FFELAB_typeUNKNOWN: ffelab_set_type (ffestc_label_, FFELAB_typeUSELESS); ffestd_labeldef_useless (ffestc_label_); break; case FFELAB_typeLOOPEND: ffelab_set_type (ffestc_label_, FFELAB_typeANY); ffestd_labeldef_any (ffestc_label_); if ((ffestw_state (ffestw_stack_top ()) != FFESTV_stateDO) || (ffestw_label (ffestw_stack_top ()) != ffestc_label_)) { /* Unterminated block. */ ffebad_start (FFEBAD_LABEL_DO_BLOCK_END); ffebad_here (0, ffelab_doref_line (ffestc_label_), ffelab_doref_column (ffestc_label_)); ffebad_here (1, ffestw_line (ffestw_stack_top ()), ffestw_col (ffestw_stack_top ())); ffebad_here (2, ffelex_token_where_line (ffesta_label_token), ffelex_token_where_column (ffesta_label_token)); ffebad_finish (); break; } ffebad_start (FFEBAD_LABEL_USE_DEF); ffebad_here (0, ffelex_token_where_line (ffesta_label_token), ffelex_token_where_column (ffesta_label_token)); ffebad_here (1, ffelab_doref_line (ffestc_label_), ffelab_doref_column (ffestc_label_)); ffebad_finish (); ffestc_labeldef_branch_end_ (); return; case FFELAB_typeASSIGNABLE: case FFELAB_typeFORMAT: case FFELAB_typeNOTLOOP: ffelab_set_type (ffestc_label_, FFELAB_typeANY); ffestd_labeldef_any (ffestc_label_); ffebad_start (FFEBAD_LABEL_USE_DEF); ffebad_here (0, ffelex_token_where_line (ffesta_label_token), ffelex_token_where_column (ffesta_label_token)); ffebad_here (1, ffelab_firstref_line (ffestc_label_), ffelab_firstref_column (ffestc_label_)); ffebad_finish (); break; default: assert ("bad label" == NULL); /* Fall through. */ case FFELAB_typeANY: break; } ffestc_try_shriek_do_ (); ffelex_token_kill (ffesta_label_token); ffesta_label_token = NULL;}/* ffestc_labelref_is_assignable_ -- Reference to label in ASSIGN stmt if (ffestc_labelref_is_assignable_(label_token,&label)) // label ref is ok, label is filled in with ffelab object */static boolffestc_labelref_is_assignable_ (ffelexToken label_token, ffelab *x_label){ ffelab label; ffelabValue label_value; label_value = (ffelabValue) atol (ffelex_token_text (label_token)); if ((label_value == 0) || (label_value > FFELAB_valueMAX)) { ffebad_start (FFEBAD_LABEL_NUMBER_INVALID); ffebad_here (0, ffelex_token_where_line (label_token), ffelex_token_where_column (label_token)); ffebad_finish (); return FALSE; } label = ffelab_find (label_value); if (label == NULL) { label = ffelab_new (label_value); ffelab_set_firstref_line (label, ffewhere_line_use (ffelex_token_where_line (label_token))); ffelab_set_firstref_column (label, ffewhere_column_use (ffelex_token_where_column (label_token))); } switch (ffelab_type (label)) { case FFELAB_typeUNKNOWN: ffelab_set_type (label, FFELAB_typeASSIGNABLE); break; case FFELAB_typeASSIGNABLE: case FFELAB_typeLOOPEND: case FFELAB_typeFORMAT: case FFELAB_typeNOTLOOP: case FFELAB_typeENDIF: break; case FFELAB_typeUSELESS: ffelab_set_type (label, FFELAB_typeANY); ffestd_labeldef_any (label); ffebad_start (FFEBAD_LABEL_USE_DEF); ffebad_here (0, ffelab_firstref_line (label), ffelab_firstref_column (label)); ffebad_here (1, ffelex_token_where_line (label_token), ffelex_token_where_column (label_token)); ffebad_finish (); ffestc_try_shriek_do_ (); return FALSE; default: assert ("bad label" == NULL); /* Fall through. */ case FFELAB_typeANY: break; } *x_label = label; return TRUE;}/* ffestc_labelref_is_branch_ -- Reference to label in branch stmt if (ffestc_labelref_is_branch_(label_token,&label)) // label ref is ok, label is filled in with ffelab object */static boolffestc_labelref_is_branch_ (ffelexToken label_token, ffelab *x_label){ ffelab label; ffelabValue label_value; ffestw block; unsigned long blocknum; label_value = (ffelabValue) atol (ffelex_token_text (label_token)); if ((label_value == 0) || (label_value > FFELAB_valueMAX)) { ffebad_start (FFEBAD_LABEL_NUMBER_INVALID); ffebad_here (0, ffelex_token_where_line (label_token), ffelex_token_where_column (label_token)); ffebad_finish (); return FALSE; } label = ffelab_find (label_value); if (label == NULL) { label = ffelab_new (label_value); ffelab_set_firstref_line (label, ffewhere_line_use (ffelex_token_where_line (label_token))); ffelab_set_firstref_column (label, ffewhere_column_use (ffelex_token_where_column (label_token))); } switch (ffelab_type (label)) { case FFELAB_typeUNKNOWN: case FFELAB_typeASSIGNABLE: ffelab_set_type (label, FFELAB_typeNOTLOOP); ffelab_set_blocknum (label, ffestw_blocknum (ffestw_stack_top ())); break; case FFELAB_typeLOOPEND: if (ffelab_blocknum (label) != 0) break; /* Already taken care of. */ for (block = ffestw_top_do (ffestw_stack_top ()); (block != NULL) && (ffestw_label (block) != label); block = ffestw_top_do (ffestw_previous (block))) ; /* Find most recent DO <label> ancestor. */ if (block == NULL) { /* Reference to within a (dead) block. */ ffebad_start (FFEBAD_LABEL_BLOCK); ffebad_here (0, ffelab_definition_line (label), ffelab_definition_column (label)); ffebad_here (1, ffelex_token_where_line (label_token), ffelex_token_where_column (label_token)); ffebad_finish (); break; } ffelab_set_blocknum (label, ffestw_blocknum (block)); ffelab_set_firstref_line (label, ffewhere_line_use (ffelex_token_where_line (label_token))); ffelab_set_firstref_column (label, ffewhere_column_use (ffelex_token_where_column (label_token))); break; case FFELAB_typeNOTLOOP: case FFELAB_typeENDIF: if (ffelab_blocknum (label) == ffestw_blocknum (ffestw_stack_top ())) break; blocknum = ffelab_blocknum (label); for (block = ffestw_stack_top (); ffestw_blocknum (block) > blocknum; block = ffestw_previous (block)) ; /* Find most recent common ancestor. */ if (ffelab_blocknum (label) == ffestw_blocknum (block)) break; /* Check again. */ if (!ffewhere_line_is_unknown (ffelab_definition_line (label))) { /* Reference to within a (dead) block. */ ffebad_start (FFEBAD_LABEL_BLOCK); ffebad_here (0, ffelab_definition_line (label), ffelab_definition_column (label)); ffebad_here (1, ffelex_token_where_line (label_token), ffelex_token_where_column (label_token)); ffebad_finish (); break; } ffelab_set_blocknum (label, ffestw_blocknum (block)); break; case FFELAB_typeFORMAT: if (ffewhere_line_is_unknown (ffelab_definition_line (label))) { ffelab_set_type (label, FFELAB_typeANY); ffestd_labeldef_any (label); ffebad_start (FFEBAD_LABEL_USE_USE); ffebad_here (0, ffelab_firstref_line (label), ffelab_firstref_column (label)); ffebad_here (1, ffelex_token_where_line (label_token), ffelex_token_where_column (label_token)); ffebad_finish (); ffestc_try_shriek_do_ (); return FALSE; } /* Fall through. */ case FFELAB_typeUSELESS: ffelab_set_type (label, FFELAB_typeANY); ffestd_labeldef_any (label); ffebad_start (FFEBAD_LABEL_USE_DEF); ffebad_here (0, ffelab_definition_line (label), ffelab_definition_column (label)); ffebad_here (1, ffelex_token_where_line (label_token), ffelex_token_where_column (label_token)); ffebad_finish (); ffestc_try_shriek_do_ (); return FALSE; default: assert ("bad label" == NULL); /* Fall through. */ case FFELAB_typeANY: break; } *x_label = label; return TRUE;}/* ffestc_labelref_is_format_ -- Reference to label in [FMT=] specification if (ffestc_labelref_is_format_(label_token,&label)) // label ref is ok, label is filled in with ffelab object */static boolffestc_labelref_is_format_ (ffelexToken label_token, ffelab *x_label){ ffelab label; ffelabValue label_value; label_value = (ffelabValue) atol (ffelex_token_text (label_token)); if ((label_value == 0) || (label_value > FFELAB_valueMAX)) { ffebad_start (FFEBAD_LABEL_NUMBER_INVALID); ffebad_here (0, ffelex_token_where_line (label_token), ffelex_token_where_column (label_token)); ffebad_finish (); return FALSE; } label = ffelab_find (label_value); if (label == NULL) { label = ffelab_new (label_value); ffelab_set_firstref_line (label, ffewhere_line_use (ffelex_token_where_line (label_token))); ffelab_set_firstref_column (label, ffewhere_column_use (ffelex_token_where_column (label_token))); } switch (ffelab_type (label)) { case FFELAB_typeUNKNOWN: case FFELAB_typeASSIGNABLE: ffelab_set_type (label, FFELAB_typeFORMAT); break; case FFELAB_typeFORMAT: break; case FFELAB_typeLOOPEND: case FFELAB_typeNOTLOOP: if (ffewhere_line_is_unknown (ffelab_definition_line (label))) { ffelab_set_type (label, FFELAB_typeANY); ffestd_labeldef_any (label); ffebad_start (FFEBAD_LABEL_USE_USE); ffebad_here (0, ffelab_firstref_line (label), ffelab_firstref_column (label)); ffebad_here (1, ffelex_token_where_line (label_token), ffelex_token_where_column (label_token)); ffebad_finish (); ffestc_try_shriek_do_ (); return FALSE; } /* Fall through. */ case FFELAB_typeUSELESS: case FFELAB_typeENDIF: ffelab_set_type (label, FFELAB_typeANY); ffestd_labeldef_any (label); ffebad_start (FFEBAD_LABEL_USE_DEF); ffebad_here (0, ffelab_definition_line (label), ffelab_definition_column (label)); ffebad_here (1, ffelex_token_where_line (label_token), ffelex_token_where_column (label_token)); ffebad_finish (); ffestc_try_shriek_do_ (); return FALSE; default: assert ("bad label" == NULL); /* Fall through. */ case FFELAB_typeANY: break; } ffestc_try_shriek_do_ (); *x_label = label; return TRUE;}/* ffestc_labelref_is_loopend_ -- Reference to label in DO stmt if (ffestc_labelref_is_loopend_(label_token,&label)) // label ref is ok, label is filled in with ffelab object */static boolffestc_labelref_is_loopend_ (ffelexToken label_token, ffelab *x_label){ ffelab label; ffelabValue label_value; label_value = (ffelabValue) atol (ffelex_token_text (label_token)); if ((label_value == 0) || (label_value > FFELAB_valueMAX)) { ffebad_start (FFEBAD_LABEL_NUMBER_INVALID); ffebad_here (0, ffelex_token_where_line (label_token), ffelex_token_where_column (label_token)); ffebad_finish (); return FALSE; } label = ffelab_find (label_value); if (label == NULL) { label = ffelab_new (label_value); ffelab_set_doref_line (label, ffewhere_line_use (ffelex_token_where_line (label_token))); ffelab_set_doref_column (label, ffewhere_column_use (ffelex_token_where_column (label_token))); } switch (ffelab_type (label)) { case FFELAB_typeASSIGNABLE: ffelab_set_doref_line (label, ffewhere_line_use (ffelex_token_where_line (label_token))); ffelab_set_doref_column (label, ffewhere_column_use (ffelex_token_where_column (label_token))); ffewhere_line_kill (ffelab_firstref_line (label)); ffelab_set_firstref_line (label, ffewhere_line_unknown ()); ffewhere_column_kill (ffelab_firstref_column (label)); ffelab_set_firstref_column (label, ffewhere_column_unknown ()); /* Fall through. */ case FFELAB_typeUNKNOWN: ffelab_set_type (label, FFELAB_typeLOOPEND); ffelab_set_blocknum (label, 0); break; case FFELAB_typeLOOPEND: if (!ffewhere_line_is_unknown (ffelab_definition_line (label))) { /* Def must follow all refs. */ ffelab_set_type (label, FFELAB_typeANY); ffestd_labeldef_any (label); ffebad_start (FFEBAD_LABEL_DEF_DO); ffebad_here (0, ffelab_definition_line (label), ffelab_definition_column (label)); ffebad_here (1, ffelex_token_where_line (label_token), ffelex_token_where_column (label_token)); ffebad_finish (); ffestc_try_shriek_do_ (); return FALSE; } if (ffelab_blocknum (label) != 0) { /* Had a branch ref earlier, can't go inside this new block! */ ffelab_set_type (label, FFELAB_typeANY); ffestd_labeldef_any (label); ffebad_start (FFEBAD_LABEL_USE_USE); ffebad_here (0, ffelab_firstref_line (label), ffelab_firstref_column (label)); ffebad_here (1, ffelex_token_where_line (label_token), ffelex_token_where_column (label_token)); ffebad_finish (); ffestc_try_shriek_do_ (); return FALSE; } if ((ffestw_state (ffestw_stack_top ()) != FFESTV_stateDO)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -