interp_o_word.cc

来自「CNC 的开放码,EMC2 V2.2.8版」· CC 代码 · 共 660 行 · 第 1/2 页

CC
660
字号
	  CHK((settings->defining_sub != 1), NCE_NOT_IN_SUBROUTINE_DEFN);	  // no longer skipping or defining	  settings->skipping_o = 0;	  settings->defining_sub = 0;	}      break;    case O_call:      // copy parameters from context      // save old values of parameters      // save current file position in context      // if we were skipping, no longer      settings->skipping_o = 0;      if(settings->call_level >= INTERP_SUB_ROUTINE_LEVELS)	{	  ERP(NCE_TOO_MANY_SUBROUTINE_LEVELS);	}      for(i=0; i<INTERP_SUB_PARAMS; i++)	{	  settings->sub_context[settings->call_level].saved_params[i] =	    settings->parameters[i+INTERP_FIRST_SUBROUTINE_PARAM];	  settings->parameters[i+INTERP_FIRST_SUBROUTINE_PARAM] =	    block->params[i];          if(settings->file_pointer == NULL)          {            ERP(NCE_FILE_NOT_OPEN);          }	  settings->sub_context[settings->call_level].position =	    ftell(settings->file_pointer);          if(settings->sub_context[settings->call_level].filename)          {              // if there is a string here, free it              free(settings->sub_context[settings->call_level].filename);          }          // save the previous filename          settings->sub_context[settings->call_level].filename =              strdup(settings->filename);	  settings->sub_context[settings->call_level].sequence_number	    = settings->sequence_number;	}      logDebug("(in call)set params[%d] return file:%s offset:%ld",	       settings->call_level,	       settings->sub_context[settings->call_level].filename,	       settings->sub_context[settings->call_level].position);      settings->call_level++;      CHP(control_back_to(block->o_number, settings));      break;    case O_do:      // if we were skipping, no longer      settings->skipping_o = 0;      // save the loop point      // we hit this again on loop back -- so test first      if(INTERP_OK != control_find_oword(block->o_number, settings, &index))      {          CHP(control_save_offset(block->o_number, block, settings));      }      break;    case O_while:      // if we were skipping, no longer      settings->skipping_o = 0;      status = control_find_oword(block->o_number, settings, &index);      // test if not already seen OR      // if seen and this is a while (alternative is that it is a do)      if((status != INTERP_OK) ||	 (settings->oword_offset[index].type == block->o_type))	{	  // this is the beginning of a 'while' loop	  // add it to the table if not already there	  if(status != INTERP_OK)	    {               CHP(control_save_offset(block->o_number, block, settings));	    }	  // test the condition	  if(settings->test_value != 0.0)	    {	      // true	      // execute forward	      logDebug("executing forward: [o%d] in 'while'",		       block->o_number);	    }	  else	    {	      // false	      // skip forward	      logDebug("skipping forward: [o%d] in 'while'",		       block->o_number);	      settings->skipping_o = block->o_number;              settings->skipping_start = settings->sequence_number;	    }	}      else	{	  // this is the end of a 'do'	  // test the condition	  if(settings->test_value != 0.0)	    {	      // true	      // loop on back	      logDebug("looping back to: [o%d] in 'do while'",		       block->o_number);              CHP(control_back_to(block->o_number, settings));	    }	  else	    {	      // false	      logDebug("not looping back to: [o%d] in 'do while'",		       block->o_number);	    }	}            break;    case O_if:      if(settings->test_value != 0.0)	{	  //true	  logDebug("executing forward: [o%d] in 'if'",	      block->o_number);          settings->skipping_o = 0;	  settings->executed_if = 1;	}      else	{	  //false          logDebug("skipping forward: [o%d] in 'if'",	      block->o_number);          settings->skipping_o = block->o_number;          settings->skipping_start = settings->sequence_number;	  settings->executed_if = 0;	}      break;    case O_elseif:      if(settings->skipping_o != block->o_number)	{	  // we were not skipping -- start skipping          logDebug("start skipping forward: [o%d] in 'elseif'",	      block->o_number);	  settings->skipping_o = block->o_number;          settings->skipping_start = settings->sequence_number;          return INTERP_OK;	}      // we were skipping      // but were we ever not skipping      if(settings->executed_if)	{	  // we have already executed, keep on skipping          logDebug("already executed, continue  "		   "skipping forward: [o%d] in 'elseif'",	      block->o_number);	  //settings->skipping_0 = block->o_number;          return INTERP_OK;	}            if(settings->test_value != 0.0)	{	  //true -- start executing          logDebug("start executing forward: [o%d] in 'elseif'",	      block->o_number);	  settings->skipping_o = 0;	  settings->executed_if = 1;	}      else	{	  //false          logDebug("continue skipping forward: [o%d] in 'elseif'",	      block->o_number);	}      break;    case O_else:      // were we ever not skipping      if(settings->executed_if)	{	  // we have already executed, skip          logDebug("already executed, "		   "skipping forward: [o%d] in 'else'",	      block->o_number);	  settings->skipping_o = block->o_number;          settings->skipping_start = settings->sequence_number;          return INTERP_OK;	}      if(settings->skipping_o == block->o_number)	{	  // we were skipping so stop skipping          logDebug("stop skipping forward: [o%d] in 'else'",	      block->o_number);          settings->executed_if = 1;	  settings->skipping_o = 0;	}      else	{          // we were not skipping -- so skip          logDebug("start skipping forward: [o%d] in 'else'",	      block->o_number);	}      break;    case O_endif:      // stop skipping if we were      settings->skipping_o = 0;      logDebug("stop skipping forward: [o%d] in 'endif'",	      block->o_number);      // the KEY -- outside if clearly must have executed      // or this would not have executed      settings->executed_if = 1;      break;    case O_break:      // start skipping      settings->skipping_o = block->o_number;      settings->skipping_start = settings->sequence_number;      //settings->doing_break = 1;      logDebug("start skipping forward: [o%d] in 'break'",	      block->o_number);      break;    case O_continue:      // if already skipping, do nothing      if(settings->skipping_o == block->o_number)	{	  logDebug("already skipping: [o%d] in 'continue'",		   block->o_number);	  return INTERP_OK;	}      // start skipping      settings->skipping_o = block->o_number;      settings->skipping_start = settings->sequence_number;      settings->doing_continue = 1;      logDebug("start skipping forward: [o%d] in 'continue'",	      block->o_number);      break;    case O_endwhile:      // end of a while loop      if(settings->skipping_o == block->o_number)	{	  // we were skipping, so this is the end	  settings->skipping_o = 0;	  if(settings->doing_continue)	    {	      settings->doing_continue = 0;  	      // loop on back	      logDebug("looping back (continue) to: [o%d] in 'while endwhile'",		   block->o_number);	      CHP(control_back_to(block->o_number, settings));	    }	  else	    {	      // not doing continue, we are done	      logDebug("falling thru the complete while: [o%d] in 'endwhile'",		   block->o_number);	      return INTERP_OK;	    }	}      else	{	  // loop on back	  logDebug("looping back to: [o%d] in 'while endwhile'",		   block->o_number);	  CHP(control_back_to(block->o_number, settings));	}      break;    case O_return:      if(settings->call_level == 0)      {          // this is in the definition          break;      }      // if we were skipping, no longer      settings->skipping_o = 0;      // in a call -- must do a return      // restore old values of parameters      // restore file position from context      free_named_parameters(settings->call_level, settings);      settings->call_level--;      for(i=0; i<INTERP_SUB_PARAMS; i++)	{	  settings->parameters[i + INTERP_FIRST_SUBROUTINE_PARAM] =	    settings->sub_context[settings->call_level].saved_params[i];	}      logDebug("seeking to: %ld",	       settings->sub_context[settings->call_level].position);      if(settings->file_pointer == NULL)      {        ERP(NCE_FILE_NOT_OPEN);      }      //!!!KL must open the new file, if changed      fseek(settings->file_pointer,	    settings->sub_context[settings->call_level].position, SEEK_SET);      settings->sequence_number =	settings->sub_context[settings->call_level].sequence_number;      break;    default:      // FIXME !!!KL should probably be an error      break;    }    return INTERP_OK;}//========================================================================// End of functions for control stuff (O-words)//========================================================================

⌨️ 快捷键说明

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