interp_read.cc

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

CC
1,969
字号
      *operation = POWER;      *counter = (*counter + 1);    } else      *operation = TIMES;    break;  case ']':    *operation = RIGHT_BRACKET;    break;  case 'a':    if ((line[*counter] == 'n') && (line[(*counter) + 1] == 'd')) {      *operation = AND2;      *counter = (*counter + 2);    } else      ERM(NCE_UNKNOWN_OPERATION_NAME_STARTING_WITH_A);    break;  case 'm':    if ((line[*counter] == 'o') && (line[(*counter) + 1] == 'd')) {      *operation = MODULO;      *counter = (*counter + 2);    } else      ERM(NCE_UNKNOWN_OPERATION_NAME_STARTING_WITH_M);    break;  case 'o':    if (line[*counter] == 'r') {      *operation = NON_EXCLUSIVE_OR;      *counter = (*counter + 1);    } else      ERM(NCE_UNKNOWN_OPERATION_NAME_STARTING_WITH_O);    break;  case 'x':    if ((line[*counter] == 'o') && (line[(*counter) + 1] == 'r')) {      *operation = EXCLUSIVE_OR;      *counter = (*counter + 2);    } else      ERM(NCE_UNKNOWN_OPERATION_NAME_STARTING_WITH_X);    break;      /* relational operators */    case 'e':      if(line[*counter] == 'q')	{	  *operation = EQ;	  *counter = (*counter + 1);	}      else        ERM(NCE_UNKNOWN_OPERATION_NAME_STARTING_WITH_E);      break;    case 'n':      if(line[*counter] == 'e')	{	  *operation = NE;	  *counter = (*counter + 1);	}      else        ERM(NCE_UNKNOWN_OPERATION_NAME_STARTING_WITH_N);      break;    case 'g':      if(line[*counter] == 'e')	{	  *operation = GE;	  *counter = (*counter + 1);	}      else if(line[*counter] == 't')	{	  *operation = GT;	  *counter = (*counter + 1);	}      else        ERM(NCE_UNKNOWN_OPERATION_NAME_STARTING_WITH_G);      break;    case 'l':      if(line[*counter] == 'e')	{	  *operation = LE;	  *counter = (*counter + 1);	}      else if(line[*counter] == 't')	{	  *operation = LT;	  *counter = (*counter + 1);	}      else        ERM(NCE_UNKNOWN_OPERATION_NAME_STARTING_WITH_L);      break;  case 0:    ERM(NCE_UNCLOSED_EXPRESSION);  default:    ERM(NCE_UNKNOWN_OPERATION);  }  return INTERP_OK;}/****************************************************************************//*! read_operation_unaryReturned Value: int   If the operation is not a known unary operation, this returns one of   the following error codes:   NCE_UNKNOWN_WORD_STARTING_WITH_A   NCE_UNKNOWN_WORD_STARTING_WITH_C   NCE_UNKNOWN_WORD_STARTING_WITH_E   NCE_UNKNOWN_WORD_STARTING_WITH_F   NCE_UNKNOWN_WORD_STARTING_WITH_L   NCE_UNKNOWN_WORD_STARTING_WITH_R   NCE_UNKNOWN_WORD_STARTING_WITH_S   NCE_UNKNOWN_WORD_STARTING_WITH_T   NCE_UNKNOWN_WORD_WHERE_UNARY_OPERATION_COULD_BE   Otherwise, this returns INTERP_OK.Side effects:   An integer code for the name of the operation read from the   line is put into what operation points at.   The counter is reset to point to the first character after the   characters which make up the operation name.Called by:   read_unaryThis attempts to read the name of a unary operation out of the line,starting at the index given by the counter. Known operations are:abs, acos, asin, atan, cos, exp, fix, fup, ln, round, sin, sqrt, tan.*/int Interp::read_operation_unary(char *line,     //!< string: line of RS274/NGC code being processed                                int *counter,   //!< pointer to a counter for position on the line                                 int *operation) //!< pointer to operation to be read               {  static char name[] = "read_operation_unary";  char c;  c = line[*counter];  *counter = (*counter + 1);  switch (c) {  case 'a':    if ((line[*counter] == 'b') && (line[(*counter) + 1] == 's')) {      *operation = ABS;      *counter = (*counter + 2);    } else if (strncmp((line + *counter), "cos", 3) == 0) {      *operation = ACOS;      *counter = (*counter + 3);    } else if (strncmp((line + *counter), "sin", 3) == 0) {      *operation = ASIN;      *counter = (*counter + 3);    } else if (strncmp((line + *counter), "tan", 3) == 0) {      *operation = ATAN;      *counter = (*counter + 3);    } else      ERM(NCE_UNKNOWN_WORD_STARTING_WITH_A);    break;  case 'c':    if ((line[*counter] == 'o') && (line[(*counter) + 1] == 's')) {      *operation = COS;      *counter = (*counter + 2);    } else      ERM(NCE_UNKNOWN_WORD_STARTING_WITH_C);    break;  case 'e':    if ((line[*counter] == 'x') && (line[(*counter) + 1] == 'p')) {      *operation = EXP;      *counter = (*counter + 2);    } else      ERM(NCE_UNKNOWN_WORD_STARTING_WITH_E);    break;  case 'f':    if ((line[*counter] == 'i') && (line[(*counter) + 1] == 'x')) {      *operation = FIX;      *counter = (*counter + 2);    } else if ((line[*counter] == 'u') && (line[(*counter) + 1] == 'p')) {      *operation = FUP;      *counter = (*counter + 2);    } else      ERM(NCE_UNKNOWN_WORD_STARTING_WITH_F);    break;  case 'l':    if (line[*counter] == 'n') {      *operation = LN;      *counter = (*counter + 1);    } else      ERM(NCE_UNKNOWN_WORD_STARTING_WITH_L);    break;  case 'r':    if (strncmp((line + *counter), "ound", 4) == 0) {      *operation = ROUND;      *counter = (*counter + 4);    } else      ERM(NCE_UNKNOWN_WORD_STARTING_WITH_R);    break;  case 's':    if ((line[*counter] == 'i') && (line[(*counter) + 1] == 'n')) {      *operation = SIN;      *counter = (*counter + 2);    } else if (strncmp((line + *counter), "qrt", 3) == 0) {      *operation = SQRT;      *counter = (*counter + 3);    } else      ERM(NCE_UNKNOWN_WORD_STARTING_WITH_S);    break;  case 't':    if ((line[*counter] == 'a') && (line[(*counter) + 1] == 'n')) {      *operation = TAN;      *counter = (*counter + 2);    } else      ERM(NCE_UNKNOWN_WORD_STARTING_WITH_T);    break;  default:    ERM(NCE_UNKNOWN_WORD_WHERE_UNARY_OPERATION_COULD_BE);  }  return INTERP_OK;}/****************************************************************************//* read_oReturned Value: int   If read_real_value returns an error code, this returns that code.   If any of the following errors occur, this returns the error code shown.   Otherwise, it returns RS274NGC_OK.   1. The first character read is not o:      NCE_BUG_FUNCTION_SHOULD_NOT_HAVE_BEEN_CALLEDSide effects:   counter is reset to point to the first character following the p value.   The p value setting is inserted in block.Called by: read_one_itemWhen this function is called, counter is pointing at an item on theline that starts with the character 'o', indicating a o valuesetting. The function reads characters which tell how to set the ovalue, up to the start of the next item or the end of the line. Thisinformation is inserted in the block.O codes are used for:1.  sub2.  endsub3.  call4.  do5.  while6.  if7.  elseif8.  else9.  endif10. break11. continue12. endwhile13. return*/int Interp::read_o(    /* ARGUMENTS                                     */ char * line,         /* string: line of RS274/NGC code being processed */ int * counter,       /* pointer to a counter for position on the line  */ block_pointer block, /* pointer to a block being filled from the line  */ double * parameters) /* array of system parameters                     */{  static char name[] = "read_o";  double value;  int status;  int param_cnt;  int oNumber;  CHK((line[*counter] != 'o'), NCE_BUG_FUNCTION_SHOULD_NOT_HAVE_BEEN_CALLED);  // changed spec so we now read an expression  // so... we can have a parameter contain a function pointer!  *counter += 1;  CHP(read_integer_value(line, counter, &oNumber,                         parameters));  logDebug("In: %s line:%d |%s|", name, block->line_number, line);  block->o_number = oNumber;#define CMP(txt) (strncmp(line+*counter, txt, strlen(txt)) == 0)  if(CMP("sub"))    {      block->o_type = O_sub;    }  else if(CMP("endsub"))    {      block->o_type = O_endsub;    }  else if(_setup.defining_sub == 1)    {      // we can not evaluate expressions -- so just skip on out      block->o_type = O_none;    }  else if(CMP("call"))    {      // we need to NOT evaluate parameters if skipping      // skipping never ends on a "call"      if(_setup.skipping_o != 0)      {          block->o_type = O_none;          return INTERP_OK;      }      *counter += strlen("call");      block->o_type = O_call;      for(param_cnt=0;line[*counter] == '[';param_cnt++)	{	  logDebug("counter[%d] rest of line:|%s|", *counter,		   line+*counter);	  CHK((param_cnt >= INTERP_SUB_PARAMS),	      NCE_TOO_MANY_SUBROUTINE_PARAMETERS);	  CHP(read_real_expression(line, counter, &value, parameters));	  block->params[param_cnt] = value;	}      logDebug("set arg params:%d", param_cnt);      // zero the remaining params      for(;param_cnt < INTERP_SUB_PARAMS; param_cnt++)	{	  block->params[param_cnt] = 0.0;	}    }  else if(CMP("do"))    {      block->o_type = O_do;    }  else if(CMP("while"))    {        // FIXME !!!KL -- should not eval expressions if skipping ???      *counter += strlen("while");      block->o_type = O_while;      CHKS((line[*counter] != '['),	    "Left bracket missing after 'while'");      CHP(read_real_expression(line, counter, &value, parameters));      _setup.test_value = value;    }  else if(CMP("if"))    {        // FIXME !!!KL -- should not eval expressions if skipping ???      *counter += strlen("if");      block->o_type = O_if;      CHKS((line[*counter] != '['),	    "Left bracket missing after 'if'");      CHP(read_real_expression(line, counter, &value, parameters));      _setup.test_value = value;    }  else if(CMP("elseif"))    {        // FIXME !!!KL -- should not eval expressions if skipping ???      *counter += strlen("elseif");      block->o_type = O_elseif;      CHKS((line[*counter] != '['),	    "Left bracket missing after 'elseif'");      CHP(read_real_expression(line, counter, &value, parameters));      _setup.test_value = value;    }  else if(CMP("else"))    {      block->o_type = O_else;    }  else if(CMP("endif"))    {      block->o_type = O_endif;    }  else if(CMP("break"))    {      block->o_type = O_break;    }  else if(CMP("continue"))    {      block->o_type = O_continue;    }  else if(CMP("endwhile"))    {      block->o_type = O_endwhile;    }  else if(CMP("return"))    {      block->o_type = O_return;    }  else    {      // not legal      block->o_type = O_none;      ERP(NCE_UNKNOWN_COMMAND_IN_O_LINE);    }  return INTERP_OK;}/****************************************************************************//*! read_p

⌨️ 快捷键说明

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